Не удается объединить с нулевыми значениями; "не удается объединить узел, используя значение свойства null" в neo4j

у меня есть столбец в CSV, который выглядит так:

enter image description here

я использую этот код, чтобы проверить, как работает разделение дат:

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 если не было даты ( e.g,

[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  

Я искал вокруг и нашел только еще один такой вопрос об этой ошибке, которая не имеет ответа. Другие поиски не помогли.

у меня сложилось впечатление, что если нет значения, то Neo4j просто не создает элемент.

я подумал, что узел не может быть создан, ведь, как может узел быть генерируется, если нет значения для его генерации? Итак, поскольку я знаю, что ID отсутствует, возможно, я мог бы слиться с ID и date, поэтому 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, пожалуйста, рассмотрите их, как если бы оба были приняты

4 ответов


как @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

некоторые запросы шифрования, как 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, '/')})
);

или вы можете использовать COALESCE(n.property?, {defaultValue})


другое решение, которое мне очень нравится, - это просто сказать сайферу пропустить строки, в которых поле интереса равно 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]