2012-10-30 6 views
5

Sto sviluppando un'applicazione che potrebbe funzionare bene con un database grafico (Titan), tranne che ha problemi con i vertici con molti bordi, ad esempio supernodes."Supernodi" in Titan

Il collegamento dei supernodi sopra indica un post del blog degli autori di Titan, che spiega come risolvere il problema. La soluzione sembra ridurre il numero di vertici filtrando sui bordi.

Purtroppo voglio groupCount attributi di bordi o vertici. Ad esempio, ho 1 milione di utenti e ogni utente appartiene a un paese. Come posso fare un rapido groupCount per calcolare il numero di utenti in ciascun paese?

Quello che ho provato finora può essere mostrato in questo elaborato scritto Groovy:

g = TitanFactory.open('titan.properties') // Cassandra 
r = new Random(100) 
people = 1e6 

def newKey(g, name, type) { 
    return g 
     .makeType() 
     .name(name) 
     .simple() 
     .functional() 
     .indexed() 
     .dataType(type) 
     .makePropertyKey() 
} 

def newLabel(g, name, key) { 
    return g 
     .makeType() 
     .name(name) 
     .primaryKey(key) 
     .makeEdgeLabel() 
} 

country = newKey(g, 'country', String.class) 
newLabel(g, 'lives', country) 

g.stopTransaction(SUCCESS) 

root = g.addVertex() 
countries = ['AU', 'US', 'CN', 'NZ', 'UK', 'PL', 'RU', 'NL', 'FR', 'SP', 'IT'] 

(1..people).each { 
    country = countries[(r.nextFloat() * countries.size()).toInteger()] 
    g.startTransaction() 
    person = g.addVertex([name: 'John the #' + it]) 
    g.addEdge(g.getVertex(root.id), person, 'lives', [country: country]) 
    g.stopTransaction(SUCCESS) 
} 

t0 = new Date().time 

m = [:]  
root = g.getVertex(root.id) 
root.outE('lives').country.groupCount(m).iterate() 

t1 = new Date().time 

println "groupCount seconds: " + ((t1 - t0)/1000) 

Fondamentalmente un nodo principale (per il gusto di Titano non avere un "tutti" i nodi di ricerca), legato a molti person tramite bordi con la proprietà country. Quando eseguo il groupCount() su 1 milione di vertici, ci vuole più di un minuto.

Mi rendo conto che Titan sta probabilmente iterando su ciascun fronte e raccogliendo i conteggi, ma c'è un modo per farlo correre più velocemente in Titan, o in qualsiasi altro database grafico? L'indice può essere contato in modo che non debba attraversare? I miei indici sono corretti?

risposta

8

Se si imposta "paese" a primary key per l'etichetta "Vite", è possibile recuperare tutte le persone per un determinato paese più rapidamente. Tuttavia, nel tuo caso sei interessato a un conteggio di gruppo che richiede che vengano recuperati tutti gli spigoli di quel nodo radice per iterare su di essi e utilizzare i paesi.

Quindi, questa query analitica è molto più adatta per il framework di analisi del grafico Faunus. Non richiede un vertice di radice poiché esegue il conto di gruppo tramite una scansione completa del database, evitando così il problema del supernodo. Fauno utilizza anche Gremlin come il linguaggio di query in modo da avere solo per modificare la query leggermente:

g.V.country.groupCount.cap... 

HTH, Matthias