В настоящее время я работаю над проектом по внедрению базы данных Neo4j (V2.2.0) в области веб-аналитики. После загрузки некоторых образцов я пытаюсь загрузить большой набор данных (> 1 ГБ,> 4 М строк). Проблема, с которой я сталкиваюсь, заключается в том, что использование команды MERGE занимает экспоненциально больше времени по мере увеличения размера данных. Интернет-источники неоднозначны в отношении того, что лучший способ - загрузить большие наборы данных, когда не каждая строка должна быть загружена как узел, и я хотел бы получить некоторую ясность по этому вопросу. Чтобы подчеркнуть, в этой ситуации я просто загружаю узлы; отношения - следующий шаг.Команда MERGE Neo4j в больших наборах данных
В основном существует три метода
I) Установить ограничение уникальности для свойства, и создавать все узлы. Этот метод использовался главным образом до того, как была введена команда MERGE.
CREATE CONSTRAINT ON (book:Book) ASSERT book.isbn IS UNIQUE
следует
USING PERIODIC COMMIT 250
LOAD CSV WITH HEADERS FROM "file:C:\\path\\file.tsv" AS row FIELDTERMINATOR'\t'
CREATE (:Book{isbn=row.isbn, title=row.title, etc})
По моему опыту, это будет возвращать ошибку, если дубликат найден, который останавливает запрос.
ii) Объединение узлов со всеми их свойствами.
USING PERIODIC COMMIT 250
LOAD CSV WITH HEADERS FROM "file:C:\\path\\file.tsv" AS row FIELDTERMINATOR'\t'
MERGE (:Book{isbn=row.isbn, title=row.title, etc})
Я попытался загрузками своего сета таким образом, но после того, как позволить протекание процесса в течение более 36 часов, и приходить к останову, я полагал, что должна быть лучшей альтернативой, так как ~ 200K моего возможного ~ Загружено 750 тыс. Узлов.
iii) Объединение узлов на основе одного свойства и установка остального после этого.
USING PERIODIC COMMIT 250
LOAD CSV WITH HEADERS FROM "file:C:\\path\\file.tsv" AS row FIELDTERMINATOR'\t'
MERGE (b:Book{isbn=row.isbn})
ON CREATE SET b.title = row.title
ON CREATE SET b.author = row.author
etc
Я бегу тест (~ 20К узлов), чтобы увидеть, если переключение от метода II к III позволит улучшить время выполнения, так как меньший образец дал противоречивые результаты. Существуют ли методы, которые я контролирую и могу улучшить время выполнения? Если я не ошибаюсь, пакетный вставщик работает только для команды CREATE, а не команды MERGE.
Я разрешил Neo4j использовать 4 ГБ ОЗУ, и, судя по моему диспетчеру задач, этого достаточно (используется чуть более 3 ГБ).
AFAIK, метод iii) будет использовать индекс для поиска узла, тогда как метод ii) не будет (из-за сопоставления нескольких свойств). Вы также пытались увеличить количество операций в каждой транзакции до 1000, например? – albertoperdomo
Сначала я опустил его, потому что думал, что Neo4j не справляется с загрузкой, когда я установил его на уровне 1000. После обнаружения реальной проблемы с этой установкой я не увеличил ее до 1000, поэтому я сделаю что снова –