首页 > 解决方案 > Cypher (Neo4j) - 只要来自节点的一个关系满足条件而不管搜索路径如何,都可以找到所有关系?

问题描述

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

我有一个非常简单的图形设置,其中包含User节点和Movie节点,并且存在从 aUserMovie被调用的关系,该关系:REVIEWED具有rating携带用户评级(包括 1.0-5.0)的属性。见下图:

在此处输入图像描述

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

也就是说,我们希望根据电影的平均评分对电影进行排序,但至少有一条评论必须低于 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 使用模式来匹配图中的路径,我们如何使用它来检查节点的所有路径并查看是否满足条件,然后根据该结果继续匹配所有路径。

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

标签: neo4jcyphergraph-databases

解决方案


您需要一个两部分查询首先匹配评论分数低于 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

推荐阅读