1、创建实体
sql
CREATE CONSTRAINT uniq_law_id ON (p:Law) ASSERT p.id IS UNIQUE;
CALL apoc.periodic.iterate(
'call apoc.load.jdbc("jdbc:clickhouse://192.xxx.x.xxx:8123/xxx?user=xxx&password=xxx", " select * from xxx.xxx", []) ',
'CALL apoc.merge.node([row.ent_label],
{id: row.id},
{name:row.name,level:row.level,office:row.office,publish:row.publish,expiry:row.expiry,law_type:row.law_type,status:row.status},
{name:row.name,level:row.level,office:row.office,publish:row.publish,expiry:row.expiry,law_type:row.law_type,status:row.status}
) yield node RETURN count(*)',
{batchSize:1000, parallel:false}
)
;
这段代码的目的是从 ClickHouse 数据库中加载数据到 Neo4j 图数据库,并在加载过程中使用 APOC(Awesome Procedures on Cypher)库提供的 apoc.merge.node
过程来合并数据,确保在图数据库中的节点具有唯一性。
逐行解释这段代码:
-
CREATE CONSTRAINT uniq_law_id ON (p:Law) ASSERT p.id IS UNIQUE;
: 这一行创建了一个唯一约束,确保 "Law" 类型的节点中的id
属性是唯一的。这是为了防止在后续的数据加载过程中出现重复的节点。 -
CALL apoc.periodic.iterate('call apoc.load.jdbc("jdbc:clickhouse://192.xxx.x.xxx:8123/xxx?user=xxx&password=xxx", "select * from xxx.xxx", [])', ...
: 这一行使用 APOC 提供的apoc.periodic.iterate
过程,该过程允许对数据进行迭代处理。 -
'call apoc.load.jdbc("jdbc:clickhouse://192.xxx.x.xxx:8123/xxx?user=xxx&password=xxx", " select * from xxx.xxx", [])'
: 在迭代中,首先调用apoc.load.jdbc
过程,从 ClickHouse 数据库中加载数据。这里使用的 JDBC 连接字符串指向 ClickHouse 数据库,提供用户名和密码用于连接。 -
'CALL apoc.merge.node([row.ent_label], ...':
在每次迭代中,对于从 ClickHouse 加载的每一行数据,调用 apoc.merge.node` 过程。-
[row.ent_label]
: 这是一个用于标记节点标签的列表。在这里,使用了row.ent_label
作为节点的标签,可能是从 ClickHouse 数据库中的某个列获取的。 -
{id: row.id}, {name:row.name,level:row.level,...}
: 这里定义了节点的属性。{id: row.id}
表示节点的id
属性,其值来自加载的行数据中的id
列。同样的逻辑适用于其他属性。 -
yield node RETURN count(*)
: 返回每次迭代中处理的节点数量。这可以帮助你了解迭代的进展。 -
{batchSize:1000, parallel:false}
: 定义了迭代的参数。batchSize
表示每次迭代处理的行数,parallel
表示是否并行处理。在这里,设置为串行(false
)。
-
总的来说,这段代码的目的是从 ClickHouse 数据库中加载数据到 Neo4j 图数据库,确保在图数据库中的 "Law" 节点具有唯一的 id
属性。在加载的过程中,使用了 APOC 库的 apoc.merge.node
过程,它可以合并节点,确保数据的唯一性。
2、创建关系
sql
CALL apoc.periodic.iterate(
'call apoc.load.jdbc("jdbc:clickhouse://192.xxx.x.xxx:8123/xxx?user=xxx&password=xxx", " select * from xxx.xxx", [])yield row',
'merge (n1:row.from_label {id: row.from_id})
merge (n2:row.to_label {id: row.to_id})
with n1, n2, row
CALL apoc.merge.relationship(
n1,
row.rel_type,
row.name,
{},
{},
n2,
{}
) YIELD rel
return id(rel), type(rel), rel',
{batchSize:2000, parallel:false}
)
;
这段代码的目的是从 ClickHouse 数据库中加载关系数据到 Neo4j 图数据库,并在加载的过程中使用 APOC 库提供的 apoc.merge.relationship
过程来合并关系,确保在图数据库中的关系具有唯一性。
逐行解释这段代码:
-
CALL apoc.periodic.iterate(...
: 这是一个调用 APOC 提供的apoc.periodic.iterate
过程的 Cypher 查询。该过程允许对数据进行迭代处理。 -
'call apoc.load.jdbc("jdbc:clickhouse://192.168.1.168:8123/law?user=default&password=QuBmUhBv", " select * from law.rel_law_bzjtkx_include", []) yield row'
: 在迭代中,首先调用apoc.load.jdbc
过程,从 ClickHouse 数据库中加载关系数据。这里使用的是 ClickHouse 数据库的 JDBC 连接字符串,提供用户名和密码用于连接。 -
'merge (n1:row.from_label {id: row.from_id}) merge (n2:row.to_label {id: row.to_id}) with n1, n2, row'
: 对于从 ClickHouse 加载的每一行数据,使用merge
关键字创建起始节点n1
和目标节点n2
。这里使用了row.from_label
和row.to_label
作为节点标签,并使用row.from_id
和row.to_id
作为节点的id
属性值。 -
CALL apoc.merge.relationship(n1, row.rel_type, row.name, {}, {}, n2, {}) YIELD rel
: 使用 APOC 提供的apoc.merge.relationship
过程,该过程可以合并关系。具体参数包括:n1
: 起始节点。row.rel_type
: 关系类型,来自于加载的数据的rel_type
列。row.name
: 关系的名称,来自于加载的数据的name
列。{}
: 关系的属性,这里为空对象。{}
: 关系的属性更新规则,这里为空对象。n2
: 目标节点。
-
YIELD rel
: 返回被合并的关系对象。 -
return id(rel), type(rel), rel'
: 返回合并关系的 ID、关系类型和关系对象。 -
{batchSize:2000, parallel:false}
: 定义了迭代的参数。batchSize
表示每次迭代处理的行数,parallel
表示是否并行处理。在这里,设置为串行(false
)。
总体来说,这段代码的目的是从 ClickHouse 数据库中加载关系数据到 Neo4j 图数据库,确保在图数据库中的关系具有唯一性。在加载的过程中,使用了 APOC 库的 apoc.merge.relationship
过程,它可以合并关系,确保数据的唯一性。