【问题标题】:Is there a way a relationship is automatically created when the nodes are created, given that the labels of the nodes already exist?考虑到节点的标签已经存在,有没有办法在创建节点时自动创建关系?
【发布时间】:2019-09-17 01:31:43
【问题描述】:

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

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    如果您想在同时创建的 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'})
    

    【讨论】:

    • 谢谢!我知道上面的例子,与节点一起创建关系。但是在我的场景中,我今天要创建一个 LABLE1 的节点,明天可能需要创建一个 LABEL2 的节点,我不想显式地创建关系。 -- 我的例子中的标签和关系是静态的。那么,当创建 LABLE2 的第二个节点时,是否有一种方法可以在不同标签的两个节点之间创建关系。而不是明确提及这种关系?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-20
    • 2016-05-01
    • 1970-01-01
    • 2016-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多