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

Ruby Meditation
Ruby MeditationRuby Meditation
Сказка про query languages
(с оскорблениями в адрес GraphQL)
18+
Ты кто?
Виктор Шепелев, aka @zverok
● Рубист с 2003-го (кажется)
● BrandSpotter→Toptal→Verbit.ai
● SciRuby
● mkdev.me
zverok.github.io
A tale of query languages. Is GraphQL the chosen one? - Victor Shepelev
A tale of query languages. Is GraphQL the chosen one? - Victor Shepelev
Основной сайт
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: А чо, есть чо?
A tale of query languages. Is GraphQL the chosen one? - Victor Shepelev
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
1 of 30

More Related Content

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

Russir 2010 finalRussir 2010 final
Russir 2010 final
yaevents474 views
JSON-RPCJSON-RPC
JSON-RPC
Alexandr Katsko775 views
Telerik Web aiiTelerik Web aii
Telerik Web aii
automated-testing.info1.1K views
Ajax and Transports (in russian)Ajax and Transports (in russian)
Ajax and Transports (in russian)
Mikhail Davydov570 views

More from Ruby Meditation(20)

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
  • 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: А чо, есть чо?
  • 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