neo4j 当“OPTIONAL MATCH”不返回任何行时,如何防止执行子查询

k4emjkb1  于 2023-10-18  发布在  其他
关注(0)|答案(1)|浏览(119)

使用此查询:

OPTIONAL MATCH (n {id: "does-not-exist"})
CALL {
    RETURN "test" as inner
}
RETURN inner

我希望子查询不会被执行,并且外部RETURN不会返回任何结果。相反,子查询只执行一次,返回值为"test"。我假设它是OPTIONAL会导致整个查询以一个空行继续。
我的实际查询看起来更像这样:

MATCH (n {id: "exists"})
CALL {
    WITH n
    OPTIONAL MATCH (n)--(m {id: "mightExist"})
    CALL {
        WITH m
        MATCH (m)--(o {id: "does-not-exist"})
        RETURN "test" as inner
    }
    RETURN inner
}
RETURN inner

这会导致查询不返回任何内容,因为最深的子查询不MATCH任何内容。最深的子查询仍然被调用一次,因为OPTIONAL MATCH的行为。我不能将OPTIONAL MATCH更改为MATCH,因为当该关系不存在时,整个查询将不会返回任何内容,即使它应该返回。

本质上,我试图返回一个节点的嵌套关系,它可能存在也可能不存在于根节点的关系中。我怎么能这么做呢?

  • 注意:我尽量远离APOC,以减少供应商锁定,但如果我绝对必须使用apoc.when之类的东西,我可以。
ncgqoxb0

ncgqoxb01#

您可以尝试将最后一个MATCH设置为可选,然后使用WITH过滤行。就像这样:

MATCH (n {id: "exists"})
CALL {
    WITH n
    OPTIONAL MATCH (n)--(m {id: "mightExist"})
    CALL {
        WITH m
        OPTIONAL MATCH (m)--(o {id: "does-not-exist"})
        WITH 
        CASE WHEN m IS NULL THEN NULL
        WHEN m IS NOT NULL AND o IS NULL THEN m
        ELSE o END AS inner
        RETURN inner
    }
    RETURN inner
}
RETURN inner

相关问题