2016-11-21 79 views
0

我想打一个查询,查找包含所有成分的用户通过(一个未知量)的食谱。暗号:基于多个关系找到节点属性

我可以基于一种成分与此查询查找菜谱:

MATCH (r:Recipe)-[:CONTAINS]->(i:Ingredient {name: 'carrot'}) 
RETURN r 

例如,我如何才能找到含有下列各成分的所有配方;胡萝卜,菠萝,芹菜,番茄,生姜?

回答

3

代表所需的成份列表,并使用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 
1

如果您安装了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将是一个程序,和上面的查询将不得不进行相应的修改)

相关问题