2016-12-09 34 views
5

如何遍歷圖並遞增頂點屬性的值?要麼通過某個固定的金額,要麼通過一個通向它的邊緣的屬性。如何增加TinkerPop圖中的頂點屬性值

例如。用下圖:

gremlin> graph = TinkerGraph.open() 
==>tinkergraph[vertices:0 edges:0] 
gremlin> g = graph.traversal() 
==>graphtraversalsource[tinkergraph[vertices:0 edges:0], standard] 
gremlin> a = g.addV('name','a','amount', 100).next() 
==>v[0] 
gremlin> b = g.addV('name','b','amount', 200).next() 
==>v[3] 
gremlin> c = g.addV('name','c','amount', 300).next() 
==>v[6] 
gremlin> a.addEdge('fill', b, 'bonus', 20) 
==>e[9][0-drain->3] 
gremlin> b.addEdge('fill', c, 'bonus', 40) 
==>e[10][3-drain->6] 
gremlin> 

所以

1)我怎麼會增加由10每個頂點?

末我想有:

gremlin> g.V().valueMap() 
==>[amount:[110],name:[a]] 
==>[amount:[210.0],name:[b]] 
==>[amount:[310.00],name:[c]] 

鑑於聲明:

g.V(a).property('amount', X) 

我想我試圖做一些事情,如:

g.V(a).property('amount', g.V(a).values('amount').next()+10) 

..但是對於圖中的所有頂點。它看起來像Tinkerpop2有loop()it.object可能有幫助,但

編輯似乎並不Tinkerpop3:OK,我很接近,但也不能令人信服:

gremlin> g.V().as('x').property('amount', select('x').by('amount')+10) 
No signature of method: org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.DefaultGraphTraversal.plus() is applicable for argument types: (java.lang.Integer) values: [10] 
Possible solutions: sum(), take(int), sum(groovy.lang.Closure), is(java.lang.Object), use([Ljava.lang.Object;), drop(int) 
Type ':help' or ':h' for help. 
Display stack trace? [yN] 

2)我怎麼會增加每個頂點通過fill邊緣的bonus財產的價值導致它。

末我想有:

gremlin> g.V().valueMap() 
==>[amount:[100],name:[a]] 
==>[amount:[220.0],name:[b]] 
==>[amount:[340.00],name:[c]] 

我試圖用一個sack做到這一點,但作爲一個麻袋整個穿越積累的數據不能完全解決它。我試圖將withSack置於repeat條款中嘗試創建新的麻袋,但這並不奏效。我沒有看到如何將屬性的值從一個頂點「傳遞」到下一個頂點的操作。

回答

6

讓我使用TinkerPop的玩具圖,所以其他人更容易遵循。玩具圖包含4個,有age業者頂點:

gremlin> g = TinkerFactory.createModern().traversal() 
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard] 
gremlin> g.V().has("age").valueMap() 
==>[name:[marko],age:[29]] 
==>[name:[vadas],age:[27]] 
==>[name:[josh],age:[32]] 
==>[name:[peter],age:[35]] 

要回答你的第一個問題,讓我們添加一個恆定值(10):

gremlin> g.V().has("age"). 
      property("age", union(values("age"), constant(10)).sum()).valueMap() 
==>[name:[marko],age:[39]] 
==>[name:[vadas],age:[37]] 
==>[name:[josh],age:[42]] 
==>[name:[peter],age:[45]] 

另一種技術來做到這一點是使用的sack() S:

gremlin> g.withSack(0).V().has("age"). 
      sack(assign).by("age").sack(sum).by(constant(10)). 
      property("age", sack()).valueMap() 
==>[name:[marko],age:[39]] 
==>[name:[vadas],age:[37]] 
==>[name:[josh],age:[42]] 
==>[name:[peter],age:[45]] 

現在你增加一個動態值,從事件到來的第二個問題邊緣。在玩具圖我們對每一個邊緣weight特性,讓我們使用它:

gremlin> g.V().has("age"). 
      property("age", union(values("age"), bothE().values("weight")).sum()).valueMap() 
==>[name:[marko],age:[30.9]] 
==>[name:[vadas],age:[27.5]] 
==>[name:[josh],age:[34.4]] 
==>[name:[peter],age:[35.2]] 

並再次,你也可以使用sack()

gremlin> g.withSack(0).V().has("age"). 
      sack(assign).by("age").sack(sum).by(bothE().values("weight").sum()). 
      property("age", sack()).valueMap() 
==>[name:[marko],age:[30.9]] 
==>[name:[vadas],age:[27.5]] 
==>[name:[josh],age:[34.4]] 
==>[name:[peter],age:[35.2]] 

所以最終的問題是:如果一個技術首選在另一方面?我會說是的,sack()應該是你的選擇 - 遍歷的時間長於你必須輸入的內容,但看看.profile()輸出,sack()可以輕鬆超越union()

相關問題