Гремлин (язык запросов)
Разработано | Марко А. Родригес |
---|---|
Разработчик | Apache TinkerPop из Apache Software Foundation |
Впервые появился | 2009 год |
Стабильная версия | 3.7.0
/ 31 июля 2023 г [1] |
ТЫ | Кроссплатформенность (мультиплатформенность) |
Лицензия | Лицензия Апач 2.0 |
Веб-сайт | тинкер-поп |
Диалекты | |
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).
См. также
[ редактировать ]- Cypher Query Language , еще один язык запросов к графическим данным.
- SPARQL , еще один язык запросов к графическим данным.
- Обычный запрос пути , теоретический язык запросов к графическим данным.
- Язык запросов графов — предлагаемая стандартизация языка запросов к данным графов.
Ссылки
[ редактировать ]- ^ «Apache TinkerPop — Загрузки» . Проверено 27 октября 2023 г.
- ^ Родригес, Марко А. (2015). «Машина и язык обхода графа Гремлина (приглашенный доклад)». Машина и язык обхода графа Gremlin . стр. 1–10. arXiv : 1508.03843 . дои : 10.1145/2815072.2815073 . ISBN 9781450339025 . S2CID 10533031 .
- ^ «Преимущества машины обхода графа Гремлина» . 14 сентября 2015 г. Проверено 17 сентября 2015 г.
- ^ «Язык обхода графа Гремлин» . 19 августа 2015 г. Проверено 22 августа 2015 г.
Внешние ссылки
[ редактировать ]- Домашняя страница Apache TinkerPop
- sql2gremlin.com (TinkerPop2)
- Родригес, Массачусетс, « Машина и язык обхода графа Гремлин », Материалы конференции ACM по языкам программирования баз данных, октябрь 2015 г.
- Кластерные вычисления
- Программное обеспечение для интеллектуального анализа данных и машинного обучения
- Хадуп
- Фонд программного обеспечения Apache
- Программное обеспечение, использующее лицензию Apache
- Java-платформа
- Бесплатное программное обеспечение, написанное на Scala.
- Декларативные языки программирования
- Языки запросов