2016-08-02 3 views
0

У меня есть группа узлов, например, пример ниже. Есть ли запрос cypher, который может проверить, отключен ли узел «выключен» или «включен» (зеленый); если он «включен», он возвращает узел, к которому подключается узел «on», и исходный узел, который подключается к «on». Если узел «выключен», он просто возвращает узел, который подключается к нему. В этом примере он должен возвращать label1 и label2, но не label3.Neo4j Проверьте свойство cypher

example

+0

Что произойдет, если 'label3' подключается к другому зеленому узлу, который включен? – cybersam

+0

Он все равно должен возвращать то же самое. В этом случае мы начинаем с label1, если мы начнем с label3, тогда это будет иначе. –

ответ

1

Вы можете использовать комбинацию optional match и with как union:

// Is the starting node 
MATCH (S {name: 'label1'}) 
WITH S 
    // Get the nodes to which have access through a pattern of "ON" 
    OPTIONAL MATCH (S)-[:connect]->({on: true})-[:connect]->(onC) 
WITH S, collect(distinct onC) as onConnect 
    // Get the nodes to which have access through a pattern of "OFF" 
    OPTIONAL MATCH (S)-[:connect]->({on: false})<-[:connect]-(offC) 
WITH S, onConnect, collect(distinct offC) as offConnect 
    // Remove possible duplicates 
    UNWIND S + onConnect + offConnect as N 
RETURN collect(distinct N) as result 
0

Я предполагаю, что 'на' и 'выключено' являются состояния по параметру. Я собираюсь назвать это State в коде. Я также предполагаю, что вы хотите начать с определенного узла. Я не уверен, как вы получите этот узел, поэтому я предполагаю, что у вас есть ID, и он равен 1

MATCH (a) - [r: connect * ..] -> (b) где ID (n) = 1 b.State = 'on' return b