【问题标题】:How to continue executing a Neo4J Cypher request after MATCH is not matched?MATCH 不匹配后如何继续执行 Neo4J Cypher 请求?
【发布时间】:2021-01-06 17:12:09
【问题描述】:

我的 Neo4J 中有以下参数:

{
  "lists": [
    {
      "from": "someone",
      "to": "somebody"
    }
  ]
}

还有以下查询:

MATCH (c:Concept{name:'infranodus'}) WITH c, $lists AS list
UNWIND CASE WHEN list = [{}] THEN [null] ELSE list END AS l 
WITH l 
MATCH (cp1:Concept{name:l.from}) 
WITH cp1 
MATCH (cp2:Concept{name:'somebody'}) 
RETURN cp1,cp2;

上面的查询会起作用。

但是,如果我将 l.from 替换为不存在的参数,例如l.about,然后 - 由于匹配没有发生 - 第二个 cp2 匹配没有触发。

即使找不到cp1,我如何才能更改此行为并继续执行此查询?也许有一种方法可以传递一个虚拟变量?

MATCH (c:Concept{name:'infranodus'}) WITH c, $lists AS list
UNWIND CASE WHEN list = [{}] THEN [null] ELSE list END AS l 
WITH l
MATCH (cp1:Concept{name:l.about}) 
WITH cp1 
MATCH (cp2:Concept{name:'somebody'}) 
RETURN cp1,cp2;

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    使用可选匹配。如果没有找到匹配项,那么它将使用 NULL 作为模式的缺失部分。类似于 SQL 中的外连接。

    NEW:
    OPTIONAL MATCH (cp1:Concept{name:l.about}) 
    
    OLD:
    MATCH (cp1:Concept{name:l.about}) 
    

    【讨论】:

      【解决方案2】:

      您也许可以用IN 谓词替换它?

      例如:

      WITH {from: 'Matt Olg', about: 'Matthew Olg'}
      AS l
      MATCH (n:Person)
      WHERE n.name IN [l.from, l.to]
      RETURN n.name
      
      ╒══════════╕
      │"n.name"  │
      ╞══════════╡
      │"Matt Olg"│
      └──────────┘
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-01-08
        • 1970-01-01
        • 2015-02-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多