我正在使用ArangoDB的traversal object来遍历递归组成员资格结构,同时避免跟随周期。在某些情况下,我需要加入两个单独遍历的结果。是否有一种有效的方法可以利用AQL来加入遍历结果?我目前正在使用javascript加入内存中的结果。
答案 0 :(得分:2)
我想使用the traversal graph解释一下。我们在ANY
方向进行两次遍历,因此结果数量会更大一些。我们从具有共同邻居的点开始,这将成为连接操作的结果。一个查询将查看A
和E
,它们应该共有B
,但其他迭代不是。
基本迭代:
FOR v IN 1..1 ANY 'circles/A' GRAPH 'traversalGraph' RETURN v._key
从circles/A
开始,这会产生["B","G"]
,从circles/E
开始会产生["F", "B"]
- 所以很明显,我们应该只得到"B"
加入的结果。
我们的第一种可能方法是使用两个子查询并使用INTERSECTION
加入它们:
LET firstTraversal = (FOR v IN 1..1 ANY 'circles/A' GRAPH 'traversalGraph' RETURN v)
LET secondTraversal = (FOR v IN 1..1 ANY 'circles/E' GRAPH 'traversalGraph' RETURN v)
RETURN INTERSECTION(firstTraversal, secondTraversal)
这里可能存在的问题是,将完成对象的全面深度比较,这可能变得昂贵。因此,另一种方法可能是使用_key
属性加入它们:
LET firstTraversal = (FOR v IN 1..1 ANY 'circles/A' GRAPH 'traversalGraph' RETURN v)
LET secondTraversal = (FOR v IN 1..1 ANY 'circles/E' GRAPH 'traversalGraph' RETURN v)
FOR oneSet IN firstTraversal
FOR otherSet IN secondTraversal
FILTER oneSet._key == otherSet._key RETURN oneSet