Начало работы
Подключение
Тесты производительности
Развёртывание
Использование данных
Загрузка данных
Миграция данных
Запрос данных
Управление кластерами
Обновление
Глобальное обслуживание
Масштабирование
Мониторинг
Безопасность
Лучшие практики
Технические принципы
Типы данных
Хранилище
Исполняющий движок
Потоковая обработка (Domino)
MARS3 Индексы
Расширения
Расширенные функции
Расширенный запрос
Федеративные запросы
Grafana
Резервное копирование и восстановление
Аварийное восстановление
Графовая база данных
Введение
Предложения
Функции
Расширенные темы
Руководство
Настройка производительности
Устранение неполадок
Инструменты
Параметры конфигурации
SQL-команда
Часто задаваемые вопросы
--enable-enterprise --with-age
Добавьте age в параметр shared_preload_libraries в файле postgresql.conf:
shared_preload_libraries = 'xxx,age'
После перезапуска сервера установите расширение:
CREATE EXTENSION age;
Каждый раз при подключении к базе данных YMatrix 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
При создании графа с помощью 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 /* обязательно */);