我正在尝试构建一个可以解决此任务的查询:
我写了这样的查询:
LOAD CSV FROM "file:.....csv" AS csvLine
MERGE (u:User { name: csvLine[0]})
MERGE (g:Group { name: csvLine[1]})
MERGE (u)-[:IS_MEMBER_OF]->(g)
MERGE (g)-[:IS_MEMBER_OF]->(m:Group {name: "MAINGROUP"})
到目前为止,这是有效的,因为我得到了每个用户和每个群组,并且他们已经连接。
问题:我的所有GROUP都没有与单个节点(MAINGROUP)的关系,但是每个GROUP都与重复的MAINGROUP有关系 - 对于每个GROUP,我的查询似乎生成一个重复的新MAINGROUP(尽管我希望MERGE)会阻止这种情况)所以我最终得到了与导入GROUPs一样多的节点MAINGROUP。
如何更改查询以获取所需的图表?
答案 0 :(得分:2)
这是使用MERGE
的常见问题。 See the docs here
在模式上使用MERGE
时,如果整个模式尚不存在,则会创建所有模式,而不仅仅是模式中尚不存在的部分。
您应该做的是使用MERGE
一次查找/创建(m:Group {name: "MAINGROUP"})
然后MERGE
只是新关系。因为MERGE在整个模式(g)-[:IS_MEMBER_OF]->(m:Group {name: "MAINGROUP"})
上匹配并且它不存在,所以它每次都重新创建主要组。
所以你可能想要这样做:
LOAD CSV FROM "file:.....csv" AS csvLine
MERGE (u:User { name: csvLine[0]})
MERGE (g:Group { name: csvLine[1]})
MERGE (u)-[:IS_MEMBER_OF]->(g)
MERGE (m:Group {name: "MAINGROUP"})
MERGE (g)-[:IS_MEMBER_OF]->(m)
最后两行不同。
不幸的是,这种搭载MERGE的方式非常普遍。 :)