2013-11-01 81 views
0

假設,如何在Gremlin中使用公共節點創建新邊緣?

A,B,C,d是公司(companiesName)和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 

哪裏賣的有屬性totalCount和金額。

我想創造像sells_I,sells2010_I等新的邊緣,如果公司有commonparentNode按照第1,3,5行。但在第6行in_country邊也滿足條件。我不想包括這個邊緣。

作爲每個給定的通過@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()]}) 

==> [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,然後刪除舊的邊緣如下?因爲我的原始數據集中有很多邊緣/節點。我可以爲此使用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

迭代爲你計較,然後過濾邊緣標籤的優勢又在哪裏,父母是平等的:

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

這會給你需要一個新的邊緣頂點對的列表。爲避免重複,您可以使用dedup擴展上述語句或自行將它們聚合到Set。一旦你有了這個設定,你就可以創造出新的邊緣。

+0

感謝Stephen的幫助。我用我的更新後的帖子嘗試這些。還需要一些更多的幫助。 – Abhi

+1

您不能使用'BatchGraph',因爲它不允許刪除邊緣。你不會說錯誤是你得到的,所以我只能在這裏猜測,但我不知道你在做什麼樣的intermedia'commit()'......如果你的數據集非常大,你可能會發現交易規模正在失控。在圖表上投入更多的內存,並使用計數器來跟蹤邊緣突變,並在某個確定的時間間隔進行提交,這對您的情況表現良好。也許這會有所幫助。 –

+0

謝謝。正如你所說的那樣工作。 :) – Abhi

相關問題