具有最多共同朋友的 OrientDb 顶点
OrientDb Vertices with most Mutual Friends
我试图找到它们之间具有最多公共顶点的顶点对。它与许多图形数据库演示中使用的 'number of mutual friends' 示例非常相似。我可以使用以下方法确定一对已知顶点之间的相互顶点数:
SELECT Expand($query) LET
$query1 = (SELECT Expand(outE().in) FROM #1:2,
$query2 = (SELECT Expand(OutE().in) FROM #1:3,
$query = Intersect($query1,$query2);
上述查询结果的Count()为公共顶点数
但是,我不知道如何在我的整个数据集中聚合该查询。我最好的解决方案是蛮力,我遍历每个顶点并 运行 上面的查询针对所有其他顶点(从技术上讲,我做所有顶点 'after' 那个顶点)。
我的解决方案效率低下,必须用 C# 编码,而不是完全用 SQL 完成。如何使用 OrientDb 的 SQL?
完成此操作
您可以将 SELECT 与匹配项一起使用:
SELECT FROM (
SELECT a, b, count(friend) as nFriends from (
MATCH
{class:Person, as:a} -FriendOf- {as:friend} -FriendOf-{as:b, where:($matched.a != $currentMatch)}
RETURN a, b, friend
)
) ORDER BY nFriends
对@Luigi 的回答稍作修改:
SELECT a, b, Count(friend) AS nFriends FROM (
MATCH
{class:Person, as:a} -E- {as:friend} -E- {class:Person, as:b, where:($matched.a != $currentMatch)}
RETURN a, b, friend
) GROUP BY a, b ORDER BY nFriends DESC
我需要 GROUP BY 否则我只会得到一个大数。
我试图找到它们之间具有最多公共顶点的顶点对。它与许多图形数据库演示中使用的 'number of mutual friends' 示例非常相似。我可以使用以下方法确定一对已知顶点之间的相互顶点数:
SELECT Expand($query) LET
$query1 = (SELECT Expand(outE().in) FROM #1:2,
$query2 = (SELECT Expand(OutE().in) FROM #1:3,
$query = Intersect($query1,$query2);
上述查询结果的Count()为公共顶点数
但是,我不知道如何在我的整个数据集中聚合该查询。我最好的解决方案是蛮力,我遍历每个顶点并 运行 上面的查询针对所有其他顶点(从技术上讲,我做所有顶点 'after' 那个顶点)。
我的解决方案效率低下,必须用 C# 编码,而不是完全用 SQL 完成。如何使用 OrientDb 的 SQL?
完成此操作您可以将 SELECT 与匹配项一起使用:
SELECT FROM (
SELECT a, b, count(friend) as nFriends from (
MATCH
{class:Person, as:a} -FriendOf- {as:friend} -FriendOf-{as:b, where:($matched.a != $currentMatch)}
RETURN a, b, friend
)
) ORDER BY nFriends
对@Luigi 的回答稍作修改:
SELECT a, b, Count(friend) AS nFriends FROM (
MATCH
{class:Person, as:a} -E- {as:friend} -E- {class:Person, as:b, where:($matched.a != $currentMatch)}
RETURN a, b, friend
) GROUP BY a, b ORDER BY nFriends DESC
我需要 GROUP BY 否则我只会得到一个大数。