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

Язык программирования
Гремлин
РазработаноМарко А. Родригес
РазработчикApache TinkerPop из Apache Software Foundation
Впервые появился2009 ; 16 лет назад ( 2009 )
Стабильный релиз
3.7.0 / 31 июля 2023 г. ; 18 месяцев назад [1] ( 2023-07-31 )
ОСКроссплатформенность (мультиплатформенность)
ЛицензияЛицензия Apache 2.0
Веб-сайтtinkerpop.apache.org
Диалекты
Gremlin‑Java8, Gremlin‑Groovy, Gremlin‑Python, Gremlin‑Scala, Gremlin‑Clojure, Gremlin‑PHP, Gremlin‑JavaScript, Gremlin‑Typeset
Под влиянием
Регулярное выражение , XPath , Ripple, SPARQL , SQL , Java / JVM

Gremlin — это язык обхода графов и виртуальная машина , разработанные Apache TinkerPop из Apache Software Foundation . Gremlin работает как с графовыми базами данных на основе OLTP, так и с графовыми процессорами на основе OLAP . Автоматы Gremlin и функциональная языковая основа позволяют Gremlin естественным образом поддерживать: императивные и декларативные запросы; независимость от языка хоста; определяемые пользователем языки, специфичные для предметной области ; расширяемый компилятор/оптимизатор, одно- и многомашинные модели выполнения; гибридную оценку в глубину и ширину с полнотой Тьюринга . [2]

В качестве пояснительной аналогии Apache TinkerPop и Gremlin являются для графовых баз данных тем же, чем JDBC и SQL являются для реляционных баз данных . Аналогично, машина обхода Gremlin является для графовых вычислений тем же, чем виртуальная машина 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 Выпущена версия 3.4.3
  • 2020-02-20 Выпущена версия 3.4.6

Интеграция с поставщиками

Gremlin — это язык обхода графов с лицензией Apache2 , который могут использовать поставщики графовых систем. Обычно существует два типа поставщиков графовых систем: графовые базы данных OLTP и графовые процессоры OLAP. В таблице ниже перечислены поставщики графов, которые поддерживают Gremlin.

ПродавецГрафическая система
Neo4jграфовая база данных
ОриентДБграфовая база данных
DataStax Enterprise (5.0+)графовая база данных
Hadoop ( Жираф )графический процессор
Hadoop ( Spark )графический процессор
InfiniteGraphграфовая база данных
JanusGraphграфовая база данных
Космос БДграфовая база данных
Амазонка Нептунграфовая база данных
ArcadeDBграфовая база данных

Примеры обхода

Следующие примеры запросов и ответов Gremlin в среде Gremlin-Groovy относятся к графическому представлению набора данных MovieLens. [4] Набор данных включает пользователей, оценивающих фильмы. У каждого пользователя есть одно занятие, и с каждым фильмом связана одна или несколько категорий. Схема графа MovieLens подробно описана ниже.

пользователь -- рейтинг [ звезды : 0 - 5 ]--> фильм пользователь -- профессия --> профессия фильм -- категория --> категория

Простые обходы

Для каждой вершины графа выдайте ее метку, затем сгруппируйте и подсчитайте каждую отдельную метку.

gremlin > g . V (). label (). groupCount () ==>[ род занятий: 21 , фильм: 3883 , категория: 18 , пользователь: 6040 ]    

В каком году был снят самый старый фильм?

гремлин > г . V (). hasLabel ( 'фильм' ). значения ( 'год' ). мин () ==> 1919 

Каков средний рейтинг «Крепкого орешка»?

gremlin > g . V (). has ( 'фильм' , 'имя' , 'Крепкий орешек' ). inE ( 'рейтинг' ). значения ( 'звезды' ). среднее () ==> 4.121848739495798 

Проекции обходов

Для каждой категории создайте карту ее названия и количества фильмов, которые она представляет.

gremlin > g . V (). hasLabel ( 'category' ). as ( 'a' , 'b' ). select ( 'a' , 'b' ). by ( 'name' ). по ( inE ( 'category' ) .count ()) == >[ a: Анимация , b: 105 ] ==>[ a: Детская , b : 251 ] ==>[ a: Комедия , b: 1200 ] ==>[ a: Приключения , b: 283 ] ==>[ a: Фэнтези , b: 68 ] ==>[ a: Романтика , b: 471 ] ==>[ a: Драма , b: 1603 ] ==>[ a: Боевик , b: 503 ] ==>[ a: Криминал , b: 211 ] ==>[ a: Триллер , b: 492 ] == >[ a: Ужасы , b: 343 ] ==>[ a: Научная фантастика , b: 276 ] ==>[ a: Документальный фильм , b: 127 ] ==>[ a: Война , b: 143 ] ==>[ a: Мюзикл , b: 114 ] ==>[ a: Детектив , b: 106 ] ==>[ a: Фильм - нуар , b: 44 ] ==>[ a: Вестерн , b: 68 ]                      

Для каждого фильма с рейтингом не менее 11 выдать карту его названия и среднего рейтинга. Отсортировать карты в порядке убывания их среднего рейтинга. Выдать первые 10 карт (т.е. топ-10).

gremlin > g . V (). hasLabel ( 'movie' ). as ( 'a' , 'b' ). where ( inE ( 'rated' ). count (). is ( gt ( 10 ))). select ( 'a' , 'b' ). by ( 'name' ). by ( inE ( 'rated' ). values ​​( 'stars' ). mean ()). order (). by ( select ( 'b' ), decr ). предел ( 10 ) ==>[ a: Сандзюро , b: 4.608695652173913 ] ==>[ a: Семь самураев ( Великолепная семёрка ) , b: 4.560509554140127 ] ==>[ a: Побег из Шоушенка , The , b: 4.554557700942973 ] ==>[ a: Крестный отец , The , b: 4.524966261808367 ] ==>[ a: Близкое бритьё , A , b: 4.52054794520548 ] ==>[ a: Подозрительные лица , The , b: 4.517106001121705 ] ==>[ a: Шиндлер ' Список s , b : 4.510416666666667 ] ==>[ a: Не те брюки , The , b: 4.507936507936508 ] ==>[ a: Бульвар Сансет ( a . k . a . Бульвар Сансет ), b: 4.491489361702127 ] ==>[ a: Индиана Джонс : В поисках утраченного ковчега , b : 4.47772 ]                                       

Декларативные обходы сопоставления с образцом

Gremlin поддерживает декларативное сопоставление графовых шаблонов, похожее на SPARQL . Например, следующий запрос ниже использует Gremlin's match() -step.

Какие боевики 80-х нравятся 30-летним программистам? Группируйте подсчет фильмов по названию и сортируйте карту подсчета групп в порядке убывания значения. Обрежьте карту до первой десятки и выведите записи карты.

гремлин > г . V (). match ( __ . as ( 'a' ). hasLabel ( 'фильм' ), __ . as ( 'a' ). out ( 'категория' ). has ( 'имя' , 'Действие' ), __ . as ( 'a' ). has ( 'год' , между ( 1980 , 1990 )), __ . as ( 'a' ). inE ( 'рейтинг' ). as ( 'b' ), __ . as ( 'b' ). has ( 'звезды' , 5 ), __ . as ( 'b' ). outV (). as ( 'c' ), __ . as ( 'c' ). out ( 'род занятий' ). has ( 'имя' , 'программист' ), __ . as ( 'c' ). has ( 'возраст' , между ( 30 , 40 ))). select ( 'a' ). groupCount ( ). by ( 'name' ). order ( local ) . by ( valueDecr ). limit ( local , 10 ) ==> Индиана Джонс: В поисках утраченного ковчега = 26 == > Звездные войны. Эпизод V - Империя наносит ответный удар = 26 == > Терминатор ,= 23 == > Звездные войны . Эпизод VI - Возвращение джедая = 22 == > Принцесса - невеста , = 19                                    ==> Чужие = 18 == > Лодка ( Das Boot ) = 11 == > Индиана Джонс и последний крестовый поход = 11 == > Звездный путь : Гнев Хана = 10 == > Бездна = 9              

OLAP-обход

Какие фильмы занимают центральное место в неявном графике 5-звездочных рейтингов?

gremlin > g = graph.traversal ( computer ( SparkGraphComputer )) == > graphtraversalsource [ hadoopgraph [ gryoinputformat- > gryooutputformat ], sparkgraphcomputer ] gremlin > g.V (). repeat ( outE ( ' rated' ). has ( 'stars' , 5 ) .inV (). groupCount ( 'm' ). by ( ' name' ). inE ( 'rated' ). has ( 'stars' , 5 ) .outV (). times ( 4 ) . cap ( ' m ' ) ==> Звездные войны. Эпизод IV - Новая надежда 35405394353105332 ==> Красота по - американски 31943228282020585 ==> Индиана Джонс : В поисках утраченного ковчега 31224779793238499 ==> Звездные войны . Эпизод V - Империя наносит ответный удар 30434677119726223 == > Крестный отец 30258518523013057 == > Побег из Шоушенка 28297717387901031 == > Список Шиндлера 27539336654199309 == > Молчание ягнят 26736276376806173 == > Фарго 26531050311325270 == > Матрица 26395118239203191                                            

Машина обхода графа Gremlin

Gremlin — это виртуальная машина , состоящая из набора инструкций и механизма выполнения. Проводится аналогия между Gremlin и Java .

Экосистема JavaЭкосистема Гремлинов
Язык программирования Apache GroovyГремлин-Groovy
Язык программирования ScalaГремлин-Скала
Язык программирования ClojureГремлин-Clojure
......
язык программирования JavaГремлин-Java8
набор инструкций JavaБиблиотека шагов Гремлина
виртуальная машина JavaМашина обхода Гремлина

Шаги Гремлина (набор инструкций)

Следующий обход представляет собой обход Gremlin на диалекте Gremlin-Java8.

g . V (). as ( "a" ). out ( "знает" ). as ( "b" ). select ( "a" , "b" ). by ( "имя" ). by ( "возраст" )   

Язык Gremlin (т. е. свободный стиль выражения обхода графа) может быть представлен на любом языке-хосте, который поддерживает композицию функций и вложение функций . Из-за этого простого требования существуют различные диалекты Gremlin, включая Gremlin-Groovy, Gremlin-Scala, Gremlin-Clojure и т. д. Вышеуказанный обход Gremlin-Java8 в конечном итоге компилируется в последовательность шагов, называемую обходом . Строковое представление обхода выше приведено ниже.

[ GraphStep ( [] , вершина ) @ [ a ] , VertexStep ( OUT , [ знает ] , вершина ) @ [ b ] , SelectStep ( [ a , b ] , [ значение ( имя ), значение ( возраст ) ] ) ]    

Шаги являются примитивами машины обхода графа Gremlin. Это параметризованные инструкции, которые машина в конечном итоге выполняет. Набор инструкций Gremlin состоит примерно из 30 шагов. Этих шагов достаточно для обеспечения вычислений общего назначения и того, что обычно требуется для выражения общих мотивов любого запроса обхода графа.

Учитывая, что Gremlin — это язык, набор инструкций и виртуальная машина, можно разработать другой язык обхода, который компилируется в машину обхода Gremlin (аналогично тому, как Scala компилируется в JVM ). Например, популярный язык сопоставления графов SPARQL может быть скомпилирован для выполнения на машине Gremlin. Следующий запрос SPARQL

ВЫБРАТЬ  ?a  ?b  ?c ГДЕ  {  ?a  a  Человек  .  ?a  ex : знает  ?b  .  ?a  ex : создан  ?c  .  ?b  ex : создан  ?c  .  ?b  ex : возраст  ?  d  .  ФИЛЬТР ( ?d  <  30 ) }

будет скомпилирован в

[ GraphStep ( [ ] , вершина ), MatchStep ( AND , [ [ MatchStartStep ( a ), LabelStep , IsStep ( eq ( Person )), MatchEndStep ] , [ MatchStartStep ( a ), VertexStep ( OUT , [ знает ] , вершина ), MatchEndStep ( b ) ] , [ MatchStartStep ( a ), VertexStep ( OUT , [ создан ] , вершина ), MatchEndStep ( c ) ] , [ MatchStartStep ( b ), VertexStep ( OUT , [ создан ] , вершина ), MatchEndStep ( c ) ] , [ MatchStartStep ( b ), PropertiesStep ( [ возраст ] , значение ), MatchEndStep ( d ) ] , [ MatchStartStep ( d ), IsStep ( gt ( 30 )), MatchEndStep ]] ), SelectStep ( [ a , b , c ] ) ] .                      

В Gremlin-Java8 приведенный выше запрос SPARQL будет представлен, как показано ниже, и скомпилирован в идентичную последовательность шагов Gremlin (т. е. обход).

g . V (). match ( as ( "a" ). label (). is ( "person" ), as ( "a" ). out ( "knows" ). as ( "b" ), as ( "a" ). out ( "created" ). as ( "c" ), as ( "b" ). out ( "created" ). as ( "c" ), as ( "b" ). values ​​( "age" ). as ( "d" ), as ( "d" ). is ( gt ( 30 ))). select ( "a" , "b" , "c" )       

Gremlin Machine (виртуальная машина)

Машина обхода графа Gremlin может выполняться на одной машине или в многомашинном вычислительном кластере. Независимость от выполнения позволяет Gremlin работать как с графовыми базами данных (OLTP), так и с графовыми процессорами (OLAP).

Смотрите также

Ссылки

  1. ^ "Apache TinkerPop - Загрузки" . Получено 27 октября 2023 г. .
  2. ^ Родригес, Марко А. (2015). «Машина и язык обхода графа Gremlin (приглашенный доклад)». Машина и язык обхода графа Gremlin . стр.  1–10 . arXiv : 1508.03843 . doi :10.1145/2815072.2815073. ISBN 9781450339025. S2CID  10533031.
  3. ^ "Преимущества машины обхода графа Gremlin". 2015-09-14 . Получено 17 сентября 2015 г.
  4. ^ "Язык обхода графа Gremlin". 2015-08-19 . Получено 22 августа 2015 г.
  1. Домашняя страница Apache TinkerPop
  2. sql2gremlin.com (TinkerPop2)
  3. Родригес, МА, «Машина и язык обхода графов Gremlin», Труды конференции ACM по языкам программирования баз данных, октябрь 2015 г.
Взято с "https://en.wikipedia.org/w/index.php?title=Gremlin_(query_language)&oldid=1196820746"