Neo4j数据库如何按多属性/标签统计节点并返回指定格式结果
Neo4j 多维度学校人员统计查询实现

以下Cypher查询可直接返回要求结构的统计结果,单次查询完成所有维度聚合,无需应用层二次拼接。
查询语句
// 分标签统计各类人员基数 OPTIONAL MATCH (t:Teacher) WITH count(t) AS teacherCount OPTIONAL MATCH (s:Staff) WITH teacherCount, count(s) AS staffCount OPTIONAL MATCH (stu:Student) WITH teacherCount, staffCount, count(stu) AS studentTotal, count(CASE WHEN stu.score > 9 THEN 1 END) AS studentOverNine, count(CASE WHEN stu.score > 8 AND stu.score <= 9 THEN 1 END) AS studentOverEight, count(CASE WHEN stu.score > 7 AND stu.score <= 8 THEN 1 END) AS studentOverSeven // 独立子查询聚合在校人员明细,避免笛卡尔积导致统计错误 CALL { MATCH (p) WHERE p:Teacher OR p:Staff OR p:Student RETURN collect({ name: p.name, details: properties(p) }) AS peopleList } // 组装为指定嵌套结构返回 RETURN { teachers: teacherCount, staff: staffCount, students: { total: studentTotal, overNine: studentOverNine, overEight: studentOverEight, `over seven`: studentOverSeven }, peopleInSchool: peopleList } AS result
调整说明
- 分数段默认采用互斥区间逻辑统计:
overNine统计9分以上学生、overEight统计8-9分(不含9)学生、over seven统计7-8分(不含8)学生,不会出现重复计数。如果需要累计统计(即8分以上人数包含9分以上人数),删除CASE语句中对应的分值上限判断条件即可。 - 明细字段
details默认通过properties(p)返回人员节点的全量属性,如果需要自定义返回字段,可以替换为手动属性映射,例如details: {jobTitle: p.jobTitle, entranceYear: p.entranceYear, score: p.score}。 - 所有统计逻辑使用
OPTIONAL MATCH实现,当某类人员、某分数段学生数量为0时,会正常返回数值0,不会因为匹配不到节点返回空结果。
内容的提问来源于stack exchange,提问作者jee_kuu
相关产品推荐
相关产品推荐

