当前位置: 首页 > 知识库问答 >
问题:

Neo4j密码:仅当结束节点存在时才创建关系

康泽宇
2023-03-14

基于这个类似的问题,我想要一种性能最好的方法来处理这个场景。

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不能用于匹配或查找唯一节点。

    null
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

共有1个答案

朱阳晖
2023-03-14

您可以简化一些:

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

(single)with子句用于将查询拆分为2个子查询。

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

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

另外,如果您希望返回A,即使B不存在,您也可以使用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;
 类似资料:
  • 问题内容: 我希望根据该文件是否已经存在来写一个文件,仅在不存在的情况下才写(实际上,我希望继续尝试文件,直到找到一个不存在的文件为止)。 下面的代码显示在其中一个潜在的攻击者可以插入一个符号,作为建议的方式这篇文章中该文件的测试和写入的文件之间。如果代码以足够高的权限运行,则可能会覆盖任意文件。 有什么办法解决这个问题? 问题答案: 编辑 :另请参见DaveJones的回答:从Python3.3

  • 我希望它创建每个节点(而不是在已经存在具有相同ID的节点时创建新节点),并创建每个关系(在CSV中指定具有多个关系的节点中有多个关系from/to节点)。 实际发生的情况:它似乎创建了所有唯一的节点。它还创建了节点之间的关系,但它只为每个节点设置一个关系,而不考虑与多个其他节点进行通信的一些节点。 我很困惑,因为我的理解是,如果在数据库中还没有出现关系,它将创建关系,所以我认为它将创建CSV中指定

  • 我有一个csv格式的数据集。其中一个字段是类型,类似于枚举。基于此类型,我需要在使用csv LOAD加载数据时创建不同的类型、节点和关系。您可以在csv中调用具有定义子类型的属性的超级类型的行。 我真的不知道如何在Cypher中做到这一点。我唯一的选择是将一个csv文件拆分为每种类型的csv文件,并运行不同的密码吗?

  • 我还使用neo4j-enterprise-3.0.2,并使用BOLT连接将我的Pycharm python程序连接到数据库。我创建了许多节点和关系。我注意到,节点和关系的创建在一定时间后会大大减慢,在一定时间之后几乎不会进展。 我检查了以下 我对节点和属性使用了唯一的约束,以便可以使用模式索引轻松地在数据库中查找节点 我注意到,当所有这些事务发生时,我的RAM内存不断增加。我在dbms.memor