我有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次。请建议或任何其他方式。
答案 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 })
然后在必要时创建相同的节点,但避免使用所有相同的属性值创建重复项。
答案 1 :(得分:1)
这也没有意义:
MATCH c = (a:first), d = (b.second)
FOREACH (n IN nodes(c) |
CREATE (e:third)
c是具有单个节点的路径,即(a)
所以不要使用foreach,而是直接使用a