如何获取ArangoDB中指定节点的最大遍历深度?
如何高效获取ArangoDB中节点的最大遍历深度
你原来的方法效率极低,核心问题是重复遍历+无效范围过大,完全没必要这么做。直接用一次AQL查询就能算出最大深度,不用反复试值。
问题分析
你之前的思路是迭代设置不同的n值,查特定深度的节点直到返回空,这种方式的弊端:
- 每次查询都要重新遍历对应深度的节点,重复计算浪费资源
- 设极大
n会让单次查询遍历范围爆炸,耗时剧增 - 加了
LIMIT 100可能截断有效结果,导致误判最大深度
高效解决方案
利用AQL的聚合功能,在一次遍历中直接计算所有可达节点的最大深度:
FOR v, e, p IN 0..INFINITY INBOUND 'all_company_data/6065e30a85a7200b323a317f' GRAPH Final_graph OPTIONS {bfs: false, uniqueVertices: 'global', maxIterations: 100000} COLLECT AGGREGATE max_depth = MAX(LENGTH(p.edges)) RETURN max_depth
代码解释
0..INFINITY:从起始节点本身(深度0)开始遍历所有可达节点,确保覆盖所有可能的层级LENGTH(p.edges):路径中的边数就是当前节点相对于起始节点的深度(起始节点边数为0,直接相连的节点边数为1,以此类推)COLLECT AGGREGATE max_depth = MAX(...):直接聚合所有路径的深度,取最大值作为结果OPTIONS配置:bfs: false:用深度优先遍历(DFS)更适合探索最长路径,避免BFS提前终止在浅层节点uniqueVertices: 'global':每个节点只访问一次,防止环导致的无限遍历,同时减少重复计算maxIterations: 100000:保留你原来的迭代上限,防止极端情况导致的性能问题
额外说明
如果你认为起始节点的深度为1(而非0),只需把返回值改成max_depth + 1即可:
FOR v, e, p IN 0..INFINITY INBOUND 'all_company_data/6065e30a85a7200b323a317f' GRAPH Final_graph OPTIONS {bfs: false, uniqueVertices: 'global', maxIterations: 100000} COLLECT AGGREGATE max_depth = MAX(LENGTH(p.edges)) RETURN max_depth + 1
内容的提问来源于stack exchange,提问作者himanshu jha
相关产品推荐
相关产品推荐

