Neo4j 基于条件的输出

Neo4j Condition Based Output

问题: 在 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 和我收集文件然后检查集合中是否存在 passport,votercard 和 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", "VoterCard", "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"  │
└──────┴───────────┘