获取SQL Server图数据库中的所有好友

问题描述 投票:0回答:3

我正在尝试使用 SQL Server 图形处理检索特定人的所有朋友

Person
表为
node

╔════╦═══════╗
║ 身份证号 ║ 姓名 ║
╠════╬═══════╣
║ 1 ║ 大卫 ║
║ 2 ║ 苏拉吉 ║
║ 3 ║ 约翰 ║
║ 4 ║ 瑞安║
╚════╩═══════╝

likes
作为
edge
//为了简单起见,我在这里没有使用自动生成的 id

╔════╦═══════╦═══════╦═════════════════ ══╗
║ 编号 ║ 自 ║ 至 ║ 备注 ║
╠════╬═══════╬═══════╬══════════════════ ═╣
║ 1 ║ 大卫 ║ Suraj ║ 大卫喜欢 Suraj ║
║ 2 ║ 大卫 ║ 约翰 ║ 大卫喜欢约翰 ║
║ 3 ║ 约翰 ║ 瑞安 ║ 约翰喜欢瑞安 ║
╚════╩═══════╩═══════╩══════════════════ ═╝

我查找约翰所有朋友的图形查询将是这样的

select p1.name, p2.name [friend]
from person p1, likes l, person p2 
where p1.name = 'John' and match(p1-(l)->p2)

这将返回以下结果集

╔══════╦════════╗
║ 姓名 ║ 朋友 ║
╠══════╬════════╣
║ 约翰 ║ 瑞安 ║
╚══════╩════════╝

问题是我们得到了约翰喜欢的所有人,其中不包括喜欢约翰的人(在本例中是大卫)。在现实世界中,如果一个人是我的朋友,我也是他的朋友,对吗?我知道我可以在这里使用

union
找到所有喜欢 John 的人并将其加起来。但对于寻找朋友的朋友的情况来说,情况会变得更糟。我们可以用
Match
或箭头

更直观地进行调整吗

预期结果

+------+--------+
|名称 |朋友|
+------+--------+
|约翰 |瑞安 |
|约翰 |大卫 |
+------+--------+

更新:添加了预期结果

sql-server graph-databases social-networking sql-server-graph
3个回答
2
投票

您得到这个答案的原因是边缘的定向性质。

在现实世界中,如果一个人是我的朋友,我也是他的朋友,对吧?

这取决于域。例如,对于 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


1
投票

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)

0
投票

是一种查询多个级别的优雅方式,就像像 cypher 这样的朋友的朋友的朋友的朋友?

© www.soinside.com 2019 - 2024. All rights reserved.