前言
最近將資料存到 MSSQL 的 Graph Table 之中,
想要查到某個 Node 在所有關系中路徑,例如下圖 C 的所有 Path。
剛好跟這篇sql server graph query, find all paths to node的問題相同。

解法
依sanora提供的範例可以分別取得 開始為 C 的整個路徑 及 結束為 C 的整個路徑。
初始資料如下,
1 | DROP TABLE IF EXISTS Person; |
要找路徑的話,可以透過 SHORTEST_PATH 這個 Fuction ,
並給它要查詢的 Node 及 Edge Pattern ,
例如 Query 1 ,找開始節點為 C (p1.userName = 'C'
)的所有路徑(使用 +),
1 | SELECT |
結果如下,

再來要找出最後節點為 C 的所有路徑,
因為最後節點要 Search 過之後才會知道,
所以這裡用 SubQuery 後,再來過濾 FinalNode = 'C'
1 | -- Query 2 |
結果如下,

所以如果要 C 在關係中的所有路徑,就將它們 Union 起來就可以了,
1 | SELECT |
結果如下,

另外,本來要針對 Levels 來過濾,但發現查詢速度會變慢,
例如原本近 0 秒結果會出來,加上 Levels 來過濾會變成 4~10 秒。