2016-12-09 34 views
5

Bir grafiğin içinden nasıl geçebilir ve bir köşe değerinin değerini artırabilirim? Ya belirli bir miktar ya da ona yönelen bir kenarın bir özelliği ile bir miktar. Örn.,Bir TinkerPop grafiğinde bir köşe özelliği değeri nasıl artırılır

örn. Aşağıdaki grafikte ile:

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> 

çok

1) I 10 her tepe artırmak nasıl? sonunda

Ben istiyorum:

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

deyimi Verilen:

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

ben böyle bir şey yapmak çalışıyorum tahmin:

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

.. .butumdaki tüm köşeler için. Bu Tinkerpop2 loop() ve it.object yardımcı olabileceğini varmış gibi görünüyor, ama

Düzenleme Tinkerpop3 değil görünüyor: Tamam, oldukça orada daha yakın, ama:

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) Nasıl her köşe artırır ediyorum bonus özelliğinin değeri, fill kenarına yol açar.

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

bunu yapmak için bir sack kullanarak çalıştı, ancak bir çuval kastetmek boyunca veri biriken olarak oldukça work it out could not: sonunda

Ben istiyorum. Yeni bir çuval oluşturmayı denemek için withSack kodunu repeat cümleciğine koymaya çalıştım, ancak bu işe yaramadı. Bir özelliğin değerini bir köşe noktasından sonraki köşe çizgisindeki bir işleme nasıl geçirebileceğimi anlamıyorum.

cevap

6

TinkerPop'un oyuncak grafiğini kullanmama izin verin, böylece başkalarının izlemesi kolaylaşır.

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), ilk soruyu cevaplamak en sabit bir değer ekleyelim için::

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

Bunu yapmanın bir başka teknik kullanımıdır oyuncak grafiği bir age özelliği vardır 4 kişi köşe içeriyor olayın gelen bir dinamik değeri ekleme hakkında ikinci soruya Şimdi

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() s kenarları.oyuncak Grafikte her kenarında bir weight özelliği vardır, bu nedenle bunu kullanalım:

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

Ve yine de sack() kullanabilirsiniz:

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

Yani nihai soru şu: Bir tekniği tercih etmelidir diğerinin üzerinde? Evet diyebilirim, sack() sizin seçiminiz olmalı - ne yazdığınıza göre geçişler daha uzundur, ancak .profile() çıkışına bakın, sack() kolayca union()'dan daha iyi performans gösterebilir.