[12屆 鐵人賽] [Day21] Neo4j with C# 程式串接實作 part3 - 回傳資料解析 === ###### tags: `iT鐵人賽` `Neo4j` ## 前情提要 沒空寫屁話了 上一篇講了 C# 該如何取得 Neo4j 資料的方法 分成 Write、Read、Begin 三種模式 那它們回傳的資料又會有幾種不同的變化呢 這篇就讓我來稍微示範一下吧,總共分成 1. FreeStyle 2. INode 3. IRelationship 4. IPath 5. MixType > 本篇將使用從最開始就使用到現在的"資料庫類型"資料庫 ## FreeStyle 好啦,也不是 FreeStyle 啦,就是回傳 `Property` 的資料啦 [第八篇](https://ithelp.ithome.com.tw/articles/10241657)的時候有提過,`Property` 包含五種類型 其中長得比較雞巴 " 空間座標 " 我們之後再做一篇獨立講 首先回憶上一篇的內容 ```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>()); }); ``` 不過這次只需要關注 `result.ToListAsync(r => r[0].As<string>())` 這個部分就好 首先 result 的格式是 `Neo4j.Driver` 底下的 `IRecord` 而 `IRecord` 實際上可以視為,這個東西 ```csharp Dictionary<string, object>() ``` 所以上面這行 `r => r[0].As<string>()` 實際上就只是把所有回傳轉成 `string` 而已 所以說其他三種格式在 C# 就有對應的格式了,就直接轉過去就可以了 ## INode 先丟範例,實際上長得一樣就是了 ```csharp string sql = $"MATCH (n:SQL) RETURN n"; var greeting = await session.ReadTransactionAsync(async tx => { var result = await tx.RunAsync(sql); return await result.ToListAsync(r => r[0].As<INode>()); }); ``` 如果你 Cypher `RETURN` 的是 `Node` 的話 那 `IRecord` 轉出來的資料會是 `INode` 的格式,直接拆  你可以看到 `INode` 包含了 * Id * `long` ( int64 ) * Labels * `List<string>` * Properties * `Dictionary<string, object>` 沒錯,跟原本的 `Node` 格式一模一樣 ## IRelationship 看了剛剛的 `INode`,`IRelationship` 長怎樣應該很好猜了吧 ```csharp string sql = "MATCH (:SQL)-[r:have]->(:SQL) RETURN r"; var greeting = await session.ReadTransactionAsync(async tx => { var result = await tx.RunAsync(sql); return await result.ToListAsync(r => r[0].As<IRelationship>()); }); ```  一樣直接拆開來看,可以看到它包含了 * EndNodeId * `long` ( int64 ) * Id * `long` ( int64 ) * Properties * `Dictionary<string, object>` * StartNodeId * `long` ( int64 ) * Type * `string` 你可能會問:阿不是啊,你 StartNode 跟 EndNode 都只給我 Id 是能幹嘛 別急,我們往下看 ## IPath 請仔細注意第一行的 Cypher,這邊回傳的是所有資料 ```csharp string sql = "MATCH p=(:SQL)-[:have]->(:SQL) RETURN p"; var greeting = await session.ReadTransactionAsync(async tx => { var result = await tx.RunAsync(sql); return await result.ToListAsync(r => r[0].As<IPath>()); }); ```  你可以看到這邊的資料看起來就比較科學了(?) * End * `INode` * Nodes * `Dictionary<string, INode>` * Relationships * `Dictionary<string, IRelationship>` * Start * `INode` 這樣的回傳資料就會包含了 `Node`、`Relationship` 的所有內容 在後續處理,或是轉換自訂格式上就會方便許多 ## MixType 最後再來詳細解析一下 `IRecord` 吧 剛剛的範例提到的都是 Cypher 只有回傳某種特定格式的情況 那如果回傳是像這種情況呢 ```sql MATCH (n:SQL)-[r:have]->(n1:SQL) RETURN n,r,n1 ``` 那就要換一種寫法了 ```csharp string sql = "MATCH (n:SQL)-[r:have]->(n1:SQL) RETURN n,r,n1"; var greeting = await session.ReadTransactionAsync(async tx => { var result = await tx.RunAsync(sql); return await result.ToListAsync(); }); foreach (var record in greeting) { var node = record["n"].As<INode>(); var node1 = record["n1"].As<INode>(); var relationship = record["r"].As<IRelationship>(); //Do Something } ``` 你回傳的資料在 `ToList` 之後,就會變成 `List<IRecord>`,廢話 而 `IRecord` 剛剛有講就是 `Dictionary<string, object>` 那他的 `key` 就會是你 Cypher `RETURN` 的那個自訂名稱  這樣所有回傳的類型就差不多解釋完了,應該是沒漏啦 (゚∀。) --- ~~持續作弊~~ 為什麼鐵人賽的換日時間 不跟某些手遊一樣,在凌晨五點換日阿 ~~工程師不都熬夜加班凌晨才睡的嘛~~ 下篇 **Neo4j with C# 程式串接實作 part4 - Neo4jClient 另一個 C# 接 Neo4j 的方法** 究竟鐵人賽能不能完賽呢,讓我們繼續看下去 --- ## 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/05 耗時: 2 小
×
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