首页 > 解决方案 > 从节点到叶子的 AQL 路径

问题描述

我是 Arango 的新手,我正在尝试了解编写一些查询的“正确”方式。我读过(https://www.arangodb.com/docs/stable/graphs-traversals-using-traversal-objects.html)和(http://jsteemann.github.io/blog/2015/01/28/using -custom-visitors-in-aql-graph-traversals/),因为他们总是在搜索我想要做的事情时弹出。特别是,我有一个图,其中给定节点具有从该节点到叶子的单个路径(通过某种“类型”的边)。类似于 x -a-> y -a-> z。其中 a 是边缘类型,x,y,z 是节点。这些路径可以是任意长度。我想编写一个 AQL 查询,它返回从起始节点到叶节点的单个“最长”路径。我发现我总是得到每个子路径,然后必须做一些后处理。遍历对象看起来像是为这个问题提供了解决方案,但现在它们似乎已被弃用。在 AQL 中是否有正确的方法来执行此操作?是否有文件显示如何做 steemann 在他的文章中所做的事情,但只使用 AQL?除了 arangodb 网站上的内容(我已经阅读了所有这些,包括图形演示和 udemy 课程)之外,是否还有一些关于图形查询的出色 AQL 文档?如果没有,我很乐意写一些东西与社区分享,但我自己还不确定如何做,所以我需要一些可以让我开始的材料的指针。长,短,我只想知道如何运行我的查询来找到从节点到叶子的路径。但是,一旦我看到在没有遍历对象的情况下应该如何完成事情,我会很乐意做出贡献。谢谢您的帮助 但我还不确定自己如何做到这一点,所以我需要一些可以让我开始的材料的指针。长,短,我只想知道如何运行我的查询来找到从节点到叶子的路径。但是,一旦我看到在没有遍历对象的情况下应该如何完成事情,我会很乐意做出贡献。谢谢您的帮助 但我还不确定自己如何做到这一点,所以我需要一些可以让我开始的材料的指针。长,短,我只想知道如何运行我的查询来找到从节点到叶子的路径。但是,一旦我看到在没有遍历对象的情况下应该如何完成事情,我会很乐意做出贡献。谢谢您的帮助

标签: arangodbaqlgraph-traversal

解决方案


OUTBOUND方向遍历为例,您可以进行第二次深度 = 1 的遍历,以检查是否到达叶节点(不再有传入边)。基于此信息,可以过滤掉“短”路径。

请注意,需要第二个条件:如果超过最大遍历深度,则遍历中的最后一个节点可能不是叶节点。因此,您还需要让路径通过,其中包含与您在遍历中所做的跳数一样多的边(此处:5)。

LET maxDepth = 5
FOR v, e, p IN 1..maxDepth OUTBOUND "verts/s" edges
  LET next = (
    FOR vv, ee IN OUTBOUND v edges
      //FILTER ee != e // needed if traversing edges in ANY direction
      LIMIT 1 // optimization, no need to check for more than a single neighbor
      RETURN true // using a constant here, which is not actually used
  )
  FILTER LENGTH(next) == 0 || LENGTH(p.edges) == maxDepth
  RETURN CONCAT_SEPARATOR(" -> ", p.vertices[*]._key)

来自https://groups.google.com/g/arangodb/c/VAo_i_1UHbo/m/ByIUTqIfBAAJ的交叉帖子


推荐阅读