Neo4j基于证件优先级的Person节点单条匹配记录查询实现
Neo4j 多证件优先级匹配查询实现
前置环境说明
当前图存储内已存在固定的节点关系链路:(p:Person)-[:HAS_DOCUMNET]->(id:Identification)-[:HAS_DESCRIPTION]->(d:Document)
业务输出要求
最终查询结果需要满足:
- 每位人员仅输出1行记录,不展示同人关联的多份证件
- 每行固定返回三个字段:
personId、documentType、idNumber - 证件选取严格遵循固定优先级:
- 最高优先级:存在
documentType = "Passport"的关联记录时,直接取该证件的idNumber,不再匹配其他证件 - 次高优先级:无Passport证件时,存在
documentType = "VoterCard"的关联记录,取该证件的idNumber - 最低匹配优先级:上述两类证件都不存在时,存在
documentType = "PanCard"的关联记录,取该证件的idNumber
- 最高优先级:存在
样例数据关联关系
- P1:关联3个Identification节点,对应绑定的Document类型分别为Passport、VoterCard、PanCard
- P2:关联2个Identification节点,对应绑定的Document类型分别为VoterCard、PanCard
- P3:关联3个Identification节点,对应绑定的Document类型分别为PanCard、AadharCard、VoterCard
- P4:关联1个Identification节点,对应绑定的Document类型为PanCard
预期匹配结果
按照优先级规则筛选后,每个人最终返回的证件信息为:
- P1:匹配Passport类型,返回证件id1
- P2:无Passport记录,匹配VoterCard类型,返回证件id4
- P3:无Passport记录,匹配VoterCard类型,返回证件id8
- P4:无Passport、无VoterCard记录,匹配PanCard类型,返回证件id9
可直接运行的Cypher查询语句
通过给不同证件分配优先级分值(分值越小优先级越高),按人员分组取最高优先级的单条记录,可完全匹配上述规则:
MATCH (p:Person)-[:HAS_DOCUMNET]->(id:Identification)-[:HAS_DESCRIPTION]->(d:Document) WITH p, CASE d.documentType WHEN 'Passport' THEN 1 WHEN 'VoterCard' THEN 2 WHEN 'PanCard' THEN 3 ELSE 10000 END AS priority, d.documentType AS documentType, id.idNumber AS idNumber // 过滤非规则内的证件类型,不参与优先级匹配 WHERE priority <= 3 // 按优先级分值升序排列,同人员下最高优先级证件排在最前 ORDER BY priority ASC WITH p, collect({docType: documentType, idNum: idNumber}) AS sortedDocs RETURN p.personId AS personId, sortedDocs[0].docType AS documentType, sortedDocs[0].idNum AS idNumber
内容的提问来源于stack exchange,提问作者R_Kalavadiya
相关产品推荐
相关产品推荐

