有没有办法将这些语句合并为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)
答案 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)
)