Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

47 views

Published on

Ruby Meditation #21
April 14, 2018
Kharkiv

Published in: Technology
  • Be the first to comment

  • Be the first to like this

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

  1. 1. Сказка про query languages (с оскорблениями в адрес GraphQL) 18+
  2. 2. Ты кто? Виктор Шепелев, aka @zverok ● Рубист с 2003-го (кажется) ● BrandSpotter→Toptal→Verbit.ai ● SciRuby ● mkdev.me zverok.github.io
  3. 3. Основной сайт API Мобильное приложение Партнёрка Телеграм-бот Аналитика
  4. 4. Глава 1: все пишут на Java и любят SOAP« »
  5. 5. SOAP (он же XML-RPC) ● XML ● ориентирован на глаголы (Remote Procedure Calls) ● жёсткая схема
  6. 6. <?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> Запрос Ответ
  7. 7. SOAP Достоинства: ● легко отображается на серверные примитивы (если сервер на Java) ● схема — часть стандарта Недостатки: ● Ориентирован на глаголы ● Жёсткий и хрупкий ● XML, Карл! ● тяжело экспериментировать
  8. 8. Глава 2: все пишут на Ruby, REST рулит PHP, конечно
  9. 9. REST ● Стиль, а не протокол ● Ориентирован на существительные (ресурсы), адресуемые URL ● Использование HTTP verbs ● Stateless Реальность ● URL в стиле /resources/<id> ● JSON-ответы (может быть)
  10. 10. 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)
  11. 11. REST Достоинства: ● понятие «ресурса» ● легко экспериментировать в браузере и в коде ● естественное использование идиом HTTP Недостатки: ● стиль, а не стандарт ● не самоописующий ● дорогостоящая выборка дерева ресурсов
  12. 12. Глава 3: входит GraphQL, все счастливы на самом деле нет
  13. 13. GraphQL морская? свинка? graph? query language?
  14. 14. GraphQL ● Предложен Facebook-ом в 2012-м ● Позволяет запросить сразу дерево ресурсов и указать необходимые поля ● Машиночитаемая схема является частью стандарта ● JSON-подобное тело запроса «в той же форме, в которой нужен ответ»
  15. 15. query { racoons(limit: 100, filter: {AND: {sex: "female", fertility: true}}) { name city age children(age_gte: 3) { name color deceases { name date cured } } } }
  16. 16. GraphQL Достоинства: ● машиночитаемая схема ● структурированный ответ ● понятие query language Недостатки: ● жёсткий ● требует априорного знания схемы ● неудобный для экспериментирования и discovery ● игнорирует HTTP-идиомы (Facebook!) ● этот слайд слишком короткий
  17. 17. Slightly JSON-alike Request Format for Optimized Querying of Internal Hierarchical Data
  18. 18. Чего мы хотим? ● URL для каждого ресурса ● Гибкие выборки по множеству ресурсов в бесконечном графе разнородных объектов ● Запросы, которые удобно писать и читать (человеку и машине) ● Структурированные ответы ● Discoverability общей схемы и отдельных ресурсов
  19. 19. Глава 4: А чо, есть чо?
  20. 20. REST is not dead! ● OpenAPI (бывший Swagger) ● HATEOS ● Facebook Graph API (≠ GraphQL!) graph.facebook.com/12345/?fields=comments{comments,from,id}
  21. 21. 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
  22. 22. ElasticSearch Query DSL { "query: { "bool": { "must": [ {"match": {"sex": "female"}}, {"match": {"fertility": true}}, {"nested": { "path": "place", "must": [ {"match": {"country": "Ukraine"}} ] } .....
  23. 23. 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;
  24. 24. При чём здесь Semantic Web? RDF (Resource Description Framework): ● Ресурсы определяется URL-ом ● Ресурс описывается предикатами (id, предикат, значение) ● Значение может быть базовых типов или ссылкой на другой ресурс ● Глобальные схемы и пространства имён ● SPARQL: язык запросов
  25. 25. 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 Позволяет определить структуру графа из элементов ответа
  26. 26. Выводы?
  27. 27. Выводы! ● Правильный query language — в будущем ● GraphQL — для очень специальных случаев ● Хорошо отдизайненый REST почти непобедим ● В идеях Semantic Web что-то есть ● Еноты рулят Виктор Шепелев aka @zverok zverok.github.io

×