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
- 1. OrientDB PHP/Gremlin Bridge
- 2. Zapobieganie zaobserwowania udostępnianie dla określonych poddrzew w Haskell
- 3. Jak zaktualizować kilka wierzchołków o tej samej właściwości w Gremlin
- 4. Jak przejść drzewo folderów/poddrzew w pliku wsadowym Windows?
- 5. Agregaty Variadic jako funkcja języka podstawowego
- 6. Agregaty C++ nie mają żadnych funkcji wirtualnych?
- 7. Usuwanie niedrukowalnych znaków "gremlin" z plików tekstowych
- 8. Dla RSA, jak obliczyć tajny wykładnik?
- 9. Jak obliczyć rowSums w rcpp
- 10. obliczyć średnią dla wielu kolumn w data.frame
- 11. Jak obliczyć współwystępkę słowa
- 12. Jak obliczyć GMSCamera zoom
- 13. Jak obliczyć nachylenie w SQL
- 14. Jak obliczyć sumę w JSTL
- 15. Jak obliczyć gl_FragCoord w glsl
- 16. Jak obliczyć sumę kontrolną
- 17. Jak obliczyć wyniki?
- 18. Jak obliczyć centroid 3D?
- 19. FPS jak to obliczyć?
- 20. Jak obliczyć FAT
- 21. Jak obliczyć czas trwania?
- 22. Jak obliczyć entropię wykresu?
- 23. Jak obliczyć współczynnik klikalności
- 24. jak obliczyć "m" w odległości Jaro Winklera?
- 25. Jak obliczyć szerokość czcionki?
- 26. Jak obliczyć użycie pamięci w Menedżerze zadań?
- 27. Jak obliczyć rozmiar fragmentu tekstu w Win2D
- 28. Obliczyć AUC w R?
- 29. Jak obliczyć upływający czas funkcji?
- 30. Jak obliczyć TF-IDF zapytania?
która wersja 2.x lub 3.x Gremlin? –
Gremlin 2.x byłby lepszy. – isobretatel