考虑到节点的标签已经存在,是否可以在创建节点时自动创建关系?

时间:2019-09-17 01:31:43

标签: neo4j cypher

我创建了两个具有连接关系的标签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

有没有一种自动创建关系的方法?当我创建节点时,数据库可以自动在两个节点之间创建关系吗?  现有标签的节点?请帮忙。

我使用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的新节点时,关系都会自动创建而无需运行密码查询。

1 个答案:

答案 0 :(得分:0)

如果要在同时创建的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创建一个trigger像这样:

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'})