【问题标题】:Neo4j Condition Based OutputNeo4j 基于条件的输出
【发布时间】:2021-01-29 19:04:09
【问题描述】:

问题: 在 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

【问题讨论】:

    标签: database neo4j add database-partitioning


    【解决方案1】:

    我按照您的描述在下面创建了示例数据。查询涉及一个简单的案例,当 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", "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"  │
    └──────┴───────────┘
    

    【讨论】:

    • 感谢您回复@âńōŋŷXmoůŜ 我之前的问题,它按预期工作,我在之前的问题中添加了一个节点和复杂性,您能帮我解决这个问题吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-26
    • 2020-05-12
    • 1970-01-01
    • 2019-12-16
    • 2016-07-25
    相关资源
    最近更新 更多