2017-09-22 5 views
2

J'ai une liste de noeuds de départ (Ingridients) et je veux trouver toutes les recettes, qui ont spécifié des ingridients (exemple de code ci-dessous). J'essaie de trouver toutes les recettes contenant des ingridients 'Ingridient2', 'Ingridient3', 'Ingridient4'.Comment trouver des noeuds, qui ont une relation avec la liste des noeuds de départ

J'utilise ce code

MATCH result=(n:Ingridient)-[r:RELATED]->(m:Recipe) 
    WHERE n.name IN ['Ingridient2', 'Ingridient3','Ingridient4'] 
RETURN result 

Mais ce retour de code tout recette qui ne contiennent qu'un seul Ingridient2 ou Ingridient3, etc.

Ma question comment je peux trouver des recettes, avec Ingridients contiennent spécifié. lien également joint par exemple http://console.neo4j.org/r/doxwy4

CREATE (Recipe1:Recipe {name:'Recipe1'}) 
CREATE (Recipe2:Recipe {name:'Recipe2'}) 
CREATE (Recipe3:Recipe {name:'Recipe3'}) 
CREATE (Recipe4:Recipe {name:'Recipe4'}) 

CREATE (Ingridient1:Ingridient {name:'Ingridient1'}) 
CREATE (Ingridient2:Ingridient {name:'Ingridient2'}) 
CREATE (Ingridient3:Ingridient {name:'Ingridient3'}) 
CREATE (Ingridient4:Ingridient {name:'Ingridient4'}) 
CREATE (Ingridient5:Ingridient {name:'Ingridient5'}) 

CREATE 
    (Ingridient1)-[:RELATED]->(Recipe1), 
    (Ingridient2)-[:RELATED]->(Recipe1), 
    (Ingridient3)-[:RELATED]->(Recipe1) 

CREATE 
    (Ingridient2)-[:RELATED]->(Recipe2), 
    (Ingridient3)-[:RELATED]->(Recipe2), 
    (Ingridient4)-[:RELATED]->(Recipe2) 

CREATE 
    (Ingridient3)-[:RELATED]->(Recipe3), 
    (Ingridient4)-[:RELATED]->(Recipe3), 
    (Ingridient5)-[:RELATED]->(Recipe3) 

Répondre

4

Voici un Cypher, avec des commentaires, pour ce que vous voulez faire. Vous pouvez utiliser WHERE ALL (...) pour valider sur une collection entière.

// Match all Recipe and their ingredients 
MATCH (n:Ingridient)-[r:RELATED]->(recipe:Recipe) 

// Collect ingredients into a collection 
WITH COLLECT(n.name) as ingredients, recipe 

// Filter where recipe uses all our ingredients 
WHERE ALL(part in ['Ingridient2', 'Ingridient3','Ingridient4'] WHERE part IN ingridients) 

// Return valid recipes 
RETURN recipe 
+0

ouais, vous m'avez sauvé la vie. mais correct typo in ingridients (should ingredients) –

+0

@BekerovArtur Vous avez utilisé "Ingridient" dans votre question, donc j'ai gardé le Cypher compatible avec cela = P – Tezra