Что такое библиотека Neo4j GraphQL и как ее использовать

Автор Категория ,
Что такое библиотека Neo4j GraphQL и как ее использовать

В этой статье для дата-аналитиков и разработчиков Neo4j, разберем, как реализовать GraphQL-сервер для взаимодействия с этой графовой NoSQL-СУБД. Библиотека Neo4j GraphQL и ее практическое применение для графовой аналитики больших данных в бизнес-приложениях.

Еще раз про GraphQL

О том, что такое GraphQL (GQL) и как это связано с архитектурным стилем REST, мы писали здесь. GraphQL развивает REST-технологию взаимодействия компонентов распределенного приложения с использованием HTTP-протокола. Будучи изначально разработанным Facebook для собственных нужд, в 2015 году язык запросов GraphQL стал публично доступным. Подобно RESTful-API, GQL позволяет клиентским приложениям работать с данными в разных источниках: СУБД, файловое или объектное хранилище и пр., с помощью простых GET и POST-запросов. Однако, в отличие от RESTful API, GraphQL позволяет передавать и получать только те данные, которые нужны для каждого конкретного случая, а не все то, что есть на конечной точке. Это экономит объем сетевого трафика, повышает гибкость приложений, позволяет объединять разные сущности в один запрос и увеличивает скорость разработки на клиенте.

Язык запросов и серверная среда их выполнения для API-интерфейсов GQL реализует все четыре основных функции работы с данными, называемые CRUD-операциями (Create, Read, Update, Delete). Запросы на чтение называются простыми (query), а за изменение данных отвечают мутации (mutation), которые выполняют операции создания (Create), обновления (Update) и удаления (Delete) записей. Мутации реализуются как вызов удаленных процедур (RPC, Remote Procedure Call), который передается с клиента на GraphQL-сервер, т.е. HTTP-сервер с GQL-схемой данных (JSON, AVRO и т.д.). Вспомнив, что такое GQL и чем это полезно, далее рассмотрим, как использовать этот язык запросов совместно с графовой NoSQL-СУБД Neo4j.

Библиотека Neo4j и связь с Cypher

Можно рассматривать GraphQL как архитектуру проектирования API, когда все запросы на операции с данными представляются как связанный граф: сервис создается через определение типов и полей для них с последующим предоставлением функций для каждого поля. Neo4j включает специальную библиотеку, которая позволяет быстро разработать сервер GQL для взаимодействия с этой графовой СУБД. Также эта библиотека автоматически предоставляет функции, необходимые для получения типов и полей, определенных в схеме GQL. При этом имя типа должно быть идентично метке узла в Neo4j. Библиотека Neo4j GraphQL по умолчанию предлагает полную поддержку CRUD-операций.

По сути, библиотека Neo4j GraphQL – это уровень выполнения запросов GQL к Cypher для реализаций Neo4j и JavaScript. Чтобы использовать библиотеку, следует предоставить определения нужных типов для генерации схемы GraphQL с CRUD-преобразователями, которые производят Cypher и поддерживаются экземпляром Neo4j. Получив схему, ее можно передать в любой совместимый инструмент JavaScript GQL, например, Apollo Server, и подготовить функциональный API для клиентов. Это экономит время разработчика на написание повторяющихся преобразователей или бизнес-логики.

GraphQL, обучение Neo4j, курсы Neo4j, графовая аналитика больших данных, анализ данных на графах, аналитика Big Data курсы обучение Neoj4, Школа Больших Данных Учебный центр Коммерсант
Библиотека GraphQL в Neo4j

Наиболее простое отображение типов GQL – это узлы Neo4j, где имя типа GraphQL сопоставляется с меткой узла Neo4j. Отношения как связи между узлами графа представлены путем пометки определенных полей директивой. Эта директива @relationship определяет тип отношений в базе данных, а также направление, в котором они развиваются.

Например, определим тип «Пользователь» (User) со свойством «Имя» (name) и тип «Пост» (Post) со свойствами «Контент» (Content) и «Лайки» (likes), которые показывает, сколько пользователей отметили этот пост. GQL-схема будет выглядеть так:

type User {

    name: String

}

 type Post {

    content: String

    likes: [User] @relationship(type: “LIKES”, direction: IN)

}

Найти посты с числом лайков больше 5, поможет следующий GQLзапрос:

query {

    posts(where: { likesAggregate: { count_GT: 5 } }) {

        content

    }

}

В заключение отметим, что Neo4j предоставляет инструмент, который позволяет с минимальными усилиями генерировать определения типов GraphQL из существующей базы данных. Это предоставляется отдельным npm-пакетом introspector. Обычно это однократная процедура, которую следует рассматривать как отправную точку для схемы GQL. Этот инструмент полностью поддерживает создание определений типов, включая свойства отношения через директиву @relationship и метку узлов @node, чтобы сопоставлять его с символами, которых нет в поддерживаемом GQL наборе, а также additionalLabels для узлов с несколькими метками.  Если свойство элемента имеет смешанные типы на графе, оно будет исключено из сгенерированных определений типов, т.к. GraphQL-сервер выдаст ошибку, найдя данные, не соответствующие указанному типу. При пропуске каких-либо свойств, они будут выведены в журнал отладки.

Сохранив созданные определения типов в файле GraphQL-схемы, например, schema.graphql, этот файл можно использовать на своем сервере.

Узнайте больше подробностей про использование Neo4j для графовой аналитики больших данных в бизнес-приложениях на специализированных курсах в нашем лицензированном учебном центре обучения и повышения квалификации для разработчиков, менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков больших данных в Москве:

Источники

  1. https://neo4j.com/docs/graphql-manual/current/
  2. https://towardsdatascience.com/network-visualizations-with-grandstack-a07deb0a0c3a
  3. https://medium.com/neo4j/securing-your-graph-with-neo4j-graphql-91a2d7b08631