使用cypher Foreach创建节点

时间:2015-07-28 17:58:35

标签: neo4j cypher

我有2个csv文件,其结构如下:

1.csv
id name age
1  aa   23
2  bb   24

2.csv
id product location
1  apple   CA
2  samsung PA
1  HTC     AR
2  philips CA
3  sony    AR

// 1.csv
LOAD CSV WITH HEADERS FROM "file:///G:/1.csv" AS csvLine
CREATE (a:first { id: toInt(csvLine.id), name: csvLine.name, age: csvLine.age})

// 2.csv
LOAD CSV WITH HEADERS FROM "file:///G:/2.csv" AS csvLine
CREATE (b:second { id: toInt(csvLine.id), product: csvLine.product, location: csvLine.location})    

现在我想使用以下cypher查询创建另一个名为“third”的节点。

LOAD CSV WITH HEADERS FROM "file:///G:/1.csv" AS csvLine
MATCH c = (a:first), d = (b.second)
FOREACH (n IN nodes(c) | 
CREATE (e:third)
SET e.name = label(a) + label(b) + "id"
SET e.origin = label(a)
SET e.destination = label(b)
SET e.param = a.id)

但是上面的查询给了我重复的条目。我认为它在负载后运行2次。请建议或任何其他方式。

2 个答案:

答案 0 :(得分:2)

CREATE总是创造出来,即使某些东西已经存在。这就是为什么你得到重复的原因。您可能希望MERGE只创建一个项目(如果它尚未存在)。

我不会CREATE (e:third)MERGE (e:third),因为如果不指定属性,您最终会得到重复项。我改变了这个:

CREATE (e:third)
SET e.name = label(a) + label(b) + "id"
SET e.origin = label(a)
SET e.destination = label(b)
SET e.param = a.id)

对此:

MERGE (e:third { name: label(a) + label(b) + "id",
                 origin: label(a), 
                 destination: label(b),
                 param: a.id })                  

然后在必要时创建相同的节点,但避免使用所有相同的属性值创建重复项。

Here's the documentation on MERGE

答案 1 :(得分:1)

您根本不使用csvLine来匹配:first和:second节点!

所以你的查询没有意义

这也没有意义:

MATCH c = (a:first), d = (b.second)
FOREACH (n IN nodes(c) | 
CREATE (e:third)

c是具有单个节点的路径,即(a) 所以不要使用foreach,而是直接使用a