2015-12-29 3 views
0

У меня есть база данных с узлами, какКак удалить узлы в обратном порядке в Neo4j

(u : Update)-[:HAS_COMMENT]->(latest_comment:Comment)-[:NEXT]->(c1: Comment)->(c2: Comment) 

И так далее .. Каждый комментарий узел имеет связь с узлом пользователя

(c : Comment)<-[:HAS_COMMENTED]-(u : User). 

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

Решение, которое пришло мне в голову, состояло в том, чтобы перейти от последнего узла Comment и начать удаление отношения с узлом пользователя и удалить узел Comment и отношение «NEXT» к предыдущему узлу комментария. Я столкнулся с проблемой написать такой запрос.

Может кто-нибудь помочь мне с этим?

ответ

1

Используйте переменную путь длиной в OPTIONAL MATCH заявление, чтобы соответствовать на все комментарии в пути (прикован вместе с :NEXT отношений), а затем использовать DETACH DELETE удалить узлы и отношения:

MATCH (u:Update {name: "UpdateToDelete"})-[:HAS_COMMENT]->(c:Comment) 
OPTIONAL MATCH (c)-[:NEXT*]->(r:Comment) 
DETACH DELETE u,c,r 

DETACH DELETE удалят узлы и любые отношения, связанные с удаляемыми узлами.

Here - это консоль Neo4j для тестирования.

Редактировать

был добавлен DETACH DELETE заявление в Neo4j версии 2.3. Для достижения этой цели без использования DETACH DELETE попробовать этот запрос:

MATCH (u:Update {name: "UpdateToDelete"})-[hc:HAS_COMMENT]->(c:Comment) 
MATCH (c)-[n:NEXT*0..]->(r:Comment), (r)<-[h:HAS_COMMENTED]-(:User) 
FOREACH (x IN n | DELETE x) 
DELETE r,u,hc,c,h 

Основное различие заключается в том, что без использования DETACH DELETE мы должны совпадать по каждой связи, которая соединяет данный узел и удалить эти отношения, когда мы удаляем узел. Поскольку мы имеем путь переменной длины (комментарии, связанные произвольным числом NEXT-отношений), мы можем использовать функцию FOREACH для итерации по совокупности связей NEXT и удаления их при удалении узлов (ов) Comment.

+2

+1, однако нет необходимости в дополнительном совпадении, используйте только длины длины: 'MATCH (u: Update) - [: HAS_COMMENT] ->() - [: NEXT * 0 ..] -> (комментарий: Комментарий) DETACH DELETE comment, u' –

+0

@ william-lyon В консоли neo4j команда DETACH DELETE отлично работает, но на моем neo4j ее не работает. Он показывает сообщение об ошибке «Недопустимый вход« T »: ожидается« l/L », это из-за версии? Я использую neo4j 2.1.8 – user3542450

+0

@ user3542450 'DETACH DELETE' был добавлен в 2.3, я считаю. Можете ли вы перейти на текущую версию? Если нет, вы захотите добавить отношения к шаблону и в оператор 'DELETE'. –

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