在ArangoDB中加入遍历对象结果

时间:2016-05-02 14:42:44

标签: join arangodb aql

我正在使用ArangoDB的traversal object来遍历递归组成员资格结构,同时避免跟随周期。在某些情况下,我需要加入两个单独遍历的结果。是否有一种有效的方法可以利用AQL来加入遍历结果?我目前正在使用javascript加入内存中的结果。

1 个答案:

答案 0 :(得分:2)

我想使用the traversal graph解释一下。我们在ANY方向进行两次遍历,因此结果数量会更大一些。我们从具有共同邻居的点开始,这将成为连接操作的结果。一个查询将查看AE,它们应该共有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