Sonntag, 12. Februar 2012


Artikel

März 2010 | Artikel

Neo4j – die High-Performance-Graphendatenbank

(Link zum Artikel: http://www.entwickler.de/jaxenter/artikel/2919)

Teil 2

Text: Peter Neubauer
  • Teilen
  • kommentieren
  • empfehlen
  • Bookmark and Share
Neo4j ist eine voll ACID-transaktionale Datenbank in Java (die .jar-Datei is ca. 500 KB groß), die alle Datenstrukturen als Netzwerke auf dem Dateisystem in einem optimierten Format speichert. Der Neo4j-Kernel ist ein sehr schneller Graphenmotor mit allen Eigenschaften, die man von einer RDBMS erwarten würde – ACID, 2PC-Transaktionen, XA-Unterstützung und so weiter. Neo4j ist im 24/7 Produktionseinsatz seit 2003 und liegt zurzeit in der frischen Version 1.0 vor. High Availability mittels Online-Backup und Master Slave Replication sind auch demnächst testfertig. Neo4j kann sowohl als selbständiger Server als auch als Embedded-Server konfiguriert werden.
Teil 1   Teil 2   Teil 3   Teil 4   Teil 5   

Artikelserie

Mehr zum Thema gibt es in Teil 1 dieser Artikelserie.

Der Entwickler arbeitet direkt auf dem Graphenmodell mit einem Java-API, das die flexible Struktur exponiert, oder kann die Anbindungen an andere Programmiersprachen anwenden, so wie Java, Scala, JRuby, Python, Clojure und unterschiedliche REST-Wrapper. Typische Charakteristiken für Neo4j sind Folgende:

Aber auch bei den "klassischen" RDBMS-Anwendungen findet man häufig Graphen in Verzeichnisstrukturen mit freier Tiefe, Produktkonfigurationen, Sortimenten, Medienmetadaten. Semantic Trading, Fraud Detection in der finanziellen Industrie und anderen wieder.

Neo4j hat eine Menge von optionalen Komponenten, um z. B. über ein Metamodell mehr Struktur in den Graphen zu bringen, einen SAIL-kompatiblen RDF TripleStore zu implementieren oder gebräuchliche Algorithmen zu unterstützen.

In Fällen, in denen man Neo4j als einen separaten Server betreiben möchte, stehen sowohl JRuby- als auch Java-basierte REST-komponenten zur Verfügung. Das bietet sich bei z. B. Architekturen wie dem bisherigen LAMP-Modell an und eignet sich außerdem gut für HTTP-Memcached und Apache-basierte Caching-Komponenten.

High Performance?

Bei Benchmarks ist es sehr schwer, allgemeingültige Performanceaussagen zu treffen, da gerade bei der Hardware sehr viel von der jeweiligen Konfiguration, Lese- und Schreibgeschwindigkeit usw. abhängt. Neo4j hantiert ohne Probleme Graphen von mehreren Milliarden Knoten, Kanten und Eigenschaften. Es ist normal, mit Neo4j Leseleistungen von über 2000 Kantenschritten pro Millisekunde (also ca. 2 Millionen Schritte pro Sekunde) mit warmen Caches zu erreichen. Bei den untenstehenden Beispielen ist Neo4j bei einem Netzwerk von 1000 Personen und dem Freunde-meiner-Freunde-Problem schon 1000 Mal schneller als MySQL, der Unterschied steigt exponentiell mit der Größe des Graphen.

Der Vorteil ist hier, dass die Traversierung entlang der Kanten in Neo4j mit konstanter Geschwindigkeit unabhängig von der Größe des Graphen erfolgt. Es werden also keine Einbußen wegen größerer Setoperationen wie in den RDBMS-Joins gemacht. Neo4j lädt lazy, sodass Knoten und Relationen erst eingelesen werden, wenn man sie wirklich im ResultSet abfragt, was die Performance bei großen und tiefen (z. B. 1000 Kanten tief) Traversierungen optimiert.

Schreibgeschwindigkeiten hängen vor allem vom Seek-Speed des Dateisystems ab. SSD-Disks und ext3 sind eine gute Kombination und geben mit vollem ACID unter Leselast von 100 000 Operationen pro Sekunde.

Skalierbarkeit: Ein Beispiel – die Matrix
Der Graph

Wie schon vorher gesagt, stellen soziale Netzwerke nur einen Bruchteil der Anwendungsfälle von Graphen dar, sind aber sehr leicht verständlich. Um die Grundfunktionalität zu demonstrieren, wird nachstehend ein kleiner Graph aus dem Film Matrix erstellt, visualisiert mit dem Eclipse-RCP-basierten Neoclipse für Neo4j:

Der Graph ist mit dem Referenzknoten (meist der Knoten mit der ID 0) verbunden, um ohne Probleme von einem bekannten Startpunkt wieder in das Netzwerk zu finden. Das ist nicht notwendig, erweist sich aber in der Praxis als anwendbar.

Teil 1   Teil 2   Teil 3   Teil 4   Teil 5   

Kommentare

Gravatar Lesender Mensch 12.01.2012
um 08:56 Uhr
Es sollte nicht heißen "... zwei Schritte ausgehend von Morpheus ...", sondern "... zwei Schritte ausgehend von Neo ..." #zitieren