【问题标题】:Join traversal object results in ArangoDB在 ArangoDB 中加入遍历对象结果
【发布时间】:2016-08-24 19:17:02
【问题描述】:

我正在使用 ArangoDB 的 traversal object 来遍历递归组成员结构,同时避免后续循环。在某些情况下,我需要加入两个单独遍历的结果。有没有一种有效的方法来利用AQL 加入遍历结果?我目前正在使用 javascript 将结果加入内存中。

【问题讨论】:

  • 答案对您有用吗?如果是,您可以将其标记为“已接受”吗?如果没有,缺少什么?
  • @dothebart 感谢您的回答。我最近没有机会看到这个问题,因为我们团队的优先级发生了变化,但是我过去尝试过类似于您的建议的方法,它确实给出了正确的结果,但性能很差。此外,我的特定问题有很多周期,反复访问同一个节点会导致性能进一步下降。因此,除了找到多组访问顶点之间的交集(每棵树的深度可能在 5 左右)之外,查询还需要指定一种避免循环的方法。
  • 我已使用 GRAPH_NEIGHBORS 函数从节点获取顶点以避免循环,但是对它进行多次调用或与其调用的多个结果相交会导致性能不佳。
  • 请注意,ArangoDB 3.0 不推荐使用 GRAPH_* 函数; see our migration guide how to upgrade。一般来说,您应该在单独的文章中分享您的解决方案,以便其他人也可以参考。

标签: join arangodb aql


【解决方案1】:

我想用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

【讨论】:

    猜你喜欢
    • 2023-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-15
    • 1970-01-01
    • 2021-07-07
    • 2010-09-07
    • 1970-01-01
    相关资源
    最近更新 更多