MERGE不能为空值; '无法在neo4j中使用null属性值合并节点'

Mon*_*eck 13 neo4j cypher

我在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;
Run Code Online (Sandbox Code Playgroud)

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

[4, 5, 1971]  
[0, 0, 2003]  
[0, 0, 2005]  
 . . .  
null  
null  
 . . .  
Run Code Online (Sandbox Code Playgroud)

我的问题是,创建的空值有什么问题,为什么在有空值时我不能做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
});
Run Code Online (Sandbox Code Playgroud)

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

Cannot merge node using null property value for date_of_birth  
Run Code Online (Sandbox Code Playgroud)

我已经四处搜索,并且只发现了另外一个关于此错误的问题,这个问题没有答案.其他搜索没有帮助.

我的印象是,如果没有值,那么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
});  
Run Code Online (Sandbox Code Playgroud)

我的下一个想法是,这个错误可能是因为我试图在斜杠上拆分空值?也许整个问题都是由于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
});
Run Code Online (Sandbox Code Playgroud)

所以我真的不明白错误的原因.谢谢你看这个.

编辑

@ stdob--和@cybersam都得到了同样出色的回复,如果你是通过谷歌来的,请考虑他们好像都被接受了

std*_*b-- 14

正如@cybersam所说,合并不适用于在null范围内设置属性的查询.因此,您可以在创建和匹配时使用:

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
Run Code Online (Sandbox Code Playgroud)


cyb*_*sam 11

有些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, '/')})
);
Run Code Online (Sandbox Code Playgroud)


小智 5

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


Tsh*_*nga 5

我一直很喜欢的另一个解决方案是告诉 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]
Run Code Online (Sandbox Code Playgroud)