我在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
. . .
我的问题是,创建的空值有什么问题,为什么在存在空值时我不能进行合并?
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都得到了同样出色的回复,如果你是通过谷歌来的,请考虑好像两者都被接受了
答案 0 :(得分:9)
某些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, '/')})
);
答案 1 :(得分:9)
正如@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
答案 2 :(得分:5)
或者您可以使用COALESCE(n.property?, {defaultValue})
答案 3 :(得分:3)
我一直非常喜欢的另一个解决方案是告诉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]