Импорт графовых данных из файлов

Граф можно создать из файлов, следуя приведённым ниже инструкциям. В этом документе описано:

  • Функции для загрузки графов из файлов
  • Как включить эти функции
  • Ожидаемая структура CSV-файлов для функций загрузки
  • Простой пример исходного кода для загрузки стран и городов

Пользователи загружают графы в два этапа:

  • Сначала загружаются вершины
  • Затем загружаются рёбра

Граф и его метки необходимо создать до загрузки данных из файлов.

Функции загрузки

Ниже перечислены функции для загрузки вершин и рёбер из файлов.

Функция load_labels_from_file загружает вершины из CSV-файла.

load_labels_from_file('<graph name>',
                      '<label name>',
                      '<file path>')

Четвёртый аргумент позволяет опустить поле id. Используйте этот параметр только тогда, когда входной файл не содержит столбца id.

load_labels_from_file('<graph name>',
                      '<label name>',
                      '<file path>',
                      false)

Функция load_edges_from_file загружает рёбра из CSV-файла. Спецификацию формата файла см. ниже.

Примечание: Убедитесь, что значения id в файле рёбер соответствуют существующим значениям id в файле вершин.

load_edges_from_file('<graph name>',
                    '<label name>',
                    '<file path>');

Спецификация формата CSV-файлов

Ниже описана требуемая структура CSV-файлов для вершин и рёбер.

  • CSV-файл вершин должен иметь следующий формат:
Имя столбца Описание
id Должен быть первым столбцом. Все значения должны быть положительными целыми числами. Необязателен только при установке параметра id_field_exists в значение false. В остальных случаях обязательное поле.
Properties Все остальные столбцы определяют свойства вершин. Заголовочная строка должна содержать имена свойств.
  • CSV-файл рёбер должен иметь следующий формат:
Имя столбца Описание
start_id id исходной вершины. Должен присутствовать в файле вершин.
start_vertex_type Метка исходной вершины.
end_id id целевой вершины.
end_vertex_type Метка целевой вершины.
properties Свойства рёбер. Заголовочная строка должна содержать имена свойств.

Примеры файлов находятся в каталоге regress/age_load/data.

Примеры SQL-скриптов

  • Загрузите расширение AGE и создайте граф:
LOAD 'age';

SET search_path TO ag_catalog;
SELECT create_graph('agload_test_graph');
  • Создайте метку Country и загрузите вершины из CSV-файла. Примечание: Этот CSV-файл содержит столбец id.
SELECT create_vlabel('agload_test_graph','Country');
SELECT load_labels_from_file('agload_test_graph',
                             'Country',
                             'age/regress/age_load/data/countries.csv');
  • Создайте метку City и загрузите вершины из CSV-файла. Примечание: Этот CSV-файл содержит столбец id.
SELECT create_vlabel('agload_test_graph','City');
SELECT load_labels_from_file('agload_test_graph',
                             'City',
                             'age/regress/age_load/data/cities.csv');
  • Создайте метку ребра has_city и загрузите рёбра из CSV-файла.
SELECT create_elabel('agload_test_graph','has_city');
SELECT load_edges_from_file('agload_test_graph', 'has_city',
     'age/regress/age_load/data/edges.csv');
  • Проверьте корректность загрузки графа:
SELECT table_catalog, table_schema, table_name, table_type
FROM information_schema.tables
WHERE table_schema = 'agload_test_graph';

SELECT COUNT(*) FROM agload_test_graph."Country";
SELECT COUNT(*) FROM agload_test_graph."City";
SELECT COUNT(*) FROM agload_test_graph."has_city";

SELECT COUNT(*) FROM cypher('agload_test_graph', $$MATCH(n) RETURN n$$) AS (n agtype);
SELECT COUNT(*) FROM cypher('agload_test_graph', $$MATCH (a)-[e]->(b) RETURN e$$) AS (n agtype);

Создание вершин при отсутствии столбца id во входном файле

  • Создайте метку Country2 и загрузите вершины из CSV-файла. Примечание: Этот CSV-файл не содержит столбца id.
SELECT create_vlabel('agload_test_graph','Country2');
SELECT load_labels_from_file('agload_test_graph',
                             'Country2',
                             'age/regress/age_load/data/countries.csv',
                             false);
  • Создайте метку City2 и загрузите вершины из CSV-файла. Примечание: Этот CSV-файл не содержит столбца id.
SELECT create_vlabel('agload_test_graph','City2');
SELECT load_labels_from_file('agload_test_graph',
                             'City2',
                             'age/regress/age_load/data/cities.csv',
                             false);
  • Проверьте корректность загрузки графа и сравните автоматически сгенерированные ID с ID, прочитанными из файла:
    • Метки Country и City используют значения id из входного файла.
    • Метки Country2 и City2 были созданы без столбца id — ID назначены автоматически.
SELECT COUNT(*) FROM agload_test_graph."Country2";
SELECT COUNT(*) FROM agload_test_graph."City2";

SELECT id FROM agload_test_graph."Country" LIMIT 10;
SELECT id FROM agload_test_graph."Country2" LIMIT 10;

SELECT * FROM cypher('agload_test_graph', $$MATCH(n:Country {iso2 : 'BE'})
    RETURN id(n), n.name, n.iso2 $$) AS ("id(n)" agtype, "n.name" agtype, "n.iso2" agtype);
SELECT * FROM cypher('agload_test_graph', $$MATCH(n:Country2 {iso2 : 'BE'})
    RETURN id(n), n.name, n.iso2 $$) AS ("id(n)" agtype, "n.name" agtype, "n.iso2" agtype);

SELECT * FROM cypher('agload_test_graph', $$MATCH(n:Country {iso2 : 'AT'})
    RETURN id(n), n.name, n.iso2 $$) AS ("id(n)" agtype, "n.name" agtype, "n.iso2" agtype);
SELECT * FROM cypher('agload_test_graph', $$MATCH(n:Country2 {iso2 : 'AT'})
    RETURN id(n), n.name, n.iso2 $$) AS ("id(n)" agtype, "n.name" agtype, "n.iso2" agtype);

SELECT drop_graph('agload_test_graph', true);