【问题标题】:How to follow a cycle only once?如何只遵循一次循环?
【发布时间】:2017-06-18 06:44:20
【问题描述】:

我是 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,但结果相同。

您是否知道是否可以选择只遍历循环一次或其他任何方式来避免该问题?

谢谢

【问题讨论】:

    标签: graph-databases arangodb


    【解决方案1】:

    如果您只是在寻找 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

    【讨论】:

    • 谢谢我也用了followCycles
    猜你喜欢
    • 2015-09-28
    • 2016-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-24
    • 1970-01-01
    • 2012-07-27
    相关资源
    最近更新 更多