我想创建一个查询,找到包含用户传递的所有成分的食谱(未知数量)。
我可以使用此查询找到基于一种成分的食谱:
MATCH (r:Recipe)-[:CONTAINS]->(i:Ingredient {name: 'carrot'})
RETURN r
例如,我如何找到包含以下每种成分的所有食谱;胡萝卜,菠萝,芹菜,番茄,姜?
答案 0 :(得分:3)
将所需成分表示为列表,并使用ALL
谓词检查配方是否包含列表中的所有成分。诀窍是,只要您不引入新变量,就可以使用patterns in conditions:
因此,模式不仅仅是表达式,它们也是谓词。您的模式的唯一限制是您必须能够在单个路径中表达它。您不能像在MATCH中那样在多个路径之间使用逗号。您可以通过将多个模式与AND组合来实现相同的效果。
请注意,您无法在此处引入新变量。 [...]
此查询返回包含您列出的所有成分的每个配方:
arrayListName.set(index, new Ship());
我猜您会将用户输入作为参数传递:
MATCH (r:Recipe)
WHERE ALL(
ingredient IN ['carrot', 'pineapple', 'celery', 'tomato', 'ginger']
WHERE (r)-[:CONTAINS]->(:Ingredient {name: ingredient})
)
RETURN r
答案 1 :(得分:1)
如果您安装了APOC library的3.1版本,则可以使用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
将是过程,并且必须相应地修改上述查询。)