【问题标题】:Why this Arangodb query max depth is not correct为什么这个 Arangodb 查询最大深度不正确
【发布时间】:2016-10-27 10:32:40
【问题描述】:

我有一个正常的节点链接图

为了获取所有链接,我想获取与 x 最大深度相关的节点。但是下面的查询返回了不正确的结果(81 个中的 64 个)。但是它们之间的最大深度就像 7。我哪里出错了?

FOR v IN 0..14 ANY "Entity/41591987" EntityRelation 
OPTIONS {uniqueVertices: "global"} return v

编辑 1: 添加 bfs: true 选项似乎解决了问题,但我不明白为什么。


编辑 2: 我的完整查询是

   //get all the vertices related to this one id
    FOR v IN 0..9 ANY "EntityProd/58868489" EntityRelationProd 
    OPTIONS  {uniqueVertices: "global",bfs:true}
    //from each of above results, get the incoming and outgoing edges
    FOR vv, c IN ANY v EntityRelationProd RETURN c

关键是我已经得到了正确的结果来获取所有顶点。为什么“uniqueVertices:global”会影响我的第二部分?还是我必须重新指定选项?

【问题讨论】:

    标签: arangodb graph-traversal


    【解决方案1】:

    我认为问题是OPTIONS {uniqueVertices: "global"}。 这强制每个顶点最多访问一次。 因此,如果有两条通往不同长度顶点的路径,则只有其中一条将被遍历,而另一条则被排除在外。如果没有bfs: trueuniqueVertices: 'global' 的结果不是确定性的。

    让我用下面的例子来说明它。我们有 6 个按字母顺序连接的顶点:

    (A) -> (B) -> (C) -> (D) -> (E) -> (F)
    

    比我们有另一个顶点 X 添加一个快捷方式:

    (A) -> (X) -> (D)
    

    现在让我们执行上面的遍历,深度为1..3,从(A)开始。 在A,我们有两个选择,要么先选择B,要么先选择X。 让我们选择X 然后我们为这个子图返回X, D, E。然后我们回到A 并选择另一个选项。 我们有B, C。我们确实返回D,因为它已经被访问过。 所以在这种情况下,我们得到:X, D, E, B, C

    如果我们在A 选择另一个选项,结果会有所不同。 首先我们找到B, C, D,这仍然与另一个选择一致。 但是如果我们继续搜索X,麻烦就开始了。 我们选择X 并查看D。 不幸的是,D 已经返回,所以我们停在这里。 因此结果是:B, C, D, Xno E

    如果您使用bfs: true,则所有路径都会按升序深度进行分析。因此,对于任何会遇到我们在上面示例中遇到的麻烦的顶点,都没有更短的方法。 这里的结果是确定性和明确定义的。

    但是,您谈论的是实体之间的所有links。 请注意,如果您说:uniqueVertices: 'global' 最多会有一个边缘指向您返回的任何实体(也根据遍历顺序选择)。如果您想在实体之间拥有所有边缘,您可能希望不使用 uniqueVertex 选项。

    【讨论】:

    • 我认为我对图遍历的知识存在差距。我更新了问题以更好地表达对我的查询的当前理解
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-24
    • 2014-06-15
    • 2020-07-06
    • 1970-01-01
    • 2015-01-08
    • 1970-01-01
    相关资源
    最近更新 更多