Neo4j удалить, обновить несколько узлов и соединений - PullRequest
0 голосов
/ 23 января 2019

У меня есть следующая схема в Neo4J:

enter image description here

Краткое описание:

  • Узлы 1, 2, 3(черный) из "Хельмут" - это сообщения кормления.
  • Узлы 1,2,3,4,5,6 (красный) из "Доу" - сообщения кормления.Но узлы 1,2 от «Доу» - это доли от 2, а затем 1 от «Хельмута».Таким образом, узел 1 от Doe является частью узла 2 от «Helmut», а узел 2 от «Doe» является частью узла 1 от «Helmut».Общие узлы связаны с помощью соединения «ORIGIN», поэтому я могу получить свойство конфиденциальности исходного узла.

Я хочу удалить узел «Helmut» и с ним выполнить следующие шаги:

  1. разорвать (удалить) соединения «aliveInCity», «aliveInCountry», «isFriendsWith» пользователя «Helmut»
  2. У других пользователей, таких как «Doe», есть узлы, которые связаны сдругие узлы через соединение "ORIGIN".Это означает, что эти узлы являются общими с другого узла.В моем примере пользовательские узлы "Doe" 1 и 2 являются общими для узлов "Helmut".Все узлы, которые имеют соединение «ORIGIN» с зелеными узлами от пользователя «Helmut» (связанного с FEED_ITEMS или NEXT), должны иметь статус «удален» - это просто строка, в которой говорится «удалено».
  3. deleteвсе feed_items и следующие узлы, которые приходят от пользователя "Helmut"
  4. удалить пользовательский узел "Helmut".

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

Я ожидаю, что в какой-то момент будет много узлов с соединением "ORIGIN".Исходное соединение означает, что это общий канал.Интересно, что это означает с точки зрения скорости, чтобы установить множество узлов со статусом «удален».Мне нужно будет сделать это в отдельном вызове (например, в качестве процесса MQ), или это будет хорошо сделать по запросу сервера формы / URL-адреса?

Также, если я удалю узел "Helmut" ине соединения между странами и городами, скажем, эти соединения останутся как призрачные соединения, или они будут удалены после того, как узел исчезнет?

1 Ответ

0 голосов
/ 28 января 2019

Поскольку вы не знаете, сколько общих ресурсов существует из сообщений удаленного пользователя, вероятно, лучше всего выполнить их групповую модификацию с последующим групповым удалением.Для этого мы можем использовать apoc.periodic.iterate () из процедур APOC.

CALL apoc.periodic.iterate("
MATCH (d:Doctor {name:${nameToDelete})-[:FEED_ITEM]->()-[:NEXT*0..]->(feedItem)
OPTIONAL MATCH (feedItem)<-[:ORIGIN]-(share)
RETURN feedItem, share",
"SET share.status = 'deleted'
 WITH DISTINCT feedItem
 DETACH DELETE feedItem", {}) YIELD batches, total, errorMessages
 RETURN batches, total, errorMessages

При этом используется значение по умолчанию batchSize, равное 10 тыс. Записей за раз (потоковое из внешнего запроса, затем внутренний запрос применяется кпакет)

Либо в том же запросе (после вызова процедуры), либо в отдельном, вы можете выполнить УДАЛЕНИЕ СООТВЕТСТВИЯ и УДАЛЕНИЯ доктора для удаления.

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

...