OrientDb Vertices与大多数共同朋友

时间:2017-03-15 16:00:22

标签: orientdb

我试图找到它们之间具有最多公共顶点的顶点对。这与共同朋友的数量非常相似。许多图形数据库演示中使用的示例。我可以使用以下方法确定一对已知顶点之间的相互顶点数:

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()结果是公共顶点的数量。

但是,我无法弄清楚如何在整个数据集中聚合该查询。我最好的解决方案是蛮力,我遍历每个顶点并对所有其他顶点运行上述查询(从技术上讲,我执行所有顶点'在'顶点之后)。

我的解决方案效率低下,必须用C#编码,而不是完全用SQL编写。如何使用OrientDb的SQL来完成?

2 个答案:

答案 0 :(得分:1)

您可以将SELECT与MATCH一起使用:

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

答案 1 :(得分:0)

对@ 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或者我只需要一个大数据。