【问题标题】:Cypher query with does not return anything if second part does not work如果第二部分不起作用,Cypher 查询不会返回任何内容
【发布时间】:2018-06-04 12:10:19
【问题描述】:

我有一个查询,它假设连接两个结果并将联合作为输出。

MATCH (:Some )-[r*0..1]-> (p:Address) WITH collect(p) AS rows1
MATCH (:Some2)-[r*0..1]-> (pp:Address) 
WITH  rows1+collect(pp) AS rows2 
UNWIND rows2 AS row RETURN  row

如您所见,选择有两个部分。因此,如果两个查询都有匹配的数据,但如果匹配的第二部分没有返回任何内容,那么它会返回空。意思是 MATCH (:Some2)-[r*0..1]-> (pp:Address) 返回空然后整个联合失败并返回 null 即使 MATCH (:Some )-[r*0..1]-> (p:Address) 返回值。

如何解决这个问题?是neo4j的bug吗?

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    您实际上并没有问过问题(您确实只是描述了 模式匹配 的预期行为......即如果没有匹配就没有结果)......但我假设你想要一个解决方案吗?

    MATCH (:Some )-[r*0..1]-> (p:Address)
    RETURN p
    UNION
    MATCH (:Some2 )-[r*0..1]-> (p:Address)
    RETURN p
    

    应该可以解决问题。请注意,唯一重要的是返回的变量完全相同(它们包含的内容实际上并不重要)。

    另外...您可能想看看 OPTIONAL MATCH 做了什么...

    希望这会有所帮助。

    问候, 汤姆

    更新

    CALL apoc.cypher.run("
        MATCH (:Some )-[r*0..1]-> (p:Address)
        RETURN p
        UNION
        MATCH (:Some2 )-[r*0..1]-> (p:Address)
        RETURN p",{}) YIELD value
    RETURN value.p AS result
    ORDER BY result;
    

    【讨论】:

    • 我尝试了一个可选匹配..这是一个错误吗?正常的工会对我不起作用,因为这不适用于计数。我希望这也返回汇总计数
    • 然后将整个语句包装在 apoc.cypher.run 中,您可以对所有内容进行后处理...我更新了答案以显示示例。
    【解决方案2】:

    这个简单的查询应该可以工作:

    MATCH (s)-[*0..1]->(p:Address)
    WHERE s:Some OR s:Some2
    RETURN p;
    

    【讨论】:

      【解决方案3】:

      感谢您的意见,我使用以下版本

      MATCH (p:Address)
      WHERE exist ((:Some )-[r*0..1]-> (p)) OR ((:Some2 )-[r*0..1]-> (p))
      RETURN p;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-02-05
        • 2013-12-12
        • 2012-04-14
        • 1970-01-01
        • 2015-02-17
        相关资源
        最近更新 更多