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" │
└──────┴───────────┘
问题:
在 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" │
└──────┴───────────┘