我正在运行数据库Agens Graph v.2.1.0。 我创建了两个具有相同结构的图形,例如1个顶点标签“ VERTEX”和1个边缘标签“ EDGE”。 如何将数据从一个图复制到另一个图?我无法使用sql查询从ag_edge,ag_vertex表中复制数据。 有没有相关的例子?
也许是创建图形完整副本的功能?
答案 0 :(得分:0)
我已向here解释了该过程,并用go语言编写了代码。 Go代码可以轻松地用C或任何脚本语言重写。 再次出现:
AgensGraph是用于现代复杂数据环境的新一代多模型图形数据库。
Sometimes,将整个图克隆到同一数据库中的另一个图似乎很有用。 AgensGraph尚未产生这种实用程序。这是尝试用Go语言创建这样的实用程序。
AgensGraph是PostgreSQL的扩展。因此,在AgensGraph中,图是一个架构(包含数据的表集)和表pg_catalog.ag_label,pg_catalog.ag_graph和pg_catalog.ag_graphmeta中的一些元数据。数据是一组表,这些表的索引包含有关顶点及其连接边的信息。
显然,这意味着创建一个 new_schema ,它将是原始架构的副本(为简便起见,将其称为 old_schema )并在其中设置元数据正确地提到了以上表格。
在PostgreSQL: How to create full copy of database schema in same database?中描述。 很快:
psql -U user -d dbname -c 'ALTER SCHEMA old_schema RENAME TO new_schema'
pg_dump -U user -n new_schema -f new_schema.sql dbname
psql -U user -d dbname -c 'ALTER SCHEMA new_schema RENAME TO old_schema'
psql -U user -d dbname -c 'CREATE SCHEMA new_schema'
psql -U user -q -d dbname -f new_schema.sql
rm new_schema.sql
为了成功完成此操作,我们需要在重命名old_schema之前从ag_graph表中删除old_schema,然后在创建新架构之前将其重新添加-否则AgensGraph触发器将禁止架构重命名(请参阅Go代码)。
agens=# \d ag_graph;
Table "pg_catalog.ag_graph"
Column | Type | Collation | Nullable | Default
-----------+------+-----------+----------+---------
graphname | name | | not null |
nspid | oid | | not null |
Indexes:
"ag_graph_graphname_index" UNIQUE, btree (graphname)
"ag_graph_oid_index" UNIQUE, btree (oid)
图名== new_schema ,nspid来自
agens=# SELECT oid FROM pg_namespace WHERE nspname='new_schema';
oid
-------
16418
(1 row)
16419 ==(nspid + 1)of old_schema
agens=# SELECT * FROM ag_label WHERE graphid=16419;
labname | graphid | labid | relid | labkind
-----------+---------+-------+-------+---------
ag_vertex | 16419 | 1 | 16424 | v
ag_edge | 16419 | 2 | 16438 | e
person | 16419 | 3 | 16453 | v
knows | 16419 | 4 | 16467 | e
(4 rows)
我们需要复制所有具有相同的实验室名称,labid,labkind和新的graphid ==(nspid + 1)为 new_schema 的记录,并从pg_class复制== relfilenode:
agens=# SELECT relname, relfilenode FROM pg_class WHERE relnamespace=16418;
relname | relfilenode
-------------------+-------------
ag_label_seq | 16420
knows | 16467
ag_vertex_pkey | 16433
ag_vertex_id_seq | 16435
ag_edge_id_idx | 16447
ag_edge_start_idx | 16448
ag_edge_end_idx | 16449
ag_edge_id_seq | 16450
ag_vertex | 16424
person | 16453
person_pkey | 16462
person_id_seq | 16464
ag_edge | 16438
knows_id_idx | 16476
knows_start_idx | 16477
knows_end_idx | 16478
knows_id_seq | 16479
(17 rows)
relnamespace 是 new_schema 的nspid,所有索引和主键都需要忽略,仅表需要复制。
我不知道-就我而言,它总是空的。
以上所有内容对我来说都是一个计划-因此,我尝试在一个简单的Go语言实用程序中实现该功能:https://github.com/tbolsh/CloneAgensGraph