Gremlin查询问题:从指定起点递归查找后代关联边
Gremlin查询优化:递归获取指定起点的所有后代边
问题描述
给定人物节点图,边类型为has child,需要从指定起点递归查找所有后代关联的边,要求:
- 起点为单个或多个节点(可能包含同一路径上的多个节点)
- 每条关联边仅返回一次,示例如下:
a -> b -> c d -> b (起点 = [c]) => [] (起点 = [b]) => [b->c] (起点 = [a,b,c]) => [a->b, b->c] (起点 = [d]) => [d->b, b->c]
原查询通过生成完整路径再展开过滤边,在多起点同路径场景下存在冗余处理问题,无法高效输出正确结果。
优化后的查询方案
方案一:边遍历过程中去重(高效版)
利用aggregate和where(without)在遍历阶段直接避免重复处理同一条边,无需后续去重,性能更优:
g.V() .has('name', within('a', 'b', 'c')) // 替换为你的起点过滤条件 .sideEffect(aggregate('startNodes')) // 记录所有起点节点 .repeat( outE('has child') .where(without('processedEdges')) // 只处理未记录的边 .aggregate('processedEdges') // 标记该边已处理 .inV() ) .emit() .select('processedEdges') .unfold()
方案二:收集所有边后去重(简洁版)
通过emit直接收集遍历过程中的所有边,最后统一去重,逻辑直观适合小数据量场景:
g.V() .has('name', within('a', 'b', 'c')) // 替换为你的起点过滤条件 .repeat(outE('has child').as('edge').inV()) .emit(select('edge')) // 每次遍历到边就输出 .select('edge') .dedup()
方案说明
- 方案一在遍历阶段就跳过已处理的边,避免了重复遍历和后续去重操作,适合大规模图数据。
- 方案二代码简洁直观,先收集所有符合条件的边再去重,适合数据量不大的场景。
内容的提问来源于stack exchange,提问作者Zeusko
相关产品推荐
相关产品推荐

