2016-05-10 5 views
2

Ich möchte ein Diagramm aus einer CSV-Datei generieren. Die Zeilen sind die Eckpunkte und die Spalten die Attribute. Ich möchte die Kanten durch Ähnlichkeit auf den Scheitelpunkten (nicht notwendigerweise mit Gewichten) in einer Weise erzeugen, dass, wenn zwei Scheitelpunkte denselben Wert eines Attributs haben, eine Kante zwischen diesen beiden das gleiche Attribut mit dem Wert 1 oder wahr haben wird.Smart Weg, Kanten in Neo4J für große Graphen zu erzeugen

Die einfachste Chiffre-Abfrage, die mir einfällt, sieht etwas wie folgt aus:

Match (a:LABEL), (b:LABEL) 
WHERE a.attr = b.attr 
CREATE (a)-[r:SIMILAR {attr : 1}]->(b) 

Die Grafik hat etwa 148.000 Knoten und die Java Heap Size Option ist: dynamisch auf verfügbaren Systemressourcen basierend berechnet.

Die Abfrage, die ich gepostet habe, gibt eine mit einem Hinweis auf Java Heap Space oben.

Ein Problem, das mir einfällt, ist, dass ein riesiges kartesisches Produkt zuerst gebaut wird, um dann nach Übereinstimmungen zu suchen, um Kanten zu erzeugen. Gibt es einen klügeren, vielleicht einen konsekutiven Weg, das zu tun?

Antwort

2

Ich glaube, Sie brauchen ein wenig ändern Modell: nein müssen jeden Knoten durch den Wert eines bestimmten Attributs miteinander verbinden. Es ist besser, einen Zwischenknoten zu haben, an den Sie die Knoten mit demselben Wertattribut binden.

Dies kann zum Zeitpunkt des Exports oder später erfolgen.

Zum Beispiel:

Match (A:LABEL) Where A.attr Is Not Null 
Merge (S:Similar {propName: 'attr', propValue: A.attr}) 
Merge (A)-[r:Similar]->(S) 

Später mit separater Abfrage können Sie mit nur einem Anschluss ähnlichen Knoten entfernen (keine andere Knoten mit einem gleichen Wert dieses Attributs):

Match (S:Similar)<-[r]-() 
With S, count(r) As r Where r=1 
Detach Delete S 

Wenn Sie brauchen Verbinden Sie durch alle Requisiten, können Sie nächste Abfrage verwenden:

Match (A:LABEL) Where A.attr Is Not Null 
With A, Keys(A) As keys 
    Unwind keys as key 
    Merge (S:Similar {propName: key, propValue: A[key]}) 
    Merge (A)-[:Similar]->(S) 
+0

Perfekt, vielen Dank! Ich werde ein zweiteiliges Diagramm erstellen. Das wird die Dinge viel einfacher machen. – Wipster

+1

@Wipster Vielen Dank für Ihre interessante Frage :) –

1

Sie haben recht, dass ein huuge kartesisches Produkt produziert wird.

Sie können die ein Knoten in Chargen von 1000 für zB iterieren und die Abfrage durch Erhöhen des SKIP-Wert bei jeder Iteration laufen, bis er zurückkehrt 0.

MATCH (a:Label) 
WITH a LIMIT SKIP 0 LIMIT 1000 
MATCH (b:Label) 
WHERE b.attr = a.attr AND id(b) > id(a) 
CREATE (a)-[:SIMILAR_TO {attr: 1}]->(b) 
RETURN count(*) as c