如何只关注一个周期?

时间:2017-06-18 06:44:21

标签: graph-databases arangodb

我是一个新的ArangoDB用户,我遇到了一个问题,我不知道如何解决它。我有一个由超过340k节点组成的图形和超过430k链接与循环,我试图找到A和B之间的路径。我知道在这两个节点之间的路径中我会遇到循环所以我使用了选项 followCycles 。作为查询,我使用了一些东西:

FOR target, unused, path IN 1..150 OUTBOUND "A" connected OPTIONS {followCycles: True, uniqueEdges: "none"} FILTER target._id == "B" LIMIT 1 RETURN path

IMO此查询应该返回A和B之间的路径,同时考虑循环。不幸的是,由于图的维度,查询无法找到路径并且它“永远”运行。

无论如何,我注意到如果我使用中间节点,我就能找到路径。我做了类似的事情:

FOR target, unused, path IN 1..150 OUTBOUND "A" connected OPTIONS {followCycles: True, uniqueEdges: "none"} FILTER target._id == "intermediate" LIMIT 1 RETURN path

FOR target, unused, path IN 1..150 OUTBOUND "intermediate" connected OPTIONS {followCycles: True, uniqueEdges: "none"} FILTER target._id == "B" LIMIT 1 RETURN path 我怀疑由于循环值150是不够的,我还尝试使用15000,但我得到了相同的结果。

你知道是否有一个选项可以说只循环一次循环或其他任何东西以避免这个问题?

由于

1 个答案:

答案 0 :(得分:0)

如果您只想查找AB之间的任何路径,则以下查询应该对您有效。

FOR target, unused, path IN 1..150 OUTBOUND "myCollection/A" connected
OPTIONS {uniqueVertices: "global", bfs: true}
  FILTER target._id == "myCollection/B"
  LIMIT 1
  RETURN path

使用uniqueVertices: "global"每个顶点(节点)仅在遍历期间访问一次。这意味着不遵循循环。

使用bfs: true,您可以使用广度优先算法。这意味着遍历首先遍历所有找到的深度1然后是2的顶点,依此类推。使用此功能可以避免在达到最大深度(150)之前遵循路径来查找路径更短,以确认它们没有连接路径。

有关AQL图遍历的更多信息,您应该查看docs