【问题标题】:Cypher (Neo4j) - Find all relationships as long as one relationship from node satisfies a condition regardless of search path?Cypher (Neo4j) - 只要来自节点的一个关系满足条件,无论搜索路径如何,都可以找到所有关系?
【发布时间】:2018-10-11 15:32:17
【问题描述】:

对不起,标题不好,我是 Cypher 和 Graph 数据库的初学者。我不确定标题是否完全符合我的要求,如果您有更好的标题,请告诉我!

我有一个非常简单的图形设置,其中包含 User 节点和 Movie 节点,并且存在从 User 到称为 :REVIEWEDMovie 的关系,该关系具有 rating 承载用户的属性评级(1.0-5.0 含)。见下图:

我认为这种设计对于捕捉用户评论的电影系统来说是有意义的。我认为评论不应该作为它们自己的节点存在,因为它们可以更好地表示为用户(评论者)与图表中的电影之间的关系。更不用说关系中存在的全部目的属性是表达关系中的比例/权重/元数据,这对它们来说是一个很好的用例。但是,由于这种设计,我一直很难想出一个 Cypher 查询来执行以下操作:

  • 找出至少一部评分低于 3 的前十部电影。

也就是说,我们希望根据电影的平均评分对电影进行排序,但至少有一条评论必须低于 3.0 分。我用来根据平均评分对电影进行排序的查询是:

MATCH (movie:Movie)<-[review:REVIEWED]-(user:User) 
RETURN movie.movieTitle, avg(review.rating) as avgRating 
ORDER BY avgRating DESC 
LIMIT 10

这对我来说很有意义,但是当我尝试限制评分低于 3 的评论路径时,请参见下文:

MATCH (movie:Movie)<-[review:REVIEWED]-(:User) 
WHERE review.rating < 3
RETURN movie.movieTitle, avg(review.rating) as avgRating 
ORDER BY avgRating DESC 
LIMIT 10

只有与评级小于 3 的关系的路径才会匹配,这是我应该得到的。然而,问题是当我们平均评分时,它只是平均评分低于 3.0。

理想情况下,只要存在评分低于 3.0 的电影的评论,无论它是否在匹配路径中,我们都希望获得该电影的所有评论。这就是我感到困惑的地方。因为 Cypher 使用模式来匹配图中的路径,我们如何使用它来检查节点的所有路径并查看是否满足条件,然后根据该结果继续匹配所有路径。

期待听到你们的想法,提前谢谢!

【问题讨论】:

    标签: neo4j cypher graph-databases


    【解决方案1】:

    您需要一个两部分查询首先匹配评论分数低于 3 的电影,然后平均它们的评分,

    MATCH (movie:Movie)<-[review:REVIEWED]-(:User) 
    WHERE review.rating < 3
    WITH DISTINCT movie
    MATCH (movie)<-[review:REVIEWED]-(:User)
    RETURN avg(review.rating) as avgRating 
    ORDER BY avgRating DESC 
    LIMIT 10
    

    【讨论】:

    • 一个小改进,在第 3 行,您应该使用 WITH DISTINCT movie,这样您就不会为每个不同的电影添加多行,因为这可能会扭曲您的结果。
    • 没问题!哦,在这种情况下不需要重新别名,因为 movie 变量已经是你想要的,所以你可以删除 AS movie 部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多