我想打一个查询,查找包含所有成分的用户通过(一个未知量)的食谱。暗号:基于多个关系找到节点属性
我可以基于一种成分与此查询查找菜谱:
MATCH (r:Recipe)-[:CONTAINS]->(i:Ingredient {name: 'carrot'})
RETURN r
例如,我如何才能找到含有下列各成分的所有配方;胡萝卜,菠萝,芹菜,番茄,生姜?
我想打一个查询,查找包含所有成分的用户通过(一个未知量)的食谱。暗号:基于多个关系找到节点属性
我可以基于一种成分与此查询查找菜谱:
MATCH (r:Recipe)-[:CONTAINS]->(i:Ingredient {name: 'carrot'})
RETURN r
例如,我如何才能找到含有下列各成分的所有配方;胡萝卜,菠萝,芹菜,番茄,生姜?
代表所需的成份列表,并使用ALL
谓词来检查配方具有列表中的所有成分。诀窍是,只要你不引入新的变量,你可以使用patterns in conditions:
所以,模式不仅是表达式,它们也是谓词。对您的模式的唯一限制是您必须能够以单一路径表达它。像在MATCH中一样,不能在多个路径之间使用逗号。您可以通过将多个模式与AND结合来实现相同的效果。
请注意,您不能在这里引入新的变量。 [...]
该查询返回每一个有你列出的所有成分的配方:
MATCH (r:Recipe)
WHERE ALL(
ingredient IN ['carrot', 'pineapple', 'celery', 'tomato', 'ginger']
WHERE (r)-[:CONTAINS]->(:Ingredient {name: ingredient})
)
RETURN r
我猜你会通过用户输入的参数:
MATCH (r:Recipe)
WHERE ALL(
ingredient IN { ingredients }
WHERE (r)-[:CONTAINS]->(:Ingredient {name: ingredient})
)
RETURN r
如果您安装了3.1版本的APOC library的,你可以使用apoc.coll.containsAll
功能。例如:
MATCH (r:Recipe)-[:CONTAINS]->(ing:Ingredient)
WITH r, COLLECT(ing.name) AS names
WHERE apoc.coll.containsAll(names, {ingredients})
RETURN r;
(如果您安装了3.0版本的库,apoc.coll.containsAll
将是一个程序,和上面的查询将不得不进行相应的修改)