【问题标题】:Can't MERGE with null values; 'Cannot merge node using null property value' in neo4j不能与空值合并; Neo4j中的“无法使用空属性值合并节点”
【发布时间】:2016-09-02 02:03:22
【问题描述】:

我在 csv 中有一个如下所示的列:

我正在使用此代码来测试日期拆分的工作原理:

LOAD CSV WITH HEADERS FROM
'file:///..some_csv.csv' AS line
WITH
SPLIT(line.date_of_birth, '/') AS date_of_birth
return date_of_birth;

这个代码块工作正常,给了我我所期望的,它是每个日期的三个值的集合,或者如果没有日期,则可能是一个 null(例如,

[4, 5, 1971]  
[0, 0, 2003]  
[0, 0, 2005]  
 . . .  
null  
null  
 . . .  

我的问题是,创建的空值有什么问题,为什么当有空值时我不能执行 MERGE?

LOAD CSV WITH HEADERS FROM
'file:///..some_csv.csv' AS line
WITH
SPLIT(line.date_of_birth, '/') AS date_of_birth, line
MERGE (p:Person {
 date_of_birth: date_of_birth
});

上面的这个块给了我错误:

Cannot merge node using null property value for date_of_birth  

我四处搜索,只发现one other SO question关于这个错误,没有答案。其他搜索没有帮助。

我的印象是,如果没有值,那么 Neo4j 根本不会创建元素。

我认为可能无法生成节点,因为毕竟,如果没有生成节点的值,如何生成节点?所以,因为我知道没有 ID 丢失,也许我可以与 ID 和日期合并,所以 Neo4j 总是看到一个值。

但是这段代码并没有好转(同样的错误信息):

LOAD CSV WITH HEADERS FROM
'file:///..some_csv.csv' AS line
WITH
SPLIT(line.date_of_birth, '/') AS date_of_birth, line
MERGE (p:Person {
 ID: line.ID
,date_of_birth: date_of_birth
});  

我的下一个想法是,这个错误可能是因为我试图在斜杠上拆分空值?也许整个问题是由于SPLIT

但是,唉,简化为同样的错误:

LOAD CSV WITH HEADERS FROM
'file:///..some_csv.csv' AS line
WITH line
MERGE (p:Person {
 subject_person_id: line.subject_person_id
,date_of_birth: line.date_of_birth
});

所以我真的不明白错误的原因。感谢您查看此内容。

编辑

@stdob-- 和 @cybersam 都得到了同样出色的回答,如果您是通过 Google 来到这里的,请将它们视为两者都被接受了

【问题讨论】:

  • 即使我没有任何空值或空值,我也会收到此错误。
  • 想通了:从 CSV 导入并且列在反引号内(例如,由于空格)并且您有外文时,您也会收到此错误。

标签: neo4j cypher


【解决方案1】:

我一直很喜欢的另一个解决方案是告诉 cypher 跳过感兴趣的字段为 NULL 的行,如下所示:

USING PERIODIC COMMIT #
LOAD CSV WITH HEADERS FROM
'file:///.../csv.csv' AS line
WITH line, SPLIT(line.somedatefield, delimiter) AS date
WHERE NOT line.somedatefield IS NULL

[THE REST OF YOUR QUERY INVOLVING THE FIELD]

【讨论】:

  • 非常优雅的解决方案 IMO。
  • WHERE NOT 对我来说很关键
【解决方案2】:

或者你可以使用COALESCE(n.property?, {defaultValue})

【讨论】:

  • 为什么property后面有问号? {} 是否应该像 Backus-Naur 表示法中那样表示必需值?
【解决方案3】:

正如@cybersam 所说,合并不适用于将属性设置在 null 范围内的查询。所以,你可以使用on create and on match

LOAD CSV WITH HEADERS FROM
  'file:///..some_csv.csv' AS line
MERGE (p:Person {
  subject_person_id: line.subject_person_id
})
  ON CREATE SET p.date_of_birth = line.date_of_birth
  ON MATCH SET p.date_of_birth = line.date_of_birth

【讨论】:

    【解决方案4】:

    某些 Cypher 查询(例如 MERGE)不适用于 NULL 值。

    使用MERGE 处理这种情况有点棘手的解决方法是使用FOREACH 子句有条件地执行MERGE。此查询可能对您有用:

    LOAD CSV WITH HEADERS FROM 'file:///..some_csv.csv' AS line
    FOREACH (x IN CASE WHEN line.date_of_birth IS NULL THEN [] ELSE [1] END |
      MERGE (:Person {date_of_birth: SPLIT(line.date_of_birth, '/')})
    );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多