Гремлин (язык запросов) - Gremlin (query language)

Гремлин
Gremlin (язык программирования) .png
РазработаноМарко А. Родригес
РазработчикApache TinkerПоп из Фонд программного обеспечения Apache
Впервые появился2009; 11 лет назад (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, другой язык запросов к данным графика

Рекомендации

  1. ^ «Гремлин 3.3.3». Получено 8 мая, 2018.
  2. ^ Родригес, Марко А. (2015). «Машина и язык обхода графа Гремлина (приглашенный доклад)». Машина и язык обхода графа Гремлина. С. 1–10. arXiv:1508.03843. Дои:10.1145/2815072.2815073. ISBN  9781450339025.
  3. ^ «Преимущества машины обхода графа Гремлин». 2015-09-14. Получено 17 сентября, 2015.
  4. ^ "Язык обхода графа Гремлина". 2015-08-19. Получено 22 августа, 2015.

внешняя ссылка

  1. Домашняя страница Apache TinkerPop
  2. sql2gremlin.com (TinkerPop2)
  3. Родригес, М.А. "Машина и язык обхода графа Гремлина, "Труды конференции языков программирования баз данных ACM, октябрь 2015 г."