2016-08-03 16 views
0

ich eine CSV-Datei, die Informationen in Form hat:LOAD CSV mit einer Sammlung MATCH und foreach eine Beziehung zu bilden

Col1,Col2 
A,B;C;D 

Ich versuche, die Beziehungen zwischen A zu erzeugen, und jedes von B, C , D. In meinem speziellen Fall wurden B, C, D bereits durch Importieren einer anderen CSV-Datei erstellt. Daher muss ich diese Knoten nicht erstellen, aber ich muss sie zuordnen, damit der Knoten die Beziehung bildet.

LOAD CSV WITH HEADERS FROM 'file:///file.csv' AS line 
WITH line 

MERGE (a:Item {name: line.Col1}) 

FOREACH (x IN SPLIT(line.Col2, ';') | 
    MATCH (s:Item {name: x}) 
    CREATE UNIQUE (s)-[:rel]->(a)); 

Knoten B, C, D haben mehrere Eigenschaften, von denen nur einer in der zweiten CSV, wie:

B: {id: 123, name: B} 

Gibt es eine Möglichkeit, dies mit Cypher zu tun? Derzeit erhalte ich den Fehler: "Ungültige Verwendung von MATCH in FOREACH". Die Verwendung von MERGE anstelle von MATCH führt zu neuen, unerwünschten Knoten.

Antwort

0

Einfache Verwendung MERGE statt MATCH:

LOAD CSV WITH HEADERS FROM 'file:///file.csv' AS line 
WITH line 

MERGE (a:Item {name: line.Col1}) 

FOREACH (x IN SPLIT(line.Col2, ';') | 
    MERGE (s:Item {name: x}) 
    MERGE (s)-[:rel]->(a)); 

Wenn ein match komplizierter ist, dann können Sie zunächst eine Auswahl treffen, und dann zu Fuß auf sie:

LOAD CSV WITH HEADERS FROM 'file:///file.csv' AS line 
MERGE (a:Item {name: line.Col1}) 
WITH a, SPLIT(line.Col2, ';') as names 
UNWIND names as x 
MATCH (t:Item {name: x}) 
WITH a, collect(t) as sc 

FOREACH (x IN sc | 
    CREATE UNIQUE (x)-[:rel]->(a)); 
+0

Dies funktionierte nicht in mein Fall, weil ich mehrere Eigenschaften auf den Knoten habe, die zusammengebracht werden. Ich habe die Frage bearbeitet, um diesen fehlenden Teil der Frage zu reflektieren. – cannin

+0

@cannin Ich erweiterte meine Antwort. –