2017-09-28 4 views
0

Je voudrais faire correspondre tous les chemins d'un nœud donné.Comment faire correspondre tous les chemins qui se terminent par des nœuds avec des propriétés communes dans Neo4j?

  -->(c: {name:"*Tom*"}) 
     /
(a)-->(b)-->(d: {name:"*Tom*"}) 
     \   
     -->(e: {name:"*Tom*"}) 

Ces chemins ont une structure précise que: - le nom de tous les enfants du deuxième dernier noeud (b) doit contenir substring « Tom ».

Comment écrire correctement le code Cypher?

+0

Donc, fondamentalement, le tout dernier nœud devrait contenir "Tom"? Quel chiffre avez-vous déjà essayé? – aldrin

+0

Oui, tous les derniers nœuds doivent contenir "Tom". J'ai essayé, mais b n'est pas une liste. 'match (: Personne {nom:" Démarrer "}) - [: AMI *] -> (b: Personne) où tout (x dans b où x.name = ~ '. * Tom. *')' – ShenLei

+0

Pourquoi faire vous utilisez des chemins de longueur variable ('*') dans la première relation? –

Répondre

3

Recréons l'ensemble de données:

CREATE 
    (a:Person {name: 'Start'}), 
    (b:Person), 
    (c:Person {name: 'Tommy Lee Jones'}), 
    (d:Person {name: 'Tom Hanks'}), 
    (e:Person {name: 'Tom the Cat'}), 
    (a)-[:FRIEND]->(b), 
    (b)-[:FRIEND]->(c), 
    (b)-[:FRIEND]->(d), 
    (b)-[:FRIEND]->(e) 

Comme vous l'avez dit dans le commentaire, all faut produire une liste. Pour obtenir une liste, vous devez utiliser la fonction collect sur les voisins de b:

MATCH (:Person)-[:FRIEND]->(b:Person)-[:FRIEND]->(bn:Person) 
WITH b, collect(bn) AS bns 
WHERE all(bn in bns where bn.name =~ '.*Tom.*') 
RETURN b, bns 

Nous appelons les voisins de b comme bn et les collectionne à une liste bns.

+0

Collect vraiment utile (x). Merci beaucoup – ShenLei