【发布时间】:2018-10-11 15:32:17
【问题描述】:
对不起,标题不好,我是 Cypher 和 Graph 数据库的初学者。我不确定标题是否完全符合我的要求,如果您有更好的标题,请告诉我!
我有一个非常简单的图形设置,其中包含 User 节点和 Movie 节点,并且存在从 User 到称为 :REVIEWED 的 Movie 的关系,该关系具有 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