База данных графов с открытым исходным кодом для поиска информации
Прочитав эту статью, вы узнаете об основных концепциях 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.graphdvesoft/nebula-metad— сервисnebula-metad, созданный с помощьюDockerfile.metadvesoft/nebula-storaged:nebula-storagedсервис, созданный с помощьюDockerfile.storagedvesoft/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ВЕРШИН. - Каждый
PersonVERTEX имеетnameиageв качестве TAG(ов). - Персоны VERTEX связаны
likeEDGE - Каждый подобный 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.
Спасибо за чтение этого произведения. Желаю отличного дня!