Как вставить большое количество узлов в Neo4J

Мне нужно вставить около 1 миллиона узлов в Neo4j. Мне нужно указать, что каждый узел уникален, поэтому каждый раз, когда я вставляю узел, нужно проверять, что еще нет такого же узла. Также отношения должны быть уникальными.

Я использую Python и Cypher:

uq = 'CREATE CONSTRAINT ON (a:ipNode8) ASSERT a.ip IS UNIQUE'
...
queryProbe = 'MERGE (a:ipNode8 {ip:"' + prev + '"})'
...
queryUpdateRelationship= 'MATCH (a:ipNode8 {ip:"' + prev + '"}),(b:ipNode8 {ip:"' + next + '"}) MERGE (a)-[:precede]->(b)'

Проблема в том, что после выставления 40-50к нод в Neo4j скорость вставки быстро тормозится и больше ничего поставить не могу.


person RamsesXVII    schedule 12.12.2016    source источник


Ответы (2)


Ваш вопрос довольно открытый. В дополнение к рекомендациям @InverseFalcon, вот некоторые другие вещи, которые вы можете изучить, чтобы ускорить процесс.

  1. Прочтите документацию по настройке производительности и следуйте рекомендациям. В частности, вы можете столкнуться с проблемами, связанными с памятью, поэтому Раздел «Настройка памяти» может оказаться очень полезным.

  2. Вероятно, ваши запросы Cypher могут быть ускорены. Например, если это имеет смысл, вы можете попробовать что-то вроде следующего. Ожидается, что data параметр будет списком объектов. имеющий формат {a: 123, b: 234}. Вы можете сделать список сколь угодно длинным (например, 20 КБ), чтобы избежать нехватки памяти на сервере, пока он обрабатывает список в рамках одной транзакции. (Этот запрос предполагает, что вы также хотите создать b, если он не существует.)

    UNWIND {data} AS d
    MERGE (a:ipNode8 {ip: d.a})
    MERGE (b:ipNode8 {ip: d.b})
    MERGE (a)-[:precede]->(b)
    

    Существуют также периодическое выполнение процедур APOC, которые вы можете использовать.

person cybersam    schedule 12.12.2016

Для таких массовых вставок лучше всего использовать LOAD CSV с периодической фиксацией или инструмент импорта.

Я считаю, что также рекомендуется использовать параметризованный запрос вместо добавления значений в строку.

Кроме того, вы создали ограничение уникального свойства для :ipNode8, но не для :ipNode, который является первым, который вы MERGE. Похоже, вам тоже понадобится уникальное ограничение.

person InverseFalcon    schedule 12.12.2016