![]() | |
Разработано | Марко А. Родригес |
---|---|
Разработчик | Apache TinkerPop из Apache Software Foundation |
Впервые появился | 2009 ( 2009 ) |
Стабильный релиз | 3.7.0 / 31 июля 2023 г. ( 2023-07-31 ) [1] |
ОС | Кроссплатформенность (мультиплатформенность) |
Лицензия | Лицензия 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]
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
Какие фильмы занимают центральное место в неявном графике 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 и 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 может выполняться на одной машине или в многомашинном вычислительном кластере. Независимость от выполнения позволяет Gremlin работать как с графовыми базами данных (OLTP), так и с графовыми процессорами (OLAP).