[12屆 鐵人賽] [Day20] Neo4j with C# 程式串接實作 part2 - 更多的資料讀寫實作 === ###### tags: `iT鐵人賽` `Neo4j` ## 前情提要 今天搭高鐵,有個妹子在車廂內打翻飲料 飲料還流的整個車廂都是,百香果的味道香到不行 上一篇簡單的示範了 C# 接 Neo4j 的基本連線與測試 今天來細講一下 `IDriver` 底下 `AsyncSession()` 回傳的 `IAsyncSession` 的功能吧 ## WriteTransactionAsync() 上一篇有過這個 Function ```csharp string sql = $"CREATE (n:Greeting{{message:'{message}'}}) RETURN n.message + ' from node : '+ id(n)"; var greeting = await session.WriteTransactionAsync(async tx => { var result = await tx.RunAsync(sql); return await result.ToListAsync(r => r[0].As<string>()); }); ``` 這邊就實際上的內容很簡單 就是在 `Write` 模式下開啟一段交談,再回傳資料而已 `Write` 模式下就包含修改刪除等都可以使用,廢話 值得一提的是 `WriteTransactionAsync` 會自動 `Commit` 你的修改內容 相關細節等等在 `BeginTransactionAsync` 會講到 > 關於這個部分 `result.ToListAsync(r => r[0].As<string>())` > 屬於回傳資料的內容,下一篇會詳細講 ## ReadTransactionAsync() 先下一個基本的內容,跟 `WriteTransactionAsync` 大同小異就是了 ```csharp string sql = $"MATCH (n:Greeting{{message:'{message}'}}) RETURN n.message + ' from node : '+ id(n)"; var greeting = await session.ReadTransactionAsync(async tx => { var result = await tx.RunAsync(sql); return await result.ToListAsync(r => r[0].As<string>()); }); ``` 跟剛剛的 `WriteTransactionAsync` 為一的不同是 這邊使用的是 `Read` 模式 在這個模式下 `CREATE`、`SET`、`DELETE` 等功能都是不會工作的 如果你下了這類的語法,在 Neo4j Server 執行的時候會直接擋住 然後回傳錯誤 如果你想要抓到錯誤的話,你可以嘗試調用 `result.FetchAsync()` 你就會抓到底下這行錯誤 > Writing in read access mode not allowed. Attempted write to internal graph 0 (neo4j) ## BeginTransactionAsync() 這邊這個就稍微複雜一點了 ```csharp string sql = $"CREATE (n:Greeting{{message:'{message}'}}) RETURN n.message + ' from node : '+ id(n)"; //建立交談 var session = _driver.AsyncSession(); //開始交談 var transaction = await session.BeginTransactionAsync(); //執行 cypher 語法 var echo = await transaction.RunAsync(sql); //取得回傳 var result = await echo.ToListAsync(r => r[0].As<string>()); //提交變更 await transaction.CommitAsync(); await session.CloseAsync(); ``` 跟之前不一樣的地方是,多這行 ```csharp await transaction.CommitAsync(); ``` 對於 `BeginTransactionAsync` 來說,所有的操作的是假的 概念跟 `Git` 有點像,在你沒 `Commit` 之前,你的變更跟沒變跟一樣 所以說用 `BeginTransactionAsync` 你可以在不動到 DB 資料的情況下,取得調整後的內容 只要你沒下 `CommitAsync()`,你怎麼改都不會實際動到資料庫 ### 另外補充 上一篇忘記提到 ```csharp var session = _driver.AsyncSession(); await session.CloseAsync(); ``` 建立 `session` 之後,要把這個 `session` 關了,完成一個完整流程 --- ~~一個作弊~~ 為什麼感覺這篇有點水阿 @@ 明天要早點開始寫 最近越來越不會估每篇文的完成所需時間了 有夠母湯  看著這個,總覺得有點心虛呢w 下篇 **Neo4j with C# 程式串接實作 part3 - 回傳資料解析** 究竟鐵人賽能不能完賽呢,讓我們繼續看下去 --- ## My Source Code [Github Link](https://github.com/flyxiang1206/NeoTest) ## 參考資料 [Neo4j - Using Neo4j from .NET](https://neo4j.com/developer/dotnet/) [Neo4j.Driver Doc ](https://neo4j.com/docs/api/dotnet-driver/current/) ## 紀錄 撰寫日期:2020/10/04 耗時: 應該在 2.5 小內
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up