如何在Gremlin中合并具有相同属性的顶点



基本上,如果我有一个图,Rob有一个苹果,Anna也有一个这样的苹果:

Rob--有-->苹果安娜有-->苹果

这显然是一个错误。我只想要一个"苹果"顶点,Rob和Anna的边都是这样的:Rob有-->苹果&lt--有——Anna

Gremlin中是否有一个选项可以将所有顶点与标签"apple"合并",并且仍然具有边?很抱歉问了这个不好的问题,英语不是我的第一语言,我对TT还很陌生希望有人能帮忙。。。

不是在Cypher中你会做

start Rob=node(1), Anna=node(2) match Rob-[:has]->apple<-[:has]-Anna return apple

我认为Gremlin会有点像

rob=1
anna=2
t = new Table()
g.v(rob).out('has').as('apple').in('has').filter{it.id==anna}.table(t,['apple']){it.name}.iterate()

HTH-

/peter

如果苹果的数量可以放入主内存,那么您可以执行以下操作。

apples = [] as Set
g.id(T.v)[[type:'apple']].each{apples.add(it)}
apple = g.addVertex()
apples.each{it.map.each{k,v -> apple[k] = v}
apples.each{it.outE.each{g.addEdge(apple, it.inVertex, it.label)}
apples.each{it.inE.each{g.addEdge(apple, it.outVertex, it.label)}
apples.each{g.removeVertex(it)}

每行执行以下操作:

  1. 创建一组内存中的苹果
  2. 在图中找到你想要合并的所有苹果(我不知道你的数据模型,所以这是最好的假设)
  3. 创建一个新的苹果顶点(合并顶点)
  4. 对于每个苹果,设置新苹果顶点的各自属性(可能覆盖旧苹果属性)
  5. 对于每条传出边,从合并苹果中添加一条类似的边
  6. 对于每个传入的边,向合并苹果添加一条类似的边
  7. 移除所有苹果(除了新的合并苹果)

当你这样做时,要明智地处理交易:https://github.com/tinkerpop/blueprints/wiki/Graph-Transactions