ArangoDB 从节点到叶的AQL路径

f2uvfpb9  于 2022-12-09  发布在  Go
关注(0)|答案(1)|浏览(187)

我是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站点上的文档之外,有没有一些关于图查询的优秀AQL文档(所有这些我都已经读过了,包括图表演示和udemy课程)?如果没有,我很乐意写一些东西与社区分享,但我自己还不确定如何做,所以我需要一些可以让我开始的材料的指针。长,短,我只是想知道如何运行我的查询来找到从节点到叶子的路径。但是,一旦我看到没有遍历对象应该如何完成,我会很高兴地贡献自己的力量。谢谢你的帮助

1dkrff03

1dkrff031#

Taking a traversal in OUTBOUND direction as example, you can do a second traversal with depth = 1 to check if you reached a leaf node (no more incoming edges). Based on this information, the “short” paths can be filtered out.
Note that a second condition is required: it is possible that the last node in a traversal is not a leaf node if the maximum traversal depth is exceeded. Thus, you need to also let paths through, which contain as many edges as hops you do in the traversal (here: 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)

相关问题