【发布时间】:2017-05-24 18:29:08
【问题描述】:
以similar question 为基础,我想要最高效的方式来处理这种情况。
MERGE (n1{id:<uuid>})
SET n1.topicID = <unique_name1>
IF (EXISTS((a:Topic{id:<unique_name1>})) | CREATE UNIQUE (n1)-[:HAS]->(a))
MERGE (n2{id:<uuid>})
SET n2.topicID = <unique_name2>
IF (EXISTS((a:Topic{id:<unique_name2>})) | CREATE UNIQUE (n2)-[:HAS]->(a))
很遗憾,IF 不存在,EXISTS 不能用于匹配或查找唯一节点。
- 我不能使用 OPTIONAL MATCH,因为这样 CREATE UNIQUE 会抛出一个空异常(尽管我希望它会忽略空参数)
- 我不能使用 MATCH,因为如果主题不存在,我将丢失所有行。
- 我不能使用 MERGE,因为如果节点还不存在,我不想创建它。
- 我不能使用 APOC,因为我不能保证它可以在我们的 Neo4j 服务器上使用。
我现在最好的解决方案是
MERGE (a:TEST{id:1})
WITH a
OPTIONAL MATCH (b:TEST{id:2})
// collect b so that there are no nulls, and rows aren't lost when no match
WITH a, collect(b) AS c
FOREACH(n IN c | CREATE UNIQUE (a)-[:HAS]->(n))
RETURN a
但是,这似乎有点复杂,需要 2 个 WITHs 才能实现本质上的 CREATE UNIQUE RELATION if start and end node exist(并且在计划中有一个渴望)。有没有可能做得更好? (使用 Cypher 3.1)
【问题讨论】: