使用MATCH和FOREACH使用集合加载CSV以形成关系

时间:2016-08-03 19:54:02

标签: neo4j cypher graph-databases

我有一个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会导致新的不需要的节点。

1 个答案:

答案 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));