2017-01-13 2 views
1

Lesen von csv, ich erstellen eine einfache Grafik DB mit "Scotch" und "Region" Knoten.Zuweisen mehrerer Eigenschaften aus abgegrenzten CSV-Spalten in neo4j Cypher

Ich möchte Eigenschaften für den Scotch-Knoten für Pipe-getrennte Felder zuweisen. Der Catch ist, dass jede Feldinstanz nicht unbedingt die gleiche Anzahl von Begrenzungswerten enthält.

Für ein einzelnes Feld, hier 'NOSE' (die zB 'frisch' oder enthalten kann 'FRESH | SEA' oder 'FRESH | MEER | FRUIT'), ich die folgende Abfrage erfolgreich ausgeführt:

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

WITH line, SPLIT(line.NOSE, '|') AS v1 

CREATE (scotch:Scotch {name: line.SCOTCH, nose: v1}) 

MERGE (region:REGION {name: line.REGION, district: line.DISTRICT}) 

CREATE (scotch)-[:MADE_IN]->(region) 

ich versuche dann mehrere Eigenschaften auf einmal mit dem gleichen Paradigma wie unten zuweisen:

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

WITH line, SPLIT(line.NOSE, '|') AS v1 
WITH line, SPLIT(line.BODY, '|') AS v2 
WITH line, SPLIT(line.FINISH, '|') AS v3 
WITH line, SPLIT(line.PALETTE, '|') AS v4 

CREATE (scotch:Scotch {name: line.SCOTCH, nose: v1, body: v2, finish: v3, palette: v4}) 

MERGE (region:REGION {name: line.REGION, district: line.DISTRICT}) 

CREATE (scotch)-[:MADE_IN]->(region) 

ich dann erhalte eine Fehlermeldung; Variable 'v2' wird nicht definiert:

Variable `v2` not defined (line 4, column 115 (offset: 178)) 
"WITH line, SPLIT(line.NOSE, '|'), SPLIT(line.BODY, '|'), 
SPLIT(line.FINISH, '|'), SPLIT(line.PALETTE, '|') AS v1, v2, v3, v4" 

Wo ist meine Syntax falsch gelaufen?

Antwort

1

WITH ändert, welche Variablen im Bereich sind, und wenn eine zuvor definierte Variable nicht in der WITH-Klausel enthalten ist, ist sie nicht mehr im Gültigkeitsbereich.

Ihre WITH-Serie führt neue Variablen ein (Ihre "v" -Variablen), aber Sie lassen sie aus dem nächsten WITH heraus, so dass sie sofort den Gültigkeitsbereich verlassen. Sie möchten sie mit jedem neuen WITH einbeziehen, also sollte v1 in dem zweiten WITH enthalten sein und sowohl v1 als auch v2 sollten in Ihrem dritten WITH usw. sein.

Das sollte Ihr Syntaxproblem lösen.

Sie könnten auch in Erwägung ziehen, diese Werte als Knoten der angegebenen Labels zu modellieren (z. B. Knoten eines: Nose Labels mit Werten für Fresh, Sea und Fruit) und Beziehungen zu jedem Ihrer: Scotches zu erstellen wenn Sie vorhaben, Suchanfragen zu erstellen, die Folgendes enthalten: Scotts, die auf bestimmten Merkmalen basieren. Wenn nicht, dann sollte das, was du jetzt machst, gut sein.

+0

Ausgezeichnet, danke @InverseFalcon - Änderung der "WITH" Teil meiner Abfrage gelöst meine Syntax Problem. Vielen Dank für Ihre Empfehlung, die Eigenschaften als Knoten zu modellieren, diese Übung wird hilfreich sein, um mein Verständnis von Graph DB-Fähigkeiten zu erweitern. –