由于您没有提供我的示例图表,我将使用TinkerPop的玩具图表来展示它是如何完成的。
假设您要合并 marko 和 lop :
marko
lop
gremlin> g = TinkerFactory.createModern().traversal() ==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard] gremlin> g.V(1).valueMap() ==>[name:[marko],age:[29]] gremlin> g.V(1).out("created").valueMap() ==>[name:[lop],lang:[java]]
注意,有两个 name 属性和理论上你将无法预测哪个 name 使它成为你的合并结果;但是,这似乎不是图表中的问题。
name
获取两个顶点的属性:
gremlin> g.V(1).union(identity(), out("created")).valueMap() ==>[name:[marko],age:[29]] ==>[name:[lop],lang:[java]]
合并他们:
gremlin> g.V(1).union(identity(), out("created")).valueMap(). unfold().group().by(select(keys)).by(select(values)) ==>[name:[lop],lang:[java],age:[29]]
的 UPDATE 强>
感谢您添加的示例输出。这使得提出解决方案变得容易得多(虽然我认为你的输出包含错误; vadas没有创建任何东西)。
gremlin> g.V().hasLabel("person"). filter(outE("created")).map( union(valueMap(), outE("created").limit(1).inV().valueMap("lang")). unfold().group().by {it.getKey()}.by {it.getValue()}) ==>[name:[marko], lang:[java], age:[29]] ==>[name:[josh], lang:[java], age:[32]] ==>[name:[peter], lang:[java], age:[35]]
使用gremlin java DSL合并边缘和顶点属性:
g.V().has('User', 'id', userDbId).outE(Edges.TWEETS) .union(__.identity().valueMap(), __.inV().valueMap()) .unfold().group().by(__.select(Column.keys)).by(__.select(Column.values)) .map(v -> converter.toTweet((Map) v.get())).toList();