如何在Neo4j Cypher中对返回值应用条件筛选
Cypher查询:筛选月度平均转账金额符合条件的账户持有人
在Cypher中,AVG()这类聚合函数的计算结果无法直接用WHERE子句过滤——因为WHERE是在数据聚合前对原始行进行筛选的。要过滤聚合后的结果,你需要用HAVING子句,或者通过WITH先完成聚合再用WHERE过滤。
方法1:直接用RETURN + HAVING筛选
这是最直观的写法,在返回结果阶段直接对聚合值设置条件:
MATCH (mt:MoneyTransfer)<-[s:SEND]-(:BankAccount)<-[hba:HAS_BANKACCOUNT]-(ah:AccountHolder) WHERE mt.TransactionDate <= date("2023-09-30") AND mt.TransactionDate >= date("2023-09-01") RETURN ah.Name AS AccountHolder, AVG(mt.MoneyTransferAmount) AS MonthlyAvg HAVING MonthlyAvg > 1000 -- 替换为你需要的数值,比如<500就是筛选平均金额小于500的账户
方法2:用WITH先聚合再过滤
如果后续需要对筛选后的结果做更多操作,这种写法更灵活:
MATCH (mt:MoneyTransfer)<-[s:SEND]-(:BankAccount)<-[hba:HAS_BANKACCOUNT]-(ah:AccountHolder) WHERE mt.TransactionDate <= date("2023-09-30") AND mt.TransactionDate >= date("2023-09-01") WITH ah, AVG(mt.MoneyTransferAmount) AS MonthlyAvg WHERE MonthlyAvg > 1000 -- 支持>、<、>=、<=等所有比较运算符 RETURN ah.Name AS AccountHolder, MonthlyAvg
两种写法都能实现需求,可根据后续查询扩展需求选择。
内容的提问来源于stack exchange,提问作者Santosh Jamale
相关产品推荐
相关产品推荐

