SlideShare a Scribd company logo
1 of 30
Download to read offline
Сказка про query languages
(с оскорблениями в адрес GraphQL)
18+
Ты кто?
Виктор Шепелев, aka @zverok
● Рубист с 2003-го (кажется)
● BrandSpotter→Toptal→Verbit.ai
● SciRuby
● mkdev.me
zverok.github.io
Основной сайт
API
Мобильное приложение
Партнёрка
Телеграм-бот
Аналитика
Глава 1: все пишут на Java и любят SOAP« »
SOAP (он же XML-RPC)
● XML
● ориентирован на глаголы (Remote Procedure Calls)
● жёсткая схема
<?xml version="1.0"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Body>
<racoon:GetRacoonList xmlns:racoon="https://racoons.xxx/schema">
<racoon:Country>Ukraine</racoon:Country>
<racoon:Age>2</racoon:Age>
</racoon:GetRacoonList>
</soap:Body>
</soap:Envelope>
<?xml version="1.0"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Body>
<racoon:GetRacoonListResponse xmlns:racoon="https://racoons.xxx/schema">
<racoon:Racoon><racoon:Name>Satan</racoon:Racoon>....</racoon:Racoon>
......
</racoon:GetRacoonListResponse>
</soap:Body>
</soap:Envelope>
Запрос
Ответ
SOAP
Достоинства:
● легко отображается на
серверные примитивы (если
сервер на Java)
● схема — часть стандарта
Недостатки:
● Ориентирован на глаголы
● Жёсткий и хрупкий
● XML, Карл!
● тяжело экспериментировать
Глава 2: все пишут на Ruby, REST рулит
PHP, конечно
REST
● Стиль, а не протокол
● Ориентирован на существительные (ресурсы), адресуемые URL
● Использование HTTP verbs
● Stateless
Реальность
● URL в стиле /resources/<id>
● JSON-ответы (может быть)
GET /racoons.json?sex=female&fertile=true&country=Ukraine,Poland
{
"meta": {"count": 1000, "page": 0, "next": 1}
"response": [
{"name": "Pumpkin", "age": 2.3, "fertile": true, "city": "Odesa"}
...
]
}
Ну или (если не повезло)
GET /get_racoons.php?filtername[1]=sex&filtervalue[1]=female&...
Или...
GET /rcnapi/<yourapikey>/for/breeding/sex/female/p1000/perform
(и спасибо, что не SOAP)
REST
Достоинства:
● понятие «ресурса»
● легко экспериментировать в
браузере и в коде
● естественное использование
идиом HTTP
Недостатки:
● стиль, а не стандарт
● не самоописующий
● дорогостоящая выборка
дерева ресурсов
Глава 3: входит GraphQL, все счастливы
на самом деле нет
GraphQL
морская?
свинка?
graph?
query language?
GraphQL
● Предложен Facebook-ом в 2012-м
● Позволяет запросить сразу дерево ресурсов и указать необходимые
поля
● Машиночитаемая схема является частью стандарта
● JSON-подобное тело запроса «в той же форме, в которой нужен
ответ»
query {
racoons(limit: 100, filter: {AND: {sex: "female", fertility: true}}) {
name
city
age
children(age_gte: 3) {
name
color
deceases {
name
date
cured
}
}
}
}
GraphQL
Достоинства:
● машиночитаемая схема
● структурированный ответ
● понятие query language
Недостатки:
● жёсткий
● требует априорного знания
схемы
● неудобный для
экспериментирования и
discovery
● игнорирует HTTP-идиомы
(Facebook!)
● этот слайд слишком короткий
Slightly
JSON-alike
Request
Format for
Optimized
Querying of
Internal
Hierarchical
Data
Чего мы хотим?
● URL для каждого ресурса
● Гибкие выборки по множеству ресурсов в бесконечном графе
разнородных объектов
● Запросы, которые удобно писать и читать (человеку и машине)
● Структурированные ответы
● Discoverability общей схемы и отдельных ресурсов
Глава 4: А чо, есть чо?
REST is not dead!
● OpenAPI (бывший Swagger)
● HATEOS
● Facebook Graph API (≠ GraphQL!)
graph.facebook.com/12345/?fields=comments{comments,from,id}
SQL
SELECT r.name, r.gender, c.name, c.color, d.name, d.date
FROM racoons r
JOIN racoons c ON c.parent_id = r.id
LEFT JOIN deceases d ON d.racoon_id = c.id
WHERE r.sex = "female" AND r.fertility = true
LIMIT 100
ElasticSearch Query DSL
{
"query: {
"bool": {
"must": [
{"match": {"sex": "female"}},
{"match": {"fertility": true}},
{"nested":
{
"path": "place",
"must": [
{"match": {"country": "Ukraine"}}
]
}
.....
OverpassQL (OpenStreetMap)
( node[amenity=police]; way[amenity=police]; rel[amenity=police] )->.polices;
( node[amenity=bank]; way[amenity=bank]; rel[amenity=bank]; )->.banks;
(
node.banks(around.polices:3000); way.banks(around.polices:3000);
rel.banks(around.polices:3000);
)->.banksNearPolices;
(.banks; - .banksNearPolices;);
out geom meta;
При чём здесь Semantic Web?
RDF (Resource Description Framework):
● Ресурсы определяется URL-ом
● Ресурс описывается предикатами (id, предикат, значение)
● Значение может быть базовых типов или ссылкой на другой ресурс
● Глобальные схемы и пространства имён
● SPARQL: язык запросов
PREFIX racoons: <https://racoons.xxx/schema>
PREFIX schema: <http://schema.org>
SELECT ?name ?age ?childName ?childDecease
WHERE {
?racoon a racoons:Racoon ;
schema:name ?name ;
schema:age ?age ;
schema:child ?child .
?child schema:name ?childName ;
racoons:decease ?childDecease .
}
SELECT → CONSTRUCT
Позволяет определить структуру графа из элементов ответа
Выводы?
Выводы!
● Правильный query language — в будущем
● GraphQL — для очень специальных случаев
● Хорошо отдизайненый REST почти непобедим
● В идеях Semantic Web что-то есть
● Еноты рулят
Виктор Шепелев aka @zverok
zverok.github.io

More Related Content

Similar to A tale of query languages. Is GraphQL the chosen one? - Victor Shepelev

Серверный JavaScript: NodeJS и CouchDB
Серверный JavaScript: NodeJS и CouchDBСерверный JavaScript: NodeJS и CouchDB
Серверный JavaScript: NodeJS и CouchDBStepan Stolyarov
 
Ihor Bliumental – Is There Life Outside OWASP Top-10
Ihor Bliumental – Is There Life Outside OWASP Top-10Ihor Bliumental – Is There Life Outside OWASP Top-10
Ihor Bliumental – Is There Life Outside OWASP Top-10OWASP Kyiv
 
анализ кода: от проверки стиля до автоматического тестирования
анализ кода: от проверки стиля до автоматического тестированияанализ кода: от проверки стиля до автоматического тестирования
анализ кода: от проверки стиля до автоматического тестированияRuslan Shevchenko
 
Пост-эксплуатация веб-приложений в тестах на проникновение
Пост-эксплуатация веб-приложений в тестах на проникновениеПост-эксплуатация веб-приложений в тестах на проникновение
Пост-эксплуатация веб-приложений в тестах на проникновениеbeched
 
Russir 2010 final
Russir 2010 finalRussir 2010 final
Russir 2010 finalyaevents
 
Реальный мир и хорошие модели данных.
Реальный мир и хорошие модели данных. Реальный мир и хорошие модели данных.
Реальный мир и хорошие модели данных. Victor Agroskin
 
Антон Полухин, Данные «Портала открытых данных правительства Москвы» в формат...
Антон Полухин, Данные «Портала открытых данных правительства Москвы» в формат...Антон Полухин, Данные «Портала открытых данных правительства Москвы» в формат...
Антон Полухин, Данные «Портала открытых данных правительства Москвы» в формат...Open City Foundation
 
Иван Чалыкин (Россия), Digital Security. Легальный SOP Bypass. Проблемы внедр...
Иван Чалыкин (Россия), Digital Security. Легальный SOP Bypass. Проблемы внедр...Иван Чалыкин (Россия), Digital Security. Легальный SOP Bypass. Проблемы внедр...
Иван Чалыкин (Россия), Digital Security. Легальный SOP Bypass. Проблемы внедр...KazHackStan
 
Производительность параметрического поиска на основе опенсорс-платформы
Производительность параметрического поиска на основе опенсорс-платформыПроизводительность параметрического поиска на основе опенсорс-платформы
Производительность параметрического поиска на основе опенсорс-платформыYandex
 
JSON-RPC или когда rest неудобен
JSON-RPC или когда rest неудобенJSON-RPC или когда rest неудобен
JSON-RPC или когда rest неудобенPyNSK
 
Оставьте Job сайты в покое! Учимся искать и оценивать кандидатов на проф. рес...
Оставьте Job сайты в покое! Учимся искать и оценивать кандидатов на проф. рес...Оставьте Job сайты в покое! Учимся искать и оценивать кандидатов на проф. рес...
Оставьте Job сайты в покое! Учимся искать и оценивать кандидатов на проф. рес...IT-Доминанта
 
«Путь от монолита на PHP к микросервисам на Scala» – Денис Иванов, 2ГИС
«Путь от монолита на PHP к микросервисам на Scala» – Денис Иванов, 2ГИС «Путь от монолита на PHP к микросервисам на Scala» – Денис Иванов, 2ГИС
«Путь от монолита на PHP к микросервисам на Scala» – Денис Иванов, 2ГИС 2ГИС Технологии
 
CodeFest 2012. Нелюбин Д. — Neo4j — графовая база данных
CodeFest 2012. Нелюбин Д. — Neo4j — графовая база данныхCodeFest 2012. Нелюбин Д. — Neo4j — графовая база данных
CodeFest 2012. Нелюбин Д. — Neo4j — графовая база данныхCodeFest
 
Мировые информационные ресурсы. Лекция 5
Мировые информационные ресурсы. Лекция 5Мировые информационные ресурсы. Лекция 5
Мировые информационные ресурсы. Лекция 5Dmitriy Krukov
 
Архитектура кода нового 2ГИС Web API или куда мы дели MVC
Архитектура кода нового 2ГИС Web API или куда мы дели MVCАрхитектура кода нового 2ГИС Web API или куда мы дели MVC
Архитектура кода нового 2ГИС Web API или куда мы дели MVCDevDay
 
Автоматизация SEO-процессов в продуктовых компаниях - DVOMA.pro 30.08
Автоматизация SEO-процессов в продуктовых компаниях - DVOMA.pro 30.08Автоматизация SEO-процессов в продуктовых компаниях - DVOMA.pro 30.08
Автоматизация SEO-процессов в продуктовых компаниях - DVOMA.pro 30.08Vladislav Morgun
 
Ajax and Transports (in russian)
Ajax and Transports (in russian)Ajax and Transports (in russian)
Ajax and Transports (in russian)Mikhail Davydov
 
Catalyst – MVC framework на Perl (RIT 2008)
Catalyst – MVC framework на Perl  (RIT 2008)Catalyst – MVC framework на Perl  (RIT 2008)
Catalyst – MVC framework на Perl (RIT 2008)Sergey Skvortsov
 

Similar to A tale of query languages. Is GraphQL the chosen one? - Victor Shepelev (20)

Серверный JavaScript: NodeJS и CouchDB
Серверный JavaScript: NodeJS и CouchDBСерверный JavaScript: NodeJS и CouchDB
Серверный JavaScript: NodeJS и CouchDB
 
Ihor Bliumental – Is There Life Outside OWASP Top-10
Ihor Bliumental – Is There Life Outside OWASP Top-10Ihor Bliumental – Is There Life Outside OWASP Top-10
Ihor Bliumental – Is There Life Outside OWASP Top-10
 
анализ кода: от проверки стиля до автоматического тестирования
анализ кода: от проверки стиля до автоматического тестированияанализ кода: от проверки стиля до автоматического тестирования
анализ кода: от проверки стиля до автоматического тестирования
 
Пост-эксплуатация веб-приложений в тестах на проникновение
Пост-эксплуатация веб-приложений в тестах на проникновениеПост-эксплуатация веб-приложений в тестах на проникновение
Пост-эксплуатация веб-приложений в тестах на проникновение
 
Russir 2010 final
Russir 2010 finalRussir 2010 final
Russir 2010 final
 
Реальный мир и хорошие модели данных.
Реальный мир и хорошие модели данных. Реальный мир и хорошие модели данных.
Реальный мир и хорошие модели данных.
 
Антон Полухин, Данные «Портала открытых данных правительства Москвы» в формат...
Антон Полухин, Данные «Портала открытых данных правительства Москвы» в формат...Антон Полухин, Данные «Портала открытых данных правительства Москвы» в формат...
Антон Полухин, Данные «Портала открытых данных правительства Москвы» в формат...
 
Иван Чалыкин (Россия), Digital Security. Легальный SOP Bypass. Проблемы внедр...
Иван Чалыкин (Россия), Digital Security. Легальный SOP Bypass. Проблемы внедр...Иван Чалыкин (Россия), Digital Security. Легальный SOP Bypass. Проблемы внедр...
Иван Чалыкин (Россия), Digital Security. Легальный SOP Bypass. Проблемы внедр...
 
Производительность параметрического поиска на основе опенсорс-платформы
Производительность параметрического поиска на основе опенсорс-платформыПроизводительность параметрического поиска на основе опенсорс-платформы
Производительность параметрического поиска на основе опенсорс-платформы
 
JSON-RPC
JSON-RPCJSON-RPC
JSON-RPC
 
JSON-RPC или когда rest неудобен
JSON-RPC или когда rest неудобенJSON-RPC или когда rest неудобен
JSON-RPC или когда rest неудобен
 
Оставьте Job сайты в покое! Учимся искать и оценивать кандидатов на проф. рес...
Оставьте Job сайты в покое! Учимся искать и оценивать кандидатов на проф. рес...Оставьте Job сайты в покое! Учимся искать и оценивать кандидатов на проф. рес...
Оставьте Job сайты в покое! Учимся искать и оценивать кандидатов на проф. рес...
 
«Путь от монолита на PHP к микросервисам на Scala» – Денис Иванов, 2ГИС
«Путь от монолита на PHP к микросервисам на Scala» – Денис Иванов, 2ГИС «Путь от монолита на PHP к микросервисам на Scala» – Денис Иванов, 2ГИС
«Путь от монолита на PHP к микросервисам на Scala» – Денис Иванов, 2ГИС
 
CodeFest 2012. Нелюбин Д. — Neo4j — графовая база данных
CodeFest 2012. Нелюбин Д. — Neo4j — графовая база данныхCodeFest 2012. Нелюбин Д. — Neo4j — графовая база данных
CodeFest 2012. Нелюбин Д. — Neo4j — графовая база данных
 
Мировые информационные ресурсы. Лекция 5
Мировые информационные ресурсы. Лекция 5Мировые информационные ресурсы. Лекция 5
Мировые информационные ресурсы. Лекция 5
 
Telerik Web aii
Telerik Web aiiTelerik Web aii
Telerik Web aii
 
Архитектура кода нового 2ГИС Web API или куда мы дели MVC
Архитектура кода нового 2ГИС Web API или куда мы дели MVCАрхитектура кода нового 2ГИС Web API или куда мы дели MVC
Архитектура кода нового 2ГИС Web API или куда мы дели MVC
 
Автоматизация SEO-процессов в продуктовых компаниях - DVOMA.pro 30.08
Автоматизация SEO-процессов в продуктовых компаниях - DVOMA.pro 30.08Автоматизация SEO-процессов в продуктовых компаниях - DVOMA.pro 30.08
Автоматизация SEO-процессов в продуктовых компаниях - DVOMA.pro 30.08
 
Ajax and Transports (in russian)
Ajax and Transports (in russian)Ajax and Transports (in russian)
Ajax and Transports (in russian)
 
Catalyst – MVC framework на Perl (RIT 2008)
Catalyst – MVC framework на Perl  (RIT 2008)Catalyst – MVC framework на Perl  (RIT 2008)
Catalyst – MVC framework на Perl (RIT 2008)
 

More from Ruby Meditation

Is this Legacy or Revenant Code? - Sergey Sergyenko | Ruby Meditation 30
Is this Legacy or Revenant Code? - Sergey Sergyenko  | Ruby Meditation 30Is this Legacy or Revenant Code? - Sergey Sergyenko  | Ruby Meditation 30
Is this Legacy or Revenant Code? - Sergey Sergyenko | Ruby Meditation 30Ruby Meditation
 
Life with GraphQL API: good practices and unresolved issues - Roman Dubrovsky...
Life with GraphQL API: good practices and unresolved issues - Roman Dubrovsky...Life with GraphQL API: good practices and unresolved issues - Roman Dubrovsky...
Life with GraphQL API: good practices and unresolved issues - Roman Dubrovsky...Ruby Meditation
 
Where is your license, dude? - Viacheslav Miroshnychenko | Ruby Meditation 29
Where is your license, dude? - Viacheslav Miroshnychenko | Ruby Meditation 29Where is your license, dude? - Viacheslav Miroshnychenko | Ruby Meditation 29
Where is your license, dude? - Viacheslav Miroshnychenko | Ruby Meditation 29Ruby Meditation
 
Dry-validation update. Dry-validation vs Dry-schema 1.0 - Aleksandra Stolyar ...
Dry-validation update. Dry-validation vs Dry-schema 1.0 - Aleksandra Stolyar ...Dry-validation update. Dry-validation vs Dry-schema 1.0 - Aleksandra Stolyar ...
Dry-validation update. Dry-validation vs Dry-schema 1.0 - Aleksandra Stolyar ...Ruby Meditation
 
How to cook Rabbit on Production - Bohdan Parshentsev | Ruby Meditation 28
How to cook Rabbit on Production - Bohdan Parshentsev | Ruby Meditation 28 How to cook Rabbit on Production - Bohdan Parshentsev | Ruby Meditation 28
How to cook Rabbit on Production - Bohdan Parshentsev | Ruby Meditation 28 Ruby Meditation
 
How to cook Rabbit on Production - Serhiy Nazarov | Ruby Meditation 28
How to cook Rabbit on Production - Serhiy Nazarov | Ruby Meditation 28How to cook Rabbit on Production - Serhiy Nazarov | Ruby Meditation 28
How to cook Rabbit on Production - Serhiy Nazarov | Ruby Meditation 28Ruby Meditation
 
Reinventing the wheel - why do it and how to feel good about it - Julik Tarkh...
Reinventing the wheel - why do it and how to feel good about it - Julik Tarkh...Reinventing the wheel - why do it and how to feel good about it - Julik Tarkh...
Reinventing the wheel - why do it and how to feel good about it - Julik Tarkh...Ruby Meditation
 
Performance Optimization 101 for Ruby developers - Nihad Abbasov (ENG) | Ruby...
Performance Optimization 101 for Ruby developers - Nihad Abbasov (ENG) | Ruby...Performance Optimization 101 for Ruby developers - Nihad Abbasov (ENG) | Ruby...
Performance Optimization 101 for Ruby developers - Nihad Abbasov (ENG) | Ruby...Ruby Meditation
 
Use cases for Serverless Technologies - Ruslan Tolstov (RUS) | Ruby Meditatio...
Use cases for Serverless Technologies - Ruslan Tolstov (RUS) | Ruby Meditatio...Use cases for Serverless Technologies - Ruslan Tolstov (RUS) | Ruby Meditatio...
Use cases for Serverless Technologies - Ruslan Tolstov (RUS) | Ruby Meditatio...Ruby Meditation
 
The Trailblazer Ride from the If Jungle into a Civilised Railway Station - Or...
The Trailblazer Ride from the If Jungle into a Civilised Railway Station - Or...The Trailblazer Ride from the If Jungle into a Civilised Railway Station - Or...
The Trailblazer Ride from the If Jungle into a Civilised Railway Station - Or...Ruby Meditation
 
What/How to do with GraphQL? - Valentyn Ostakh (ENG) | Ruby Meditation 27
What/How to do with GraphQL? - Valentyn Ostakh (ENG) | Ruby Meditation 27What/How to do with GraphQL? - Valentyn Ostakh (ENG) | Ruby Meditation 27
What/How to do with GraphQL? - Valentyn Ostakh (ENG) | Ruby Meditation 27Ruby Meditation
 
New features in Rails 6 - Nihad Abbasov (RUS) | Ruby Meditation 26
New features in Rails 6 -  Nihad Abbasov (RUS) | Ruby Meditation 26New features in Rails 6 -  Nihad Abbasov (RUS) | Ruby Meditation 26
New features in Rails 6 - Nihad Abbasov (RUS) | Ruby Meditation 26Ruby Meditation
 
Security Scanning Overview - Tetiana Chupryna (RUS) | Ruby Meditation 26
Security Scanning Overview - Tetiana Chupryna (RUS) | Ruby Meditation 26Security Scanning Overview - Tetiana Chupryna (RUS) | Ruby Meditation 26
Security Scanning Overview - Tetiana Chupryna (RUS) | Ruby Meditation 26Ruby Meditation
 
Teach your application eloquence. Logs, metrics, traces - Dmytro Shapovalov (...
Teach your application eloquence. Logs, metrics, traces - Dmytro Shapovalov (...Teach your application eloquence. Logs, metrics, traces - Dmytro Shapovalov (...
Teach your application eloquence. Logs, metrics, traces - Dmytro Shapovalov (...Ruby Meditation
 
Best practices. Exploring - Ike Kurghinyan (RUS) | Ruby Meditation 26
Best practices. Exploring - Ike Kurghinyan (RUS) | Ruby Meditation 26Best practices. Exploring - Ike Kurghinyan (RUS) | Ruby Meditation 26
Best practices. Exploring - Ike Kurghinyan (RUS) | Ruby Meditation 26Ruby Meditation
 
Road to A/B testing - Alexey Vasiliev (ENG) | Ruby Meditation 25
Road to A/B testing - Alexey Vasiliev (ENG) | Ruby Meditation 25Road to A/B testing - Alexey Vasiliev (ENG) | Ruby Meditation 25
Road to A/B testing - Alexey Vasiliev (ENG) | Ruby Meditation 25Ruby Meditation
 
Concurrency in production. Real life example - Dmytro Herasymuk | Ruby Medita...
Concurrency in production. Real life example - Dmytro Herasymuk | Ruby Medita...Concurrency in production. Real life example - Dmytro Herasymuk | Ruby Medita...
Concurrency in production. Real life example - Dmytro Herasymuk | Ruby Medita...Ruby Meditation
 
Data encryption for Ruby web applications - Dmytro Shapovalov (RUS) | Ruby Me...
Data encryption for Ruby web applications - Dmytro Shapovalov (RUS) | Ruby Me...Data encryption for Ruby web applications - Dmytro Shapovalov (RUS) | Ruby Me...
Data encryption for Ruby web applications - Dmytro Shapovalov (RUS) | Ruby Me...Ruby Meditation
 
Rails App performance at the limit - Bogdan Gusiev
Rails App performance at the limit - Bogdan GusievRails App performance at the limit - Bogdan Gusiev
Rails App performance at the limit - Bogdan GusievRuby Meditation
 
GDPR. Next Y2K in 2018? - Anton Tkachov | Ruby Meditation #23
GDPR. Next Y2K in 2018? - Anton Tkachov | Ruby Meditation #23GDPR. Next Y2K in 2018? - Anton Tkachov | Ruby Meditation #23
GDPR. Next Y2K in 2018? - Anton Tkachov | Ruby Meditation #23Ruby Meditation
 

More from Ruby Meditation (20)

Is this Legacy or Revenant Code? - Sergey Sergyenko | Ruby Meditation 30
Is this Legacy or Revenant Code? - Sergey Sergyenko  | Ruby Meditation 30Is this Legacy or Revenant Code? - Sergey Sergyenko  | Ruby Meditation 30
Is this Legacy or Revenant Code? - Sergey Sergyenko | Ruby Meditation 30
 
Life with GraphQL API: good practices and unresolved issues - Roman Dubrovsky...
Life with GraphQL API: good practices and unresolved issues - Roman Dubrovsky...Life with GraphQL API: good practices and unresolved issues - Roman Dubrovsky...
Life with GraphQL API: good practices and unresolved issues - Roman Dubrovsky...
 
Where is your license, dude? - Viacheslav Miroshnychenko | Ruby Meditation 29
Where is your license, dude? - Viacheslav Miroshnychenko | Ruby Meditation 29Where is your license, dude? - Viacheslav Miroshnychenko | Ruby Meditation 29
Where is your license, dude? - Viacheslav Miroshnychenko | Ruby Meditation 29
 
Dry-validation update. Dry-validation vs Dry-schema 1.0 - Aleksandra Stolyar ...
Dry-validation update. Dry-validation vs Dry-schema 1.0 - Aleksandra Stolyar ...Dry-validation update. Dry-validation vs Dry-schema 1.0 - Aleksandra Stolyar ...
Dry-validation update. Dry-validation vs Dry-schema 1.0 - Aleksandra Stolyar ...
 
How to cook Rabbit on Production - Bohdan Parshentsev | Ruby Meditation 28
How to cook Rabbit on Production - Bohdan Parshentsev | Ruby Meditation 28 How to cook Rabbit on Production - Bohdan Parshentsev | Ruby Meditation 28
How to cook Rabbit on Production - Bohdan Parshentsev | Ruby Meditation 28
 
How to cook Rabbit on Production - Serhiy Nazarov | Ruby Meditation 28
How to cook Rabbit on Production - Serhiy Nazarov | Ruby Meditation 28How to cook Rabbit on Production - Serhiy Nazarov | Ruby Meditation 28
How to cook Rabbit on Production - Serhiy Nazarov | Ruby Meditation 28
 
Reinventing the wheel - why do it and how to feel good about it - Julik Tarkh...
Reinventing the wheel - why do it and how to feel good about it - Julik Tarkh...Reinventing the wheel - why do it and how to feel good about it - Julik Tarkh...
Reinventing the wheel - why do it and how to feel good about it - Julik Tarkh...
 
Performance Optimization 101 for Ruby developers - Nihad Abbasov (ENG) | Ruby...
Performance Optimization 101 for Ruby developers - Nihad Abbasov (ENG) | Ruby...Performance Optimization 101 for Ruby developers - Nihad Abbasov (ENG) | Ruby...
Performance Optimization 101 for Ruby developers - Nihad Abbasov (ENG) | Ruby...
 
Use cases for Serverless Technologies - Ruslan Tolstov (RUS) | Ruby Meditatio...
Use cases for Serverless Technologies - Ruslan Tolstov (RUS) | Ruby Meditatio...Use cases for Serverless Technologies - Ruslan Tolstov (RUS) | Ruby Meditatio...
Use cases for Serverless Technologies - Ruslan Tolstov (RUS) | Ruby Meditatio...
 
The Trailblazer Ride from the If Jungle into a Civilised Railway Station - Or...
The Trailblazer Ride from the If Jungle into a Civilised Railway Station - Or...The Trailblazer Ride from the If Jungle into a Civilised Railway Station - Or...
The Trailblazer Ride from the If Jungle into a Civilised Railway Station - Or...
 
What/How to do with GraphQL? - Valentyn Ostakh (ENG) | Ruby Meditation 27
What/How to do with GraphQL? - Valentyn Ostakh (ENG) | Ruby Meditation 27What/How to do with GraphQL? - Valentyn Ostakh (ENG) | Ruby Meditation 27
What/How to do with GraphQL? - Valentyn Ostakh (ENG) | Ruby Meditation 27
 
New features in Rails 6 - Nihad Abbasov (RUS) | Ruby Meditation 26
New features in Rails 6 -  Nihad Abbasov (RUS) | Ruby Meditation 26New features in Rails 6 -  Nihad Abbasov (RUS) | Ruby Meditation 26
New features in Rails 6 - Nihad Abbasov (RUS) | Ruby Meditation 26
 
Security Scanning Overview - Tetiana Chupryna (RUS) | Ruby Meditation 26
Security Scanning Overview - Tetiana Chupryna (RUS) | Ruby Meditation 26Security Scanning Overview - Tetiana Chupryna (RUS) | Ruby Meditation 26
Security Scanning Overview - Tetiana Chupryna (RUS) | Ruby Meditation 26
 
Teach your application eloquence. Logs, metrics, traces - Dmytro Shapovalov (...
Teach your application eloquence. Logs, metrics, traces - Dmytro Shapovalov (...Teach your application eloquence. Logs, metrics, traces - Dmytro Shapovalov (...
Teach your application eloquence. Logs, metrics, traces - Dmytro Shapovalov (...
 
Best practices. Exploring - Ike Kurghinyan (RUS) | Ruby Meditation 26
Best practices. Exploring - Ike Kurghinyan (RUS) | Ruby Meditation 26Best practices. Exploring - Ike Kurghinyan (RUS) | Ruby Meditation 26
Best practices. Exploring - Ike Kurghinyan (RUS) | Ruby Meditation 26
 
Road to A/B testing - Alexey Vasiliev (ENG) | Ruby Meditation 25
Road to A/B testing - Alexey Vasiliev (ENG) | Ruby Meditation 25Road to A/B testing - Alexey Vasiliev (ENG) | Ruby Meditation 25
Road to A/B testing - Alexey Vasiliev (ENG) | Ruby Meditation 25
 
Concurrency in production. Real life example - Dmytro Herasymuk | Ruby Medita...
Concurrency in production. Real life example - Dmytro Herasymuk | Ruby Medita...Concurrency in production. Real life example - Dmytro Herasymuk | Ruby Medita...
Concurrency in production. Real life example - Dmytro Herasymuk | Ruby Medita...
 
Data encryption for Ruby web applications - Dmytro Shapovalov (RUS) | Ruby Me...
Data encryption for Ruby web applications - Dmytro Shapovalov (RUS) | Ruby Me...Data encryption for Ruby web applications - Dmytro Shapovalov (RUS) | Ruby Me...
Data encryption for Ruby web applications - Dmytro Shapovalov (RUS) | Ruby Me...
 
Rails App performance at the limit - Bogdan Gusiev
Rails App performance at the limit - Bogdan GusievRails App performance at the limit - Bogdan Gusiev
Rails App performance at the limit - Bogdan Gusiev
 
GDPR. Next Y2K in 2018? - Anton Tkachov | Ruby Meditation #23
GDPR. Next Y2K in 2018? - Anton Tkachov | Ruby Meditation #23GDPR. Next Y2K in 2018? - Anton Tkachov | Ruby Meditation #23
GDPR. Next Y2K in 2018? - Anton Tkachov | Ruby Meditation #23
 

A tale of query languages. Is GraphQL the chosen one? - Victor Shepelev

  • 1. Сказка про query languages (с оскорблениями в адрес GraphQL) 18+
  • 2. Ты кто? Виктор Шепелев, aka @zverok ● Рубист с 2003-го (кажется) ● BrandSpotter→Toptal→Verbit.ai ● SciRuby ● mkdev.me zverok.github.io
  • 3.
  • 4.
  • 6. Глава 1: все пишут на Java и любят SOAP« »
  • 7. SOAP (он же XML-RPC) ● XML ● ориентирован на глаголы (Remote Procedure Calls) ● жёсткая схема
  • 8. <?xml version="1.0"?> <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope/" soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding"> <soap:Body> <racoon:GetRacoonList xmlns:racoon="https://racoons.xxx/schema"> <racoon:Country>Ukraine</racoon:Country> <racoon:Age>2</racoon:Age> </racoon:GetRacoonList> </soap:Body> </soap:Envelope> <?xml version="1.0"?> <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope/" soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding"> <soap:Body> <racoon:GetRacoonListResponse xmlns:racoon="https://racoons.xxx/schema"> <racoon:Racoon><racoon:Name>Satan</racoon:Racoon>....</racoon:Racoon> ...... </racoon:GetRacoonListResponse> </soap:Body> </soap:Envelope> Запрос Ответ
  • 9. SOAP Достоинства: ● легко отображается на серверные примитивы (если сервер на Java) ● схема — часть стандарта Недостатки: ● Ориентирован на глаголы ● Жёсткий и хрупкий ● XML, Карл! ● тяжело экспериментировать
  • 10. Глава 2: все пишут на Ruby, REST рулит PHP, конечно
  • 11. REST ● Стиль, а не протокол ● Ориентирован на существительные (ресурсы), адресуемые URL ● Использование HTTP verbs ● Stateless Реальность ● URL в стиле /resources/<id> ● JSON-ответы (может быть)
  • 12. GET /racoons.json?sex=female&fertile=true&country=Ukraine,Poland { "meta": {"count": 1000, "page": 0, "next": 1} "response": [ {"name": "Pumpkin", "age": 2.3, "fertile": true, "city": "Odesa"} ... ] } Ну или (если не повезло) GET /get_racoons.php?filtername[1]=sex&filtervalue[1]=female&... Или... GET /rcnapi/<yourapikey>/for/breeding/sex/female/p1000/perform (и спасибо, что не SOAP)
  • 13. REST Достоинства: ● понятие «ресурса» ● легко экспериментировать в браузере и в коде ● естественное использование идиом HTTP Недостатки: ● стиль, а не стандарт ● не самоописующий ● дорогостоящая выборка дерева ресурсов
  • 14. Глава 3: входит GraphQL, все счастливы на самом деле нет
  • 16. GraphQL ● Предложен Facebook-ом в 2012-м ● Позволяет запросить сразу дерево ресурсов и указать необходимые поля ● Машиночитаемая схема является частью стандарта ● JSON-подобное тело запроса «в той же форме, в которой нужен ответ»
  • 17. query { racoons(limit: 100, filter: {AND: {sex: "female", fertility: true}}) { name city age children(age_gte: 3) { name color deceases { name date cured } } } }
  • 18. GraphQL Достоинства: ● машиночитаемая схема ● структурированный ответ ● понятие query language Недостатки: ● жёсткий ● требует априорного знания схемы ● неудобный для экспериментирования и discovery ● игнорирует HTTP-идиомы (Facebook!) ● этот слайд слишком короткий
  • 20. Чего мы хотим? ● URL для каждого ресурса ● Гибкие выборки по множеству ресурсов в бесконечном графе разнородных объектов ● Запросы, которые удобно писать и читать (человеку и машине) ● Структурированные ответы ● Discoverability общей схемы и отдельных ресурсов
  • 21. Глава 4: А чо, есть чо?
  • 22.
  • 23. REST is not dead! ● OpenAPI (бывший Swagger) ● HATEOS ● Facebook Graph API (≠ GraphQL!) graph.facebook.com/12345/?fields=comments{comments,from,id}
  • 24. SQL SELECT r.name, r.gender, c.name, c.color, d.name, d.date FROM racoons r JOIN racoons c ON c.parent_id = r.id LEFT JOIN deceases d ON d.racoon_id = c.id WHERE r.sex = "female" AND r.fertility = true LIMIT 100
  • 25. ElasticSearch Query DSL { "query: { "bool": { "must": [ {"match": {"sex": "female"}}, {"match": {"fertility": true}}, {"nested": { "path": "place", "must": [ {"match": {"country": "Ukraine"}} ] } .....
  • 26. OverpassQL (OpenStreetMap) ( node[amenity=police]; way[amenity=police]; rel[amenity=police] )->.polices; ( node[amenity=bank]; way[amenity=bank]; rel[amenity=bank]; )->.banks; ( node.banks(around.polices:3000); way.banks(around.polices:3000); rel.banks(around.polices:3000); )->.banksNearPolices; (.banks; - .banksNearPolices;); out geom meta;
  • 27. При чём здесь Semantic Web? RDF (Resource Description Framework): ● Ресурсы определяется URL-ом ● Ресурс описывается предикатами (id, предикат, значение) ● Значение может быть базовых типов или ссылкой на другой ресурс ● Глобальные схемы и пространства имён ● SPARQL: язык запросов
  • 28. PREFIX racoons: <https://racoons.xxx/schema> PREFIX schema: <http://schema.org> SELECT ?name ?age ?childName ?childDecease WHERE { ?racoon a racoons:Racoon ; schema:name ?name ; schema:age ?age ; schema:child ?child . ?child schema:name ?childName ; racoons:decease ?childDecease . } SELECT → CONSTRUCT Позволяет определить структуру графа из элементов ответа
  • 30. Выводы! ● Правильный query language — в будущем ● GraphQL — для очень специальных случаев ● Хорошо отдизайненый REST почти непобедим ● В идеях Semantic Web что-то есть ● Еноты рулят Виктор Шепелев aka @zverok zverok.github.io