ВВЕДЕНИЕ 3
1. ОСНОВНЫЕ ПОДХОДЫ К ИСПОЛЬЗОВАНИЮ GRAPHQL И
ГРАФОВЫХ БАЗ ДАННЫХ 5
1.1 Разновидности API в протоколе HTTP 5
1.2 Спецификация GraphQL API 7
1.3 Графовая база данных Neo4j 8
1.4 Поиск в глубину в графовой базе данных Neo4j 9
1.5 Совместная работа GraphQL API и Neo4j. Аналоги 10
2. РАЗРАБОТКА БИБЛИОТЕКИ NEOMODEL 12
2.1 Проектирование разработки 12
2.2 Расширенные критерии поиска 13
2.3 Выборка объектов по критериям отношений 14
2.4 Пагинация объектов в neomodel-next 15
3. РАЗРАБОТКА БИБЛИОТЕКИ GRAPHENE-NEO4J 17
3.1 Проектирование разработки библиотеки 17
3.2 Автоматическое определение полей для GraphQL-типов 17
3.3 Реализация функций фильтрации, сортировки и пагинации 20
3.4 Система middleware аутентификации 24
3.5 Автоматическая генерация GraphQL-типов 27
4. ИНТЕГРАЦИЯ ФУНКЦИИ РЕКУРСИВНОГО ПОИСКА В
СПЕЦИФИКАЦИЮ GRAPHQL 29
4.1 Синтаксис 29
4.2 Реализация рекурсивного поиска в graphql-core 30
ЗАКЛЮЧЕНИЕ 33
СПИСОК ЛИТЕРАТУРЫ 34
ГЛОССАРИЙ 37
ПРИЛОЖЕНИЕ. ИСХОДНЫЙ КОД NEOMODEL-NEXT 39
В сфере разработки серверной части веб-приложения существует несколько спецификаций обмена данными с клиентской частью приложения в протоколе HTTP [1]:
• REST API [2]
• JSON API [3]
• GraphQL API [4]
Перечисленные стандарты API обеспечивают передачу данных между узлами сети со своим набором правил. Спецификации REST и JSON API - это довольно устоявшиеся форматы, предназначенные для обмена данными, которые имеют ряд своих недостатков. GraphQL API разрабатывался с целью решения этих недостатков.
В спецификации GraphQL решаются проблемы over-fetching^ и under- fetching’a данных. Клиенту предоставляется возможность выборочно получать атрибуты у сущности и её смежные отношения, в отличие от REST и JSON API [5]. В спецификации GraphQL используется древовидная структура построения запроса по отношениям, которая, в свою очередь, отражает схожесть со схемой графовой базы данных, построенной на ER-сущностях проекта.
В настоящий момент, графовые СУБД используются в проектах и активно набирают популярность за счет удобного представления данных в формате графа, имеют возможность масштабирования и обладают высокой производительностью в операциях с графами [6].
Графовые СУБД показывают наибольшую производительность для вычисления задачи поиска в глубину, относительно реляционных баз данных [7].
Актуальность задачи поиска в глубину подчеркивается, например, тем фактом, что среди двух десятков самых популярных веб-сайтов 2018 года алгоритм поиска в глубину используется в 10 из них. Одним из примеров является реализация функционала ответа на комментарий в древовидной структуре в социальных сетях и форумах [8]. Функции алгоритма поиска в глубину можно применить в приложении графической оболочки GraphiQL - как результат получения настроек для пользовательской схемы данных.
Основная проблема заключается в том, что на данный момент не реализована интеграция спецификации GraphQL с графовой СУБД Neo4j, то есть нет реализованных инструментов для работы с графами, поддерживающих, например, указанную выше функцию рекурсивного поиска для объектов из базы данных.
Объект исследования - библиотека graphene-neo4j, позволяющая интегрировать спецификацию GraphQL API в работу с графовой СУБД Neo4j.
Предмет исследования - процесс разработки библиотеки, поддерживающей работу с графовыми базами данных в спецификации GraphQL.
Целью дипломной работы является разработка соответствующей библиотеки для серверного фреймворка Django.
Для достижения поставленной цели необходимо решение следующих задач:
1. исследование предметной области:
о изучение концепций и сервисов предоставления API;
о исследование спецификации GraphQL и существующих библиотек;
о исследование функционала и настроек СУБД Neo4j.
2. анализ и проектирование библиотек;
3. разработка библиотек:
о кастомизация OGM-библиотеки для графовой базы Neo4j;
о разработка библиотеки graphene-neo4j;
о интеграция технологии рекурсивного поиска в библиотеку graphql-core.
4. проведение анализа и тестирование библиотек.
Разработана библиотека graphene-neo4j для серверного фреймворка Django, поддерживающая работу графовой базы данных Neo4j в спецификации GraphQL.
Библиотека предоставляет готовый набор функций для разработки GraphQL API, в которых присутствует:
• автоматическое определение и работа с ER-сущностями;
• функции фильтрации, сортировки и пагинации, настраиваемые со стороны клиента;
• GraphQL-типы для предоставления информации о реберных соединениях из графой базы данных;
• система middleware-аутентификации.
В спецификацию GraphQL интегрирован модуль поиска в глубину, выполняемый через использование директивы @recursive с возможностью указания глубины рекурсии depth. Библиотека graphene-neo4j имеет возможность автоматически генерировать исходный код GraphQL среды для ER- сущностей, что позволяет ускорить разработку серверной части веб-приложения.
Результаты выпускной квалификационной работы имеют практическое применение в сервисах предоставления API, в которых за основу используется графовая база данных Neo4j.
Полученные результаты представлены на XI Международной научной конференции «Электронная Казань 2019» и описаны в публикации «Интеграция спецификации GraphQL с графовыми базами данных в фреймворках вебразработки»
1. Mulloy, B., Web API design - 2014, [Электронный ресурс] / Mulloy B. - Электрон. текст. - Режим доступа: http://bit.ly/2UAhuZ0, свободный - Загл. с экрана.
2. REST API, Руководство по использованию REST API [Электронный ресурс] - Электрон. текст. - Режим доступа: https://api.mail.ru/docs/guides/restapi/, свободный (дата обращения
21.04.2019) .
3. JSON API, A specification for building API in JSON [Электронный ресурс] - Электрон. текст. - Режим доступа: https://jsonapi.org/, свободный (дата обращения 05.06.2019).
4. Byron, L., GraphQL: A data query language, [Электронный ресурс] -
Электрон. текст. - Режим доступа:
https://code.facebook.com/posts/1691455094417024/graphql-a-data-query- language/, свободный (дата обращения: 15.04.2019).
5. Eizinger, T., API Design in Distributed Systems. A Comparison between GraphQL and REST. - 2017, [Электронный ресурс] - Электрон. текст. - Режим доступа: https://eizinger.io/assets/Master-Thesis.pdf, свободный (дата обращения: 15.04.2019).
6. Vicknair C. A., Comparison of a graph database and a relational database: a data provenance perspective [Текст] / C. Vicknair, M. Macias, Z. Zhao, X. Nan, Y. Chen // Proceedings of the 48th Annual Southeast Regional Conference. - ACM, 2010. - Article No. 42.
7. De Marzi, М., Neo4j is faster than MySQL in performing recursive query, [Электронный ресурс] - Электрон. текст. - Режим доступа: https://maxdemarzi.com/2017/02/06/Neo4j-is-faster-than-mysql-in- performing-recursive-query/, свободный (дата обращения: 15.04.2019).
8. List of most popular web sites, [Электронный ресурс] - Режим доступа: https://en.wikipedia.org/wiki/List of most popular websites, свободный (дата обращения: 15.04.2019).
9. Bloch J., How to design a good API and why it matters //Companion to the 21st ACM SIGPLAN symposium on Object-oriented programming systems, languages, and applications. - ACM, 2006. - С. 506-507.
10.Sohan S. M., Anslow C., Maurer F. Spyrest: Automated restful API documentation using an HTTP proxy server (N) //2015 30th IEEE/ACM International Conference on Automated Software Engineering (ASE). - IEEE, 2015. - С. 271-276.
ll.Slate [Электронный ресурс]. - Режим доступа: https://github.com/lord/slate, свободный (дата обращения: 15.04.2019)
12. Apimatic [Электронный ресурс]. - Режим доступа: https://docs.apimatic.io, свободный (дата обращения: 16.04.2019)
13. Бочкарёв П. В., Кононова М. В.: Графовые модели данных
//Редакционная коллегия: Кулаков Петр Алексеевич-к. т. н. - 2016. - С. 133.
14. Neo4j Basics [Электронный ресурс]. - Режим доступа: https://Neo4i.com/product/, свободный (дата обращения: 15.04.2019)
15. Holzschuher F., Peinl R. Performance of graph query languages: comparison of cypher, gremlin and native access in Neo4j //Proceedings of the Joint EDBT/ICDT 2013 Workshops. - ACM, 2013. - С. 195-204.
16. Graph Search Algorithm Basics [Электронный ресурс]. - Режим доступа: https://Neo4i.com/blog/graph-search-algorithm-basics/, свободный (дата обращения: 15.04.2019).
17. Абрамский, М.М., Сравнительный анализ использования реляционных и графовых баз данных в разработке цифровых образовательных систем / М.М. Абрамский, Т.И. Тимерханов // Вестник Новосибирского государственного университета. - 2018. - Т.16. - № 4. - С. 5-12.
18. Martinez, A. A, Comparison between a Relational Database and a Graph
Database in the context of a Personalized Cancer Treatment Application [Электронный ресурс] / A. Martinez, R. Mora, D. Alvarado, G. L'opez, S. Quir'os. - 2016. - Режим доступа: http://ceur-ws.org/Vol-
1644Zpaper37.pdf, свободный (дата обращения: 15.04.2019).
19. Python.org: Официальный сайт языка программирования Python [Электронный ресурс]. - Режим доступа: http://python.org, свободный (дата обращения: 15.04.2019).
20. Neo4j-GraphQL [Электронный ресурс]. - Режим доступа:
https://github.com/neo4i-graphql/neo4i-graphql, свободный (дата обращения 12.03.2019).
21. Graphene-Django [Электронный ресурс]. - https://docs. graphene-
python. org/proi ects/di ango/en/latest/, свободный (дата обращения
13.09.2018) .
22. Django - The web framework for perfectionists with deadlines
[Электронный ресурс]. - Режим доступа:
https: //www.diangoproiect.com/, свободный (дата обращения:
15.04.2019) .
23. Ruhi Velasco E. Web Authorization and authentication for single page applications (SPAs) : дис. - Universitat Politecnica de Catalunya, 2018.
24. Марданов, Т.Р. Интеграция спецификации GraphQL с графовыми базами данных в фреймворках веб-разработки / Марданов Т.Р., Абрамский М.М. // Ученые записки ИСГЗ. - 2019. - Т.17. - С. 604 - 609.