请为此问题提供更具信息性的标题。
我希望根据提供的成分阵列匹配食谱。如果我提供数组['tomato', celery]
,我想匹配所有配方,这些食谱的名称包含'番茄',并且其成分的名称中包含'芹菜'。
今天我使用以下查询:
MATCH (recipe:Recipe)
WHERE ALL(
ingredient IN ['tomato', 'celery']
WHERE (recipe)-[:CONTAINS_INGREDIENT]->(:Ingredient {name: ingredient})
)
RETURN recipe
这是有效的,只要配料名称是完全匹配,但我希望它匹配,只要成分名称包含通过的术语(即'黄色西红柿'将匹配'番茄'),但我不喜欢看到将CONTAIN
关键字合并到此查询中的任何方式。
我正在尝试做什么?
答案 0 :(得分:1)
我认为表达此查询的最简洁方式是使用pattern comprehension和list comprehension:
WITH ['tomato', 'celery'] AS requiredIngredients
MATCH (recipe:Recipe)
WITH
recipe,
size([
(recipe)-[:CONTAINS_INGREDIENT]->(ingredient:Ingredient)
WHERE size([requiredIngredient IN requiredIngredients WHERE ingredient.name CONTAINS requiredIngredient]) > 0
| ingredient]
) AS containedRequiredIngredients,
size(requiredIngredients) AS allRequiredIngredients
WHERE containedRequiredIngredients = allRequiredIngredients
RETURN recipe
想法是计算所需的成分(allRequiredIngredients
)和配方中包含的成分(containedRequiredIngredients
)。如果两个值相等,则返回配方。
可以使用此示例进行测试:
CREATE
(r1:Recipe),
(r1)-[:CONTAINS_INGREDIENT]->(:Ingredient {name: '50g celery (chopped)'}),
(r1)-[:CONTAINS_INGREDIENT]->(:Ingredient {name: 'some tomato'})