2

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

Person表为node

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

likes作为edge// 为简单起见,我在这里不使用自动生成的 ID

╔════╦═══════╦═══════╦═══════════════════╕
║ Id ║ From ║ To ║ 备注 ║
╠════╬═══════╬═══════╬═══════════════════╣
║ 1 ║ David ║ Suraj ║ David 喜欢 Suraj ║
║ 2 ║ 大卫 ║ 约翰 ║ 大卫喜欢约翰 ║
║ 3 ║ John ║ Ryan ║ John 喜欢 Ryan ║
╚════╩═══════╩═══════╩═══════════════════╕

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

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或 箭头更直观地进行调整吗

预期结果

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

更新:添加了预期结果

4

2 回答 2

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.

于 2020-03-18T19:22:09.367 回答
0

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)
于 2021-12-22T13:52:54.447 回答