Gremlin遍历DAG时如何基于存储集合过滤Level3节点
问题分析与解决方案
原查询的核心问题
- 嵌套属性访问错误:Level3节点的
level1_node是嵌套在attributesMap属性中的,原查询直接使用values('level1_node')无法获取对应值,导致后续过滤条件完全不匹配。 - 遍历对象丢失:原查询调用
values('level1_node')后,遍历对象从Level3节点变成了属性值,最终存储的是字符串而非节点,不符合预期结果要求。
修正后的查询代码
# 方案:收集Level1节点名称集合,遍历过滤符合条件的Level3节点 level3_list = g.V().has('level0', 'name', 'node0')\ .out('links').aggregate('level1_names').by('name')\ .out('links').out('links')\ .hasLabel('level3')\ .where(__.values('attributes').get('level1_node').within('level1_names'))\ .fold().next() # 打印节点名称验证结果 for node in level3_list: print(node.value('name'))
代码说明
aggregate('level1_names').by('name'):将Level0直接关联的Level1节点名称收集到集合中,供后续过滤使用。.out('links').out('links'):从Level0出发,经过两层links边直接到达Level3节点,也可以用repeat(out('links')).times(3)实现相同遍历逻辑。values('attributes').get('level1_node'):正确读取Level3节点中attributesMap内的level1_node值,部分图数据库支持简化写法values('attributes.level1_node')。where(within('level1_names')):过滤出level1_node值属于Level1节点名称集合的Level3节点。fold():将所有符合条件的Level3节点汇总为列表,与预期的level3_list结构一致。
实际输出结果
根据你的建图代码,执行后会得到以下Level3节点列表:[v[5], v[6], v[7]],对应的名称分别是node1-suffix1、node2-suffix2、node3-suffix1(注:你预期中的suffix2可能是笔误,需以实际建图数据为准)。
内容的提问来源于stack exchange,提问作者Anil_M
相关产品推荐
相关产品推荐

