2016-09-20 4 views
0

Ich habe 2 verschiedene Knoten mit Label Klasse und Eltern. Diese Knoten sind mit hasParents Beziehung verbunden. Es gibt 4 Millionen Klassenknoten, 700K Elternknoten. Ich wollte eine Geschwister Beziehung zwischen den Klassen Knoten erstellen. Ich habe die folgende Abfrage durchgeführt:Beschleunigen Merge-Vorgang in Cypher

Match (A:Class)-[:hasParents]-> (B:Parents) <-[:hasParents]-(C:Class) Merge (A)-[:Sibling]-[C] 

Diese Abfrage dauert Ewigkeiten zu vervollständigen. Ich habe sowohl in class_id und parent_id Eigenschaft von Class und Parents Knoten indexiert. Ich benutze Neo4j Version 2.1.6. Irgendein Vorschlag, dies zu beschleunigen.

Antwort

0

Zunächst helfen die Indizes der Abfrage nicht, da die Eigenschaften nirgends in der Abfrage referenziert werden.

Mit 700K Parent Knoten und 4M Class Knoten haben Sie im Durchschnitt 5,7 Klassen pro Elternteil. Mit 5 Klassen unter einem Elternteil gibt es 15 Sibling Beziehungen, so dass mehr als 10M Beziehungen für das gesamte Diagramm erstellt werden müssten.

Das ist viel für eine Transaktion, Sie sind fast garantiert, einen OutOfMemory-Fehler zu treffen.

Um dies zu vermeiden, sollten Sie Änderungen in mehrere kleinere Transaktionen chargen.

Ich würde ein Marker Label verwenden, um die Progression zu verwalten. Markieren Sie zunächst alle Eltern:

MATCH (p:Parent) SET p:ToProcess 

Dann wiederholt eine Teilmenge der Knoten auswählen, die verarbeitet werden müssen, und die Geschwister verbinden:

MATCH (p:ToProcess) 
REMOVE p:ToProcess 
WITH p 
LIMIT 1000 
OPTIONAL MATCH (p)<-[:hasParents]-(c:Class) 
WITH p, collect(c) AS children 
FOREACH (c1 IN children | 
    FOREACH (c2 IN filter(c IN children WHERE c <> c1) | 
     MERGE (c1)-[:Sibling]-(c2))) 
RETURN count(p) 

Da die Abfrage die Anzahl der Eltern zurückgibt, verarbeitet wurden, wiederholen Sie es einfach, bis es 0 zurückgibt. Zu diesem Zeitpunkt hat kein Elternteil das ToProcess-Label mehr.

+0

Ich habe die Abfrage von der letzten Stunde ausgeführt. Ich sehe keine "Geschwister" -Beziehung in meiner Datenbank. –

+0

Eine Ausführung der Abfrage mit dem 'LIMIT' kehrt nicht in 1 Stunde zurück? Haben Sie pathologische Fälle mit Hunderten von Klassen für ein Elternteil? Versuchen Sie, das Limit auf 100 oder sogar auf 10 zu reduzieren. –