【问题标题】:Cypher: using OPTIONAL MATCH in combination with collect returns default item when there is noneCypher:使用 OPTIONAL MATCH 与 collect 在没有时返回默认项目
【发布时间】:2021-06-06 08:57:33
【问题描述】:

我正在使用 Neo4J 检索一个人及其技能。这是我的 Cypher 查询:

MATCH (p:Person {id: "1"})
OPTIONAL MATCH (p) -[exp:HAS_EXPERIENCE]->(s:Skill)
WITH collect(distinct {id: s.id, name: s.name}) as skills, p

RETURN p.id as id, skills

这是结果:

{
    "id": "1",
    "skills": [
        {
            "name": null,
            "id": null,
        }
    ]
}

如您所见,技能列表包含一个“默认”项目。但是,在这种特殊情况下,该人没有技能。

为什么结果包含一个数组项?如何调整查询以返回空数组?

使用 Neo4J 3.1.1。

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    这应该可行:

    MATCH (p:Person {id: "1"})
    OPTIONAL MATCH (p)-[exp:HAS_EXPERIENCE]->(s:Skill)
    RETURN p.id AS id,
      CASE WHEN s IS NULL THEN [] ELSE COLLECT(distinct {id: s.id, name: s.name}) END as skills;
    

    如果OPTIONAL MATCH 不匹配任何内容,s 只会是 NULL

    【讨论】:

      【解决方案2】:

      您不妨考虑以下几点:

      MATCH (p:Person {id: "1"})
      OPTIONAL MATCH (p) -[exp:HAS_EXPERIENCE]->(s:Skill)
      
      RETURN p {id: p.id, skills: COLLECT(distinct s {.*})}
      

      假设您希望从 Skill 获取所有字段。否则

      ... collect(distinct s {id:s.id, name:s.name})
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-09-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-17
        • 2011-05-04
        相关资源
        最近更新 更多