You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Amazon Neptune中用Gremlin Python聚合子节点为列表?

问题描述

我有一个有向无环图,节点层级关系为:多个greatgrandparent节点指向grandparent节点,grandparent节点指向多个parent节点,parent节点又指向多个children节点,示例结构如下:

greatgrandparent1 -> grandparent1 -> parent1 -> child1
greatgrandparent1 -> grandparent1 -> parent1-> child2 
greatgrandparent1 -> grandparent1 -> parent2 -> child3 
greatgrandparent1 -> grandparent1 -> parent2 -> child4

我需要从指定grandparent节点出发,向上遍历关联的greatgrandparent节点,同时向下遍历到parent节点及其关联的children节点,期望返回的结果格式为每个parent对应一个children列表:

{'greatgrandparent':  'greatgrandparent1' , 'parent' : 'parent1' , 'children' : ['child1', 'child2', …..]}
{'greatgrandparent':  'greatgrandparent1' , 'parent' : 'parent2' , 'children' : ['child3', 'child4', …..]}

但当前使用Amazon Neptune搭配gremlin_python的查询返回的是每个child单独一行的结果:

{'greatgrandparent':  'greatgrandparent1' , 'grandparent' : 'grandparent1', 'parent' : 'parent1' , 'children' : 'child1'}
{'greatgrandparent':  'greatgrandparent1' , 'grandparent' : 'grandparent1', 'parent' : 'parent1' , 'children' : 'child2'}
{'greatgrandparent':  'greatgrandparent1' , 'grandparent' : 'grandparent1', 'parent' : 'parent2' , 'children' : 'child3'}
{'greatgrandparent':  'greatgrandparent1' , 'grandparent' : 'grandparent1', 'parent' : 'parent2' , 'children' : 'child4'}

当前查询代码如下:

g.V()
.has('grandparent', 'name', 'grandparent1').as_('grandparent')
.repeat(timeLimit(1000).in()).until(hasLabel('greatgrandparent'))
.dedup().order().by('name').as_('greatgrandparent')
.select('grandparent').repeat(timeLimit(1000).out()).until(hasLabel('parent'))
.dedup().order().by('name').as_('parent')
.repeat(timeLimit(1000).out()).until(hasLabel('children'))
.dedup().order().by('name').as_('children')
.select('greatgrandparent','grandparent','parent', 'children').by('name')

请问如何修改查询,让每个parent对应的children以列表形式返回?

解决方案

你需要使用Gremlin的fold()步骤聚合每个parent下的children节点,同时通过project()组织结果结构。修改后的查询代码如下:

g.V()
.has('grandparent', 'name', 'grandparent1').as_('gp')
# 向上获取关联的greatgrandparent节点
.in().hasLabel('greatgrandparent').dedup().order().by('name').as_('ggp')
# 从grandparent向下遍历到parent节点
.select('gp').out().hasLabel('parent').dedup().order().by('name')
# 构造目标结果格式,聚合children为列表
.project('greatgrandparent', 'parent', 'children')
.by(select('ggp').values('name'))
.by(values('name'))
.by(out().hasLabel('children').dedup().order().by('name').values('name').fold())

修改说明:

  1. 简化遍历逻辑:去掉不必要的repeat()步骤,直接用in()/out()结合hasLabel()定位节点——因为你的层级关系是固定的,不需要循环遍历,这样更高效。
  2. 核心聚合操作:在project()的children字段中,用fold()将当前parent下的所有children节点的name值收集为一个列表,这是实现批量返回的关键。
  3. 精简结果字段:移除了不需要的grandparent字段,完全匹配你期望的输出格式。

如果你的层级存在不确定深度(比如parent可能多层子节点才到children),可以把out().hasLabel('children')替换为repeat(out()).until(hasLabel('children')),适配更复杂的结构。

内容的提问来源于stack exchange,提问作者Anil_M

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 16:10:24