2017-09-05 3 views
1

J'ai un problème suivant: Je veux sélectionner les noeuds de chemins avec le type A. Mais je ne veux pas tous les chemins, seulement ceux avec des propriétés spécifiques. Le problème est que, dans notre datamodel, ces propriétés sont stockées dans un nœud distinct de type AD. Pour le début et la fin, tout fonctionne bien. Et je pense que j'ai également travaillé sur la structure générale car cette requête fonctionne parfaitement.Sélectionner les chemins en fonction des informations des noeuds liés

MATCH (n:A)-->(ad:AD) WHERE ad.name='AD0' 
WITH n AS start 
MATCH (n:A)-->(ad:AD) WHERE ad.name='AD3' 
WITH n AS end, start 
MATCH p = (start) -[:L*0..10]-> (end) 
WHERE ALL (x in nodes(p) [1..-1] WHERE ((x.name STARTS WITH 'ad1' OR x.name STARTS WITH 'ad2'))) 
return p 

Le problème est ici, que je reçois la propriété pour les noeuds intermédiaires sur des noeuds de type A, qui ne sera pas pe possible dans notre modèle final. Pour tester, j'ai ajouté une propriété à A contenant les informations normalement stockées dans AD. Le résultat ne doit contenir que des nœuds de type A liés à des nœuds de type AD et AD.name doit être AD0 ... AD3, mais je souhaite exclure des nœuds de type A liés à des nœuds AD avec AD.name = ' AD4 'par exemple. Pour cela, j'ai essayé la requête suivante, mais elle ne renvoie que le chemin contenant les nœuds A liés aux nœuds AD avec AD.name = AD0 ou AD3.

MATCH (n:A)-->(ad:AD WHERE ad.name='AD0' 
WITH n AS start 
MATCH (n:A)-->(ad:AD) WHERE ad.name='AD3' 
WITH n AS end, start 
MATCH (n:AD) WITH n AS ad, end, start //somehow needed otherwise I cannot use AD in the where clause 
MATCH p = (start) -[:L*0..]-> (end) 
WHERE ALL (
    x in nodes(p) [1..-1] WHERE (
     ((x)-->(ad:AD)) 
     AND 
     (ad.name ='AD1' OR ad.name='AD2') 
    ) 
) 
return p 

Toute idée pourquoi les chemins ne contenant que des nœuds de type A liés à des noeuds de type AD avec AD.name = AD1 ou AD2 ne sont pas retournés?

+0

Première chose: dans la ligne 'MATCH (n: AD) avec n ad, éviers, sources' vous ne passe pas' 'start' et end' au prochain contexte . Je crois que vous devriez changer cette ligne à 'MATCH (n: AD) avec n AS annonce, puits, sources, début, fin' et essayez à nouveau. –

+0

désolé, il y avait un mélange, sources de puits sont commencent fin maintenant, a corrigé le code ci-dessus – birnenpfluecker

Répondre

0

J'ai été capable de résoudre ce problème. Aucune idée s'il y a un meilleur moyen, mais j'ai dû mettre mes nœuds intermédiaires dans une liste séparée, sinon je ne peux pas l'utiliser dans la partie where de la clause WHERE ALL. Le code de travail ressemble à ceci:

MATCH (n:A)-->(ad:AD WHERE ad.name='AD0' 
WITH n AS start 
MATCH (n:A)-->(ad:AD) WHERE ad.name='AD3' 
WITH n AS end, start 
MATCH (n:A)-->(ad:AD) WHERE (ad.name IN ['AD1', 'AD2']) 
WITH collect(n) AS intermediates, sinks, sources 
MATCH p = (start) -[:L*0..]-> (end) 
WHERE ALL (
    x IN nodes(p) [1..-1] WHERE (
     x IN intermediates 
    ) 
) 
return p