2016-12-12 5 views
1

Мне нужно вставить около 1 миллиона узлов в Neo4j. Мне нужно указать, что каждый узел уникален, поэтому каждый раз, когда я вставляю узел, он должен быть проверен, что еще нет одного узла. Также отношения должны быть уникальными.Как вставить большое количество узлов в 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-50K узлов в Neo4j, скорость вставки замедляет быстро, и я не могу поставить что-нибудь еще.

ответ

0

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

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

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

+0

Я всегда использую ipNode8, это была ошибка при копировании – RamsesXVII

1

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

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

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

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

    Есть также periodic execution процедуры Апок, что вы могли бы быть в состоянии использовать.