我有一个正常的节点链接图
为了获取所有链接,我想得到与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?
答案 0 :(得分:1)
我认为问题是OPTIONS {uniqueVertices: "global"}
。
这强制每个顶点最多访问一次。
因此,如果有两条到达差异长度的顶点的路径,则只会遍历其中一条,另一条路径将被排除。如果没有bfs: true
,则uniqueVertices: '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, X
和否 E
。
如果您使用bfs: true
,则会按升序深度分析所有路径。因此,对于任何遇到上述示例中遇到的麻烦的顶点,都没有任何更短的方法。
这里的结果是确定性的,定义明确。
但是,您在讨论实体之间的所有links
。
请注意,如果你说:uniqueVertices: 'global'
,最多只有一条边指向你返回的任何实体(也是基于遍历排序选择的)。如果您希望在实体之间拥有所有边缘,则可能希望不使用uniqueVertex
选项。