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

Posted

技术标签:

【中文标题】获取 SQL Server 图形数据库中的所有好友【英文标题】:Get all friends in SQL Server graph database 【发布时间】:2020-06-29 17:06:07 【问题描述】:

我正在尝试使用 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 ║ ╚════╩═══════╩═══════╩═══════════════════╕

我查找 John 的所有朋友的图表查询是这样的

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

这将返回以下结果集

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

问题是我们得到了所有约翰喜欢的人,其中不包括喜欢约翰的人(在本例中为大卫)。在现实世界中,如果一个人是我的朋友,我也是他的朋友,对吧?我知道我可以在这里使用union 来找到所有喜欢约翰的人并加起来。但是对于寻找朋友的朋友的情况,情况会变得更糟。我们可以更直观地使用Match 或箭头进行调整

预期结果

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

更新:添加预期结果

【问题讨论】:

你能显示你的预期输出吗? @KumarHarsh 添加了预期结果 请删除 Sql Server Tag,它会造成混乱。 我只提到 sql server。 sql server-2017 附带图形处理 【参考方案1】:

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

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

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

【讨论】:

这不起作用。我试过match(p1-(l)-p2)match(p1<-(l)->p2)。两者都给出语法错误 如果是这种情况,SQL Server Graph 可能不支持双向边遍历,因此您需要执行 UNION【参考方案2】:

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)

【讨论】:

以上是关于获取 SQL Server 图形数据库中的所有好友的主要内容,如果未能解决你的问题,请参考以下文章

XMPP Server for iPhone 中的好友列表问题

如何从 SQL Server 中特定数据库的表中获取所有列名?

从 SQL Server 获取所有值 [关闭]

实体框架查询 SQL Server 2017 图形数据库的语法

SQL Server Compact - 计算记录/获取数据库中所有表使用的空间

如何在 SQL Server 中查找外键依赖项?