Установка и управление

Установка

1. Компиляция

--enable-enterprise --with-age

2. Конфигурация

Добавьте age в параметр shared_preload_libraries в файле postgresql.conf:

shared_preload_libraries = 'xxx,age'

3. Загрузка расширения

После перезапуска сервера установите расширение:

CREATE EXTENSION age;

4. Настройка для каждой сессии

Каждый раз при подключении к базе данных YMatrix AGE выполните следующие шаги:

  • Загрузите библиотеку AGE:
LOAD 'age';
  • Добавьте схему ag_catalog в search_path, чтобы упростить ссылки на функции и типы:
SET search_path = ag_catalog, "$user", public;

Управление графами

Граф состоит из множества вершин и рёбер. Каждая вершина и каждое ребро имеет собственную карту свойств. Вершина — это фундаментальный объект графа, способный существовать независимо от всех остальных элементов графа. Ребро устанавливает направленное соединение между двумя вершинами.

Создание графа

Используйте функцию create_graph из схемы ag_catalog.

  • create_graph()

Синтаксис: create_graph(graph_name);

Возвращаемое значение:

void

Параметры:

Имя Описание
graph_name Имя создаваемого графа

Примечания:

  • Функция не возвращает данных. Отсутствие ошибки означает успешное создание.
  • Необходимые системные таблицы создаются автоматически.

Пример:

SELECT * FROM ag_catalog.create_graph('graph_name');
NOTICE:  graph "graph_name" has been created
 create_graph
--------------

(1 строка)

Удаление графа

Используйте функцию drop_graph из схемы ag_catalog.

  • drop_graph()

Синтаксис: drop_graph(graph_name, cascade);

Возвращаемое значение:

void

Параметры:

Имя Описание
graph_name Имя удаляемого графа
cascade Логическое значение (по умолчанию false). Должно быть true, чтобы удалить зависимые метки и данные; иначе возникнет ошибка.

Примечания:

  • Функция не возвращает данных. Отсутствие ошибки означает успешное удаление.
  • Аргумент cascade должен быть явно установлен в true. Передача false или его пропуск вызовет ошибку.

Примеры:

SELECT * FROM ag_catalog.drop_graph('graph_name', true);
NOTICE:  drop cascades to 2 other objects
DETAIL:  drop cascades to table graph_name._ag_label_vertex
drop cascades to table graph_name._ag_label_edge
NOTICE:  graph "graph_name" has been dropped
 drop_graph
------------

(1 строка)

SELECT drop_graph('graph');
ERROR:  drop_graph second argument must be TRUE

SELECT drop_graph('graph', false);
ERROR:  drop_graph second argument must be TRUE

Хранение графов в PostgreSQL

При создании графа с помощью AGE генерируется выделенное пространство имён graph_name. Имя графа и связанное с ним пространство имён записываются в системную таблицу каталога ag_catalog.ag_graph:

SELECT create_graph('new_graph');
NOTICE:  graph "new_graph" has been created
 create_graph 
--------------

(1 строка)

SELECT * FROM ag_catalog.ag_graph;

   name    | namespace 
-----------+-----------
 new_graph | new_graph
(1 строка)

После создания графа в его пространстве имён автоматически создаются две системные таблицы: _ag_label_vertex и _ag_label_edge. Они служат родительскими таблицами для всех последующих таблиц меток вершин и рёбер. Следующие запросы демонстрируют, как получить список всех меток вершин и рёбер во всех графах.

-- До создания любой метки вершины
SELECT * FROM ag_catalog.ag_label;

       name       | graph | id | kind |          relation          |        seq_name         
------------------+-------+----+------+----------------------------+-------------------------
 _ag_label_vertex | 68484 |  1 | v    | new_graph._ag_label_vertex | _ag_label_vertex_id_seq
 _ag_label_edge   | 68484 |  2 | e    | new_graph._ag_label_edge   | _ag_label_edge_id_seq
(2 строки)

-- Создание новой метки вершины
SELECT create_vlabel('new_graph', 'Person');
NOTICE:  VLabel "Person" has been created
 create_vlabel 
---------------

(1 строка)

-- После создания метки вершины
SELECT * FROM ag_catalog.ag_label;
       name       | graph | id | kind |          relation          |        seq_name         
------------------+-------+----+------+----------------------------+-------------------------
 _ag_label_vertex | 68484 |  1 | v    | new_graph._ag_label_vertex | _ag_label_vertex_id_seq
 _ag_label_edge   | 68484 |  2 | e    | new_graph._ag_label_edge   | _ag_label_edge_id_seq
 Person           | 68484 |  3 | v    | new_graph."Person"         | Person_id_seq
(3 строки)

Вызов create_vlabel() создаёт новую таблицу new_graph."<label>" в пространстве имён графа. Аналогичный механизм применяется и для create_elabel().

Таблицы создаются автоматически при вставке вершин или рёбер через Cypher.

-- Создание двух вершин и одного ребра
SELECT * FROM cypher('new_graph', $$
CREATE (:Person {name: 'Daedalus'})-[:FATHER_OF]->(:Person {name: 'Icarus'})
$$) AS (a agtype);
 a 
---
(0 строк)

-- Проверка вновь созданных таблиц
SELECT * FROM ag_catalog.ag_label;
       name       | graph | id | kind |          relation          |        seq_name         
------------------+-------+----+------+----------------------------+-------------------------
 _ag_label_vertex | 68484 |  1 | v    | new_graph._ag_label_vertex | _ag_label_vertex_id_seq
 _ag_label_edge   | 68484 |  2 | e    | new_graph._ag_label_edge   | _ag_label_edge_id_seq
 Person           | 68484 |  3 | v    | new_graph."Person"         | Person_id_seq
 FATHER_OF        | 68484 |  4 | e    | new_graph."FATHER_OF"      | FATHER_OF_id_seq
(4 строки)

Примечание!
Не выполняйте команды DML или DDL внутри пространств имён, зарезервированных для графов.

Примечание!
Ограничения на индексы и ограничения целостности для таблиц меток в YMatrix AGE:
Таблицы меток используют распределение DISTRIBUTED RANDOMLY, что запрещает создание уникальных (UNIQUE) индексов и ограничений первичного ключа (PRIMARY KEY). В результате предотвратить дублирование данных на уровне хранения с помощью проверки уникальности невозможно.

CREATE UNIQUE INDEX idx ON graph_name."TestIdx"(properties);
-- ERROR: UNIQUE and DISTRIBUTED RANDOMLY are incompatible

ALTER TABLE graph_name."TestIdx" ADD PRIMARY KEY (id);
-- ERROR: PRIMARY KEY and DISTRIBUTED RANDOMLY are incompatible

Чтобы предотвратить дублирование, обеспечивайте уникальность на уровне приложения или с помощью логики Cypher — например, используя MERGE вместо CREATE.

Чтобы удалить метку, когда она больше не требуется, используйте drop_label():

SELECT drop_label(graph_name, label_name, true /* обязательно */);