gpt4 book ai didi

Neo4j 密码 : Create a relationship only if the end node exists

转载 作者:行者123 更新时间:2023-12-02 00:45:13 25 4
gpt4 key购买 nike

以此为基础 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 会抛出一个 null 异常(尽管我希望它会忽略 null 参数)
  • 我不能使用 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 个 WITH 本质上是 CREATE UNIQUE RELATION if start and end node exists(在计划中有一个渴望).有没有可能做得更好? (使用 Cypher 3.1)

最佳答案

你可以简化很多:

MERGE (a:TEST{id:1})
WITH a
MATCH (b:TEST{id:2})
CREATE UNIQUE (a)-[:HAS]->(b)
RETURN a;

(单个)WITH 子句用于将查询拆分为 2 个“子查询”。

因此,如果 MATCH 子查询失败,它只会中止自己的子查询(以及任何后续子查询),但不会回滚先前成功的 MERGE子查询。

但是请注意,无论何时最终子查询失败,RETURN 子句都不会返回任何内容。您必须确定这是否可以接受。

因为上面的 RETURN 子句只会在 b 存在的情况下返回一些东西,所以返回 b 可能更有意义,或者小路。这是后者的一个例子(即使路径已经存在,p 也会被赋值):

MERGE (a:TEST{id:1})
WITH a
MATCH (b:TEST{id:2})
CREATE UNIQUE p=(a)-[:HAS]->(b)
RETURN p;

[更新]

在neo4j 4.0+中,不再支持CREATE UNIQUE,因此需要使用MERGE

此外,如果即使 b 不存在也想返回 a,可以使用 APOC 函数 apoc.do.when :

MERGE (a:TEST{id:1})
WITH a
OPTIONAL MATCH (b:TEST{id:2})
CALL apoc.do.when(
b IS NOT NULL,
'MERGE (a)-[:HAS]->(b)',
'',
{a: a, b: b}) YIELD value
RETURN a;

关于Neo4j 密码 : Create a relationship only if the end node exists,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44166057/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com