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?