arangodb - 从节点到叶子的 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 文档?如果没有,我很乐意写一些东西与社区分享,但我自己还不确定如何做,所以我需要一些可以让我开始的材料的指针。长,短,我只想知道如何运行我的查询来找到从节点到叶子的路径。但是,一旦我看到在没有遍历对象的情况下应该如何完成事情,我会很乐意做出贡献。谢谢您的帮助 但我还不确定自己如何做到这一点,所以我需要一些可以让我开始的材料的指针。长,短,我只想知道如何运行我的查询来找到从节点到叶子的路径。但是,一旦我看到在没有遍历对象的情况下应该如何完成事情,我会很乐意做出贡献。谢谢您的帮助 但我还不确定自己如何做到这一点,所以我需要一些可以让我开始的材料的指针。长,短,我只想知道如何运行我的查询来找到从节点到叶子的路径。但是,一旦我看到在没有遍历对象的情况下应该如何完成事情,我会很乐意做出贡献。谢谢您的帮助
解决方案
以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的交叉帖子
推荐阅读
- amazon-web-services - Kubernetes Ingress 与 AWS API Gateway 的集成
- html - 分页符上的 CSS 边距
- javascript - TS1086:无法在环境上下文中声明访问器
- firebase - 如何检查给定的电子邮件是否存在于firebase auth中?
- javascript - 对象数组中的 indexOf 问题。反应应用
- javascript - 使用 javascript 创建一个选项场景并将值传递给下一个场景
- database - 如何使用 Sinatra 数据库池
- oracle - 如何将日期插入为空且日期默认为时间戳格式的 sysdate 的表中?
- angular - 以编程方式设置 NgbDatePicker 的日期
- excel - 如何循环 Vlookup 函数直到结果不为空?