Cypher (Neo4j) - 只要来自节点的一个关系满足条件而不考虑搜索路径,就可以找到所有关系?
Cypher (Neo4j) - Find all relationships as long as one relationship from node satisfies a condition regardless of search path?
请原谅这个糟糕的标题,我是 Cypher 和图形数据库的初学者。我不确定标题是否完全反映了我想问的问题,如果您有更好的标题,请告诉我!
我有一个非常简单的图表设置,其中包含 User
个节点和 Movie
个节点,并且存在从 User
到 Movie
的关系,称为 :REVIEWED
具有 rating
属性 的用户评分(1.0-5.0 含)。见下图:
我认为这种设计对于用于捕获用户评论的电影系统来说是有意义的。我不认为评论应该作为它们自己的节点存在,因为它们在图表中更好地表示为用户(评论者)和电影之间的关系。更不用说关系中可以存在的全部目的属性是在关系中表达 scale/weight/metadata,这对他们来说是一个很好的用例。但是,由于这种设计,我一直很难想出一个 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
请原谅这个糟糕的标题,我是 Cypher 和图形数据库的初学者。我不确定标题是否完全反映了我想问的问题,如果您有更好的标题,请告诉我!
我有一个非常简单的图表设置,其中包含 User
个节点和 Movie
个节点,并且存在从 User
到 Movie
的关系,称为 :REVIEWED
具有 rating
属性 的用户评分(1.0-5.0 含)。见下图:
我认为这种设计对于用于捕获用户评论的电影系统来说是有意义的。我不认为评论应该作为它们自己的节点存在,因为它们在图表中更好地表示为用户(评论者)和电影之间的关系。更不用说关系中可以存在的全部目的属性是在关系中表达 scale/weight/metadata,这对他们来说是一个很好的用例。但是,由于这种设计,我一直很难想出一个 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