【问题标题】:Filtering a return group by traversal in ArangoDB在 ArangoDB 中通过遍历过滤返回组
【发布时间】:2022-08-19 03:13:45
【问题描述】:

我正在评估要使用 ArangoDB 来代替 OrientDB。我的数据集本质上是一个不必要连接的树的森林(家谱)。

因为数据集是一个有向无环图(一棵树),所以沿着树上走寻找东西总是比沿着树下走更有效。

在 OrientDB 的早期版本中,在他们为我删除这个关键特性之前,我能够执行以下查询:

SELECT FROM Person WHERE haircolor = \"Red\" and in traverse(0, -1, \"in\") (birth_country = \"Ireland\")

由于 haircolor 是一个索引字段,因此获取所有这些顶点是有效的。神奇之处在于 WHERE 子句中的遍历运算符,如果它找到来自爱尔兰的任何祖先,它会停止遍历并立即返回 TRUE。

是的,你可以把它转过来,寻找所有来自爱尔兰的人,然后向下走,寻找那些讨厌的红发女郎,将它们归还,但它的效率要低得多,因为你必须评估每条向下的路径,这可能会呈指数级增长。

由于 OrientDB 通过删除该功能(在我看来)是在踢自己的脚,我想知道是否有一个 ArangoDB 查询可以在不走下树的情况下执行类似的任务。

在此先感谢您的帮助!

    标签: orientdb traversal arangodb


    【解决方案1】:

    在 AQL 中,它会是这样的:

    FOR redhead IN Person                             // Find start vertices
      FILTER doc.haircolor == "Red"
      FOR v, e, p IN 1..99 INBOUND redhead Ancestor   // Traversal up to depth 99
        PRUNE v.birth_country == "Ireland"            // Don't walk further if condition is met
        RETURN p                                      // Return the entire path
    

    这假设关系(边)存储在名为Ancestor 的边集合中。

    PRUNE 防止进一步向下(或此处:向上)路径遍历,但包括它所在的节点。 https://www.arangodb.com/docs/stable/aql/graphs-traversals.html#pruning

    请注意,可变深度遍历不仅返回最长路径,还返回同一路线的“中间”路径。您可能希望在客户端将它们过滤掉,或者以额外的遍历为代价查看此 AQL 解决方案:https://stackoverflow.com/a/64931939/2044940

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多