2016-08-02 1 views
0

J'ai un groupe de nœuds comme l'image ci-dessous. Y a-t-il une requête de chiffrement qui peut vérifier si un nœud est éteint ou "allumé" (en vert); si elle est activée, elle renvoie le noeud auquel le noeud "on" se connecte et le noeud d'origine qui se connecte à "on". Si le noeud est "off", il renvoie simplement le noeud qui s'y connecte. Dans cet exemple, il doit renvoyer label1 et label2, mais pas label3.Neo4j Vérifier la propriété cypher

example

+0

Que se passe-t-il si 'label3' se connecte à un autre nœud vert actif? – cybersam

+0

Il devrait toujours retourner la même chose. Dans ce cas, nous commençons à label1, si nous devions commencer à label3, ce serait différent. –

Répondre

1

Vous pouvez utiliser la combinaison de optional match et with comme 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

Je suppose que 'sur' et 'off' sont des états sur un paramètre. Je vais l'appeler Etat dans le code. Je suppose également que vous voulez commencer à un nœud spécifique. Je ne suis pas sûr comment vous obtenez ce noeud, donc je suppose que vous avez l'ID et il est égal à 1

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