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.
我有一个 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.