2016-03-10 3 views
0

У нас есть график, состоящий из наборов данных (~ 500) и пользователей (~ 15). Когда я попытался очистить оба набора узлов, используя следующий запрос, использование памяти Neo4J (v2.3.1) увеличилось до 1,5 ГБ, и запрос был довольно медленным.Запрос удаления Cypher вызывает высокий уровень использования памяти

MATCH (ds:DataSet), (u:User) 
OPTIONAL MATCH (ds)-[r1]-(), (u)-[r2]-() 
DELETE ds, u, r1, r2 

Удивительно разделив запрос на следующие два запроса:

MATCH (ds:DataSet) OPTIONAL MATCH (ds)-[r]-() DELETE ds, r 
MATCH (u:User) OPTIONAL MATCH (u)-[r]-() DELETE u, r 

сохранили память при ~ 240 МБ. Начальное потребление памяти после запуска составляет около ~ 230 МБ.

вопрос есть ли концептуальная проблема с первым запросом шифрования. Предполагается ли, что это очень неэффективно для одновременного удаления нескольких наборов узлов?

TL/дг:

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

ответ

1

Оказалось, что проблема связана с декартовым продуктом (ds)-[r1]-() и (u)-[r2]-().

1

Если вы просматриваете оба запроса, вы обнаружите, что первый из них приводит к декартовому произведению DataSet и User, потому что в этот момент они отключены шаблонами (хотя они могут быть связаны в базовом графике, шаблон не выражайте это).

Более эффективные запросы не имеют такой вещи: они находят узлы с помощью проверки метки и удаления.

+0

Декартовой продукт 'DataSet' и' User' не был проблемой, он просто позволял ~ 7000 удаленным ударам, что на самом деле не очень много. Спасибо за отзыв о 'ПРОФИЛЬ' –

Смежные вопросы