我有一个CSV文件,其中包含以下格式的信息:
Col1,Col2
A,B;C;D
我试图在A和B,C,D之间生成关系。在我的特定情况下,已经通过导入另一个CSV文件创建了B,C,D。因此,我不需要创建这些节点,但我需要匹配它们以使节点形成关系。
LOAD CSV WITH HEADERS FROM 'file:///file.csv' AS line
WITH line
MERGE (a:Item {name: line.Col1})
FOREACH (x IN SPLIT(line.Col2, ';') |
MATCH (s:Item {name: x})
CREATE UNIQUE (s)-[:rel]->(a));
节点B,C,D具有多个属性,其中只有一个属于第二个CSV,如:
B: {id: 123, name: B}
有没有办法用Cypher做到这一点?目前,我收到错误:"在FOREACH"内无效使用MATCH。使用MERGE代替MATCH会导致新的不需要的节点。
答案 0 :(得分:0)
简单使用MERGE
代替MATCH
:
LOAD CSV WITH HEADERS FROM 'file:///file.csv' AS line
WITH line
MERGE (a:Item {name: line.Col1})
FOREACH (x IN SPLIT(line.Col2, ';') |
MERGE (s:Item {name: x})
MERGE (s)-[:rel]->(a));
如果match
更复杂,那么您可以先做出选择,然后继续选择:
LOAD CSV WITH HEADERS FROM 'file:///file.csv' AS line
MERGE (a:Item {name: line.Col1})
WITH a, SPLIT(line.Col2, ';') as names
UNWIND names as x
MATCH (t:Item {name: x})
WITH a, collect(t) as sc
FOREACH (x IN sc |
CREATE UNIQUE (x)-[:rel]->(a));