我有一个Neo4j数据库,其中有配料节点和配方节点。一个食谱连接到许多节点,因此,对于一个简单的切达三明治,食谱节点将连接到面包和切达奶酪。我想实现的是查询所有至少包含胡椒和盐的食谱,这样,如果我的食谱中有胡椒、盐和火腿,它就会匹配。我在下面的例子中尝试的是:
WITH ['pepper', 'salt'] as ingredients
MATCH (i:Ingredient)-[:INGREDIENT_OF]->(r:Recipe)
WHERE i.name in ingredients
WITH r, size(ingredients) as inputCnt, count(DISTINCT i) as cnt
WHERE cnt = inputCnt
RETURN r;
但它只符合食谱中的确切成分只有胡椒和盐。我怎样才能做到这一点?
您所做的是查询任何至少含有sal或胡椒的食谱。如果你想让你的食谱同时包含这两种成分,你是无法做到的。
您可以尝试以下查询:
MATCH (i:Ingredient)-[:INGREDIENT_OF]->(r:Recipe)
WITH r, collect(i.name) as recipeIngredients, ['salt', 'pepper'] as requiredIngredients
WHERE apoc.coll.containsAll(recipeIngredients, requiredIngredients)
RETURN r;
在这里,你首先得到所有的配方成分,然后将这些棕褐色的成分与你需要的所有成分进行匹配。此解决方案使用库apoc,请确保已安装该库。
这看起来是一种非常尴尬的方式。
大多数人会使用关系数据库和SQL。
数据库将具有一个表,该表存储关系";配方";其将配料ID连接到配方ID。
然后你写
SELECT recipe_id FROM used_in WHERE ingredient_id = ingedient1
AND ingredient_id = ingedient2;
就是这样!除了之外,你会得到一份使用两种成分和其他可能成分的所有食谱的列表