У меня есть база данных графов, которая отображает соединения между зданиями и автостанциями, где график содержит другие соединительные элементы, такие как дороги и пересечения (среди многих типов узлов).Как фильтровать результаты по метке узла в neo4j cypher?
Я пытаюсь выяснить, как фильтровать путь вниз, чтобы возвращать только определенные типы узлов. У меня есть два связанных вопроса, с которыми я в настоящее время борется.
Вопрос 1: Как вернуть метки узлов вдоль пути?
Кажется, что логическим первым шагом является определение того, что типа узлов происходит по пути.
Я попытался следующие:
MATCH p=(a:Building)-[:CONNECTED_TO*..5]-(b:Bus)
WITH nodes(p) AS nodes
RETURN DISTINCT labels(nodes);
Однако я получаю ошибку исключения типа, что метки() ожидает данных типа узла, а не коллекция. Я хотел бы динамически знать, какие типы узлов находятся на моих путях, чтобы я мог в конечном итоге фильтровать мои пути.
Вопрос 2. Как вернуть подмножество узлов в пути, который соответствует метке, которую я идентифицировал на первом этапе?
Говорит, я обнаружил, что, что между (a:Building)
и (d1:Bus)
и (d2:Bus)
я могу ожидать, чтобы найти (:Intersection)
узлов и (:Street)
узлов.
Это упрощенная модель моего графика:
(a:Building)--(:Street)--(:Street)--(b1:Bus)
\(:Street)--(:Intersection)--(:Street)--(b2:Bus)
Я написал MATCH
о том, что будет искать все возможные пути между (:Building)
и (:Bus)
узлов. Что мне нужно сделать рядом с фильтром для выборочного возврата узлов Street?
MATCH p=(a:Building)-[r:CONNECTED_TO*]-(b:Bus)
// Insert logic to only return (:Street) nodes from p
Любые указания на это были бы очень признательны!
Возможно, вы сможете получить более эффективный запрос в 2. если вы используете что-то вроде 'WITH p, FILTER (узел в NODES (p) WHERE (node: Street)) в качестве улиц'. Это также позволяет сохранять отдельные пути сопоставления, так как ваш текущий запрос возвращает только улицы, но вы теряете информацию о пути или даже если доступны несколько путей. – InverseFalcon