Nehmen wir an, ich habe eine Eigenschaft "name" von Knoten in neo4j. Jetzt möchte ich erzwingen, dass es maximal einen Knoten für einen bestimmten Namen gibt, indem alle Knoten mit demselben Namen identifiziert werden. Genauer gesagt: Wenn es drei Knoten gibt, deren Name "Hund" ist, möchte ich, dass sie durch nur einen Knoten mit dem Namen "Hund" ersetzt werden, der:
Der Hintergrund dafür ist der folgende: In meinem Graphen gibt es oft mehrere Knoten desselben Namens, die als "gleich" betrachtet werden sollten (obwohl einige umfangreichere Eigenschaftsinformationen haben als andere). Putting a.name = b.name
in einer WHERE-Klausel ist extrem langsam.
EDIT: Ich habe vergessen zu erwähnen, dass mein Neo4j momentan die Version 2.3.7 hat (ich kann es nicht aktualisieren).
ZWEITE BEARBEITUNG: Es gibt eine bekannte Liste von Beschriftungen für die Knoten und für die möglichen Bögen. Die Art der Knoten ist bekannt.
DRITTE BEARBEITUNG: Ich möchte oben "Node-Kollaps" -Prozedur von Java aufrufen, also wäre eine Mischung aus Cypher-Abfragen und prozeduralem Code auch eine nützliche Lösung.
Ich habe einen Testfall mit folgendem Schema erstellt:
%Vor%Was in der folgenden Ausgabe resultiert:
Wo die Knoten B wirklich die gleichen Knoten sind. Und hier ist meine Lösung:
%Vor%Die resultierende Ausgabe sieht folgendermaßen aus:
Es muss markiert sein, dass Sie den Typ der verschiedenen Beziehungen kennen müssen.
Alle Eigenschaften werden von den Knoten mit "höheren" IDs in die Knoten mit den "niedrigeren" IDs kopiert.
Ich denke, du brauchst so etwas wie ein Synonym für Knoten.
1) Gehen Sie durch alle Knoten und erstellen Sie ein Knotensynonym:
%Vor%2) Entfernen Sie die Synonyme mit nur einem Knoten:
%Vor% 3) Transporteigenschaften und Beziehungen für die verbleibenden Synonyme (mit apoc
) ):
4) Entfernen Sie Synonym
label: