在Amazon Neptune中用TinkerPop3的Gremlin查询连接顶点信息
Gremlin查询:将出边结果中的边ID替换为目标顶点ID
要实现将出边结果里的边ID替换为对应目标顶点ID的需求,可以通过以下两种方式修改你的Gremlin查询:
方式一:使用project精确控制返回结构
适合需要固定返回label、p、vertex_id三个字段的场景:
GraphTraversal<Vertex, Map<Object, Object>> x = g.V("694837") .outE() .as("edge") .inV() .project("label", "p", "vertex_id") .by(__.select("edge").label()) .by(__.select("edge").values("p").orElse(null)) .by(T.id);
步骤说明:
outE().as("edge"):遍历起始顶点的所有出边,并将边标记为edge以便后续引用inV():获取每条出边连接的目标顶点project(...):构造指定键的结果Map- 三个
by()分别为label赋值边的标签、为p赋值边的p属性(无该属性时返回null)、为vertex_id赋值目标顶点的ID
方式二:使用map动态保留所有边属性
如果需要保留边的所有原有属性(不限于p),仅替换边ID为顶点ID,可使用自定义映射:
GraphTraversal<Vertex, Map<Object, Object>> x = g.V("694837") .outE() .as("edge") .inV() .map(traversal -> { Edge edge = traversal.get("edge"); // 获取边的所有属性和标签 Map<Object, Object> result = new HashMap<>(edge.valueMap()); result.put("label", edge.label()); // 移除边ID,添加目标顶点ID result.remove(T.id); result.put("vertex_id", traversal.get().id()); return result; });
步骤说明:
- 同样先遍历出边并标记,获取目标顶点
- 通过
map()自定义处理逻辑:- 获取边的所有属性并添加边标签
- 删除原有边ID字段
- 添加
vertex_id字段并赋值为目标顶点ID
两种方式最终返回的结果都会符合你期望的格式,例如:
[ {label=match, p=0.69, vertex_id=39085}, {label=match, p=0.4, vertex_id=482928}, {label=has, vertex_id=TL}, ... ]
内容的提问来源于stack exchange,提问作者Scott Lewis
相关产品推荐
相关产品推荐

