Wie kann ich eine Neo4j MERGE-Abfrage auf einem Knoten mit vielen Beziehungen optimieren?

8

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.

%Vor%
  

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.

%Vor%
  

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

    
Dave 19.06.2015, 05:08
quelle

1 Antwort

10

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.

%Vor%     
Michael Hunger 19.06.2015, 07:49
quelle

Tags und Links