【问题标题】:Difference between MERGE and CREATE in Cypher Neo4jCypher Neo4j 中 MERGE 和 CREATE 的区别
【发布时间】:2021-12-03 18:38:58
【问题描述】:

我只是将一些东西从 .csv 文件导入到 Neo4j。我一直使用MERGE 创建一个节点,但是现在,当尝试从 .csv 导入时,一些数据为空,例如专栏address。当我在做MERGE 而不是CREATE 时会出错,但是当我做CREATE 时它工作正常。我知道MERGE 和CREATE 之间的唯一区别是,如果节点已经存在,MERGE 不会创建新节点。

我的查询:

LOAD CSV WITH HEADERS FROM '<path>' as line
                   CREATE (a: Address
                   {
                   address: line.address,
                   postalCode: toInteger(line.postalCode),
                   town: line.town,
                   municipalityNr: toInteger(line.municipalityNr),
                   municipality: line.municipality,
                   countryCode: line.countryCode,
                   country: line.country
                  
                   })
                    RETURN a.address

【问题讨论】:

  • 能否请您也与MERGE 分享查询及其产生的错误?
  • 这是同一个查询,但不是 CREATE 而是 MERGE。

标签: javascript neo4j


【解决方案1】:

在执行MERGE 时,Neo4j 需要一个可以合并的值。 MERGE 使用 null 总是会导致错误。

一般来说是这样的:

仅MERGE 用于与查找唯一节点相关的属性。例如,如果你想MERGE汽车,车牌就是要使用的属性。 确保你有一个 CONSTRAINT 来代表你 MERGE 所在的属性。这将有助于加快导入速度。 为避免MERGE 中出现空值,您可以使用COALESCE()。 在MERGE之后,可以SET其他属性,可能有空值。

MERGE {c:Car {licensePlate: COALESCE(line.licensePlate,'Unknown') })
SET c.color = line.color,
    c.someproperty = line.someproperty

在运行结束时,您会发现一个带有licensePlate:'Unknown' 的:Car 节点

【讨论】:

    【解决方案2】:

    同意 Graphileon。

    你应该避免一个陷阱。您还希望避免在数据集中可能会发生变化的属性。例如,同一个人有不同格式的出生日期(例如,5/16/85、05/16/1985),如果出生日期是合并标准的一部分,您将添加重复节点。为避免这种情况,您可以在没有日期的情况下进行合并,然后在后续步骤中添加属性......当然,只有最后一次这样的努力才会持续。

    您可以检查是否有重复的节点。在给出的示例中,如果您确定名称是唯一的,或者汽车的牌照号码:

    match (p:Person) return p.name, count(*) as ct order by ct desc
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-19
      • 2014-02-13
      • 1970-01-01
      • 2016-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-16
      相关资源
      最近更新 更多