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?
Odpowiedz
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)
>> możesz po prostu zapisać wartość c w głównym węźle poddrzewa << Jak? – isobretatel
'v1.setProperty ('total', c)' - potrzebujesz czegoś więcej? –
Tak: oblicz i buforuj wartości dla _ego_ pod drzewka, a nie dla całego drzewa. – isobretatel
która wersja 2.x lub 3.x Gremlin? –
Gremlin 2.x byłby lepszy. – isobretatel