2017-02-17 5 views
0

Gibt es eine Möglichkeit, diese Anweisungen zu einer in Cypher zu kombinieren? Eine andere Möglichkeit, dies zu fragen, ist der Umfang einer With-Anweisung, wann endet sie?Geltungsbereich von mit Anweisung in cypher neo4j

Ich versuche eine bedingte Erstellung von Verknüpfungstypen aus einer CSV-Datei zu tun.

LOAD CSV WITH HEADERS FROM "file:///g:/crs2/DataFlowDB/links.csv" AS row 
WITH row WHERE row.type = 'in' 
MATCH (start:Actor { key:toInteger(row.from) }) 
MATCH (end:Actor { key:toInteger(row.to) }) 
CREATE (start)-[:IN { direction: [row.type]}]->(end) 

LOAD CSV WITH HEADERS FROM "file:///g:/crs2/DataFlowDB/links.csv" AS row 
WITH row WHERE row.type = 'out' 
MATCH (start:Actor { key:toInteger(row.from) }) 
MATCH (end:Actor { key:toInteger(row.to) }) 
CREATE (start)-[:OUT { direction: [row.type]}]->(end) 

Antwort

2

Der Umfang eines MIT erstreckt sich bis zum nächsten MIT oder Sie erreichen eine RETURN. In Ihrem Beispiel erhalten Sie einen Fehler, da die Zeile bereits im Gültigkeitsbereich ist, wenn Sie versuchen, die Ergebnisse des zweiten CSV-Imports als Alias ​​zu verwenden.

Ein Weg um dies zu entfernen ist, Zeile aus dem Bereich in einer WITH-Klausel direkt vor dem zweiten CSV-Import, wie dieser, aber mit dem beliebigen Platzhalter-Alias ​​zu entfernen.

WITH DISTINCT 1 as ignored 

DISTINCT benötigt wird, denn sonst werden Sie immer noch die gleiche Anzahl von Zeilen wie vor dem MIT haben, mit einem 1 in jeder Zeile. Dadurch werden Sie auf eine einzelne Zeile zurückgesetzt.

Dann können Sie den Import frei aufrufen.

Das heißt, es gibt eine Möglichkeit, die gesamte Verarbeitung in einem einzigen Durchlauf zu behandeln, indem Sie APOC procedures verwenden, um die Beziehung mit einem dynamischen Typ zu erstellen.

LOAD CSV WITH HEADERS FROM "file:///g:/crs2/DataFlowDB/links.csv" AS row 
WITH row, upper(row.type) as reltype 
MATCH (start:Actor { key:toInteger(row.from) }) 
MATCH (end:Actor { key:toInteger(row.to) }) 
CALL apoc.create.relationship(start, reltype, {direction:row.type}, end) YIELD relationship 
RETURN relationship 

Sie können natürlich Rückkehr, was Sie wollen, aber Sie müssen etwas zurückgeben, da Sie nicht eine Abfrage mit einer CALL-Anweisung enden kann.

+0

Ich versuchte zuerst die APOC-Ansatz, aber ich lief in eine Art von Installation, Config Problem: http://StackOverflow.com/Questions/42286508/neo4j-apoc-install-but-missing-procedures –

0

Sie benötigen foreach:

LOAD CSV WITH HEADERS FROM "file:///g:/crs2/DataFlowDB/links.csv" AS row 
FOREACH(t in CASE WHEN row.type = 'in' THEN [1] ELSE [] | 
    MATCH (start:Actor { key:toInteger(row.from) }) 
    MATCH (end:Actor { key:toInteger(row.to) }) 
    CREATE (start)-[:IN { direction: [row.type]}]->(end) 
) 
FOREACH(t in CASE WHEN row.type = 'out' THEN [1] ELSE [] | 
    MATCH (start:Actor { key:toInteger(row.from) }) 
    MATCH (end:Actor { key:toInteger(row.to) }) 
    CREATE (start)-[:OUT { direction: [row.type]}]->(end) 
)