2016-12-09 9 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を使用してみましたが、袋を横断全体のデータを蓄積してかなりそれをうまくできませんでした。私はwithSackrepeat句の中に入れて新しい袋を作成しようとしましたが、うまくいかなかった。ある頂点のプロパティの値を次の頂点の操作にどのように '渡す'のかわかりません。

答えて

6

私はTinkerPopのおもちゃのグラフを使ってみましょう。おもちゃのグラフはageプロパティを持つ4つの頂点が含まれています

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]] 

別の技術は、使用されます事件から来て、動的な値を追加することについて、あなたの2番目の質問に今

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]] 

sack()秒のエッジ。

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]] 

だから、究極の質問です:1つの技術は、優先すべきおもちゃのグラフでは、我々はそうのは、それを使用してみましょう、すべてのエッジでweight性質を持っていますもう一方では?私ははいと言うだろうsack()あなたの選択になるべきです - トラバースは、タイプする必要がありますが、.profile()の出力を見て、より長くですsack()は簡単にunion()を上回ることができます。

関連する問題