cypher neo4j中的with语句的范围

cypher neo4j中的with语句的范围,neo4j,cypher,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:toInt

有没有办法在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)

您需要为每个人提供
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)
)

您需要为每个人提供
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)
)

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

解决此问题的一种方法是在第二次CSV导入之前从WITH子句的作用域中删除行,如下所示,但使用您想要的占位符别名

WITH DISTINCT 1 as ignored
需要DISTINCT,因为否则您的行数仍将与WITH之前相同,每行上都有一个1。这会将您重置回一行

然后您可以自由调用导入

也就是说,有一种方法可以通过使用创建与动态类型的关系,在单个过程中处理所有处理

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语句结束查询。

with的范围将扩展到下一个with或您到达返回。在您的示例中,您会收到一个错误,因为当您尝试为第二次CSV导入的结果别名时,行已在范围内

解决此问题的一种方法是在第二次CSV导入之前从WITH子句的作用域中删除行,如下所示,但使用您想要的占位符别名

WITH DISTINCT 1 as ignored
需要DISTINCT,因为否则您的行数仍将与WITH之前相同,每行上都有一个1。这会将您重置回一行

然后您可以自由调用导入

也就是说,有一种方法可以通过使用创建与动态类型的关系,在单个过程中处理所有处理

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语句结束查询。

我先尝试了APOC方法,但遇到了某种instal,config问题:我先尝试了APOC方法,但遇到了某种instal,config问题: