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"  │
└──────┴───────────┘