[英]Get all friends in SQL Server graph database
我正在嘗試使用 SQL Server 圖形處理檢索特定人的所有朋友
Person
表作為node
╔════╦═══════╗ ║ Id ║ Name ║ ╠════╬═══════╣ ║ 1 ║ David ║ ║ 2 ║ Suraj ║ ║ 3 ║ John ║ ║ 4 ║ Ryan ║ ╚════╩═══════╝
likes
作為edge
// 為簡單起見,我沒有在這里使用自動生成的 ID
╔════╦═══════╦═══════╦═══════════════════╗ ║ Id ║ From ║ To ║ Remarks ║ ╠════╬═══════╬═══════╬═══════════════════╣ ║ 1 ║ David ║ Suraj ║ David likes Suraj ║ ║ 2 ║ David ║ John ║ David likes John ║ ║ 3 ║ John ║ Ryan ║ John likes Ryan ║ ╚════╩═══════╩═══════╩═══════════════════╝
我查找 John 的所有朋友的圖形查詢將是這樣的
select p1.name, p2.name [friend]
from person p1, likes l, person p2
where p1.name = 'John' and match(p1-(l)->p2)
這將返回以下結果集
╔══════╦════════╗ ║ name ║ friend ║ ╠══════╬════════╣ ║ John ║ Ryan ║ ╚══════╩════════╝
問題是我們得到了所有約翰喜歡的人,這排除了喜歡約翰的人(在這種情況下是大衛)。 在現實世界中,如果一個人是我的朋友,那么我也是他的朋友,對嗎? 我知道我可以在這里使用union
來找到所有喜歡 John 的人並將其加起來。 但是對於尋找朋友的朋友的情況,它會使情況變得最糟。 我們可以更直觀地使用Match
或箭頭進行調整嗎
預期結果
+------+--------+ | Name | Friend | +------+--------+ | John | Ryan | | John | David | +------+--------+
更新:添加了預期結果
您得到此答案的原因是邊緣的定向性質。
在現實世界中,如果一個人是我的朋友,那么我也是他的朋友,對嗎?
這取決於域。 例如,這對 Facebook 或 LinkedIn 來說是正確的,但對於像 Twitter 這樣的東西來說就不是這樣了,因為你關注我並不意味着我關注你。 這是您在開發圖形數據模型時需要了解的設計決策。
我不熟悉 SQL Graph 的語法,但您可以通過從 MATCH 步驟中刪除>
來雙向遍歷邊緣,如下所示:
select p1.name, p2.name [friend]
from person p1, likes l, person p2
where p1.name = 'John' and match(p1-(l)-p2)
至少這是您在另一種圖形模式匹配語法中的做法。 如果這不起作用,那么您可能必須執行UNION
。
SQL Server 圖是有方向的。 那么你
MATCH
不允許OR
,您必須使用兩個查詢的 UNION ,其中每個查詢使用不同的方向性:select p1.name, p2.name [friend]
from person p1, likes l, person p2
where p1.name = 'John' and match(p1-(l)->p2)
UNION
select p2.name, p1.name [friend]
from person p1, likes l, person p2
where p2.name = 'John' and match(p1-(l)->p2)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.