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

时间:2012-01-09 17:51:20

标签: neo4j graph-databases

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

罗布 - 哈斯 - >苹果 安娜 - 哈斯 - >苹果

这显然是一个错误。我只想要一个带有Rob和Anna边缘的“苹果”顶点:  Rob - has - > apple< - has - Anna

Gremlin中有一个选项可以将所有顶点与标签'apple'“合并”并且仍然有边缘吗? 对不起这个糟糕的问题,英语不是我的第一语言,我在这个TT上相当新 希望有人可以提供帮助......

2 个答案:

答案 0 :(得分:0)

不在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

/彼得

答案 1 :(得分:0)

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

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. 删除所有苹果(新合并苹果除外)。
  8. 执行此操作时要善于处理事务:    https://github.com/tinkerpop/blueprints/wiki/Graph-Transactions