Cypher:根据多个关系属性查找节点

时间:2016-11-21 14:08:43

标签: neo4j cypher

我想创建一个查询,找到包含用户传递的所有成分的食谱(未知数量)。

我可以使用此查询找到基于一种成分的食谱:

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

例如,我如何找到包含以下每种成分的所有食谱;胡萝卜,菠萝,芹菜,番茄,姜?

2 个答案:

答案 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将是过程,并且必须相应地修改上述查询。)