根据列表

时间:2017-11-12 11:36:03

标签: neo4j cypher

请为此问题提供更具信息性的标题。

我希望根据提供的成分阵列匹配食谱。如果我提供数组['tomato', celery],我想匹配所有配方,这些食谱的名称包含'番茄',并且其成分的名称中包含'芹菜'。

今天我使用以下查询:

MATCH (recipe:Recipe)
WHERE ALL(
  ingredient IN ['tomato', 'celery']
  WHERE (recipe)-[:CONTAINS_INGREDIENT]->(:Ingredient {name: ingredient})
)
RETURN recipe

这是有效的,只要配料名称是完全匹配,但我希望它匹配,只要成分名称包含通过的术语(即'黄色西红柿'将匹配'番茄'),但我不喜欢看到将CONTAIN关键字合并到此查询中的任何方式。

我正在尝试做什么?

1 个答案:

答案 0 :(得分:1)

我认为表达此查询的最简洁方式是使用pattern comprehensionlist 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'})