簡體   English   中英

獲取 SQL Server 圖數據庫中的所有朋友

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM