Для эффективного сопоставления с достижимыми узлами есть два варианта, которые, как правило, хорошо работают.
В Neo4j 3.2.x есть эффективное средство для сопоставления со всеми различными доступными узлами посредством сопоставления отношений переменных плюс использование DISTINCT, но для этого требуется верхняя граница отношения переменной длины. Использование подходящего большого числа должно работать. Что-то типа:
MATCH (:SomeLabel{someProperty:false})-[*..999999]->(x)
WITH distinct x
SET x.someProperty = false
В противном случае Процедуры APOC предлагают apoc.path.subgraphNodes(), который также выполняет эффективное сопоставление с доступными узлами в подграфе:
MATCH (start:SomeLabel{someProperty:false})
CALL apoc.path.subgraphNodes(start, {}) YIELD node
SET node.someProperty = false;
РЕДАКТИРОВАТЬ
Чтобы добавить больше деталей для первого варианта (почему бы просто не использовать *
и почему использовать DISTINCT), имейте в виду, что по умолчанию Cypher будет соответствовать всем возможным путям, когда мы используем *
, даже если эти пути заканчиваются в том же узле, что и ранее сопоставленный путь. Это может стать неэффективным в достаточно связном графе (когда у нас нет разумной верхней границы и мы не используем LIMIT), с возможностью взорвать вашу кучу или зависнуть на неопределенный срок.
Этого особенно следует избегать, когда нас интересуют не все возможные пути, а только все возможные достижимые узлы.
В Neo4j 3.2 была введена оптимизация под названием pruning-var expand, которая изменяет логику обхода в случае, когда выполняются все следующие условия:
- У нас есть расширение var-length
- Мы никоим образом не ссылаемся на путь (например, устанавливая переменную пути для шаблона соответствия или устанавливая переменную для отношения var-length)
- У нас есть верхняя граница расширения var-length
- Мы просим РАЗЛИЧНЫЕ узлы или значения, которые можно получить из расширения
В основном, когда запрос таков, что ясно, что нам нужны отдельные узлы (или значения из разных узлов) из расширения переменной длины и не заботятся о путях.
Затем планировщик будет использовать отбрасывающую переменную расширения (вы можете подтвердить это, проверив план запроса из EXPLAIN или PROFILE) для эффективного сопоставления с доступными узлами.
person
InverseFalcon
schedule
09.11.2017