Ich habe ein Diagramm mit einem Knoten, der viele ausgehende Beziehungen hat. Die Zeit, die benötigt wird, um neue ausgehende Beziehungen hinzuzufügen, verschlechtert sich, wenn ich weitere Beziehungen hinzufüge. Die Verschlechterung scheint auf die Zeit zurückzuführen zu sein, die benötigt wird, um zu überprüfen, dass die Beziehung noch nicht existiert (ich verwende MERGE, um die Beziehungen hinzuzufügen).
Die Zielknoten der Beziehungen haben selbst sehr wenige Beziehungen. Gibt es eine Möglichkeit, Neo4j zu erzwingen, die Existenz der Beziehung vom Zielknoten statt vom Quellknoten zu überprüfen?
Hier ist ein Testskript, um das Problem zu reproduzieren. Es erstellt einen Knoten mit der ID 0, gefolgt von 1000 Knoten, die über die Beziehung HAS
mit dem Knoten 0 verbunden sind. Wenn Knoten hinzugefügt werden, erhöht sich die Ausführungszeit linear.
%Vor%1001 Beschriftungen hinzugefügt, 1001 Knoten erstellt, 1001 Eigenschaften festgelegt, erstellt 1000 Beziehungen, Anweisung in 3496 ms ausgeführt.
%Vor%1000 Etiketten hinzugefügt, 1000 Knoten erstellt, 1000 Eigenschaften festgelegt, erstellt 1000 Beziehungen, Anweisung in 7030 ms ausgeführt.
%Vor%1000 Etiketten hinzugefügt, 1000 Knoten erstellt, 1000 Eigenschaften festgelegt, erstellt 1000 Beziehungen, Anweisung in 10489 ms ausgeführt.
1000 Etiketten hinzugefügt, 1000 Knoten erstellt, 1000 Eigenschaften festgelegt, erstellt 1000 Beziehungen, Anweisung in 14390 ms ausgeführt.
Wenn CREATE
anstelle von MERGE
verwendet wird, ist die Leistung viel besser. Ich kann CREATE
jedoch nicht verwenden, weil ich sicherstellen möchte, dass die Beziehungen eindeutig sind.
1000 Etiketten hinzugefügt, 1000 Knoten erstellt, 1000 Eigenschaften festgelegt, erstellt 1000 Beziehungen, Anweisung in 413 ms ausgeführt.
Hinweis: Getestet mit Neo4j v2.2.2
Dies liegt daran, dass die Chiffre noch nicht schlau genug ist, den Grad der Knoten beim Ausführen der Zusammenführung zu verwenden. Im COST-Optimierer, der für Lesevorgänge verwendet wird, ist es schon schlauer, aber für Aktualisierungen wird der alte RULE-Optimierer verwendet.
Nachdem ich ein wenig erfolglos herumgespielt habe
* Ändern der Reihenfolge von & amp; zu
* mit CREATE UNIQUE
anstelle von MERGE
* Versuche Pfad-Ausdrücke zu verwenden, die get-degree in COST verwenden
Ich erinnerte mich, dass shortestPath
tatsächlich Grad berücksichtigt und auch von links nach rechts geht
Also habe ich versucht, das mit CREATE
zu kombinieren, und es hat wirklich gut funktioniert,
Hier ist ein Beispiel für 100.000 Knoten.