如何使用Gremlin中的公共节点创建新边?

如何使用Gremlin中的公共节点创建新边?,gremlin,Gremlin,假设 A、B、C、D为公司(公司名称),P1、P2、P3、P4为母公司(母公司名称) 它们的关系如下: P1 <- sub_of - A ->sells ->B -> sub_of -> P1 P1 <- sub_of - C ->sells-> D -> sub_of -> P2 P3 <- sub_of - A ->sells ->C -> sub_of -> P3 P4 <- su

假设

A、B、C、D为公司(公司名称),P1、P2、P3、P4为母公司(母公司名称)

它们的关系如下:

P1 <- sub_of - A ->sells ->B -> sub_of -> P1   
P1 <- sub_of - C ->sells-> D -> sub_of -> P2  
P3 <- sub_of - A ->sells ->C -> sub_of -> P3  
P4 <- sub_of - D ->sells ->B -> sub_of -> P1
P1 <- sub_of - A ->sells2010-> B -> sub_of -> P1  
P1 <- sub_of - A ->sells2011-> B -> sub_of -> P4  
P1 <- sub_of - A ->in_country-> B -> sub_of -> P1
==>[v[C],v[A]]
==>[v[B],v[A]]

x = []
g.E.has('label','sells').filter{it.inV.out('SUB_OF').next()==it.outV.out('SUB_OF').next()}.transform({[it.inV().next(),it.outV().next()]}).dedup().aggregate(x)
for ( i in x ) {
    c = i[0] 
    d = i[1]
    g.addEdge(c, d, "sells_I", [amt : 100])
}
是否可以创建新的边缘sells_I,然后删除旧的sells边缘,如下所示?因为我的原始数据集中有太多的边/节点。我可以用BatchGraph来做这个吗

下面的查询抛出错误

g.E.has('label','sells').filter{it.inV.out('SUB_OF').next()==it.outV.out('SUB_OF').next()}.transform({[it.inV().next(),it.outV().next()]}).sideEffect{g.addEdge(it.inVertex, it.outVertex, 'sells_I'); g.removeEdge(it)}


or

g.E.has('label','sells').filter{it.inV.out('SUB_OF').next()==it.outV.out('SUB_OF').next()}.transform({[it.inV().next(),it.outV().next()]}).sideEffect{g.addEdge(it.inV().next(), it.outV().next(), 'sells_I'); g.removeEdge(it)}
有什么建议或帮助吗


谢谢。:)

迭代您关心的边标签的边,然后过滤父项相等的位置:

g.E.has('label','sells').filter{it.inV.out('sub_of').next()==it.outV.out('sub_of').next()}

这将为您提供需要新边的顶点对列表。为了避免重复,您可以使用
dedup
扩展上述语句,或者自己将它们聚合到
集合中。一旦设置好,您就可以创建新的边。

感谢Stephen的帮助。我在更新的帖子中尝试了这些。在这方面还需要一些帮助。您不能使用
BatchGraph
,因为它不允许您删除边。你没有说你得到的错误是什么,所以我只能在这里猜测,但我看不出你在哪里做任何形式的中介
commit()
…如果你的数据集很大,你可能会发现事务大小正在失控增长。在图形中投入更多内存,并使用计数器跟踪边缘突变,并在某个定义的时间间隔提交,该时间间隔对您的案例有很好的效果。也许这会有所帮助。
g.E.has('label','sells').filter{it.inV.out('sub_of').next()==it.outV.out('sub_of').next()}