【发布时间】: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