База данных графов с открытым исходным кодом для поиска информации

Прочитав эту статью, вы узнаете об основных концепциях NebulaGraph, графической базы данных с открытым исходным кодом. Судя по официальной документации, NebulaGraph

«…распределенная, быстрая графовая база данных с открытым исходным кодом, отличающаяся горизонтальной масштабируемостью и высокой доступностью. Это база данных, которая специализируется на хранении обширных графовых сетей и извлечении из них информации».

Перед этим давайте рассмотрим различия между реляционной базой данных и графовой базой данных.

Реляционная база данных хранит данные в таблицах. Каждая таблица определяется своими столбцами и строками. Реляционная база данных требует объединения для соединения между различными таблицами. Этот тип базы данных подходит для случаев использования, ориентированных на транзакции, таких как бухгалтерский учет и онлайн-транзакции.

С другой стороны, графовая база данных представлена ​​узлами или ребрами. В некоторых базах данных графов вместо этого используются термины вершины, ребра и свойства. Они предназначены для представления сущностей и отношений между сущностями. База данных Graph идеально подходит для систем обнаружения мошенничества и рекомендаций.

Перейдите к следующему разделу для настройки и установки.

Настройка и установка

В этом руководстве рассматривается установка следующих пакетов:

  • NebulaGraph server — Бинарники для сервера NebulaGraph
  • Nebula Console — Интерфейс командной строки для сервера NebulaGraph

NebulaGraph (пакет RPM или DEB)

На момент написания этой статьи NebulaGraph поддерживается только в операционной системе Linux (Ubuntu, CentOS). Загрузите нужный пакет на основе желаемого release_version:

//Centos 6
https://oss-cdn.nebula-graph.io/package/<release_version>/nebula-graph-<release_version>.el6.x86_64.rpm
//Centos 7
https://oss-cdn.nebula-graph.io/package/<release_version>/nebula-graph-<release_version>.el7.x86_64.rpm
//Centos 8
https://oss-cdn.nebula-graph.io/package/<release_version>/nebula-graph-<release_version>.el8.x86_64.rpm
//Ubuntu 1604
https://oss-cdn.nebula-graph.io/package/<release_version>/nebula-graph-<release_version>.ubuntu1604.amd64.deb
//Ubuntu 1804
https://oss-cdn.nebula-graph.io/package/<release_version>/nebula-graph-<release_version>.ubuntu1804.amd64.deb
//Ubuntu 2004
https://oss-cdn.nebula-graph.io/package/<release_version>/nebula-graph-<release_version>.ubuntu2004.amd64.deb

Например, вы можете запустить следующую команду, чтобы загрузить пакет для версии 3.2.1:

# CentOS 7.5
wget https://oss-cdn.nebula-graph.io/package/3.2.1/nebula-graph-3.2.1.el7.x86_64.rpm
# Ubuntu 1804
wget https://oss-cdn.nebula-graph.io/package/3.2.1/nebula-graph-3.2.1.ubuntu1804.amd64.deb
# Ubuntu 2004
wget https://oss-cdn.nebula-graph.io/package/3.2.1/nebula-graph-3.2.1.ubuntu2004.amd64.deb

После загрузки пакета выполните следующую команду для установки NebulaGraph:

# CentOS 7.5
sudo rpm -ivh nebula-graph-3.2.1.el7.x86_64.rpm
# Ubuntu 1804
sudo dpkg -i nebula-graph-3.2.1.ubuntu1804.amd64.deb
# Ubuntu 2004
sudo dpkg -i nebula-graph-3.2.1.ubuntu2004.amd64.deb

Затем запустите сервер NebulaGraph с помощью следующей команды:

sudo /usr/local/nebula/scripts/nebula.service start all

Вы должны увидеть следующий вывод, указывающий, что сервер запущен:

[INFO] Starting nebula-metad...
[INFO] Done
[INFO] Starting nebula-graphd...
[INFO] Done
[INFO] Starting nebula-storaged...
[INFO] Done

Для проверки состояния можно использовать следующую команду:

sudo /usr/local/nebula/scripts/nebula.service status all

Он выведет идентификатор процесса и соответствующий порт, используемый службами NebulaGraph:

[INFO] nebula-metad(ef6d6a0): Running as 713187, Listening on 9559
[INFO] nebula-graphd(ef6d6a0): Running as 713233, Listening on 9669
[WARN] nebula-storaged after v3.0.0 will not start service until it is added to cluster.
[WARN] See Manage Storage hosts:ADD HOSTS in https://docs.nebula-graph.io/
[INFO] nebula-storaged(ef6d6a0): Running as 713262, Listening on 9779

Кроме того, есть еще команда остановки для остановки процесса NebulaGraph:

sudo /usr/local/nebula/scripts/nebula.service stop all

Терминал распечатает следующий журнал:

[INFO] Stopping nebula-metad...
[INFO] Done
[INFO] Stopping nebula-graphd...
[INFO] Done
[INFO] Stopping nebula-storaged...
[INFO] Done

Пожалуйста, проверьте следующие документы для получения дополнительной информации обо всем доступном синтаксисе.

NebulaGraph (Docker и Kubernetes)

Кроме того, NebulaGraph также доступен с Docker и Kubernetes. Для стандартной установки используйте следующий Dockerfile из официального репозитория:

  • vesoft/nebula-graphd:- nebula-graphd сервис, созданный с помощью Dockerfile.graphd
  • vesoft/nebula-metad — сервис nebula-metad, созданный с помощью Dockerfile.metad
  • vesoft/nebula-storaged: nebula-storaged сервис, созданный с помощью Dockerfile.storaged
  • vesoft/nebula-tools: инструменты туманности, созданные с помощью Dockerfile.tools

Кроме того, вы можете получить образы Docker напрямую из Docker Hub. Просто перейдите по следующей ссылке и вытащите нужные изображения. Например, вы можете использовать следующую команду, чтобы получить изображение nebula-graphd:

docker pull vesoft/nebula-graphd

Для Kubernetes перейдите по следующей ссылке и следуйте предоставленным инструкциям.

Консоль туманности

Файл сервера NebulaGraph не поставляется с консолью Nebula. Консоль Nebula предоставляет интерфейс командной строки для взаимодействия с сервером NebulaGraph.

Обратите внимание, что Nebula Console не требуется, если вы собираетесь подключаться к NebulaGraph через собственный клиентский SDK (Python, Java, Go, C++). Тем не менее, это отличный инструмент для отладки и тестирования.

Загрузите нужные бинарники из следующего репозитория Github в зависимости от операционной системы и архитектуры вашей машины. Вы можете запустить команду lscpu, чтобы определить архитектуру.

Для удобства рекомендуется переименовать бинарники в nebula-console. Кроме того, вам необходимо предоставить разрешение на выполнение файла. Вы можете сделать это, запустив chmod 111 nebula-console. Пожалуйста, не используйте chmod 777, так как файл будет доступен для чтения, записи и выполнения любым пользователем.

Измените рабочий каталог на тот же каталог, что и исполняемый файл nebula-console. Затем выполните следующую команду, чтобы запустить интерфейс командной строки:

# syntax
./nebula-console -addr <address> -port <port> -u <username> -p <password>
# example
./nebula-console -addr 127.0.0.1 -port 9669 -u root -p root
  • address — устанавливает IP-адрес службы графа. Адрес по умолчанию — 127.0.0.1.
  • port — устанавливает номер порта службы графа. Номер порта по умолчанию — 9669.
  • username — Задает имя пользователя. Имя пользователя по умолчанию — root.
  • password — Устанавливает пароль вашего. Если аутентификация не включена, вы можете использовать любые символы в качестве пароля.

Вы должны увидеть следующий вывод при выполнении файла nebula-console:

Welcome to NebulaGraph!
(root@nebula) [(none)]>

В следующем разделе вы научитесь выполнять nGQL с помощью интерфейса командной строки.

Язык запросов NebulaGraph (nGQL)

Как следует из названия, nGQL — это декларативный язык запросов к графу для NebulaGraph. При первом подключении к серверу NebulaGraph вам необходимо добавить новые хосты хранилища.

Хосты хранения

Убедитесь, что ваш терминал подключен к серверу NebulaGraph через nebula-console. Выполните следующий запрос, чтобы определить все доступные узлы хранилища:

SHOW HOSTS;

Вы должны увидеть пустую таблицу, указывающую на то, что в настоящее время она пуста. Добавьте новый хост с помощью следующего запроса:

ADD HOSTS 127.0.0.1:9779;

Запустите запрос SHOW HOSTS; еще раз. Терминал выдаст следующий результат:

+-------------+------+-----------+-----------+--------------+
| Host        | Port | HTTP port | Status    | Leader count |
+-------------+------+-----------+-----------+--------------+
| "127.0.0.1" | 9779 | 19669     | "ONLINE"  | 0            |
+-------------+------+-----------+-----------+--------------+

Экземпляр NebulaGraph может содержать ноль или более пробелов графа. Каждое ПРОСТРАНСТВО физически изолировано друг от друга и имеет собственную схему. Вы можете думать об этом как о БАЗЕ ДАННЫХ в реляционной базе данных.

Схема

Схема SPACE представлена ​​следующими компонентами:

  • VERTEX — представляет сущность. Он может иметь от нуля до нескольких тегов.
  • TAG — Опишите свойства VERTEX.
  • EDGE — Представляет направленную связь между двумя ВЕРШИНАМИ.
  • EDGE TYPE — Опишите свойства EDGE

Например, взгляните на следующее изображение, иллюстрирующее схему SPACE:

  • ПРОБЕЛ содержит три Person ВЕРШИН.
  • Каждый Person VERTEX имеет name и age в качестве TAG(ов).
  • Персоны VERTEX связаны like EDGE
  • Каждый подобный EDGE имеет likeness в качестве EDGE TYPE.

Следовательно, мы можем легко интерпретировать SPACE выше следующим образом:

  • Человек (имя: Боб, возраст: 22) нравится (сходство: 90,0) Человек (имя: Мэри, возраст: 30)
  • Человек (имя: Боб, возраст: 22) нравится (сходство: 70,0) Человек (имя: Алиса, возраст: 22)

Создавать

Давайте создадим новый SPACE и соответствующую схему на основе варианта использования выше. Запустите в консоли следующий запрос:

CREATE SPACE IF NOT EXISTS test(vid_type=FIXED_STRING(30));
USE test;
CREATE TAG IF NOT EXISTS person(name string, age int);
CREATE EDGE like (likeness double);

Вставлять

После этого используйте следующий запрос, чтобы вставить новые Person ВЕРШИНЫ в ПРОБЕЛ:

INSERT VERTEX person(name, age) VALUES "Bob":("Bob", 22), "Alice":("Alice", 22), "Mary":("Mary", 30);

Теперь мы можем установить взаимосвязь между вновь созданными VERTEX(ами) следующим образом:

INSERT EDGE like(likeness) VALUES "Bob"->"Alice":(70.0), "Bob"->"Mary":(90.0);

Читать

NebulaGraph предоставляет 4 различных способа чтения данных с графового сервера:

  • GO — пройтись по БД по заданным условиям и получить нужную информацию
  • FETCH — получить свойства из VERTEX(s) или EDGE(s)
  • LOOKUP — поиск данных, удовлетворяющих заданным условиям, по индексам
  • MATCH — описывать все виды графических паттернов на основе индексов

В этом руководстве рассматриваются функции FETCH и GO. Используйте следующий запрос, чтобы получить свойства из Person VERTEX с именем Bob:

FETCH PROP ON person "Bob" YIELD vertex as node;

Консоль выведет следующий результат:

+---------------------------------------+
| node                                  |
+---------------------------------------+
| ("Bob" :person{age: 22, name: "Bob"}) |
+---------------------------------------+

Что касается EDGE, вы можете использовать следующий запрос, чтобы получить свойства like EDGE от Bob до Alice:

FETCH PROP ON like "Bob"->"Alice" YIELD edge as e;

Вы должны получить следующий вывод

+--------------------------------------------+
| e                                          |
+--------------------------------------------+
| [:like "Bob"->"Alice" @0 {likeness: 70.0}] |
+--------------------------------------------+

С другой стороны, оператор GO можно использовать для обхода базы данных. Например, вы можете легко идентифицировать все Person VERTEX like Боба:

GO FROM "Bob" OVER like YIELD properties($$).name AS Name, properties($$).age AS Age;

Терминал напечатает следующий текст:

+---------+-----+
| Name    | Age |
+---------+-----+
| "Alice" | 22  |
| "Mary"  | 30  |
+---------+-----+

Знак $$ представляет собой целевую VERTEX. В этом случае запрос вернет свойства целевого VERTEX. Вы можете использовать знак $^, чтобы получить свойства исходного VERTEX.

Вы можете указать условия с помощью предложения WHERE следующим образом:

# Person liked by Bob that is over 25 in age
GO FROM "Bob" OVER like WHERE properties($$).age >= 25 YIELD properties($$).name AS Name, properties($$).age AS Age;
# Person liked by Bob with less than 80 likeness
GO FROM "Bob" OVER like WHERE properties(edge).likeness < 80 YIELD properties($$).name AS Name, properties($$).age AS Age;

Обновлять

Чтобы обновить существующие VERTEX и EDGE, выполните следующий запрос:

# Update the age of Bob
UPDATE VERTEX "Bob" SET person.age = 25;
# Update the likeness from Bob to Alice
UPDATE EDGE "Bob" -> "Alice" OF like SET likeness = 99.9;

Удалить

Предложение DELETE можно использовать для удаления VERTEX или EDGE из базы данных. Используйте его следующим образом:

DELETE VERTEX "Bob", "Alice";
DELETE EDGE like "Bob" -> "Mary";

Проверьте следующую шпаргалку для получения дополнительной информации о nGQL.

Python-клиент

NebulaGraph поставляется со следующими клиентскими SDK:

  • C++
  • Джава
  • Go
  • питон

В этом руководстве рассматривается простой пример подключения и управления базой данных графов в Python. Вы можете запустить скрипт локально на том же компьютере или с удаленного компьютера.

Пакет Python

Перед этим давайте создадим новую виртуальную среду на целевой машине. Активируйте его и выполните следующую команду, чтобы установить NebulaGraph Python API.

pip install nebula3-python

Затем создайте новый файл с именем main.py и добавьте в него следующий код:

Функция session.execute вернет объект ResultSet. Например:

ResultSet(keys: ['node'], values: [("Bob" :person{age: 22, name: "Bob"})])

Вы можете использовать следующий код, чтобы преобразовать его в словарь Python:

columns = result.keys()
d = {}
for col_num in range(result.col_size()):
    col_name = columns[col_num]
    col_list = result.column_values(col_name)
    d[col_name] = [x for x in col_list]

Вывод dict должен быть следующим:

{'node': [("Bob" :person{age: 22, name: "Bob"})]}

Инструменты экосистемы NebulaGraph

NebulaGraph также предоставляет несколько полезных инструментов как часть своей экосистемы:

  • NebulaGraph Explorer — инструмент визуализации на основе браузера для визуализации взаимодействия с данными графика. Помогает отображать данные графика для быстрого анализа.
  • NebulaGraph Dashboard — инструмент визуализации, отслеживающий состояние машин и сервисов в кластерах NebulaGraph. Он поставляется с Community Edition и Enterprise Edition.
  • NebulaGraph Exchange — приложение Apache Spark для потоковой передачи данных и переноса данных кластера в NebulaGraph в распределенном. Он поставляется с Community Edition и Enterprise Edition.

Заключение

Давайте повторим, что вы узнали сегодня.

Эта статья началась с краткого введения в NebulaGraph. Также были рассмотрены различия между графовой базой данных и реляционной базой данных.

Затем были выделены шаги по настройке и установке сервера NebulaGraph и консоли Nebula на вашем локальном компьютере.

Впоследствии он исследовал язык запросов NebulaGraph (nGQL). В этом руководстве представлены подробные объяснения и примеры кода, связанные с операциями CRUD.

Статья продолжилась примерами использования клиента Python для подключения и управления сервером NebulaGraph.

В последнем разделе говорилось об инструментах экосистемы, предоставляемых NebulaGraph.

Спасибо за чтение этого произведения. Желаю отличного дня!

Рекомендации

  1. NebulaGraph — Официальный сайт
  2. НебулаГраф — Документация
  3. NebulaGraph — Python-клиент