无法与空值合并;neo4j中的“无法使用空属性值合并节点”

oyjwcjzk  于 2023-03-02  发布在  其他
关注(0)|答案(5)|浏览(285)

我有一个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访问这里的,请将它们视为已接受

zysjyyx4

zysjyyx41#

正如@cybersam所说,merge不适用于属性设置为null的查询,因此,可以使用on create和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
ruoxqz4g

ruoxqz4g2#

一些密码查询(如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, '/')})
);
wrrgggsh

wrrgggsh3#

另一个我非常喜欢的解决方案是让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]
yhqotfr8

yhqotfr84#

也可以使用COALESCE(n.property?, {defaultValue})

wfsdck30

wfsdck305#

按照VojtechRuzicka的方法,您可以使用类似于your_value:COALESCE(line.your_value, 'default value')的代码
如果您需要更多信息,请在此处链接到文档。

相关问题