首页 > 解决方案 > Neo4J:没有重复匹配的多个聚合

问题描述

如何在 Neo4j 中进行多个聚合而不重复我的 MATCH 查询?

假设我有一个数据库,其中包含客户、他们去的餐厅以及特定年份每个客户/餐厅的账单记录。请注意,客户可能经常光顾不同的餐馆。我想获取客户-餐厅对的列表,其中该年的总账单金额在 90% 及以上。

我尝试了类似以下的方法,但 Neo4j 不允许在单个查询中使用多个聚合:

MATCH (c:Customer)-[:PAID]->(b:Bill)-[:AT]->(r:Restaurant)
WITH c, r, sum(b.amount) AS total_amount
WHERE total_amount > percentileCont(total_amount, 0.9)
RETURN c, r

上述语法将返回错误。我可以尝试以下替代方法,它确实有效:

MATCH (c:Customer)-[:PAID]->(b:Bill)-[:AT]->(r:Restaurant)
WITH c, r, sum(b.amount) AS total_amount
WITH percentileCont(total_amount, 0.9) as percentile

MATCH (c:Customer)-[:PAID]->(b:Bill)-[:AT]->(r:Restaurant)
WITH c, r, sum(b.amount) AS total amount, per
WHERE total_amount > percentile
RETURN c,r

但是,这是相当低效的,因为我必须运行完全相同的查询两次。有没有更优雅的方法来做到这一点?

标签: neo4jcypher

解决方案


推荐阅读