为什么这个Arangodb查询最大深度不正确

时间:2016-10-27 10:32:40

标签: arangodb graph-traversal

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

为了获取所有链接,我想得到与x max深度相关的节点。但是下面的查询返回了错误的结果(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”会影响我的第二部分?或者我是否必须重新指定OPTIONS?

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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

现在让我们从1..3开始执行深度(A)上面的遍历。 在A,我们有两个选项,首先选择BX。 我们选择X 然后我们为此子图返回X, D, E。我们回到A并选择其他选项。 我们有B, C。我们返回D,因为它已被访问过。 因此,在这种情况下,我们会:X, D, E, B, C作为结果。

如果我们在A选择其他选项,结果会有所不同。 首先我们找到B, C, D,这仍然与另一个选择一致。 但是如果我们继续搜索X,那么问题就开始了。 我们选择X并查看D。 很遗憾D已经退回,所以我们就此止步。 因此,结果是:B, C, D, X E

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

但是,您在讨论实体之间的所有links。 请注意,如果你说:uniqueVertices: 'global',最多只有一条边指向你返回的任何实体(也是基于遍历排序选择的)。如果您希望在实体之间拥有所有边缘,则可能希望不使用uniqueVertex选项。