cypher neo4j中with语句的范围

时间:2017-02-17 16:09:20

标签: neo4j cypher

有没有办法将这些语句合并为Cypher中的一个?另一种问这个问题的方法是什么是with语句的范围,什么时候结束?

我正在尝试从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 个答案:

答案 0 :(得分:2)

WITH的范围会延伸到下一个WITH或您到达RETURN。在您的示例中,当您尝试对第二个CSV导入的结果进行别名时,您会收到错误,因为行已在范围内。

解决此问题的一种方法是在第二次CSV导入之前删除WITH子句中的行,就像这样,但是使用你想要的任何占位符别名。

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

您当然可以返回任何内容,但是您需要返回一些内容,因为您无法使用CALL语句结束查询。

答案 1 :(得分: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)
)