2015-09-18 10 views
9

Mam drzewo z wieloma poziomami, gdzie węzły liści mogą mieć właściwość "count". Chcę obliczyć całkowitą liczbę dla każdego pod-drzewa i buforować te wartości w głównym węźle każdego pod-drzewa. Czy to możliwe w Gremlin?Jak obliczyć agregaty dla pod-drzew w Gremlin?

+0

która wersja 2.x lub 3.x Gremlin? –

+0

Gremlin 2.x byłby lepszy. – isobretatel

Odpowiedz

3

Można to zrobić z sideEffect - to całkiem proste. My setup proste drzewo z:

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] 

I to tu jest obliczenie nad każdym poddrzewie w pełnym drzewa:

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 

To zapytanie zepsuje tak. Po pierwsze, ten fragment:

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

pobiera każdą część drzewa, który nie jest węzłem liści (tzn powinien mieć co najmniej jedną krawędź wychodzące być liść). Po drugie, używamy sideEffect przetworzyć każdy korzeń poddrzewa:

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

przechowywania sumę „Count” własności dla każdego poddrzewa w zmiennej o nazwie c. Z operatorem elvisa (?:) jest tam trochę przyjemności, aby sprawdzić wierzchołki bez własności "count" i zwrócić zero w tych przypadkach. Po przemierzać drzewo obliczyć c można po prostu zapisać wartość c w korzenia poddrzewa poprzez:

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

>> możesz po prostu zapisać wartość c w głównym węźle poddrzewa << Jak? – isobretatel

+0

'v1.setProperty ('total', c)' - potrzebujesz czegoś więcej? –

+0

Tak: oblicz i buforuj wartości dla _ego_ pod drzewka, a nie dla całego drzewa. – isobretatel