Как вы можете использовать API GraphQL для администрирования базы данных

1656589093 kak vy mozhete ispolzovat api graphql dlya administrirovaniya bazy dannyh

Майкл Голод

kCJdwPoyYpuACfQG2zP4ISn14Oz0VF3XXmxI

Недавняя дискуссия на graphql-europe заставила меня понять, что GraphQL станет отличным API для администрирования баз данных.

Вы знаете это множество функций и опций для контроля деталей безопасности, индексирования, метаданных, кластеризации и других операций?

Я использовал поездку домой в поезде, чтобы создать конечную точку администратора GraphQL для Neo4j, показывая все доступные процедуры в виде запросов или мутаций. Используя Kotlin, это, к счастью, было всего несколькими строками (200) кода. И это сработало на удивление хорошо.

Если вы знаете любую другую базу данных, открывающую свой админ-API через GraphQL, пожалуйста, сообщите мне в комментариях — я хотел бы посмотреть.

И если вы получите вдохновение, чтобы основать некоторые свои работы на этой идее, я буду благодарен, тем более со ссылкой на авторство 🙂

TL; DR

Вы можете получить ваш Neo4j Admin API по адресу /graphql/admin путем установки последней версии neo4j-graphqlрасширение. В Neo4j Desktop просто нажмите «Установить GraphQL» в разделе «Плагины» базы данных (version 3.4.0.1). Возможно, вам понадобится настроить a основное название авторизации для учетных пользовательских данных базы данных. Тогда вы готовы спросить свой новый блестящий администратор API через GraphiQL или GraphQL Playground.

6GfcIFSf6Dz2wcWKTzNHJYi3EmP6Py6w1MnY
Административный запрос в API базы данных

Конечная точка есть не ограничиваясь встроенными процедурами. Внешние библиотеки, такие как APOC, graph-algorithms или neo4j-spatial, открываются автоматически.

Преимущества

В моей книге наибольшим преимуществом является то самодокументирующий характер API GraphQL на основе предоставленной строгой схемы.

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

С четкое разделение в запросах чтения и мутациях записи легко рассуждать о влиянии на вызов.

И конечно же удивительное автозаполнение со встроенной справкой а автоматически доступная документация в GraphiQL и GraphQL-Playground оказывают взаимодействие с таким API в удовольствие. ?

Параметрирование все входящие данные и ограничение размеров результатов – это просто вишен на ?.

Еще одно преимущество в том, что вы можете комбинировать несколько запросов в один звонок. Вся релевантная информация для полноэкранного режима получается в одном запросе.

Конечно, вы можете использовать все доступные инструменты GraphQL в качестве промежуточного программного обеспечения или библиотеки для быстрого создания внешних программ (apollo-tools, React, semantic-ui, victory и т.п.). Это позволяет быстро интегрировать эти API в ваши сценарии мониторинга/администрирования или информационные панели.

Детали внедрения

Как и обычная конечная точка GraphQL в neo4j-graphql, это расширение сервера, обслуживающего конечные точки GET, POST и OPTIONS. Они принимают запросы, переменные и названия операций выполнить внутри одной транзакции. После выполнения, в результаты или ошибки возвращаются клиенту в виде JSON.

Необходимая схема graphql построена из доступных определенных пользователем процедур, развернутых в Neo4j.

Вы должны четко разрешить открыть процедуры через настройки конфигурации graphql.admin.procedures.(read/write) с синтаксисом процедуры Neo4j или именами полей конечной точки администратора. Например, вы можете установить его на:

graphql.admin.procedures.read=db.*,dbms.components,dbms.queryJ*graphql.admin.procedures.write=db.create*,dbIndexExplicitFor*

Определенные пользователем процедуры

В 2016 году Neo4j 3.0 получил новую точку расширения. Вы можете предоставить аннотированные методы Java как определенные пользователем процедуры, которые затем можно было вызвать как отдельно, так и часть запросов в базу данных. Поскольку наш (на основе React) Neo4j-браузер перешел от HTTP к бинарному транспорту, начальные REST-API управления были дополнены процедурами, обеспечивающими ту же функциональность.

Каждая процедура может занять параметры и возвращает a поток данных со столбцами с индивидуальными названиями, подобными результатам обычных запросов. Как входы, так и выходы могут использовать типы данных из системы типов Cypher.

call dbms.listConfig('dbms.connector.http')   yield name, value, description;
╒══════════════════════════════╤═══════╤════════════════════════╕│"name"                        │"value"│"description"           │╞══════════════════════════════╪═══════╪════════════════════════╡│"dbms.connector.http.enabled" │"true" │"Enable this connector."│├──────────────────────────────┼───────┼────────────────────────┤│"dbms.connector.https.enabled"│"true" │"Enable this connector."│└──────────────────────────────┴───────┴────────────────────────┘

С тех пор большое количество функциональных возможностей было перемещено в процедуры и функции, что дало нам широкий выбор вещей для раскрытия через GraphQL.

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

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

Я сопоставил основные скалярные типы и списки с типами GraphQL.

Только для Map (dict/object) нужно ли сопоставить тип a List<Attribute> где каждый атрибут

type Attribute {   name: String!   value: String   type: String!  = "String"}

который удивительно хорошо работал как для входов, так и выходов.

TPHbVofDoxIaYzVCak4nnwQQXBKAvM1QNCYT
Использование списка атрибутов для карт/словарей как входных, так и исходных данных

Подобным образом я создал специальные типы для Node, Relationship и Path.

Для этих четырех пользовательских типов я добавил соответствующий код (де)сериализации. Остальные неизвестные типы были переведены в строки.

The резольвер только для каждого поля выполняет завернутую процедуру с входными аргументами из среды. Затем результаты отображаются в поля типа исходных данных (по желанию трансформируются) и возвращаются к конечной точке.

На основе их метаданных я объединил поля в типы объектов для запросов и мутаций соответственно.

NttyWbz1Rr8ra6ioksZrF0viNzxHW79yNFzF
Выполнение переменных операций администратора с переменными

И это было в основном.

Я сам был удивлен, когда запустил GraphiQL после развертывания расширения, которое я мог интуитивно вызвать любой из запросов и мутаций без ошибок.

Проблемы

Мой самый большой вызов – это отсутствие пространств имен в GraphQL. Хотя вы можете хорошо структурировать запросы с помощью вложенных типов, то же недоступно для мутаций.

Я решил, чтобы имена API были последовательными для обоих не подструктурировать запросы и подобные мутации, а вместе объединили части пространства имен и процедуры с прописной буквы вместе.

Поэтому db.labels превращается в dbLabels .

Еще одной небольшой проблемой было отсутствие информации об операциях чтения и записи в файле DBMS и SCHEMA объемы процедур Neo4j Поэтому мне пришлось использовать a белый список для определения «лишь для чтения», чего, конечно, недостаточно.

Знатные особы

То, что не встроено в другие технологии API, и это действительно круто, это возможность выбирать любое количество запросов или мутаций, которые вы хотите запустить в единственный запрос.

Если необходимо, вы можете создать псевдоним для нескольких вызовов одного запроса с различными параметрами (подумайте о статистике для каждой базы данных).

rIlWmkfgvMhEKShmGFmZV2YWLfKQB8ergdzS
Выполняйте несколько операций API в одном запросе.

И вы даже можете запускать алгоритмы графиков или операторы шифрования как часть этого API, что очень круто.

tgV-N2b8UdF9HlO6uZ1fQs8YJPuwjj5PRP0D
Выполните запрос Cypher.
WDPAzuzfGnmmu5urddjgVHwa56UINx1-pPfQ
Запустите функцию «граф-алгоритм».

Следующие шаги

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

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

Я хотел бы? пучок ммониторинг и управление мобильными, веб-приложениями и клиентами командной строки строить этаж tего API управления.

Я рад увидеть, где мы можем улучшить удобство использования и какие отзывы и запросы мы получаем. Конечно, первой целью было бы графическое приложение для Neo4j Desktop. Так что если вас интересует что-то из этого, пожалуйста, свяжитесь и поговорим.

Счастливого взлома! – Майкл

Если у вас возникнут проблемы, пожалуйста, добавьте комментарий или устраните проблему на GitHub.

Добавить комментарий

Ваш адрес email не будет опубликован.