【问题标题】:Create nodes if optional match returns null如果可选匹配返回 null,则创建节点
【发布时间】:2021-09-08 23:29:34
【问题描述】:

我将使用的所有节点都有与之关联的唯一约束。

我尝试像这样创建新节点(我考虑过 MERGE,因此如果节点已经存在,它就不会创建该节点):

MERGE (n:url{url_addr:'test.com'})-[:FROM_DEVICE]->(o:device{mode:'iphone'})

并且节点已经存在它返回此错误:

Node(21) already exists with label `url` and property `url_addr` = 'test.com'

很明显,因为我没有事先匹配它们,所以我这样做只是为了传递结果属性:

MATCH (n:url{url_addr:'test.com'}), (o:device{mode:'iphone'})
MERGE (n)-[:FROM_DEVICE]->(o)

但如果这些记录中的任何一条不存在,则不会创建新节点。

所以我考虑使用 OPTIONAL MATCH,因为它会用 null 替换任何不存在的值,但这意味着它也会用 null 值替换我传递的属性。

OPTIONAL MATCH (n:url{url_addr:'test.com'}) RETURN n
MERGE n-[:FROM_DEVICE]->(o:device{mode:'iphone'})

它返回了这个错误:

Failed to create relationship `  REL87(d65d30eb-65f5-4460-b166-15996622cf1b)`, node `n` is missing. If you prefer to simply ignore rows where a relationship node is missing, set 'cypher.lenient_create_relationship = true' in neo4j.conf

所以我考虑使用 CASE 语句来首先验证匹配是否会返回 null,然后创建节点来定义关系,但事情并不顺利:

OPTIONAL MATCH (n:url{url_addr:'test.com'})
WITH n as test
RETURN CASE
    WHEN test IS NULL THEN CREATE (:url{url_addr:'test.com'})
END

发生这种情况:

Invalid input '{': expected
  "!="
  "%"
  ")"
  "*"
  "+"
  ","
  "-"
  "."
  "/"
  ":"
  "<"
  "<="
  "<>"
  "="
  "=~"
  ">"
  ">="
  "AND"
  "CONTAINS"
  "ENDS"
  "IN"
  "IS"
  "OR"
  "STARTS"
  "XOR"
  "["
  "^" (line 4, column 51 (offset: 135))
"        WHEN CASE IS NULL THEN CREATE (a:cookie_id{url:'test.com'})"
                                                   ^

删除节点的属性没有帮助。

【问题讨论】:

    标签: database neo4j cypher graph-databases


    【解决方案1】:

    MERGE 总是匹配或创建整个模式。因此,您可能希望拆分 MERGE 子句,以便它匹配或创建每个节点和关系:

    MERGE (n:url {url_addr:'test.com'}) // match or create url node
    MERGE (o:device {mode:'iphone'})    // match or create device node
    MERGE (n)-[:FROM_DEVICE]->(o)       // match or create relationship
    

    您可能还想看看使用 APOC 过程执行条件密码: https://neo4j.com/labs/apoc/4.2/cypher-execution/conditionals/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-18
      • 1970-01-01
      • 1970-01-01
      • 2017-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多