Как получить все подключенные узлы в neo4j

enter image description here

Я хочу получить список всех подключенных узлов, начиная с узла 0, как показано на схеме

3 ответов


на основе вашего комментария:

Я хочу получить список всех подключенных узлов. Например, в выше случай, когда я ищу подключенные узлы для 0, он должен вернуться узлы - 1,2,3

этот запрос будет делать то, что вы хотите:

MATCH ({id : 0})-[*]-(connected)
RETURN connected

приведенный выше запрос вернет все узлы, связанные с узлом с id=0 (Я считаю, что числа внутри узлов являются значениями свойства id) в любой глубине, в обоих направлениях и учитывая любой тип отношений. Посмотрите в разделе отношения в глубину документацию.

хотя это будет работать нормально для небольших графиков, обратите внимание, что это очень дорогая операция. Он будет проходить через весь график начиная с от начала ({id : 0}) рассматривая любой тип отношений. Это действительно не очень хорошая идея для производственных сред.


Если вы хотите сопоставить узлы, которые имеют отношение к другому узлу, вы можете использовать это:

MATCH (n) MATCH (n)-[r]-() RETURN n,r

он вернет вам все узлы, которые имеют отношение к другому узлу или узлам, независимо от направления отношения.

Если вы хотите, чтобы добавить ограничение, вы можете сделать это так:

MATCH (n:Label {id:"id"}) MATCH (n)-[r]-() RETURN n,r

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

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

использование метки "Label" и параметра idParam, запрос для получения узлов подграфа с APOC будет быть:

MATCH (n:Label {id:$idParam})
CALL apoc.path.subgraphNodes(n, {minLevel:1}) YIELD node
RETURN node

узлы будут отличаться, и начальный узел не будет возвращен вместе с остальными.

редактировать

в настоящее время существует ограничение, предотвращающее использование minLevel на subgraphNodes(), вы можете использовать либо отфильтровать начальный узел самостоятельно, либо использовать apoc.path.expandConfig() используя uniqueness:'NODE_GLOBAL' чтобы получить тот же эффект.