neo4j Cypher的WITH子句的真实的好处是什么?

3qpi33ja  于 2023-02-19  发布在  其他
关注(0)|答案(1)|浏览(212)

我在neo4j图形学院学习了Neo4j的“Intermediate Cypher Queries”课程,我已经了解了WITH子句,它的基本功能是定义或重新定义变量的作用域。现在,由于某种原因,我不能完全理解他们给出的例子中WITH子句的用法,特别是关于流水线的用法。例如,在其中一个练习中,我被告知要使用WITH来聚合中间结果。2正确答案如下:

MATCH (p:Person)-[:ACTED_IN]->(m:Movie)<-[r:RATED]-(:User)
WHERE p.name = 'Tom Hanks'
WITH m, avg(r.rating) AS avgRating
RETURN m.title AS Movie, avgRating AS `AverageRating`
ORDER BY avgRating DESC

但是,在我看来,WITH子句实际上并没有做太多工作,为了说服自己,我重写了查询,以便在没有WITH子句的情况下得到相同的结果:

MATCH (p:Person)-[:ACTED_IN]->(m:Movie)<-[r:RATED]-(:User)
WHERE p.name = 'Tom Hanks'
RETURN m.title AS Movie, avg(r.rating) AS `AverageRating`
ORDER BY avg(r.rating) DESC

这样做效果很好,只需要少一行代码。也许问题只是一个例子--在更长的查询中,“WITH方法”会成为它自己的方法。但是,就目前的情况而言,我不能完全解释WITH的真实的用途。例如,他们谈论管道化结果,但我们在MATCH子句的开头指定了“m”。那么我们为什么还要麻烦的用WITH子句,把'm'变量再放进去呢?至于'avg(r.rating)',实际上,这看起来就像我们在浪费时间重命名一个查询的结果,而这是我们可以做的事情,就像我已经做的一样。这到底是怎么回事?谁能告诉我?

sxissh06

sxissh061#

当您要执行中间聚合或按顺序执行多个聚合时,WITH子句非常有用。您还可以执行中间筛选。可以将其视为在查询语句中间操作/转换数据的选项。

MATCH (p:Person)-[:ACTED_IN]->(m:Movie)<-[r:RATED]-(:User)
WITH m, avg(r.rating) AS avgRating
WHERE avgRating > 8
RETURN m.title AS Movie, avgRating AS `AverageRating`
ORDER BY avgRating DESC

下面是一个示例,其中您执行了中间聚合和筛选,如果没有WITH语句,则无法执行中间聚合,因为必须计算平均评分,并且您无法在RETURN语句中筛选结果

相关问题