不能合并空值; neo4j

问题描述 投票:0回答:5

我在 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  

我四处搜索,只发现另一个关于这个错误的SO问题,没有答案。其他搜索没有帮助。

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

我想可能无法生成节点,毕竟,如果没有生成节点的价值,如何生成节点?所以,因为我知道没有 ID 丢失,也许我可以 MERGE 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 来到这里的,请将它们视为都被接受了

neo4j cypher
5个回答
15
投票

正如@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

12
投票

一些 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, '/')})
);

6
投票

我一直很喜欢的另一个解决方案是告诉 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]

5
投票

或者你可以使用

COALESCE(n.property?, {defaultValue})


0
投票

按照 Vojtech Ruzicka 的方法,你可以使用这样的东西

your_value:COALESCE(line.your_value, 'default value')

链接到文档这里,如果您需要更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.