2016-12-09 32 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()

相关问题