首页 > 解决方案 > 考虑到节点的标签已经存在,有没有办法在创建节点时自动创建关系?

问题描述

我创建了两个具有 CONNECT 关系的标签 A 和 B。我需要创建每个标签 A 和 B 的多个节点以及它们之间的关系。即,对于每个节点 A 和 B,我需要创建一个关系。例如:a1:A -[:CONNECT]-> b1:B, a2:A -[:CONNECT]-> b2:B,a3:A -[:CONNECT]-> b3:B, ... an:A -[:CONNECT]-> bn:B

有没有办法自动建立关系?创建节点时,db可以自动创建不同现有标签的节点之间的关系吗?请帮忙。

我使用 APOC 过程在属性上手动创建节点之间的多个关系 - 对于标签 LABEL1 和 LABEL2 的 100 个节点,在属性值上,我可以使用以下 proc 使用单个 Cypher 查询手动创建关系:

MATCH (ref1:LABEL1), (ref2:LABEL2)
WHERE ref1.property = ref2.property 
CALL apoc.create.relationship(ref1, ‘RELATIONSHIP_NAME', {}, ref2) YIELD rel
RETURN rel

但我想知道是否存在一种方式,两个标签 A 和 B 之间的关系已经存在;并且每当创建标签 A 和 B 的新节点时,都会自动创建关系,而无需运行密码查询。

标签: neo4jcypher

解决方案


如果要在同时创建的 2 个节点之间创建关系,只需在CREATE子句中指定该模式即可。

这是LOAD CSV用于导入数据的示例:

LOAD CSV WITH HEADERS FROM 'file:///data.csv' AS row
CREATE (a:A {x: row.x})-[:CONNECT]->(b:B {y: row.y})

通常,数据库代表您自动创建关系是有风险的,因为它可能会导致创建您不希望的关系。

[更新]

但是,如果Label2节点的创建时间晚于Label1节点,并且您确定要自动创建CONNECT关系,则可以使用 APOC 创建如下触发器

CALL apoc.trigger.add(
  "create-CONNECT-rel",
  "UNWIND $createdNodes AS ref2
   WITH ref2
   WHERE ref2:Label2
   MATCH (ref1:Label1 {property: ref2.property})
   CREATE (ref1)-[:CONNECT]->(ref2)",
  {phase:'before'})

推荐阅读