Neo4j:获取至少与列表的某些项目相关的节点

Neo4j: Get nodes that are at least related with some items of a list

我有一个 Neo4j 数据库,其中包含成分节点和配方节点。一个食谱连接到许多节点,因此,对于一个简单的切达干酪三明治,食谱节点将连接到面包和切达干酪。我想要实现的是查询所有包含例如至少胡椒和盐的食谱,所以如果我的食谱有胡椒、盐和火腿,它就会匹配。我按照 this 示例尝试过的是:

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;

但它只符合确切成分只有胡椒和盐的食谱。我怎样才能做到这一点?

这看起来是一种非常笨拙的做法。

大多数人会使用关系数据库,SQL。

数据库将有一个 table 存储关系“成分在配方中使用”,它将成分 ID 连接到配方 ID。

然后你写

SELECT recipe_id FROM used_in WHERE ingredient_id = ingedient1
     AND  ingredient_id = ingedient2;

就是这样!你会得到一份所有使用这两种成分和可能的其他成分的食谱的列表

您所做的是查询至少包含盐或胡椒的任何食谱。如果您希望您的食谱包含两者,您将无法实现。

您可以试试这个查询:

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,确保拥有它 installed.