WikiDer > Гремлин (язык запросов)

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 г."