Ho un albero con molti livelli, in cui i nodi foglia potrebbero avere un "conteggio" di proprietà. Voglio calcolare il conteggio totale per ogni sottoalbero e mettere in cache quei valori nel nodo radice di ciascun sottoalbero. È possibile in Gremlin?Come calcolare gli aggregati per i sotto-alberi in Gremlin?
risposta
Si potrebbe fare con un sideEffect
- questo è abbastanza semplice. Abbiamo installato un semplice albero con:
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]
E allora ecco il calcolo sopra ogni sottostruttura all'interno dell'albero completa:
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
Quella domanda rompe in questo modo. In primo luogo, questo pezzo:
g.V().filter{it.outE().hasNext()}
ottiene qualsiasi parte dell'albero che non è un nodo foglia (cioè dovrebbe avere almeno un bordo di uscita di non essere foglia). In secondo luogo, usiamo sideEffect
per elaborare ogni radice di un sottoalbero:
it.as('a').out().sideEffect{leaf -> c+=(leaf.getProperty('count')?:0)}.loop('a'){true}.iterate()
memorizzare la somma della proprietà "contare" per ogni sottostruttura in una variabile denominata c
. C'è un po 'di groovy goodness con l'operatore elvis (?:
) per verificare i vertici senza una proprietà "count" e restituire uno zero in questi casi. Dopo aver attraversare l'albero di calcolare c
si può semplicemente memorizzare il valore di c
nel nodo principale della sottostruttura tramite:
it.setProperty('total',c)
>> puoi semplicemente memorizzare il valore di c nel tuo nodo radice della sottostruttura << Come? – isobretatel
'v1.setProperty ('total', c)' - hai bisogno di qualcosa in più? –
Sì: calcola e memorizza questi valori per _each_ sottoalbero, non per l'intero albero. – isobretatel
quale versione di Gremlin 2.xo 3.x? –
Gremlin 2.x sarebbe preferibile. – isobretatel