Я хочу импортировать файл excel, который на самом деле представляет собой матрицу отношений nxn с несколькими типами отношений между элементами n.
id| name | element1 | element2 | element3 ... n
1 | element1 1;2;3 1;5
2 | element2 1;2;3
3 | element3 1;5
...
Я сохранил Excel как CSV, что создает много нулевых ячеек (пустых ячеек).
В Neo4j пробовал:
load csv with headers from 'file:///test.csv' as line
WITH line where not line.ID is null
merge (c:element{id: toInteger(line.id),name: line.name})
в результате никаких изменений и записей я не получаю.
Имена свойств в Neo4j Cypher чувствительны к регистру.
В вашем файле есть столбец id
, но вы проверяете where not line.ID is null
.
Это пропустит все строки, так как в вашем CSV-файле нет столбца ID
.
Найдите ниже измененную версию вашего запроса для удобочитаемости:
LOAD CSV WITH HEADERS FROM 'file:///test.csv' AS line
WITH line
WHERE line.id IS NOT NULL
MERGE (c:element{id: toInteger(line.id),name: line.name})
Помимо ответа @Raj (имена свойств чувствительны к регистру), в вашем CSV-файле должен использоваться один и тот же разделитель между всеми значениями.
В вашем CSV-файле (как показано в вашем вопросе) используются несогласованные разделители. Иногда он использует пробелы, а иногда пробелы и вертикальные черты (|
). Это не сработает, так как предложение ЗАГРУЗИТЬ CSV-файл поддерживает только один тип разделителя. Кроме того, если вы не используете разделитель по умолчанию, запятую, вам нужно использовать параметр FIELDTERMINATOR
, чтобы указать, что это за разделитель.
Вот исправленная версия вашего файла CSV, в которой используется разделитель по умолчанию — запятая. Обратите внимание, что две соседние запятые используются для обозначения отсутствующего значения. Если в строке отсутствует первое значение, то первая запятая должна стоять в начале этой строки. Кроме того, обратите внимание на отсутствие лишних пробелов.
id,name,element1,element2,element3
1,element1,,1;2;3,1;5
2,element2,1;2;3
3,element3,1;5
теперь я также хочу импортировать отношения, как мне это автоматизировать? Следующее создает отношение только для одной строки, как выполнить итерацию по всем строкам с именем? 'ЗАГРУЗИТЬ CSV С ЗАГОЛОВКАМИ ИЗ 'file:///test.csv' КАК строку СО строкой, ГДЕ line.element1 НЕ NULL Соответствие (c:element{id: toInteger(line.id),name: line.name}) Соответствие (d:element{name:'element1'}) Объединить (d)-[:REL{type: line.element1}]-(c) вернуть c,d'
Я думаю, вы должны задать новый вопрос. В вашем комментарии много потенциальных проблем с Cypher, и их решение слишком усложнит этот и без того сложный вопрос.
Если это не решит вашу проблему, проверьте, разделен ли ваш файл запятыми или символами табуляции.