【问题标题】:Neo4j: Get nodes that are at least related with some items of a listNeo4j:获取至少与列表中某些项目相关的节点
【发布时间】:2021-12-12 18:47:47
【问题描述】:

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

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

【问题讨论】:

    标签: database graph neo4j


    【解决方案1】:

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

    你可以试试这个查询:

    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

    【讨论】:

    • 非常感谢!这非常有效。
    【解决方案2】:

    这看起来是一种非常尴尬的方式。

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

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

    那你写

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

    就是这样!您会得到一份使用这两种成分的所有食谱的列表,以及旁边可能的其他成分

    【讨论】:

    • 感谢您的回答,我知道 SQL 更适合这个用例,但我必须在这个大学项目中使用 Neo4j。
    • 也许现实世界中最有用的一项技能就是选择合适的工具。当大学项目对使用的工具进行任意限制时,我总是感到惊讶。我怀疑这是因为讲师只对一小部分工具感到满意。可耻!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-14
    • 1970-01-01
    • 1970-01-01
    • 2016-11-10
    • 1970-01-01
    • 1970-01-01
    • 2016-11-30
    相关资源
    最近更新 更多