Neo4j Cypher:基于多个关系属性查找节点
我想做一个查询,查找包含用户传递的所有成分(未知量)的配方 我可以通过此查询查找基于一种成分的配方:Neo4j Cypher:基于多个关系属性查找节点,neo4j,cypher,Neo4j,Cypher,我想做一个查询,查找包含用户传递的所有成分(未知量)的配方 我可以通过此查询查找基于一种成分的配方: MATCH (r:Recipe)-[:CONTAINS]->(i:Ingredient {name: 'carrot'}) RETURN r 例如,我如何找到包含以下每种成分的所有食谱;胡萝卜、菠萝、芹菜、西红柿、生姜?将所需成分表示为一个列表,并使用谓词检查食谱是否包含列表中的所有成分。诀窍在于,只要不引入新变量,就可以使用: 因此,模式不仅是表达式,也是谓词。您的模式的唯一限制是必须
MATCH (r:Recipe)-[:CONTAINS]->(i:Ingredient {name: 'carrot'})
RETURN r
例如,我如何找到包含以下每种成分的所有食谱;胡萝卜、菠萝、芹菜、西红柿、生姜?将所需成分表示为一个列表,并使用谓词检查食谱是否包含列表中的所有成分。诀窍在于,只要不引入新变量,就可以使用: 因此,模式不仅是表达式,也是谓词。您的模式的唯一限制是必须能够在单个路径中表达它。不能像在MATCH中那样在多个路径之间使用逗号。通过将多个模式与和组合,可以实现相同的效果 请注意,这里不能引入新变量。[……] 此查询返回包含您列出的所有成分的每个配方:
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
将所需的成分表示为一个列表,并使用谓词检查配方是否包含列表中的所有成分。诀窍在于,只要不引入新变量,就可以使用: 因此,模式不仅是表达式,也是谓词。您的模式的唯一限制是必须能够在单个路径中表达它。不能像在MATCH中那样在多个路径之间使用逗号。通过将多个模式与和组合,可以实现相同的效果 请注意,这里不能引入新变量。[……] 此查询返回包含您列出的所有成分的每个配方:
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.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
将是一个过程,并且必须相应地修改上面的查询。)如果您安装了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
将是一个过程,必须相应地修改上面的查询。)