Не удается объединить с нулевыми значениями; "не удается объединить узел, используя значение свойства null" в neo4j
у меня есть столбец в 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
если не было даты ( 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, '/')})
);
другое решение, которое мне очень нравится, - это просто сказать сайферу пропустить строки, в которых поле интереса равно 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]