2015-09-18 13 views
9

Yaprak düğümlerinin "sayım" özelliği taşıyabileceği birçok düzeydeki bir ağacım var. Her alt ağaç için toplam sayımı hesaplamak ve her alt ağacın kök düğümündeki bu değerleri önbelleğe almak istiyorum. Gremlin'de bu mümkün mü?Gremlin'de alt ağaçların agregatları nasıl hesaplanır?

+0

hangi sürümü: Hesaplamak ağaç travers sonra c sadece aracılığıyla altağacın kök düğümünde c değerini saklayabilir? –

+0

Gremlin 2.x tercih edilebilir. – isobretatel

cevap

3

sideEffect ile yapabilirdiniz - bu oldukça basittir. Biz kurulum ile basit ağacı:

gremlin> g.V().filter{it.outE().hasNext()}.sideEffect{           
gremlin> c=0;                     
gremlin> it.as('a').out().sideEffect{leaf -> c+=(leaf.getProperty('count')?:0)}.loop('a'){true}.iterate() 
gremlin> it.setProperty('total',c)                  
gremlin> }                         
==>v[0] 
==>v[1] 
gremlin> g.v(0).total 
==>5 
gremlin> g.v(1).total                      
==>3 

Yani sorgu şu şekilde ayırır: Burada daha sonra

gremlin> g = new TinkerGraph()                 
==>tinkergraph[vertices:0 edges:0] 
gremlin> v1 = g.addVertex()                  
==>v[0] 
gremlin> v2 = g.addVertex()                  
==>v[1] 
gremlin> v3 = g.addVertex([count:2])               
==>v[2] 
gremlin> v4 = g.addVertex([count:3])               
==>v[3] 
gremlin> v1.addEdge('child',v2)                 
==>e[4][0-child->1] 
gremlin> v1.addEdge('child',v3)                 
==>e[5][0-child->2] 
gremli                       
gremlin> v2.addEdge('child',v4) 
==>e[6][1-child->3] 

Ve tam ağacın içindeki her alt ağaç üzerinde hesaplama verilmiştir. İlk olarak, bu parça:

g.V().filter{it.outE().hasNext()} 

bir yaprak düğümü değildir ağaç herhangi bir bölümünü alır (yani, bir yaprak vermeye için en az bir giden kenar olmalıdır). İkincisi, bir alt ağacının her kök işlemek için sideEffect kullanın:

it.as('a').out().sideEffect{leaf -> c+=(leaf.getProperty('count')?:0)}.loop('a'){true}.iterate() 

c adında bir değişkende her alt ağacı için "saymak" özelliğinin toplamını depolamak. Orada bir "sayım" özelliği olmadan köşeleri kontrol etmek ve bu durumlarda bir sıfır döndürmek için elvis operatörü (?:) ile biraz groovy iyilik var. Gremlin 2.x veya 3.x

it.setProperty('total',c) 
+0

>> c'nin değerini alt ağacın kök düğümünde saklayabilirsiniz << Nasıl? – isobretatel

+0

' v1.setProperty ('total', c) '- daha fazlasına ihtiyacınız var mı? –

+0

Evet: tüm ağaç için değil, _each_ alt ağacı için bu değerleri hesaplayın ve önbelleğe alın. – isobretatel

İlgili konular