Ich bin neu bei Neo4j und da muss etwas sein, was ich nicht verstehe.Neo4j, Massenladung mit Cypher-Befehlen
Ich habe viele Objekte in Java und möchte sie verwenden, um ein Neo4j-Diagramm mit dem Java-Treiber und Cypher zu füllen. Mein Code funktioniert wie folgt:
// nodes
for (Person person: persons)
session.run (String.format (
"CREATE (:Person { id: '%s', name: \"%s\", surname: \"%s\" })",
person.getId(), person.getName(), person.getSurname()
));
// relations
session.run ("CREATE INDEX ON :Person(id)");
for (Friendship friendship: friendships)
session.run (String.format (
"MATCH (from:Person { id: '%s' }), (to:Person { id: '%s' })\n" +
"CREATE (from)-:KNOWS->(to)\n",
friendship.getFrom().getId(),
friendship.getTo().getId()
));
(in der Tat, es ist etwas komplizierter, weil ich ein Dutzend Knotentypen und etwa die gleiche Anzahl von Beziehungstypen haben).
Jetzt ist das sehr langsam, wie mehr als 1 Stunde, 300k Knoten und 1M Relationen zu laden (auf einem ziemlich schnellen MacBookPro, mit Neo4j, das 12/16 GB RAM nimmt).
Mache ich es falsch? Sollte ich stattdessen die batch inserter verwenden? (Ich würde es vorziehen, auf die graphDB über das Netzwerk zugreifen zu können). Würde ich etwas gewinnen, wenn ich mehr Einfügungen in eine Transaktion zusammenfasse? (Aus der Dokumentation geht hervor, dass Transaktionen nur für das Zurückrollen und für Isolierungszwecke nützlich sind).
Danke, aber ich denke nicht, dass es in meinem Fall funktionieren würde. 24-15ms sind nicht viel anders, wenn man bedenkt, dass meine Anwendung das interne Diagramm (unter Verwendung von Hash-Maps) in weniger als 3 Minuten auffüllt, während Neo4j ewig braucht, um das gleiche zu tun. Das kann nicht stimmen, es sollte mehr oder weniger das Gleiche sein. Wie für WIND, ich denke, senden eine Liste als Parameter würde schließlich in eine zu große Abfrage, in Anbetracht der Tatsache, dass ich so viele Knoten und Kanten haben. – zakmck
Mein Benchmark gibt es vielleicht nicht, aber ich schlage vor, zumindest UNWIND zu versuchen. Deine Payload-Liste muss nicht * all * deine Daten sein, du könntest sie ausschneiden (wie ich es in der Praxis tue, nicht im obigen Beispielcode). Wenn die Nutzlast eine Größe von ~ 100k hat und Sie Ihre Kanten mit N Transaktionen füllen können, wird das eine Menge Zeit im Vergleich zu N * 100k einzelnen Transaktionen sparen. – sjc
danke @sjc, ich sehe den Punkt auf UNWIND, ich werde es versuchen. – zakmck