如何将数据从一个GRAPH复制到另一个?

时间:2019-05-23 09:34:39

标签: postgresql graph-databases agens-graph

我正在运行数据库Agens Graph v.2.1.0。 我创建了两个具有相同结构的图形,例如1个顶点标签“ VERTEX”和1个边缘标签“ EDGE”。 如何将数据从一个图复制到另一个图?我无法使用sql查询从ag_edge,ag_vertex表中复制数据。 有没有相关的例子?

也许是创建图形完整副本的功能?

1 个答案:

答案 0 :(得分:0)

我已向here解释了该过程,并用go语言编写了代码。 Go代码可以轻松地用C或任何脚本语言重写。 再次出现:

AgensGraph数据库中的克隆图

AgensGraph是用于现代复杂数据环境的新一代多模型图形数据库。

Sometimes,将整个图克隆到同一数据库中的另一个图似乎很有用。 AgensGraph尚未产生这种实用程序。这是尝试用Go语言创建这样的实用程序。

那么,AgensGraph中的图是什么?

AgensGraph是PostgreSQL的扩展。因此,在AgensGraph中,图是一个架构(包含数据的表集)和表pg_catalog.ag_label,pg_catalog.ag_graph和pg_catalog.ag_graphmeta中的一些元数据。数据是一组表,这些表的索引包含有关顶点及其连接边的信息。

那么克隆图意味着什么?

显然,这意味着创建一个 new_schema ,它将是原始架构的副本(为简便起见,将其称为 old_schema )并在其中设置元数据正确地提到了以上表格。

为什么很难做到?

  1. AgensGraph没有实用程序。
  2. AgensGraph文档中没有描述
  3. AgensGraph禁止对作为图形一部分的表进行许多表操作。

如何在PostgreSQL中复制模式?

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代码)。

如何处理ag_graph表?

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)

如何处理ag_label表?

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,所有索引和主键都需要忽略,仅表需要复制。

如何处理ag_graphmeta表?

我不知道-就我而言,它总是空的。

以上所有内容对我来说都是一个计划-因此,我尝试在一个简单的Go语言实用程序中实现该功能https://github.com/tbolsh/CloneAgensGraph