Как удалить узел и все отношения, а также узел, который связан с ним в Neo4j - PullRequest
0 голосов
/ 09 декабря 2018

Я хочу удалить специальный «корневой» узел в моей базе данных Neo4j.

Я уже нашел несколько вопросов / ответов в SO, но они бесполезны по другой причине.

Мы используем узел db: DATABASE для хранения данных клиента в Neo4j, а все остальные узлы каким-то образом связаны с этим узлом.Таким образом, настоящий Root Node Neo4j просто подключен к этой базе данных.Это означает, что при создании нового узла под арендатором этот новый узел имеет промежуточное соединение с узлом DATABASE и имя соединения СОДЕРЖИТ.

здесь приведен код создания узла DATABASE

      CREATE (db:Database { Name: 'TenantName' } ) " )

И я хочу удалить всего Арендатора, это означает, что я хочу удалить всю БАЗУ ДАННЫХ и весь узел, который подключен к узлу ДАННОЙ БАЗЫ.

Если удалить узел с этим простым шифром,узел удален, но все подключенные узлы все еще остаются в базе данных.

      MATCH (db:Database)
      WHERE db.Name = 'TeanantName'
      DETACH DELETE db

Задача заключается в следующем: мы не знаем ни имени узла, ни какого-либо соединения в узле DATABASE.


Уже отвечено на SO вопросы:

  1. Как удалить узел и связанные с ним узлы с помощью запроса шифра Neo4j? В этом ответе мы знаем имя отношения.«ACTED_IN» и предполагает, что у нас есть только это соединение с удаленным узлом.
  2. Neo4j: Как удалить все узлы и отношения за пределами узла? В этом случае мы знаем реальную структуру узла, но в нашем случае мы не знаем.
  3. узел удаления шифров и весь список связанных узлов Это предполагает, что каждый узел в пути больше не привязан ни к чему, кромеузлы в пути, иначе они не смогут быть удалены.Что в нашем случае неверно.
  4. Neo4j, как рекурсивно удалять узлы из некоторого начального узла В этом случае известна вся структура графа.

Спасибо, ребята!

1 Ответ

0 голосов
/ 09 декабря 2018

Хорошо, это должно быть просто.

При условии, что: узел базы данных для арендатора и все достижимые узлы из него должны быть удалены, независимо от метки узла или типа связи, соединяющего их,самым быстрым подходом будет использование процедур расширения пути из процедур APOC для сопоставления со всеми узлами в подграфе и их удаления:

MATCH (db:Database)
WHERE db.Name = 'TenantName'
CALL apoc.path.subgraphNodes(db, {}) YIELD node
DETACH DELETE node

Если существует достаточно большое количество узлов для удаления(> 10k или около того), тогда вы можете использовать apoc.periodic.iterate () для пакетного удаления:

CALL apoc.periodic.iterate("
 MATCH (db:Database)
 WHERE db.Name = 'TenantName'
 CALL apoc.path.subgraphNodes(db, {}) YIELD node
 RETURN node",
 "DETACH DELETE node",
 {}) YIELD total, batches, errorMessages
RETURN total, batches, errorMessages
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...