Гремлин (язык запросов) - Gremlin (query language)
Разработано | Марко А. Родригес |
---|---|
Разработчик | Apache TinkerПоп из Фонд программного обеспечения Apache |
Впервые появился | 2009 |
Стабильный выпуск | Гремлин 3.3.3[1] |
Операционные системы | Кроссплатформенность (мультиплатформенность) |
Лицензия | Лицензия Apache 2.0 |
Интернет сайт | Официальный сайт |
Диалекты | |
Gremlin-Java8, Gremlin-Groovy, Gremlin-Python, Gremlin-Scala, Gremlin-Clojure, Gremlin-PHP, Gremlin-JavaScript, Gremlin-Typeset | |
Под влиянием | |
Регулярное выражение, XPath, Пульсация, SPARQL, SQL, Ява /JVM |
Гремлин это обход графа язык и виртуальная машина разработан Apache TinkerPop из Фонд программного обеспечения Apache. Гремлин работает на обоих OLTP на основе графовых баз данных, а также OLAP графические процессоры на базе. Гремлина автоматы и функциональный язык фундамент позволяет Гремлин естественным образом поддерживать императив и декларативный запросы, агностицизм основного языка, определяемый пользователем специфичные для домена языки, расширяемый компилятор / оптимизатор, модели выполнения на одной и нескольких машинах, гибридная оценка в глубину и в ширину, а также Полнота по Тьюрингу.[2]
В качестве пояснительной аналогии Apache TinkerPop и Gremlin должны графовые базы данных что за JDBC и SQL должны реляционные базы данных. Точно так же машина обхода Гремлина должна вычислять графы как то, что Виртуальная машина Java для вычислений общего назначения.[3]
История
- 2009-10-30 рождается проект, сразу получивший название "TinkerPop"
- 2009-12-25 v0.1 - первый релиз
- 2011-05-21 Выпущена версия 1.0
- 2012-05-24 Выпущена версия 2.0
- 2015-01-16 TinkerPop становится проектом Apache Incubator
- 2015-07-09 выпущена v3.0.0-incubating
- 2016-05-23 Apache TinkerPop становится проектом верхнего уровня
- 2016-07-18 v3.1.3 и v3.2.1 - первые выпуски Apache TinkerPop
- 2017-12-17 выпущена v3.3.1
- 2018-05-08 Выпущена версия 3.3.3
- 2019-08-05 Выпущена v3.4.3
- 2020-02-20 Выпущена v3.4.6
Интеграция с поставщиком
Гремлин - это Под лицензией Apache2 язык обхода графов, который могут использовать поставщики графовых систем. Обычно существует два типа поставщиков графовых систем: OLTP графовые базы данных и графические процессоры OLAP. В таблице ниже указаны поставщики графов, которые поддерживают Gremlin.
Продавец | Система графиков |
---|---|
Neo4j | база данных графов |
OrientDB | база данных графов |
DataStax Предприятие (5.0+) | база данных графов |
Hadoop (Гираф ) | графический процессор |
Hadoop (Искра ) | графический процессор |
InfiniteGraph | база данных графов |
ЯнусГраф | база данных графов |
Cosmos DB | база данных графов |
Амазонка Нептун | база данных графов |
Примеры обхода
Следующие ниже примеры запросов и ответов Gremlin в среде Gremlin-Groovy относятся к графическому представлению MovieLens набор данных.[4] В набор данных входят пользователи, оценивающие фильмы. У каждого пользователя есть одно занятие, и с каждым фильмом связана одна или несколько категорий. Схема графика MovieLens подробно описана ниже.
Пользователь--оцененный[звезды:0-5]-->фильмПользователь--Занятие-->Занятиефильм--категория-->категория
Простые обходы
Для каждой вершины в графе испустите ее метку, затем сгруппируйте и подсчитайте каждую отдельную метку.
гремлин> грамм.V().метка().groupCount()==>[Занятие:21, фильм:3883, категория:18, Пользователь:6040]
В каком году был снят самый старый фильм?
гремлин> грамм.V().hasLabel('фильм').значения('год').мин()==>1919
Какой средний рейтинг у «Крепкого орешка»?
гремлин> грамм.V().имеет('фильм','имя','Живучи').inE('оценено').значения('звезды').иметь в виду()==>4.121848739495798
Обход проекции
Для каждой категории создайте карту с ее названием и количеством фильмов, которые она представляет.
гремлин> грамм.V().hasLabel('категория').в качестве('а','b'). Выбрать('а','b'). к('имя'). к(inE('категория').считать())==>[а:Анимация, б:105]==>[а:Дети's, б:251]==>[а:Комедия, б:1200]==>[а:Приключение, б:283]==>[а:Фантазия, б:68]==>[а:Романтика, б:471]==>[а:Драма, б:1603]==>[а:Действие, б:503]==>[а:Преступление, б:211]==>[а:Триллер, б:492]==>[а:Ужастик, б:343]==>[а:Наука-Fi, б:276]==>[а:Документальный, б:127]==>[а:Война, б:143]==>[а:Музыкальный, б:114]==>[а:Тайна, б:106]==>[а:Фильм-Нуар, б:44]==>[а:Западный, б:68]
Для каждого фильма с не менее 11 рейтингами отправьте карту с его названием и средней оценкой. Отсортируйте карты в порядке убывания их среднего рейтинга. Выпустите первые 10 карт (т.е. 10 лучших).
гремлин> грамм.V().hasLabel('фильм').в качестве('а','b'). куда(inE('оценено').считать().является(gt(10))). Выбрать('а','b'). к('имя'). к(inE('оценено').значения('звезды').иметь в виду()). порядок().к(Выбрать('b'),декр). предел(10)==>[а:Санджуро, б:4.608695652173913]==>[а:Семь Самурай (В Великолепный Семь), б:4.560509554140127]==>[а:Shawshank Искупление, В, б:4.554557700942973]==>[а:Крестный отец, В, б:4.524966261808367]==>[а:Закрывать Бритье, А, б:4.52054794520548]==>[а:Обычный Подозреваемые, В, б:4.517106001121705]==>[а:Шиндлер's Список, б:4.510416666666667]==>[а:Неправильный Брюки, В, б:4.507936507936508]==>[а:Закат солнца Бул.. (а.k.а. Закат солнца Бульвар), б:4.491489361702127]==>[а:Рейдеры из в Потерял Ковчег, б:4.47772]
Декларативные обходы сопоставления с образцом
Gremlin поддерживает декларативное сопоставление шаблонов графов, аналогичное SPARQL. Например, в следующем запросе ниже используется запрос Гремлина матч()-шаг.
Какие боевики 80-х нравятся программистам за 30? Группа подсчитывает фильмы по их имени и сортирует карту подсчета групп в порядке убывания по значению. Обрежьте карту до 10 лучших и отправьте записи карты.
гремлин> грамм.V(). матч( __.в качестве('а').hasLabel('фильм'), __.в качестве('а').из('категория').имеет('имя','Действие'), __.в качестве('а').имеет('год',между(1980,1990)), __.в качестве('а').inE('оценено').в качестве('b'), __.в качестве('b').имеет('звезды',5), __.в качестве('b').outV().в качестве('c'), __.в качестве('c').из('Занятие').имеет('имя','программист'), __.в качестве('c').имеет('возраст',между(30,40))). Выбрать('а').groupCount().к('имя'). порядок(местный).к(valueDecr). предел(местный,10)==>Рейдеры из в Потерял Ковчег=26==>Звезда Войны Эпизод V - В Империя Забастовки Назад=26==>Терминатор, В=23==>Звезда Войны Эпизод VI - Возвращаться из в Джедаи=22==>Принцесса Невеста, В=19==>Инопланетяне=18==>Лодка, В (Дас Ботинок)=11==>Индиана Джонс и в Последний Крестовый поход=11==>Звезда Трек В Гнев из Хан=10==>Бездна, В=9
Обход OLAP
Какие фильмы занимают центральное место в скрытый 5-звездочный график?
гремлин> грамм = график.обход(компьютер(ИскраГрафКомпьютер))==>graphtraversalsource[хадоупграф[gryoinputformat->формат gryooutput], искрографкомпьютер]гремлин> грамм.V().повторение(outE('оценено').имеет('звезды', 5).inV(). groupCount('м').к('имя'). inE('оценено').имеет('звезды', 5).outV()). раз(4).колпачок('м')==>Звезда Войны Эпизод IV - А Новый Надеяться 35405394353105332==>Американец Красота 31943228282020585==>Рейдеры из в Потерял Ковчег 31224779793238499==>Звезда Войны Эпизод V - В Империя Забастовки Назад 30434677119726223==>Крестный отец, В 30258518523013057==>Shawshank Искупление, В 28297717387901031==>Шиндлер's Список 27539336654199309==>Тишина из в Ягнята, В 26736276376806173==>Фарго 26531050311325270==>Матрица, В 26395118239203191
Машина обхода графа Гремлина
Гремлин - это виртуальная машина состоит из Набор инструкций а также механизм исполнения. Проводится аналогия между Гремлином и Ява.
Экосистема Java | Экосистема Гремлин |
---|---|
Язык программирования Apache Groovy | Гремлин-Groovy |
Язык программирования Scala | Гремлин-Скала |
Язык программирования Clojure | Гремлин-Clojure |
... | ... |
Язык программирования Java | Гремлин-Java8 |
Набор инструкций Java | Библиотека шагов Gremlin |
Виртуальная машина Java | Гремлин обходной станок |
Шаги гремлина (набор инструкций)
Следующий обход - это обход Gremlin в диалекте Gremlin-Java8.
грамм.V().в качестве("а").из("знает").в качестве("б"). Выбрать("а","б"). к("имя"). к("возраст")
Гремлинский язык (т.е. свободный стиль выражения обхода графа) могут быть представлены на любом основном языке, который поддерживает функциональная композиция и вложение функций. Из-за этого простого требования существуют различные диалекты Gremlin, включая Gremlin-Groovy, Gremlin-Scala, Gremlin-Clojure и т. Д. Приведенный выше обход Gremlin-Java8 в конечном итоге компилируется до последовательности шагов, называемой обход. Строковое представление обхода выше представлено ниже.
[GraphStep([],вершина)@[а], VertexStep(ИЗ,[знает],вершина)@[б], SelectStep([а, б],[ценить(имя), ценить(возраст)])]
В шаги являются примитивами машины обхода графа Гремлина. Это параметризованные инструкции, которые в конечном итоге выполняет машина. Гремлин Набор инструкций составляет примерно 30 шагов. Этих шагов достаточно для обеспечения вычислений общего назначения и того, что обычно требуется для выражения общих мотивов любого запроса обхода графа.
Учитывая, что Gremlin - это язык, набор инструкций и виртуальная машина, можно разработать другой язык обхода, который компилируется в машину обхода Gremlin (аналогично тому, как Scala компилируется в JVM ). Например, популярный SPARQL язык сопоставления с образцом графа может быть скомпилирован для выполнения на машине Gremlin. Следующий запрос SPARQL
ВЫБРАТЬ ? а ? б ? cКУДА { ? а а Человек . ? а бывший:знает ? б . ? а бывший:созданный ? c . ? б бывший:созданный ? c . ? б бывший:возраст ? d . ФИЛЬТР(? d < 30)}
компилируется в
[GraphStep([],вершина), MatchStep(И,[[MatchStartStep(а), LabelStep, IsStep(экв(Человек)), MatchEndStep], [MatchStartStep(а), VertexStep(ИЗ,[знает],вершина), MatchEndStep(б)], [MatchStartStep(а), VertexStep(ИЗ,[созданный],вершина), MatchEndStep(c)], [MatchStartStep(б), VertexStep(ИЗ,[созданный],вершина), MatchEndStep(c)], [MatchStartStep(б), PropertiesStep([возраст],ценить), MatchEndStep(d)], [MatchStartStep(d), IsStep(gt(30)), MatchEndStep]]), SelectStep([а, б, c])].
В Gremlin-Java8 запрос SPARQL выше будет представлен, как показано ниже, и скомпилирован в идентичную последовательность шагов Gremlin (то есть обход).
грамм.V().матч( в качестве("а").метка().является("человек"), в качестве("а").из("знает").в качестве("б"), в качестве("а").из("созданный").в качестве("c"), в качестве("б").из("созданный").в качестве("c"), в качестве("б").значения("возраст").в качестве("d"), в качестве("d").является(gt(30))). Выбрать("а","б","c")
Gremlin Machine (виртуальная машина)
Машина обхода графа Gremlin может выполняться на одной машине или в многомашинном вычислительном кластере. Агностицизм казни позволяет Гремлину перебить оба графовые базы данных (OLTP) и графические процессоры (OLAP).
Смотрите также
- Cypher Query Language, другой язык запросов к данным графика
- SPARQL, другой язык запросов к данным графика
Рекомендации
- ^ «Гремлин 3.3.3». Получено 8 мая, 2018.
- ^ Родригес, Марко А. (2015). «Машина и язык обхода графа Гремлина (приглашенный доклад)». Машина и язык обхода графа Гремлина. С. 1–10. arXiv:1508.03843. Дои:10.1145/2815072.2815073. ISBN 9781450339025.
- ^ «Преимущества машины обхода графа Гремлин». 2015-09-14. Получено 17 сентября, 2015.
- ^ "Язык обхода графа Гремлина". 2015-08-19. Получено 22 августа, 2015.
внешняя ссылка
- Домашняя страница Apache TinkerPop
- sql2gremlin.com (TinkerPop2)
- Родригес, М.А. "Машина и язык обхода графа Гремлина, "Труды конференции языков программирования баз данных ACM, октябрь 2015 г."