Neo4j使用count过滤查询任职超1家存在指定交易机构的员工问题
问题原因
- 你写的
WHERERetailer Name>1语法无效:Retailer Name是存储多个零售商名称的数组,无法直接和数值做比较,需要用size()函数获取数组长度后再判断。 - 注释掉的
WHERE cnt >1未正常生效,是因为你计算count(retailer.name)时未添加DISTINCT修饰,若同一个零售商对应多条交易记录,统计值会和实际关联的零售商数量不符。 - 额外优化提示:你原代码中将
WORKS_AT关系的变量名命名为Employee,和节点标签重名,建议修改为其他名称避免歧义,下方示例代码中已经做了简化处理。
正确写法
1. 返回员工+关联零售商列表
MATCH (employee:Employee)-[:WORKS_AT]->(retailer),(customer:Customer)-[:SHOPPED_AT]->(retailer) WHERE transaction.status = "XYZ" WITH employee.name AS `Employee Name`, collect(DISTINCT retailer.name) AS `Retailer Name` // 直接用去重后的零售商数组长度判断 WHERE size(`Retailer Name`) > 1 RETURN `Employee Name`, `Retailer Name`
运行后会自动过滤掉仅关联1家零售商的员工,返回结果示例:
| Employee Name | Retailer Name |
|---|---|
| John | [abc, def] |
2. 返回员工+关联零售商逐条记录
如果需要输出每行对应一条员工+零售商的记录,可添加UNWIND展开数组:
MATCH (employee:Employee)-[:WORKS_AT]->(retailer),(customer:Customer)-[:SHOPPED_AT]->(retailer) WHERE transaction.status = "XYZ" WITH employee.name AS `Employee Name`, collect(DISTINCT retailer.name) AS `Retailer Name` WHERE size(`Retailer Name`) > 1 UNWIND `Retailer Name` AS retailer RETURN `Employee Name`, retailer
运行后返回结果示例:
| Employee Name | retailer |
|---|---|
| John | abc |
| John | def |
内容的提问来源于stack exchange,提问作者Gazoo
相关产品推荐
相关产品推荐

