基于指定节点获取完整Gremlin层级结构的问题求助
解决方案
一、修改现有代码的去重逻辑
直接把去重判断的键从(outV.id, inV.id)改成(outV.id, inV.id, label),就能保留相同节点对之间不同类型的关联边。另外注意你原代码里把节点的~label当成了实体名称,这是个错误——节点名称存在entity_name属性里,~label是节点的类型标签,需要修正:
graph_result = g.V(entity_id).repeat(inE().outV().dedup()).emit().path().toList() unique_ids = set() results = [] for path in graph_result: for item in path: if type(item) == Edge: # 改用三元组作为去重标识 key = (item.outV.id, item.inV.id, item.label) if key not in unique_ids: unique_ids.add(key) results.append({ "src_entity_id": item.outV.id, "src_entity_name": item.outV.property('entity_name').value(), # 修正为entity_name属性 "target_entity_id": item.inV.id, "target_entity_name": item.inV.property('entity_name').value(), # 修正为entity_name属性 "association": item.label, "journey_id": item.property('journey_id').value() # 可选:如果需要返回journey_id })
二、更高效的Gremlin查询实现
上面的方式需要客户端遍历所有路径再去重,效率偏低。可以让Gremlin在查询层面直接返回去重后的边,减少数据传输和客户端处理成本:
# 直接查询所有关联边并在Gremlin侧完成去重 edges_result = g.V(entity_id) .repeat(inE().outV()) .emit() .inE() # 收集所有遍历到的边 .dedup() .by(outV().id()) .by(inV().id()) .by(label()) .toList() results = [] for edge in edges_result: src_v = edge.outV() target_v = edge.inV() results.append({ "src_entity_id": src_v.id(), "src_entity_name": src_v.property('entity_name').value(), "target_entity_id": target_v.id(), "target_entity_name": target_v.property('entity_name').value(), "association": edge.label(), "journey_id": edge.property('journey_id').value() })
说明
repeat(inE().outV()).emit():从起始节点出发,递归遍历所有入边对应的源节点(即你的子节点及深层子节点)dedup().by(outV().id()).by(inV().id()).by(label()):基于边的源节点ID、目标节点ID、边标签三重维度去重,确保相同节点对的同类型边只返回一次- 这种方式无需处理路径,直接返回去重后的边,代码更简洁,性能更优
内容的提问来源于stack exchange,提问作者ak4550126
相关产品推荐
相关产品推荐

