2015-09-18 8 views
9

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?

+0

quale versione di Gremlin 2.xo 3.x? –

+0

Gremlin 2.x sarebbe preferibile. – isobretatel

risposta

3

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) 
+0

>> puoi semplicemente memorizzare il valore di c nel tuo nodo radice della sottostruttura << Come? – isobretatel

+0

'v1.setProperty ('total', c)' - hai bisogno di qualcosa in più? –

+0

Sì: calcola e memorizza questi valori per _each_ sottoalbero, non per l'intero albero. – isobretatel

Problemi correlati