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

时间:2013-11-01 20:41:59

标签: gremlin

假设,

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

他们的关系如下:

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

其中sells edge具有属性totalCount和amount。

我想创建新的边缘,如sells_I,sells2010_I等,如果公司按照第1,3,5行的公共广告节点。但是第6行in_country边缘也满足条件。我不想包括这个边缘。< / p>

根据@Stephen给出的答案:

g = new TinkerGraph()
P1 = g.addVertex("P1")
P2 = g.addVertex("P2")
P3 = g.addVertex("P3")
P4 = g.addVertex("P4")
A = g.addVertex("A")
B = g.addVertex("B")
C = g.addVertex("C")
D = g.addVertex("D")

g.addEdge(A, P1, "SUB_OF")
g.addEdge(B, P1, "SUB_OF")
g.addEdge(C, P1, "SUB_OF")
g.addEdge(D, P2, "SUB_OF")
g.addEdge(A, P3, "SUB_OF")
g.addEdge(C, P3, "SUB_OF")
g.addEdge(D, P4, "SUB_OF")
g.addEdge(B, P4, "SUB_OF")
g.addEdge(A, B, "sells")
g.addEdge(C, D, "sells")
g.addEdge(A, C, "sells")
g.addEdge(D, B, "sells")
g.addEdge(A, B, "sells2010")
g.addEdge(A, B, "sells2011")
g.addEdge(A, B, "IN_COUNTRY")

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()]})

==&gt; [v [C],v [A]]
==&gt; [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,之后删除旧的销售边缘如下?因为我的原始数据集中有很多边/节点。我可以使用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)}

任何建议或帮助?

感谢。 :)

1 个答案:

答案 0 :(得分:1)

迭代您关注的边缘标签的边缘,然后过滤父母等于的位置:

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

这将为您提供需要新边的顶点对列表。为避免重复,您可以使用dedup扩展上述语句,或者将它们自行聚合到Set。拥有该套装后,您可以创建新的边缘。