iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 21
0
自我挑戰組

圖形資料庫是什麼,可以吃嗎 - Neo4j系列 第 21

Neo4j with C# 程式串接實作 part3 - 回傳資料解析

前情提要

沒空寫屁話了

上一篇講了 C# 該如何取得 Neo4j 資料的方法

分成 Write、Read、Begin 三種模式

那它們回傳的資料又會有幾種不同的變化呢

這篇就讓我來稍微示範一下吧,總共分成

  1. FreeStyle
  2. INode
  3. IRelationship
  4. IPath
  5. MixType

本篇將使用從最開始就使用到現在的"資料庫類型"資料庫

FreeStyle

好啦,也不是 FreeStyle 啦,就是回傳 Property 的資料啦

第八篇的時候有提過,Property 包含五種類型

其中長得比較雞巴 " 空間座標 " 我們之後再做一篇獨立講

首先回憶上一篇的內容

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 實際上可以視為,這個東西

Dictionary<string, object>()

所以上面這行 r => r[0].As<string>()

實際上就只是把所有回傳轉成 string 而已

所以說其他三種格式在 C# 就有對應的格式了,就直接轉過去就可以了

INode

先丟範例,實際上長得一樣就是了

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

看了剛剛的 INodeIRelationship 長怎樣應該很好猜了吧

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,這邊回傳的是所有資料

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

這樣的回傳資料就會包含了 NodeRelationship 的所有內容

在後續處理,或是轉換自訂格式上就會方便許多

MixType

最後再來詳細解析一下 IRecord

剛剛的範例提到的都是 Cypher 只有回傳某種特定格式的情況

那如果回傳是像這種情況呢

MATCH (n:SQL)-[r:have]->(n1:SQL) RETURN n,r,n1

那就要換一種寫法了

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

參考資料

Neo4j - Using Neo4j from .NET

Neo4j.Driver Doc


排版好看的版本同步更新在我的 HackMD


上一篇
Neo4j with C# 程式串接實作 part2 - 更多的資料讀寫實作
下一篇
Neo4j with C# 程式串接實作 part4 - Neo4jClient 另一個 C# 接 Neo4j 的方法
系列文
圖形資料庫是什麼,可以吃嗎 - Neo4j30

尚未有邦友留言

立即登入留言