neo4j - Cypher (Neo4j) - 只要来自节点的一个关系满足条件而不管搜索路径如何,都可以找到所有关系?
问题描述
对不起,标题不好,我一般是 Cypher 和 Graph 数据库的初学者。我不确定标题是否完全符合我的要求,如果您有更好的标题,请告诉我!
我有一个非常简单的图形设置,其中包含User
节点和Movie
节点,并且存在从 aUser
到Movie
被调用的关系,该关系:REVIEWED
具有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 使用模式来匹配图中的路径,我们如何使用它来检查节点的所有路径并查看是否满足条件,然后根据该结果继续匹配所有路径。
期待听到你们的想法,提前谢谢!
解决方案
您需要一个两部分查询首先匹配评论分数低于 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
推荐阅读
- python - Python NameError:名称“名称”未定义函数
- javascript - 验证文本框只允许数字,没有特殊字符或字母
- c++ - 有没有办法将调用堆栈窗口(vs2005)捕获到文本文件中?
- c# - Ozeki 未显示出站呼叫者 ID
- javascript - NPM 构建重复构建过程
- linux - Chef 错误:无法完成 #verify 操作:[undefined method `[]' for nil:NilClass] on default-amazonlinux2-base
- python - 为什么socket io客户端不工作?
- html - 如何在 Angular 中实现指令(ng-template)?
- python - Django 究竟什么时候运行查询?
- swift - 拉动刷新 Swift 中的新项目