如何解决Neo4j 基于条件的输出
问题:
在 Neo4j 中,我有关系 (p:Person)-[:HAS_DOCUMNET]->(id:Identification)-[:HAS_DESCRIPTION]->(d:Document)
并且每人只需要 1 行数据(personId、documentType 和 idNumber)
我需要根据以下优先级条件开发查询输出
1) 如果 documentType="Passport" 存在,那么应该带有 personId 和受尊重的 idNumber。(第一优先级)
2) 如果 documentType="VoterCard" 存在,那么应该带有 personeId 和受尊重的 idNumber。(如果 Passport 不存在)
3) 如果 documentType="PanCard" 存在,那么应该带有 personId 和受尊重的 idNumber。(如果 VoterId 不存在)
数据呈现如下:
(P1:Person)-[:HAS_Document]->('id1','id2','id3')->[:HAS_DESCRIPTION]->("Passpot","VoterCard",PanCard)`
(P2:Person)-[:HAS_Document]->('id4','id5')->[:HAS_DESCRIPTION]->("VoterCard","PanCard")`
(P3:Person)-[:HAS_Document]->('id6','id7','id8')->[:HAS_DESCRIPTION]->("PanCard","AadharCard","VoterCard")
(P4:Person)-[:HAS_Document]->('id9')->[:HAS_DESCRIPTION]->("PanCard")
输出应该是:
PName Doc.Type IDNumber
------- ----------- ---------
P1 "Passport" id1
P2 "VoterCard" id4
P3 "VoterCard" id8
P4 "PanCard" id9
解决方法
我按照您的描述创建了以下示例数据。查询涉及一个简单的案例,当 else 和我收集文件然后检查集合中是否存在护照、选民卡和 pancard 时。
(P1:Person)-[:HAS_Document]->("Passport","VoterCard","PanCard")
(P2:Person)-[:HAS_Document]->("VoterCard","PanCard")`
(P3:Person)-[:HAS_Document]->("PanCard","AadharCard","VoterCard")
(P4:Person)-[:HAS_Document]->("PanCard")
Create (p1:Person {Name: 'P1'})
Create (p2:Person {Name: 'P2'})
Create (p3:Person {Name: 'P3'})
Create (p4:Person {Name: 'P4'})
Create (d1:Document {Doc_Type: 'Passport'})
Create (d2:Document {Doc_Type: 'VoterCard'})
Create (d3:Document {Doc_Type: 'PanCard'})
Create (d4:Document {Doc_Type: 'AadharCard'})
Merge (p1)-[:HAS_DOCUMENT]-(d1)
Merge (p1)-[:HAS_DOCUMENT]-(d2)
Merge (p1)-[:HAS_DOCUMENT]-(d3)
Merge (p2)-[:HAS_DOCUMENT]-(d2)
Merge (p2)-[:HAS_DOCUMENT]-(d3)
Merge (p3)-[:HAS_DOCUMENT]-(d3)
Merge (p3)-[:HAS_DOCUMENT]-(d4)
Merge (p3)-[:HAS_DOCUMENT]-(d2)
Merge (p4)-[:HAS_DOCUMENT]-(d3)
Query:
MATCH (p: Person)-[: HAS_DOCUMENT]-(d:Document)
WHERE d.Doc_Type in ["Passport","PanCard"]
WITH p.Name as Name,collect(d.Doc_Type) as docType
RETURN Name,CASE WHEN 'Passport' in docType THEN 'Passport'
WHEN 'VoterCard' in docType THEN 'VoterCard'
WHEN 'PanCard' in docType THEN 'PanCard'
ELSE NULL END as DocType
ORDER BY Name
Result:
╒══════╤═══════════╕
│"Name"│"DocType" │
╞══════╪═══════════╡
│"P1" │"Passport" │
├──────┼───────────┤
│"P2" │"VoterCard"│
├──────┼───────────┤
│"P3" │"VoterCard"│
├──────┼───────────┤
│"P4" │"PanCard" │
└──────┴───────────┘
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。