Подтвердить что ты не робот

Удаление всех узлов и связей в neo4j с использованием cypher превышает кучу пространства

Я пытаюсь запустить этот запрос, как рекомендовано в группе google neo4j и в других источниках в Интернете:

START n = node (*) MATCH n- [r?] -() WHERE ID (n) > 0 DELETE n, r;

чтобы удалить все узлы и отношения между тестами. Когда я делаю это с консоли, у меня заканчивается пустое пространство Java. Когда я делаю это из python (используя новый graph_db.clear(), который появляется, использует тот же запрос), я получаю "SystemError: None", который, я полагаю, является той же ошибкой java-пространства в Java. У меня есть база данных с 500k узлами, всего 5k отношений и 7M свойствами. Я работаю на ноутбуке Mac (10.6.8) с 8 ГБ оперативной памяти, используя neo4j-1.8.1. Наверное, я немного удивлен тем, что удаление узлов (по существу без связей, так что очень маленькие подграфы) превысит пространство кучи java, но я очень наивно о том, как работает neo4j. Любые предложения о том, как продвигаться вперед, оцениваются. Я знаю, что rm -rf в каталоге данных и с нуля будет работать, но я думал, что может быть менее решительное решение.

[перетаскивается в группы neo4j google]

4b9b3361

Ответ 1

Как и в случае Neo4j 2.3.3, был введен новый способ удаления node и отношения. См. 2.3.3 Документы.

Например, вы можете сделать:

MATCH(n) DETACH DELETE n;

Ответ 2

Вышеприведенный выше оператор cypher заставляет все узлы (помимо корневого node с ID 0) создавать экземпляры перед удалением в одной транзакции. Это увеличивает слишком много памяти при работе с 500k узлами.

Попробуйте ограничить количество удаляемых узлов примерно на 10k-50k, например, например:

START n = node(*) 
MATCH n-[r?]-() 
WHERE (ID(n)>0 AND ID(n)<10000) 
DELETE n, r;

START n = node(*) 
MATCH n-[r?]-() 
WHERE (ID(n)>0 AND ID(n)<20000) 
DELETE n, r;

и др.

Однако нет ничего плохого в удалении всего каталога базы данных, это хорошая практика.

Ответ 3

Согласно документации neo4j, удаление графика выполняется через:

MATCH (n)
OPTIONAL MATCH (n)-[r]-()
DELETE n,r;

Чтобы избежать ошибки в области кучи java, я сконфигурировал этот код с помощью LIMIT:

MATCH (n)
OPTIONAL MATCH (n)-[r]-()
WITH n,r LIMIT 100000 DELETE n,r;

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

Ответ 4

Значок вопроса больше не работает. Используйте опциональное совпадение. Ниже следует работать.

               START n = node(*) 
               OPTIONAL MATCH n-[r]-() 
               WHERE (ID(n)>0 AND ID(n)<10000) 
               DELETE n, r;

Ответ 5

Вы можете увеличить область кучи в своих свойствах neo4j и включить gc log и наблюдать за ростом области кучи, если оно действительно близко к верхнему пределу. размер кеша страницы должен быть уменьшен или увеличен в зависимости от вашего начального размера.... уменьшить/увеличить его и проверить эффект на время загрузки. neo4j является голодной памятью... нужно больше размера кучи, сколько вы можете получить.