2017-02-17 13 views
0

Есть ли способ объединить эти утверждения в один в Cypher? Другой способ спросить это, какова область действия оператора with, когда он заканчивается?scope with statement in cypher neo4j

Я пытаюсь сделать условное создание типов ссылок из файла csv.

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) 

ответ

2

Область действия WITH простирается до следующего С или вы достигаете RETURN. В вашем примере вы получаете сообщение об ошибке, поскольку строка уже находится в области видимости, когда вы пытаетесь выполнить псевдоним результатов второго импорта CSV.

Один из способов: удалить строку из области действия в предложении WITH непосредственно перед вторым вводом CSV, например, с любым псевдонимом заполнителя, который вы хотите.

WITH DISTINCT 1 as ignored 

DISTINCT необходим, потому что в противном случае вы все еще будете иметь такое же количество строк, как перед WITH с 1 по каждой строке. Это возвращает вас к одной строке.

Тогда вы можете свободно называть импорт.

Это означает, что существует возможность обрабатывать всю обработку за один проход, используя APOC procedures, чтобы создать связь с динамическим типом.

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 

Вы можете, конечно, возвращение все, что вы хотите, но вы должны вернуть что-то, как вы не можете завершить запрос с вызовом заявления.

+0

Сначала я попробовал подход APOC, но я столкнулся с какой-то установкой, проблема с конфигурацией: http://stackoverflow.com/questions/42286508/neo4j-apoc-install-but-missing-procedures –

0

Вам нужно 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) 
)