Hintergrund: Das Folgende stammt aus dem Buch Graph Databases , das einen Leistungstest behandelt, der im Buch Neo4j in Aktion erwähnt wird :
Beziehungen in einem Diagramm bilden natürlich Pfade. Beim Abfragen oder Durchlaufen des Diagramms werden folgende Pfade verwendet. Aufgrund der grundsätzlich pfadorientierten Natur des Datenmodells sind die meisten pfadbasierten Diagrammdatenbankoperationen stark an der Art und Weise ausgerichtet, in der die Daten angeordnet sind, was sie äußerst effizient macht. In ihrem Buch Neo4j in Action führen Partner und Vukotic ein Experiment mit einem relationalen Speicher und Neo4j durch.
Der Vergleich zeigt, dass die Diagrammdatenbank für verbundene Daten wesentlich schneller ist als ein relationaler Speicher. Das Experiment von Partner und Vukotic versucht, Freunde von Freunden in einem sozialen Netzwerk bis zu einer maximalen Tiefe von fünf zu finden. Gibt es bei zwei zufällig ausgewählten Personen einen Pfad, der sie verbindet und höchstens fünf Beziehungen lang ist? Für ein soziales Netzwerk mit 1.000.000 Personen mit jeweils ungefähr 50 Freunden deuten die Ergebnisse nachdrücklich darauf hin, dass Diagrammdatenbanken die beste Wahl für verbundene Daten sind, wie in Tabelle 2-1 dargestellt.
Tabelle 2-1. Das Finden erweiterter Freunde in einer relationalen Datenbank im Vergleich zum effizienten Finden in Neo4j
Depth RDBMS Execution time (s) Neo4j Execution time (s) Records returned 2 0.016 0.01 ~2500 3 30.267 0.168 ~110,000 4 1543.505 1.359 ~600,000 5 Unfinished 2.132 ~800,000
In Tiefe zwei (Freunde von Freunden) funktionieren sowohl die relationale Datenbank als auch die Diagrammdatenbank so gut, dass wir in Betracht ziehen können, sie in einem Online-System zu verwenden. Während die Neo4j-Abfrage in zwei Dritteln der Zeit der relationalen Abfrage ausgeführt wird, würde ein Endbenutzer den Unterschied in Millisekunden zwischen den beiden kaum bemerken. Bis wir Tiefe drei erreichen (Freund-Freund-Freund-Freund), ist jedoch klar, dass die relationale Datenbank die Abfrage nicht mehr in einem angemessenen Zeitrahmen bearbeiten kann: Die 30 Sekunden, die für die Fertigstellung benötigt werden, wären völlig inakzeptabel für ein Online-System. Im Gegensatz dazu bleibt die Antwortzeit von Neo4j relativ gering: Nur ein Bruchteil einer Sekunde, um die Abfrage durchzuführen - definitiv schnell genug für ein Online-System.
In der vierten Tiefe weist die relationale Datenbank eine lähmende Latenz auf, was sie für ein Online-System praktisch unbrauchbar macht. Die Timings von Neo4j haben sich ebenfalls etwas verschlechtert, aber die Latenz liegt hier an der Peripherie, um für ein reaktionsfähiges Online-System akzeptabel zu sein. In der fünften Tiefe dauert die relationale Datenbank einfach zu lange, um die Abfrage abzuschließen. Im Gegensatz dazu gibt Neo4j in etwa zwei Sekunden ein Ergebnis zurück. In der fünften Tiefe stellt sich heraus, dass fast das gesamte Netzwerk unser Freund ist: Für viele reale Anwendungsfälle würden wir wahrscheinlich die Ergebnisse und das Timing kürzen.
Fragen sind:
- Ist dies ein vernünftiger Test, um zu emulieren, was man außer in einem sozialen Netzwerk finden könnte? (Dies bedeutet, dass echte soziale Netzwerke normalerweise Knoten mit ungefähr 50 Freunden haben. Es scheint, dass das Modell " Rich Get Richer " für soziale Netzwerke natürlicher wäre, obwohl es möglicherweise falsch ist.)
- Gibt es einen Grund zu der Annahme, dass die Ergebnisse ungeachtet der Natürlichkeit der Emulation falsch oder nicht reproduzierbar sind?