Neo4j 查询以查找列表中的所有匹配项

Neo4j 查询以查找列表中的所有匹配项,neo4j,cypher,Neo4j,Cypher,就我个人而言,我似乎无法为以下场景构建查询 给定与配料节点有关系的配方节点。 另找一份成分完全相同的食谱 任何指向正确方向的指针都将受到极大的赞赏 这当然不起作用,但却是一个失败尝试的例子 match (r:Recipie {name:"sweetcake"})-[:HAS_INGREDIENT]-(i:Ingredient) with collect(distinct i.name) as Ingredients match (r2:Recipie)-[:HAS_INGREDIENT]-(

就我个人而言,我似乎无法为以下场景构建查询

给定与配料节点有关系的配方节点。 另找一份成分完全相同的食谱

任何指向正确方向的指针都将受到极大的赞赏

这当然不起作用,但却是一个失败尝试的例子

match (r:Recipie {name:"sweetcake"})-[:HAS_INGREDIENT]-(i:Ingredient)
with  collect(distinct i.name) as Ingredients 
match (r2:Recipie)-[:HAS_INGREDIENT]-(i2:Ingredient) 
where (Ingredients IN colect(distinct i2.name)) 
return r2 limit 5
把它换成一点

with  collect(distinct i) as Ingredients
....
where (i2 IN Ingredients ) 
...

接近他们,但我得到的食谱,有一个原甜饼节点的成分

我收集了一个示例数据集来展示这一点,以确保我理解您的问题。我相信你想要的食谱至少包含所有相同的成分,这意味着另一个食谱必须包含与甜蛋糕食谱相同的所有成分,但也可能包含更多的成分

CREATE (sweetcake:Recipe {name:'Sweet Cake'}),
       (chocolatecake:Recipe {name:'Chocolate Cake'}),
       (lemoncake:Recipe {name:'Lemon Cake'}),

       (sugar:Ingredient {name:'Sugar'}),
       (something:Ingredient {name:'Something Nice'}),
       (milk:Ingredient {name:'Milk'}),
       (chocolate:Ingredient {name:'Chocolate'}),
       (lemon:Ingredient {name:'Lemon'}),

       (sweetcake)-[:HAS_INGREDIENT]->(sugar),
       (sweetcake)-[:HAS_INGREDIENT]->(something),
       (sweetcake)-[:HAS_INGREDIENT]->(milk),

       (chocolatecake)-[:HAS_INGREDIENT]->(sugar),
       (chocolatecake)-[:HAS_INGREDIENT]->(something),
       (chocolatecake)-[:HAS_INGREDIENT]->(milk),
       (chocolatecake)-[:HAS_INGREDIENT]->(chocolate),

       (lemoncake)-[:HAS_INGREDIENT]->(sugar),
       (lemoncake)-[:HAS_INGREDIENT]->(milk),
       (lemoncake)-[:HAS_INGREDIENT]->(lemon)
我很确定你想要巧克力蛋糕被退回,因为它分享了所有的糖,一些好吃的东西,还有牛奶和甜蛋糕。柠檬蛋糕不应该被退回,因为它没有好吃的东西。因此,使用ALL检查一个配方是否至少包含与甜蛋糕配方相同的所有成分

MATCH (:Recipe {name:'Sweet Cake'})-[:HAS_INGREDIENT]->(i:Ingredient)
WITH COLLECT(i) AS sweetcake_ingredients
MATCH (r:Recipe)-[:HAS_INGREDIENT]->(i:Ingredient)
WHERE r.name <> 'Sweet Cake'
WITH sweetcake_ingredients, r, COLLECT(i) AS other_ingredients
WHERE ALL(x IN sweetcake_ingredients WHERE x IN other_ingredients)
RETURN r.name

只有巧克力蛋糕被退回。

我收集了一个示例数据集来展示这一点,以确保我理解您的问题。我相信你想要的食谱至少包含所有相同的成分,这意味着另一个食谱必须包含与甜蛋糕食谱相同的所有成分,但也可能包含更多的成分

CREATE (sweetcake:Recipe {name:'Sweet Cake'}),
       (chocolatecake:Recipe {name:'Chocolate Cake'}),
       (lemoncake:Recipe {name:'Lemon Cake'}),

       (sugar:Ingredient {name:'Sugar'}),
       (something:Ingredient {name:'Something Nice'}),
       (milk:Ingredient {name:'Milk'}),
       (chocolate:Ingredient {name:'Chocolate'}),
       (lemon:Ingredient {name:'Lemon'}),

       (sweetcake)-[:HAS_INGREDIENT]->(sugar),
       (sweetcake)-[:HAS_INGREDIENT]->(something),
       (sweetcake)-[:HAS_INGREDIENT]->(milk),

       (chocolatecake)-[:HAS_INGREDIENT]->(sugar),
       (chocolatecake)-[:HAS_INGREDIENT]->(something),
       (chocolatecake)-[:HAS_INGREDIENT]->(milk),
       (chocolatecake)-[:HAS_INGREDIENT]->(chocolate),

       (lemoncake)-[:HAS_INGREDIENT]->(sugar),
       (lemoncake)-[:HAS_INGREDIENT]->(milk),
       (lemoncake)-[:HAS_INGREDIENT]->(lemon)
我很确定你想要巧克力蛋糕被退回,因为它分享了所有的糖,一些好吃的东西,还有牛奶和甜蛋糕。柠檬蛋糕不应该被退回,因为它没有好吃的东西。因此,使用ALL检查一个配方是否至少包含与甜蛋糕配方相同的所有成分

MATCH (:Recipe {name:'Sweet Cake'})-[:HAS_INGREDIENT]->(i:Ingredient)
WITH COLLECT(i) AS sweetcake_ingredients
MATCH (r:Recipe)-[:HAS_INGREDIENT]->(i:Ingredient)
WHERE r.name <> 'Sweet Cake'
WITH sweetcake_ingredients, r, COLLECT(i) AS other_ingredients
WHERE ALL(x IN sweetcake_ingredients WHERE x IN other_ingredients)
RETURN r.name
只有巧克力蛋糕被退回