neo4j - 考虑到节点的标签已经存在,有没有办法在创建节点时自动创建关系?
问题描述
我创建了两个具有 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 的新节点时,都会自动创建关系,而无需运行密码查询。
解决方案
如果要在同时创建的 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'})
推荐阅读
- ios - 应用程序图标仅在 iPad Pro(12.9 英寸)第 2 代上不显示
- php - 我们可以使用 php 将谷歌文档中的数据获取到 mysql 数据库吗
- javascript - 如何从输入变量将元素添加到 JavaScript 中的数组?
- ssl - 更改 IIS Express SSL 证书
- c# - C#将通用类obj作为参数传递给接口
- reactjs - 显示隐藏多个元素与反应
- android - 如何计算图像的平均值和标准值
- http - 即使在电子邮件验证后,Bit.ly 位链接创建总是返回禁止?
- html - 单击表格正文中的链接时,粘性表格标题会跳转
- neural-network - LSTM 反向传播,然后是最大/均值池