Graphendatenbank

Das ist neu in Neo4j 3.0

Michael Hunger

Im April wurde die neueste Version 3.0 von Neo4j der Öffentlichkeit vorgestellt. Knapp sechs Monate nach dem vorherigen Release 2.3, ist dieser Versionssprung gerechtfertigt, denn die 3-er Version von Neo4j bringt eine große Menge von neuen Features, Verbesserungen und Änderungen mit. Michael Hunger von Neo Technology erklärt im Detail, was die Version ausmacht.

Für die Verbesserung der Produktivität unserer Anwender wurde jeder Teil von Neo4j überarbeitet und erweitert. Die Kernthemen sind:

  • Skalierbarkeit & Leistung
  • Anwenderfreundlichkeit & Produktivität
  • Infrastruktur & Betrieb

Das aktuellste Release ist auf http://neo4j.com/download zu finden, mit Installern für Windows und OSX sowie einem Binär-Download für alle anderen Betriebssysteme. Es ist auch über Docker (docker run neo4j) und als Debian-Paket verfügbar.

Skalierbarkeit & Leistung

Obwohl Graphdaten nicht als Massendaten ausgelegt sind und unsere Anwender die bislang existierenden Limits nie erreicht haben, gab es schon seit längerem den Wunsch diese zu entfernen. Daher ist jetzt die Anzahl der Knoten, Kanten und Eigenschaften in einem Neo4j-Graph nicht mehr limitiert. Die Größe der Dateisysteme, und die Schreibgeschwindigkeit von Festplatten sind damit die begrenzenden Faktoren.

Um trotz der größeren Adressierbarkeit den Platzbedarf für die größeren Block-Offsets zu minimieren, nutzen wir komprimierte Pointer, die nur wenig Speicher benötigen. Für unsere Lucene-Integration, haben wir ein automatisches Sharding implementiert, da ein einzelner Lucene-Index nur 2,4 Milliarden Dokumente umfassen kann. Weiterhin wurde in vielen Integrations- und Clustertests sichergestellt, dass Neo4j auch auf großen Maschinen gut skaliert. Innerhalb unserer Partnerschaft mit IBM haben wir die Datenbank auf Maschinen mit bis zu 160 Kernen und bis zu 256 GB RAM auf Herz und Nieren Stresstests unterzogen. Für die Zukunft ist außerdem die Unterstützung von CAPI-Flash mit mehr als 50 Terabyte RAM in Arbeit. Und unser kostenbasierter Abfrageplaner für Cypher wird jetzt auch für Statements genutzt, die in die Datenbank schreiben. Besonders bei komplexen, gemischten Lese-Schreib-Abfragen profitiert man jetzt vom höheren Durchsatz.

Anwenderfreundlichkeit & Produktivität

Wir bekommen viel positives Feedback von unseren Nutzern für unsere Abfragesprache Cypher, die Datenbankoberfläche mit Visualisierungen und das flexible Datenmodell. Es gibt aber noch Bereiche in der Datenbank, die wir verbessern wollen. Dazu gehören neben Installation und Betrieb auch die APIs, mit denen man mit Neo4j interagiert.

bolt-diagram

Bisher konnte der Neo4j-Server über HTTP APIs angesprochen werden. Diese wurden sowohl von Treibern als auch von Webanwendungen, wie unserer eigenen Oberfläche, dem Neo4j-Browser, genutzt. Für die Version 3.0 wurde eine neues Binärprotokoll namens Bolt entwickelt, das neben der kompakten und schnellen Datenübertragung auch Raum für zukünftige Entwicklungen lässt. Es ist ein versioniertes Protokoll. Ein Server kann mehrere Client-Versionen unterstützen. Für Sicherheit ist mit zertifikatsbasierter Verschlüsselung der Transportschicht (TLS) und Authentifizierung gesorgt. Das Protokoll basiert auf eine Variante von MessagePack namens PackStream, die komplex geschachtelte Datentypen, Graph-Elemente wie Knoten, Beziehungen und Pfade sowie generelle Erweiterbarkeit bereitstellt.

Für die Nutzung des neuen Protokolls gibt es erstmals in der Geschichte von Neo4j offizielle Treiber. Bisher haben wir, wie für Open-Source-Projekte häufig der Fall, Treiber genutzt, die von unserer Nutzergemeinschaft entwickelt wurden. Jetzt wollen wir unseren Kunden und Nutzern zumindest einen konsistenten Basistreiber für die meisten Programmiersprachen anbieten. Für Java, JavaScript, .Net und Python ist das jetzt der Fall. Die C- und PHP -Treiber für das neue Protokoll wurden in unserer Partner-Community entwickelt. Weitere Treiber werden in der Zukunft folgen.

Da alle Treiber dieselben Konzepte und APIs implementieren und das Cypher-Typsystem zur Anwendung bringen, sieht die API in fast jeder Sprache ähnlich aus. Hier am Beispiel von Java:

Driver driver = GraphDatabase.driver("bolt://localhost");
try (Session session = driver.session()) {
StatementResult result = session.run("MATCH (p:Person) WHERE p.name CONTAINS {name} RETURN p",
Values.parameters("name","Sven"));
while (result.hasNext()) {
Record record = result.next();
record.get("name");
record.get("age");
}
}

Diese neuen Treiber lassen sich leicht in eigene Anwendungen einbinden. Zwei Projekte, die schon Gebrauch davon machen, sind der Neo4j-JDBC-Treiber und die neue Integration mit Apache Spark. Demos zur Integration in Web-Anwendungen und Beispielanwendungen sind auch verfügbar.

apoc.meta.graph

Mit Neo4j 3.0 ist es möglich, spezifische Erweiterungen der Abfragesprache als Prozeduren einzubringen. Die Prozeduren lassen sich in Java und anderen JVM-Sprachen mittels annotierter Methoden erstellen. Hier ein einfaches Beispiel zur Generierung von UUIDs.

@Procedure("apoc.create.uuid")
public Stream<UUIDResult> uuid() {
return Stream.of(new UUIDResult(UUID.randomUUID().toString()));
}

In Cypher wird sie mittels CALL procedure(parameter) YIELD result integriert.

LOAD CSV WITH HEADERS FROM {url} AS row
CALL apoc.create.uuid() yield uuid
CREATE (:Person {id:uuid, name: row.name, born: row.dob });

Natürlich ist in einer solchen Prozedur alles möglich: Komplexe Graph-Algorithmen, das zur Verfügungstellen von Java-APIs in Cypher, Datenkonvertierung, Import, Export, aber auch ausgefallenere Sachen, wie Verbindungen zu anderen Datenbanken oder Generierung von Meta-Informationen. All das haben wir in unseren APOC (Awesome Procedures for Neo4j) umgesetzt, die jetzt mittlerweile knapp 200 Prozeduren aus viele verschiedene Anwendungsbereichen abdecken.

Infrastruktur & Betrieb

neo4j-3-0-deployment-options

Die Laufzeit-Infrastruktur von Neo4j ist über die Jahre gewachsen. Dadurch hatten sich einige Inkonsistenzen manifestiert. Mit der aktuellen Version wurde dieser Teil der Datenbank komplett überarbeitet, der mehr für Administratoren aber auch für Entwickler gedacht ist. Die Start-Skripte, Konfigurationsdateien, Log-Dateien, Betriebssystemintegration und Installationspakete wurden überarbeitet und konsolidiert. Damit sollte auch die Integration in Unix-Systemlandschaften leichter werden.

Wer bisher Neo4j genutzt hat, sollte sich auf jeden Fall die Upgrade-Dokumentation anschauen, da sich in diesem Bereich fast alle Namen, Verzeichnisse und Dateien geändert haben. Für den leichteren Wechsel auf die neue Version gibt es ein Konfigurations-Migrationstool.

java -jar $NEO4J_HOME/bin/tools/config-migrator.jar pfad/zu/neo4j2.x pfad/zu/neo4j3.x

In Neo4j 2.3 wurde die Powershell-Integration für Windows vorgenommen, diese wurde jetzt in einfachere Skripte gekapselt. Die Docker Images und Debian-Pakete wurden ebenso aktualisiert.

Verwandte Themen:

Geschrieben von
Michael Hunger
Michael Hunger
Software zu entwickeln, gehört zu Michael Hungers großen Leidenschaften. Der Umgang mit den beteiligten Menschen ist ein besonders wichtiger Aspekt. Zu seinen Interessen gehören außerdem Software Craftsmanship, Programmiersprachen, Domain Specific Languages und Clean Code. Seit Mitte 2010 arbeitet er eng mit Neo Technology zusammen, um deren Graphdatenbank Neo4j noch leichter für Entwickler zugänglich zu machen. Hauptfokus sind dort Integration in Spring (Spring Data Graph Project) und Hosting-Lösungen. Zurzeit hilft er der Neo4j-Community dabei, mit der Graphdatenbank ihre Wünsche wahr werden zu lassen. Michael arbeitet(e) an mehreren Open-Source-Projekten mit, ist Autor, Editor, Buchreviewer und Sprecher bei Konferenzen. Neben seiner Familie betreibt er noch ein Buch- und Kulturcafé (die-buchbar.de) in Dresden, ist Vereinsvorstand des letzten großen deutschen MUDs (mg.mud.de) und hat viel Freude an kreativen Projekten aller Art.
Kommentare

Hinterlasse einen Kommentar

Hinterlasse den ersten Kommentar!

avatar
400
  Subscribe  
Benachrichtige mich zu: