Neo4j寻找配方,从食品室中提取成分

时间:2016-08-05 23:49:08

标签: neo4j cypher

您好我正在使用neo4j来创建食谱数据库。有配方节点,配料节点和食品室节点,并包含关系。通常,有许多配方含有许多成分,只有一个左右的食品包含许多成分。 我想知道什么食谱包含我在食品室里的成分。如果我可以订购食谱结果,以便首先显示最多成分的配方

,这也会很酷
MATCH (pantry_a:Pantry {name: "pantry_a"})-[:Contains]->(i:Ingredient) 
WITH COLLECT(i) AS pantry_ingredients
MATCH (r:Recipe)-[:Contains]->(i:Ingredient)
WITH pantry_ingredients, r, COLLECT(i) AS other_ingredients 
WHERE ALL(x IN pantry_ingredients WHERE x IN other_ingredients)
RETURN r.name

但它什么也没有回报。非常感谢任何帮助

干杯

1 个答案:

答案 0 :(得分:1)

[增订]

如果您只想找到其成分全部包含在指定食品室中的食谱,那么您非常接近。唯一真正的问题出在你的WHERE条款中,该条款检查所有食品室配料都在配方中。您实际上想要检查相反的情况(即,所有配方成分都在食品室中)。

以下查询应该适合您。它还首先返回含有最多成分的食谱。

MATCH (:Pantry {name: "pantry_a"})-[:Contains]->(i:Ingredient)
WITH COLLECT(i) AS pantry_ingredients
MATCH (r:Recipe)-[:Contains]->(i:Ingredient)
WITH pantry_ingredients, r, COLLECT(i) AS recipe_ingredients
WHERE ALL(x IN recipe_ingredients WHERE x IN pantry_ingredients)
RETURN r.name
ORDER BY SIZE(recipe_ingredients) DESC;

另一方面,如果您想要所有食谱需要来自指定食品室的一种或多种成分,并按照该食品储藏室中找到的成分数量对结果进行分类,这应该有效:

MATCH (:Pantry {name: "pantry_a"})-[:Contains]->(i:Ingredient)
WITH COLLECT(i) AS pantry_ingredients
MATCH (r:Recipe)-[:Contains]->(i:Ingredient)
WHERE i IN pantry_ingredients
WITH r, COLLECT(i) AS recipe_ingredients_in_pantry
RETURN r.name
ORDER BY SIZE(recipe_ingredients_in_pantry) DESC;