Получение подграфа, не пересекающего определенный узел - PullRequest
0 голосов
/ 20 декабря 2018

У меня огромный (нециклический) граф, и я хочу найти все узлы, достижимые по отношению X от данного узла.Тем не менее, я не хочу пересекать узел, имеющий определенный атрибут {attr:'donotcross'}, поскольку это представляет собой дроссельную точку, которую я не хочу пересекать (т.е. это единственный узел, ведущий к смежному подграфу).

В настоящее времяСначала я выполняю поиск в ширину, используя тривиальный запрос Cypher, чтобы изолировать соседние узлы и python, останавливая рекурсию, как только достигаю этого конкретного узла.Это, однако, очень медленно, и я думаю, что использование чистого Cypher для изоляции этих узлов может быть быстрее.

Как выглядит запрос Cypher, возвращающий все подключенные узлы через X, но не пересекающий узел ссвойство attr:'donotcross'?

Моя интуиция была бы

MATCH (n)-[:X*]->(inter)-[:X*]->(m) WHERE NOT inter.attr = 'donotcross' RETURN m

, где n - начальный узел.Однако это не работает, так как этот шаблон может сопоставить путь с запрещенным узлом, если между начальным и целевым узлом больше запрещенного узла.

1 Ответ

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

Используя только Cypher, вы можете использовать следующий подход:

MATCH path = (n)-[:X*]->(m) // best to use a label!
WHERE none(node in nodes(path) WHERE inter.attr = 'donotcross')
RETURN DISTINCT m

Имейте в виду, что вы должны по крайней мере использовать метки для вашего начального узла n, если вы не можете их просмотретьна индексированное свойство для конкретной метки.

Кроме того, если этих donotcross узлов относительно мало, и если на метке этих узлов есть индекс attr, то это можетБыстрее сначала сопоставить на этих узлах, собрать их, а затем отфильтровать на основе этого:

MATCH (x) // best to use a label and index lookup!
WHERE x.attr = 'donotcross'
WITH collect(x) as excluded
MATCH path = (n)-[:X*]->(m) // best to use a label!
WHERE none(node in nodes(path) WHERE node in excluded) 
RETURN DISTINCT m
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...