不好意思,我一般是Cypher和Graph数据库的初学者。我不确定标题是否能完全满足我要问的问题,请告诉我您是否有更好的标题!
我有一个非常简单的图形设置,其中包含User
个节点和Movie
个节点,并且从User
到称为Movie
的{{1}}存在着一种关系,具有:REVIEWED
属性,该属性带有用户评分(包括1.0-5.0)。参见下图:
我认为这种设计对于捕捉用户评论的电影系统是有意义的。我认为评论不应该作为自己的节点存在,因为它们可以更好地表示为用户(评论者)与图中电影之间的关系。更不用说关系中可以存在的全部目的属性,即表示关系中的比例/重量/元数据,这对他们来说是一个很好的用例。但是,由于这种设计,我一直很难用Cypher查询来执行以下操作:
也就是说,我们要根据电影的平均评分对它们进行排序,但是至少有一个评论必须低于3.0分。我用来根据电影的平均评分对电影进行排序的查询是:
rating
这对我来说很有意义,但是当我尝试将路径限制为评分小于3的评论时,请参见下文:
MATCH (movie:Movie)<-[review:REVIEWED]-(user:User)
RETURN movie.movieTitle, avg(review.rating) as avgRating
ORDER BY avgRating DESC
LIMIT 10
只有关系的等级小于3的路径才会匹配,这是我应该得到的。但是,问题在于,当我们平均收视率时,它只会平均收视率低于3.0。
理想情况下,我们希望拥有该电影的所有评论,只要该电影的评论评分低于3.0(无论它是否位于匹配路径中)即可。这就是我感到困惑的地方。由于Cypher使用模式来匹配图中的路径,因此我们如何使用它来检查节点中的所有路径并查看是否满足条件,然后根据该结果继续匹配所有路径。
期待听到大家的想法,谢谢!
答案 0 :(得分: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