Jump to content

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

Гремлин
Разработано Марко А. Родригес
Разработчик Apache TinkerPop из Apache Software Foundation
Впервые появился 2009 год ; 15 лет назад ( 2009 )
Стабильная версия
3.7.0 / 31 июля 2023 г .; 12 месяцев назад ( 31.07.2023 ) [1]
ТЫ Кроссплатформенность (мультиплатформенность)
Лицензия Лицензия Апач 2.0
Веб-сайт тинкер-поп .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]

  • 30 октября 2009 г. родился проект, сразу получивший название «TinkerPop».
  • 25 декабря 2009 г. v0.1 – первый выпуск.
  • 21 мая 2011 г. выпущена версия 1.0.
  • 24 мая 2012 г. выпущена версия 2.0.
  • 16 января 2015 г. TinkerPop становится проектом инкубатора Apache.
  • 09.07.2015 выпущена версия 3.0.0-инкубация
  • 23 мая 2016 г. Apache TinkerPop становится проектом верхнего уровня.
  • 18 июля 2016 г. v3.1.3 и v3.2.1 — первые выпуски Apache TinkerPop.
  • 17 декабря 2017 г. выпущена версия 3.3.1.
  • 2018-05-08 выпущена версия 3.3.3
  • 2019-08-05 выпущена версия 3.4.3
  • 20 февраля 2020 г. выпущена версия 3.4.6.

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

[ редактировать ]

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

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

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

[ редактировать ]

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

user--rated[stars:0-5]-->movie
user--occupation-->occupation
movie--category-->category

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

[ редактировать ]

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

gremlin> g.V().label().groupCount()
==>[occupation:21, movie:3883, category:18, user:6040]

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

gremlin> g.V().hasLabel('movie').values('year').min()
==>1919

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

gremlin> g.V().has('movie','name','Die Hard').inE('rated').values('stars').mean()
==>4.121848739495798

Обходы проекций

[ редактировать ]

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

gremlin> g.V().hasLabel('category').as('a','b').
           select('a','b').
             by('name').
             by(inE('category').count())
==>[a:Animation, b:105]
==>[a:Children's, b:251]
==>[a:Comedy, b:1200]
==>[a:Adventure, b:283]
==>[a:Fantasy, b:68]
==>[a:Romance, b:471]
==>[a:Drama, b:1603]
==>[a:Action, b:503]
==>[a:Crime, b:211]
==>[a:Thriller, b:492]
==>[a:Horror, b:343]
==>[a:Sci-Fi, b:276]
==>[a:Documentary, b:127]
==>[a:War, b:143]
==>[a:Musical, b:114]
==>[a:Mystery, b:106]
==>[a:Film-Noir, b:44]
==>[a:Western, 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).
           limit(10)
==>[a:Sanjuro, b:4.608695652173913]
==>[a:Seven Samurai (The Magnificent Seven), b:4.560509554140127]
==>[a:Shawshank Redemption, The, b:4.554557700942973]
==>[a:Godfather, The, b:4.524966261808367]
==>[a:Close Shave, A, b:4.52054794520548]
==>[a:Usual Suspects, The, b:4.517106001121705]
==>[a:Schindler's List, b:4.510416666666667]
==>[a:Wrong Trousers, The, b:4.507936507936508]
==>[a:Sunset Blvd. (a.k.a. Sunset Boulevard), b:4.491489361702127]
==>[a:Raiders of the Lost Ark, b:4.47772]

Декларативный обход сопоставления шаблонов

[ редактировать ]

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

Какие боевики 80-х нравятся тридцатилетним программистам? Сгруппируйте фильмы по их названию и отсортируйте карту подсчета групп в порядке убывания по значению. Закрепите карту до 10 лучших и опубликуйте записи карты.

gremlin> g.V().
           match(
             __.as('a').hasLabel('movie'),
             __.as('a').out('category').has('name','Action'),
             __.as('a').has('year',between(1980,1990)),
             __.as('a').inE('rated').as('b'),
             __.as('b').has('stars',5),
             __.as('b').outV().as('c'),
             __.as('c').out('occupation').has('name','programmer'),
             __.as('c').has('age',between(30,40))).
           select('a').groupCount().by('name').
           order(local).by(valueDecr).
           limit(local,10)
==>Raiders of the Lost Ark=26
==>Star Wars Episode V - The Empire Strikes Back=26
==>Terminator, The=23
==>Star Wars Episode VI - Return of the Jedi=22
==>Princess Bride, The=19
==>Aliens=18
==>Boat, The (Das Boot)=11
==>Indiana Jones and the Last Crusade=11
==>Star Trek The Wrath of Khan=10
==>Abyss, The=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')
==>Star Wars Episode IV - A New Hope	  35405394353105332
==>American Beauty	  31943228282020585
==>Raiders of the Lost Ark	31224779793238499
==>Star Wars Episode V - The Empire Strikes Back  30434677119726223
==>Godfather, The	30258518523013057
==>Shawshank Redemption, The	28297717387901031
==>Schindler's List	27539336654199309
==>Silence of the Lambs, The	26736276376806173
==>Fargo	 26531050311325270
==>Matrix, The	 26395118239203191

Машина обхода графа Гремлина

[ редактировать ]

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

Экосистема Java Экосистема Гремлинов
Язык программирования Apache Groovy Гремлин-Груви
язык программирования Скала Гремлин-Скала
Язык программирования Клоюр Гремлин-Кложур
... ...
язык программирования Java Гремлин-Java8
Набор инструкций Java Библиотека шагов Гремлина
виртуальная машина Java Траверсальная машина Гремлин

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

[ редактировать ]

Следующий обход — это обход Gremlin на диалекте Gremlin-Java8.

g.V().as("a").out("knows").as("b").
  select("a","b").
    by("name").
    by("age")

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

[GraphStep([],vertex)@[a], VertexStep(OUT,[knows],vertex)@[b], SelectStep([a, b],[value(name), value(age)])]

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

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

SELECT ?a ?b ?c
WHERE {
  ?a a Person .
  ?a ex:knows ?b .
  ?a ex:created ?c .
  ?b ex:created ?c .
  ?b ex:age ? d .
    FILTER(?d < 30)
}

скомпилировал бы в

[GraphStep([],vertex), MatchStep(AND,[[MatchStartStep(a), LabelStep, IsStep(eq(Person)), MatchEndStep], [MatchStartStep(a), VertexStep(OUT,[knows],vertex), MatchEndStep(b)], [MatchStartStep(a), VertexStep(OUT,[created],vertex), MatchEndStep(c)], [MatchStartStep(b), VertexStep(OUT,[created],vertex), MatchEndStep(c)], [MatchStartStep(b), PropertiesStep([age],value), 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 может выполняться на одной машине или в вычислительном кластере из нескольких машин. Агностицизм выполнения позволяет Gremlin работать как с графовыми базами данных (OLTP), так и с графовыми процессорами (OLAP).

См. также

[ редактировать ]
  1. ^ «Apache TinkerPop — Загрузки» . Проверено 27 октября 2023 г.
  2. ^ Родригес, Марко А. (2015). «Машина и язык обхода графа Гремлина (приглашенный доклад)». Машина и язык обхода графа Gremlin . стр. 1–10. arXiv : 1508.03843 . дои : 10.1145/2815072.2815073 . ISBN  9781450339025 . S2CID   10533031 .
  3. ^ «Преимущества машины обхода графа Гремлина» . 14 сентября 2015 г. Проверено 17 сентября 2015 г.
  4. ^ «Язык обхода графа Гремлин» . 19 августа 2015 г. Проверено 22 августа 2015 г.
[ редактировать ]
  1. Домашняя страница Apache TinkerPop
  2. sql2gremlin.com (TinkerPop2)
  3. Родригес, Массачусетс, « Машина и язык обхода графа Гремлин », Материалы конференции ACM по языкам программирования баз данных, октябрь 2015 г.
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 1debad51821bba2ffe05af8b574eefed__1705584420
URL1:https://arc.ask3.ru/arc/aa/1d/ed/1debad51821bba2ffe05af8b574eefed.html
Заголовок, (Title) документа по адресу, URL1:
Gremlin (query language) - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)