将导入的节点(CSV LOAD)连接到一般组

时间:2014-11-25 15:39:57

标签: csv neo4j cypher

我正在尝试构建一个可以解决此任务的查询:

  1. 导入CSV格式为" user"," group"到Neo4J
  2. 为每个USER生成一个节点 - 避免重复
  3. 为每个GROUP生成一个节点 - 避免重复
  4. 将节点USER连接到导入的GROUP
  5. 最后将每个导入的GROUP连接到MAINGROUP
  6. 我写了这样的查询:

    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。

    如何更改查询以获取所需的图表?

1 个答案:

答案 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的方式非常普遍。 :)