在Cypher中通过汇总计算进行过滤

时间:2019-09-10 19:40:40

标签: neo4j cypher

我正在使用Neo4j的Movies数据库学习Cypher。我正在尝试查找演员的平均年龄小于40岁的电影,但它并没有对演员的整体进行平均,因此我得到了具有不同平均年龄的标题的副本。

我尝试了两件事:(1)计算演员的发行年份与出生年份之间的差异,并将其平均计算在同一行中;(2)计算年龄,然后使用WHERE查找演员平均年龄<40岁的电影。

我的第一种方法:

MATCH (a:Person), (m:Movie)
WITH DISTINCT a, m, AVG(m.released - a.born) AS averageAge
WHERE averageAge <= 40
RETURN DISTINCT m.title, averageAge

第二种方法:

MATCH (a:Person), (m:Movie)
WITH DISTINCT a, m, m.released - a.born AS age
WHERE AVG(age) <= 40
RETURN  m.title, AVG(age) AS averageAge

均无效。我在做什么错了?

1 个答案:

答案 0 :(得分:1)

您需要使用ACTED_IN关系将每部电影与其演员联系起来。无需使用DISTINCT,因为AVG子句中的aggregating function WITH会自动使用不同的m节点作为分组关键字。

MATCH (p:Person)-[:ACTED_IN]->(m:Movie)
WITH m, AVG(m.released - p.born) AS averageAge
WHERE averageAge < 40
RETURN m, averageAge