Can';t与空值合并';无法使用null属性值合并节点';在neo4j中

Can';t与空值合并';无法使用null属性值合并节点';在neo4j中,neo4j,cypher,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; 这个代码块工作得很好,给了我我所期望的,它是每个日期的三个值的集合,或者如果没有日期(例如 我的问题是,创建的空值有什么问题,为什么我不能在有空值的情况

我在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;
这个代码块工作得很好,给了我我所期望的,它是每个日期的三个值的集合,或者如果没有日期(例如

我的问题是,创建的空值有什么问题,为什么我不能在有空值的情况下进行合并

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  
我到处搜索,只找到了这个错误,没有答案。其他搜索没有帮助

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

我想可能无法生成节点,因为毕竟,如果没有值可以生成节点,那么如何生成节点呢?因此,既然我知道没有缺少ID,也许我可以将ID和日期合并,这样Neo4j总能看到一个值

但这段代码没有任何改进(相同的错误消息):

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

但遗憾的是,如果简化成这样,同样的错误是:

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和@ CysSaM都得到了同样优秀的回答,如果你通过谷歌来这里,请把它们看作是两个都被接受的< /P> < P>一些密码查询,比如“代码>合并< /代码>,与<代码> 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, '/')})
);

正如@cybersam所说,merge不能很好地处理属性设置在null范围内的查询。因此,您可以使用:


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

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

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]

为什么在
属性
之后加问号?{}是指Backus Naur表示法中所要求的值吗?即使我没有空值或空值,我也会遇到这个错误。解决了:从CSV导入时也会出现这个错误,并且列在backticks内(例如,由于空格)而且你有外国角色。我觉得这是一个非常优雅的解决方案。
其中不
是我的关键
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, '/')})
);
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
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]