2014-09-24 4 views
5

Nei O'Reilly libro "database del grafico" nel capitolo 6, che è su come Neo4j memorizza un database grafico che dice:In che modo Titan ottiene una ricerca costante del tempo utilizzando HBase/Cassandra?

Per comprendere il motivo per cui l'elaborazione grafico nativo è così molto più efficiente di grafici basati su indicizzazione pesante, considerare quanto segue. A seconda dell'implementazione, le ricerche dell'indice potrebbero essere O (log n) in complessità algoritmica rispetto a O (1) per cercare relazioni immediate. Per attraversare una rete di m passi, il costo dell'approccio indicizzato, a O (m log n), fa sembrare nullo il costo di O (m) per un'implementazione che utilizza l'adiacenza dell'indice senza indici.

Esso viene poi spiegato che Neo4j raggiunge questo ricerca costante di tempo memorizzando tutti i nodi e le relazioni come record dimensione fissa:

Con record di dimensioni fisse e ID record puntatore simili, attraversamenti sono implementati semplicemente inseguendo i puntatori attorno a una struttura dati, che può essere eseguita a velocità molto elevata con . Per attraversare una particolare relazione da un nodo a un altro, il database esegue diversi calcoli di ID economici (questi calcoli sono molto più economici di cercando indici globali, come dovremmo fare se simulare un grafico in un documento non nativo non grafico database)

Quest'ultima frase fa scattare la mia domanda: in che modo Titan, che utilizza Cassandra o HBase come back-end di archiviazione, raggiunge questi miglioramenti di prestazioni o compensa?

+0

E voterei per la stessa domanda per OrientDB! –

+0

Buona domanda, si. OrientDB gestisce la propria memoria, quindi suppongo che abbiano qualcosa di simile a Neo4j, ma mi piacerebbe saperlo. –

+0

Neo4j è O (1) in complessità algoritmica, indipendentemente dal fatto che si stia accedendo a un oggetto memorizzato nella cache oa uno su disco, poiché semplicemente insegue i puntatori anziché richiamare un indice esterno per le relazioni di movimento. Neubauer e Rodriguez (vedi sopra) chiamano questa "adiacenza indice-libera" e sospetto che sia centrale per tutti i database di dati sensibili. –

risposta

12

Neo4j raggiunge O (1) solo quando i dati sono in memoria nella stessa JVM. Quando i dati sono su disco, Neo4j è lento a causa del puntatore che insegue sul disco (hanno una rappresentazione povera del disco).

Titan raggiunge solo O (1) quando i dati sono in memoria nella stessa JVM. Quando i dati sono su disco, Titan è più veloce di Neo4j perché ha una migliore rappresentazione del disco.

Vedere il seguente post sul blog che spiega quanto sopra quantitativamente: http://thinkaurelius.com/2013/11/24/boutique-graph-data-with-titan/

Quindi, è importante capire quando la gente dice O (1) quale parte della gerarchia di memoria sono in Quando sei in una. singola JVM (macchina singola), è facile da essere veloce in quanto sia Neo4j che Titan dimostrano con i rispettivi motori di caching. Quando non è possibile inserire l'intero grafico in memoria, è necessario fare affidamento su layout di disco intelligenti, cache distribuite e simili.

Si prega di consultare i seguenti due post del blog per ulteriori informazioni:

http://thinkaurelius.com/2013/11/01/a-letter-regarding-native-graph-databases/ http://thinkaurelius.com/2013/07/22/scalable-graph-computing-der-gekrummte-graph/

+3

Per estendere, Neo4j non supporta O (1) su tutti gli attraversamenti. Assumi un predicato di bordo. Per ottenere l'ultimo amico del vertice v costa O (| out (v) |) in Neo4j (cioè una scansione lineare vertice-centrica). Perché? Perché Neo4j non ordina i suoi dati in memoria (né su disco). Neo4j deve iterare su tutti i bordi amici in uscita di v per determinare quale ha il timestamp più recente. In Titan, questa (può essere) un'operazione O (1). Puoi saperne di più qui: http://thinkaurelius.com/2012/10/25/a-solution-to-the-supernode-problem/ Questo avanzamento è realizzato sia su disco che in memoria con Titan. –

+0

Credo che tu abbia torto lì. Nelle ultime versioni di Neo4j (2.1.x) Neo4j implementa anche un cosiddetto "indice vertice-centrico" per risolvere quel problema. –

+2

Neo4j è sempre algoritmicamente O (1) poiché è un calcolo dell'offset * id che produce un record. Meccanicamente, come con qualsiasi approccio di archiviazione stanco, ci sono percorsi più brevi e più lunghi. Colpire un oggetto memorizzato nella cache e cortocircuitare il percorso dal database al disco e viceversa; colpisci cache fredde e andrai su disco. Questo è ancora O (1). Non esiste alcun indice o altra O (log n) o ricerca peggiore da eseguire. Questo è un enorme vantaggio di essere il nativo del grafico fino in fondo allo stack. –

1

OrientDB utilizza un approccio simile in cui i rapporti vengono gestiti senza indici (adiacenza libero-index), ma piuttosto con puntatori diretti (LINKS) tra i vertici. È come nei puntatori di memoria ma sul disco. In questo modo OrientDB ottiene O (1) sul movimento in memoria e su disco.

Ma se hai un vertice "Città" con migliaia di bordi ai vertici "Persona", e stai cercando tutte le persone con età> 18, quindi OrientDB utilizza gli indici perché è coinvolta una query, quindi in questo caso è O (log N).