SET метка на основе данных в LOAD CSV
Я использую Neo4j 2.2.0 и импортирую данные (в виде файла узлов и файла отношений) через LOAD CSV.
Все узлы будут импортированы под меткой «Person», однако я хочу добавить метку «Geotag» для некоторых из них, если их поля широты и долготы в файле узлов пусты.
Так, например, файл приведенных ниже узлов (игнорируйте лишнюю строку между строками)
«Имя пользователя», «идентификатор», «широта», «долгота»
"abc123", "111111111", "33,223", "33.223"
"abc456", "222222222", "", ""
Я хотел бы создать узел "abc123" с метками Person и Geotag и узел abc456 только с меткой Person, поскольку он не имеет широты и долготы.
Я думал, что это будет что-то вроде:
LOAD CSV WITH HEADERS FROM "file:/users.csv" AS line
CREATE (p:Person { username: line.username, id: line.id, latitude: line.latitude, longitude: line.longitude })
SET p: (CASE WHEN line.latitude IS NOT NULL THEN GEOTAGGED);
Я знаю, что неправильно использую оператор CASE, а также оператор SET, но возможно ли это сделать при импорте узлов? Этот файл содержит более 3 миллионов узлов, и было бы полезно сделать это после вставки, чтобы при добавлении новых узлов (обычно в пакетном режиме) мы не исследовали все узлы только для того, чтобы перейти к новым.
Я исследовал другие вопросы (Как установить тип отношения и метку в LOAD CSV?, Загрузка отношений из данных CSV в neo4j db, Neo4j Cypher - создание узлов и установка меток с помощью LOAD CSV), однако они отличаются от моего вопроса тем, что эти OP пытаются использовать поле в файле в качестве метки, а я просто пытаюсь принять условное решение о том, какие метки использовать на основе данных в файле.
Спасибо!
РЕДАКТИРОВАТЬ: В ответ на ответ я пробую следующее:
LOAD CSV WITH HEADERS FROM "file:/users.csv" AS line
CREATE (p:Person { username: line.username, id: line.id, latitude: line.latitude, longitude: line.longitude })
CASE WHEN line.latitude IS NOT NULL THEN [1] ELSE [] END AS geotagged
FOREACH (x IN geotagged | SET p:Geotag);
Я получаю следующую ошибку:
QueryExecutionKernelException: Invalid input 'A': expected 'r/R' (line 3, column 2 (offset: 454)) "CASE WHEN line.latitude IS NOT NULL THEN [1] ELSE [] END AS geotagged"
С морковкой под «А» в «ДЕЛО»
EDIT2:
Ниже приведено полное решение, вдохновленное и мало отличающееся от решения Дэвида.
LOAD CSV WITH HEADERS FROM "file:/users.csv" AS line
CREATE (p:Person { username: line.username, id: line.id, latitude: line.latitude, longitude: line.longitude })
WITH p, CASE WHEN line.latitude <> "" THEN [1] ELSE [] END AS geotagged
FOREACH (x IN geotagged | SET p:Geotag);