2016-12-06 3 views
1

Я хочу удалить связанный граф, связанный с определенным узлом в базе данных Neo4j, используя Cypher. Вариант использования - удалить узел «start» и все узлы, где существует путь к стартовому узлу. Чтобы ограничить транзакцию, запрос должен быть итеративным и не должен отключать подключенный график.Удалить связанный граф с Cypher

До сих пор я не я использую этот запрос:

OPTIONAL MATCH (start {indexed_prop: $PARAM})--(toDelete) 
OPTIONAL MATCH (toDelete)--(toBind) 
WHERE NOT(id(start) = id(toBind)) AND NOT((start)--(toBind)) 
WITH start, collect(toBind) AS TO_BIND, toDelete limit 10000 
DETACH DELETE toDelete 
WITH start, TO_BIND 
UNWIND TO_BIND AS b 
CREATE (start)-[:HasToDelete]->(b) 

И называют его до тех пор, пока узел удален равно 0.

Есть ли лучший запрос для этого?

+0

Я полагаю, вы пробовали путь переменной длины ко всем подключенным узлам и DETACH DELETE каждого подключенного узла? Это взорвает вашу кучу? – InverseFalcon

+0

Да, но проблема в том, что запрос не работает на большом графике, вызывающий запрос несколько раз может сломать связанный граф. – cde

ответ

1

Вы можете попробовать использовать метод маркировки и удаления, который аналогичен тому, как вы будете отсоединять и удалять весь связанный граф с переменным соответствием, но вместо DETACH DELETE вы можете применить метку TO_DELETE.

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

MATCH (start:StartNodeLabel {indexed_prop: $PARAM})-[*]-(toDelete) 
SET toDelete:TO_DELETE 

Если взрывает ваш куча, вы можете запускать его несколько раз с добавленным предикатом WHERE NOT toDelete:TO_DELETE до SET и используя комбинацию LIMIT и/или ограничение на глубину отношения переменной длины.

Когда вы уверены, что вы отметили каждый подключенный узел, это просто вопрос удаления каждого узла на ярлыке TO_DELETE, и вы можете запустить его итеративно или использовать процедуру APOC apoc.periodic.commit() для обрабатывать их партиями.

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