Neo4j按相同referenceId匹配关系计算金额差值的查询咨询
问题原因说明
你原来的写法存在重复计数的问题:路径匹配(a)-[in:rel]->(b)-[out:rel]->(c)会让同一个in关系对应多个out关系,导致SUM(in.amount)被重复计算,比如referenceId=1234对应的a→b关系会匹配到2条b的出边,求和时这个2会被累加2次,得到错误的4而非正确的2。
正确Cypher语句
// 先统计每个referenceId下a到b的流入总金额 MATCH (a)-[in_rel:rel]->(b) WHERE NOT EXISTS(() --> (a)) WITH in_rel.referenceId AS ref_id, SUM(in_rel.amount) AS total_in // 再统计同referenceId下b流出到下游节点的总金额 MATCH (b)-[out_rel:rel]->() WHERE out_rel.referenceId = ref_id WITH ref_id, total_in, SUM(out_rel.amount) AS total_out // 计算差值返回 RETURN ref_id, total_in - total_out AS balance
提示:如果你的源节点a、中间节点b有单独的标签,可直接用标签匹配替换WHERE中的EXISTS判断,查询效率会更高。
运行结果验证
针对你给出的测试数据,运行后得到的结果如下:
- ref_id=1234,balance=2 - (1+0.5) = 0.5
- ref_id=4567,balance=4 - (1+3) = 0
完全符合需求预期。
内容的提问来源于stack exchange,提问作者nrgyzer
相关产品推荐
相关产品推荐

