2016-07-16 8 views
1

Ich bin ziemlich neu zu Graph/Neo4j/cypher und haben meine csv-Importen funktioniert gut für Knoten, aber um die Beziehungen aufzubauen, möchte ich es dynamischer machen mit einem Case-Anweisung meine Beziehung Anweisung, um zu entscheiden, aber es Fehler out mit:Neo4j Cypher mit case-Anweisung zu entscheiden, Beziehung funtion Fehler aus

Ungültige Eingabe 'S': erwartete 'L/L' (Zeile 2, Spalte 3 (offset: 60)) „CASE line.type "

Ist es möglich, CASE in diesem Format zu verwenden, oder ist meine Syntax falsch?

CSV-Datei:

id,type,rack,name_from,port,name_to 
1,fDEVICE,R01-01,ID_DEV_001,PX-01-0-F,R01-01-F-U01-1-A-01 
2,fDEVICE,R01-01,ID_DEV_001,PX-01-1-F,R01-01-F-U02-1-A-01 
3,fDEVICE,R01-01,ID_DEV_001,PX-03-0-F,R01-01-F-U01-1-A-02 
4,fDEVICE,R01-01,ID_DEV_001,PX-03-1-F,R01-01-F-U02-1-A-02 
5,FRAME,,R02-01-F-U01-1-A-01,,R02-01-F-U13-1-A-01 
6,FRAME,,R02-12-F-U01-1-A-01,,R02-12-F-U24-1-A-01 
7,FRAME,,R02-01-F-U01-1-A-02,,R02-01-F-U14-1-A-01 
8,FRAME,,R02-12-F-U01-1-A-02,,R02-12-F-U23-1-A-01 
9,tDEVICE,R03-01,ID_DEV_002,gi0-01,R03-01-F-U01-1-A-01 
10,tDEVICE,R03-12,ID_DEV_003,gi0-01,R03-12-F-U02-1-A-01 
11,tDEVICE,R03-02,ID_DEV_004,gi0-01,R03-02-F-U01-1-A-01 
12,tDEVICE,R03-11,ID_DEV_005,gi0-01,R03-11-F-U02-1-A-01 

Cypher:

LOAD CSV WITH HEADERS FROM 'file:///patching.csv' AS line 
CASE line.type 
    WHEN 'fDEVICE' THEN 
     MATCH (deviceport:DevicePort { name: line.port, device: line.name_from }),(port:Port { name: line.name_to}) 
     CREATE (port)-[:PATCHED]->(deviceport) 
    WHEN 'FRAME' THEN 
     MATCH (portA:Port { name: line.name_from}),(portB:Port { name: line.name_to}) 
     CREATE (portA)-[:PATCHED]->(portB) 
    WHEN 'tDEVICE' THEN 
     MATCH (deviceport:DevicePort { name: line.port, device: line.name_from }),(port:Port { name: line.name_to}) 
     CREATE (port)<-[:PATCHED]-(deviceport) 
END 
+2

Mögliche Duplikate von [Cypher Neo4J - CASE-Ausdruck mit MERGE] (http://stackoverflow.com/questions/27576427/cypher-neo4j-case-expression-with-merge) –

Antwort

0

Ich würde es wahrscheinlich aufgeteilt in 3 einfachen Anweisungen, jede Filterung durch line.type.

wie folgt aus:

LOAD CSV WITH HEADERS FROM 'file:///patching.csv' AS line 
WHERE line.type='fDEVICE' 
MATCH (deviceport:DevicePort { name: line.port, device: line.name_from }),(port:Port { name: line.name_to}) 
CREATE (port)-[:PATCHED]->(deviceport); 

usw.

Es liegen noch keine conditionals für Teilaussagen/Unterabfragen in Chiffre.

Sie können für jede Bedingung mit einer (nicht-) leeren FOREACH-Schleife umgehen, die jedoch nur Aktualisierungsanweisungen unterstützt, also keine MATCH.

+0

Danke @ michael-hunger. Habe ich recht, wenn ich davon ausgehe, wenn ich in drei separaten Anweisungen gelaufen bin, die auch dieselbe CSV dreimal laden? – Andrew