2016-09-27 8 views
4

У меня есть база данных графов, которая отображает соединения между зданиями и автостанциями, где график содержит другие соединительные элементы, такие как дороги и пересечения (среди многих типов узлов).Как фильтровать результаты по метке узла в 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 

Любые указания на это были бы очень признательны!

ответ

3
  1. Чтобы получить разные метки вдоль соответствующих путей:

    MATCH p=(a:Building)-[:CONNECTED_TO*..5]-(b:Bus) 
    WITH NODES(p) AS nodes 
    UNWIND nodes AS n 
    WITH LABELS(n) AS ls 
    UNWIND ls AS label 
    RETURN DISTINCT label; 
    
  2. Чтобы вернуть узлы, которые имеют Street метку.

    MATCH p=(a:Building)-[r:CONNECTED_TO*]-(b:Bus) 
    WITH NODES(p) AS nodes 
    UNWIND nodes AS n 
    WITH n 
    WHERE 'Street' IN LABELS(n) 
    RETURN n; 
    
+0

Возможно, вы сможете получить более эффективный запрос в 2. если вы используете что-то вроде 'WITH p, FILTER (узел в NODES (p) WHERE (node: Street)) в качестве улиц'. Это также позволяет сохранять отдельные пути сопоставления, так как ваш текущий запрос возвращает только улицы, но вы теряете информацию о пути или даже если доступны несколько путей. – InverseFalcon

0

ответы Cybersam являются хорошими, но их выход просто колонна этикеток ... вы полностью потеряете информацию о пути. Поэтому, если есть несколько путей от: Строка к: Шина, первый запрос будет выводить только все метки во всех узлах всех шаблонов, и вы не можете определить, сколько путей существует, и поскольку вы теряете информацию о пути, вы не можете указать, какие метки находятся в некоторых путях, но не в других, или распространены между некоторыми путями.

Аналогичным образом, второй запрос теряет информацию о пути, поэтому, если существует несколько путей, использующих разные улицы, чтобы получить от: Building to: Bus, запрос cybersam вернет все улицы, задействованные во всех путях. Это возможно для вывода всех улиц в вашем графике, что не кажется очень полезным.

Вам нужны запросы, которые сохраняют информацию о пути.

Для 1, находя разные метки на узлах на каждом пути я хотел бы предложить этот вопрос:

MATCH p=(:Building)-[:CONNECTED_TO*..5]-(:Bus) 
WITH NODES(p) AS nodes 
WITH REDUCE(myLabels = [], node in nodes | myLabels + labels(node)) as myLabels 
RETURN DISTINCT myLabels 

Для 2, этот запрос сохраняет информацию о пути:

MATCH p=(:Building)-[:CONNECTED_TO*..5]-(:Bus) 
WITH NODES(p) AS nodes 
WITH FILTER(node in nodes WHERE (node:Street)) as pathStreets 
RETURN pathStreets 

Обратите внимание, что они оба имеют дорогие операции, поскольку они выполняют декартовую продукцию всех зданий и всех автобусов, как в запросах в вашем описании. Я настоятельно рекомендую сузить здания и автобусы, на которые вы согласны, по меньшей мере, очень мало или конкретных зданий.

Я также рекомендую ограничить, насколько глубоко вы смотрите в своем шаблоне. Я понимаю, что многие, если не большинство, ваши узлы в вашем графике связаны между собой: CONNECTED_TO отношениями, и если мы не ограничиваем это до разумной суммы, ваш запрос может находить каждый единственный путь по всему вашему графику, независимо от того, насколько долго или запутанно или бессмысленно, и я не думаю, что это то, что вы хотите.

Смежные вопросы