2017-10-13 5 views
2

Il y a 2 nœudsNeo4j/Cypher: noeud de retour si l'une des relations entre celui-ci un autre nœud rencontre un certain nombre de critères

  1. Feuille de route: (: feuille de route)
  2. Programme: (: Programme)

Ils sont liés à la relation (:Roadmap)<-[:IS_SHOWN_ON_ROADMAP]-(:Program)

Chaque fois qu'un programme se retire de la feuille de route d'un endDate p roperty se met sur la relation. Si ce même programme est ajouté à la même feuille de route, une nouvelle relation est ajoutée sans et endDate propriété. (De cette façon, nous pouvons remonter dans le temps et voir l'état des choses dans le passé).

Ainsi, il peut y avoir un nombre quelconque de relations [:IS_SHOWN_ON_ROADMAP] entre deux nœuds (:Program) et (:Roadmap). Là, s'il y a n relations, n ou n - 1 d'entre elles auront une date de fin. Tous auront une date de fin si le programme n'est pas actuellement sur la feuille de route, ou si l'un d'entre eux n'aura pas de date de fin s'il est actuellement sur la feuille de route.

Donc, ma question: En cypher comment puis-je poser la question "Montrez-moi tous les programmes qui ne sont pas actuellement actifs sur la feuille de route?"

AKA, s'il y a au moins une relation avec un endDate qui est null, alors ne le renvoie pas.
OU: retour uniquement des programmes où toutes les relations ont un endDate

La requête que j'ai (qui ne fonctionne pas tout à fait) est

MATCH (rm:Roadmap)<-[r:IS_SHOWN_ON_ROADMAP]-(p:Program) 
WHERE r.endDate IS NOT NULL 
RETURN p 

Cette requête renverra toujours un programme qui est actif sur la feuille de route , si elle a été enlevée quelque temps dans le passé. Exemple: S'il y a deux relations, une avec endDate (parce qu'elle a été supprimée) et une sans endDate (parce qu'elle est actuellement associée à la feuille de route).

J'ai besoin de trouver un moyen de chiffrer toutes les relations entre chaque programme et feuille de route et de ne pas retourner ce programme si au moins l'une des relations n'a pas de date de fin.

Répondre

2

Vous pouvez essayer d'utiliser la fonction ALL:

MATCH (rm:Roadmap)<-[r:IS_SHOWN_ON_ROADMAP]-(p:Program) 
WITH p, collect(r) as rs WHERE ALL(rel in rs WHERE rel.endDate IS NOT NULL) 
RETURN p 
+0

Grâce @BrunoPeres, qui a parfaitement fonctionné – BradStell