Cypher:如果不存在则创建节点和关系,否则创建关系

时间:2018-02-15 19:42:36

标签: neo4j cypher relationship

我正在尝试使用neo在许多数据集中创建统一的数据字典,因为许多列都是共享的。我有一个字典作为每个数据集的csv,每个都有共同的列。我是图形数据库的新手,但我认为伪代码应如下所示:

  1. 创建数据集节点(具有数据集名称和特征的单个节点)
  2. 在步骤1中上传数据集的数据字典
  3. 如果存在字段节点,则在数据集节点和现有字段节点之间创建关系。
  4. 如果不存在,则在数据集节点和字段节点之间创建字段节点和关系。
  5. 排除我为每个数据集节点手动执行的第1步,这是我到目前为止所拥有的:

    USING PERIODIC COMMIT LOAD CSV WITH HEADERS FROM "file:.csv" AS csvLine 
    MERGE (d:data {field: csvLine.Field, dtype: csvLine.Type, format: csvLine.Format})
    ON CREATE SET d.field = csvLine.Field
    ON MATCH SET d.field = csvLine.Field
    CREATE (dataset)-[r:CONTAINS]->(d);
    

    结果看起来几乎正确,只创建了新字段,并且创建的关系数等于上传数据集中的字段数。但是,我之前创建的(数据集)节点未连接到字段。而是创建无标记节点并将其附加到新数据集中的所有字段。如何将数据集节点正确连接到相应的字段?

1 个答案:

答案 0 :(得分:0)

问题在于:CREATE (dataset)-[r:CONTAINS]->(d)

dataset是一个变量,这是第一次在查询中使用,因此这个CREATE将创建一个空白节点,将其绑定到dataset变量,然后创建与d的关系。

变量仅在查询期间持续(或者更少,如果它们不在WITH子句的范围内携带),并且永远不会持久保存到数据库。如果您之前使用dataset变量在另一个查询中创建了某个节点,则在查询结束时该变量超出范围。如果要再次引用同一节点,则需要在此查询中匹配该节点。