Спасибо за пояснение, это сложное требование, и мне не сразу понятно, какой лучший подход будет хорошо масштабироваться с большими графами, поскольку большинство возможностей кажутся дорогостоящими операциями с полным графом. Скорее всего, нам нужно будет выполнить несколько шагов, чтобы настроить график для упрощения запросов позже. Я также предполагаю, что вы имеете в виду «отключенные подграфы», иначе этот ответ не сработает.
Для начала можно было бы пометить узлы как «живые» или «мертвые» в зависимости от значения свойства. Это должно помочь, если все узлы имеют одну и ту же метку и есть ли индекс свойства значения для этой метки, поскольку наши операции сопоставления могут использовать индекс вместо того, чтобы выполнять полное сканирование метки и сравнение свойств.
MATCH (a:MyNode)
WHERE a.value <= 1
SET a:Dead
И отдельно
MATCH (a:MyNode)
WHERE a.value > 1
SET a:Alive
Тогда ваш запрос для отметки узлов для удаления будет:
MATCH (a:Dead)
WHERE NOT (a)-[*]-(:Alive)
SET a:ToDelete
И если все в порядке с узлами, которые вы отметили для удаления, вы можете запустить операцию удаления, используя apoc.periodic.commit () из процедур APOC, чтобы при необходимости выполнить операцию в пакетном режиме.
MATCH (a:ToDelete)
DETACH DELETE a
Если операции с отключенными подграфами будут обычным явлением, я настоятельно рекомендую использовать специальный узел, подключенный к каждому подграфу, который вы создаете (например, единственный узел: Cluster во главе подграфа), чтобы вы могли начать такие операции на: узлах кластера, что значительно ускорит такие запросы, поскольку ваши операции запроса будут выполняться для каждого кластера, а не для: Мертвый узел.
person
InverseFalcon
schedule
16.12.2016