База данных графов с открытым исходным кодом для поиска информации
Прочитав эту статью, вы узнаете об основных концепциях NebulaGraph, графической базы данных с открытым исходным кодом. Судя по официальной документации, NebulaGraph
«…распределенная, быстрая графовая база данных с открытым исходным кодом, отличающаяся горизонтальной масштабируемостью и высокой доступностью. Это база данных, которая специализируется на хранении обширных графовых сетей и извлечении из них информации».
Перед этим давайте рассмотрим различия между реляционной базой данных и графовой базой данных.
Реляционная база данных хранит данные в таблицах. Каждая таблица определяется своими столбцами и строками. Реляционная база данных требует объединения для соединения между различными таблицами. Этот тип базы данных подходит для случаев использования, ориентированных на транзакции, таких как бухгалтерский учет и онлайн-транзакции.
С другой стороны, графовая база данных представлена узлами или ребрами. В некоторых базах данных графов вместо этого используются термины вершины, ребра и свойства. Они предназначены для представления сущностей и отношений между сущностями. База данных Graph идеально подходит для систем обнаружения мошенничества и рекомендаций.
Перейдите к следующему разделу для настройки и установки.
Настройка и установка
В этом руководстве рассматривается установка следующих пакетов:
NebulaGraph server
— Бинарники для сервера NebulaGraphNebula 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.
Спасибо за чтение этого произведения. Желаю отличного дня!