Из Википедии, свободной энциклопедии
  (Перенаправлено с Gremlin (язык программирования) )
Перейти к навигации Перейти к поиску

Gremlin - это язык обхода графов и виртуальная машина, разработанная Apache TinkerPop из Apache Software Foundation . Gremlin работает как с графическими базами данных на основе OLTP, так и с графическими процессорами на основе OLAP . Gremlin в автоматах и функциональный языке фундамент позволяют Gremlin естественно поддерживать императивные и декларативную обработку запросов, хост языка агностицизм, определяемого пользователь языки домена специфической , расширяемый компилятор / оптимизатор, одно- и мульти-машинные модели исполнения, гибридные depth- и в ширину оценки , а также полнота по Тьюрингу. [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 Выпущена v3.4.3
  • 2020-02-20 Выпущена v3.4.6

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

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

Примеры обхода [ править ]

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

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

Простые обходы [ править ]

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

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

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

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

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

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

Обходы проекций [ править ]

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

гремлин >  g . V (). hasLabel ( 'категория' ). как ( 'a' , 'b' ).  выберите ( 'a' , 'b' ).  автор: ( 'имя' ).  по ( INE ( 'категории' .) рассчитывать ()) ==> [ а: Анимация ,  B: 105 ] ==> [ а: Дети ' s ,  б: 251 ] ==> [ а: Комедия,  b: 1200 ] ==> [ a: Приключение ,  b: 283 ] ==> [ a: Фантазия ,  b: 68 ] ==> [ a: Романтика ,  b: 471 ] ==> [ a: Драма ,  b : 1603 ] ==> [ a: Действие ,  b: 503 ] ==> [ a: Преступление ,  b: 211 ] ==> [ a: Триллер ,  b: 492 ] ==> [а: Ужасы ,  б: 343 ] ==> [ а: Sci - Fi ,  б: 276 ] ==> [ а: Документальный ,  б: 127 ] ==> [ а: война ,  б: 143 ] ==> [ a: Мюзикл ,  b: 114 ] ==> [ a: Тайна ,  b: 106 ] ==> [ a: Фильм - Нуар ,  b: 44 ] ==> [ a:Вестерн ,  р: 68 ]

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

гремлин >  g . V (). hasLabel ( 'фильм' ). как ( 'a' , 'b' ).  где ( inE ( 'Rated' ). count (). is ( gt ( 10 ))).  выберите ( 'a' , 'b' ).  автор: ( 'имя' ).  by ( inE ( 'Rated' ). values ( 'stars' ). mean ()). заказ ().по ( выберите ( 'b' ), decr ).  Ограничение ( 10 ) ==> [ A: Sanjuro ,  б: 4,608695652173913 ] ==> [ A: Семь  самураев  ( Великолепные Семь ), б: 4,560509554140127 ] ==> [ A: Shawshank Искупление , , б: 4,554557700942973 ] = => [ a: Крестный отец , The , b: 4.524966261808367        ] ==> [ а: Закрыть  бритье ,  , б: +4,52054794520548 ] ==> [ а: Обычные Подозреваемые , , б: +4,517106001121705 ] ==> [ а: Schindler ' s Список , б: +4,510416666666667 ] ==> [ A: неправильные Брюки , , б: 4,507936507936508 ] ==> [ A: Sunset Blvd . ( . К .           а .  Sunset  Boulevard ),  б: +4,491489361702127 ] ==> [ а: Рейдеры  из  в  утраченного  ковчега ,  б: 4,47772 ]

Обходы декларативного сопоставления с образцом [ править ]

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

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

гремлин >  g . V ().  match (  __ . as ( 'a' ). hasLabel ( 'movie' ),  __ . as ( 'a' ). out ( 'category' ). has ( 'name' , 'Action' ),  __ . as ( ' a ' ). has ( ' год ' , между ( 1980 , 1990 )),  __ . as ('а' ). inE ( «оцененный» ). как ( 'b' ),  __ . как ( 'b' ). has ( 'stars' , 5 ),  __ . как ( 'b' ). outV (). как ( 'c' ),  __ . как ( 'c' ). out ( 'занятие' ). has ( 'имя' , 'программист' ),  __ .как ( 'c'). has ( 'возраст' , от ( 30 , 40 ))).  выберите ( 'а' ). groupCount (). автор: ( 'имя' ).  заказ ( местный ). по ( valueDecr ).  предельные ( местные , 10 ) ==> рейдовиков  из  в  Потери  Ark = 26 ==> Звездные  войны  Эпизод  V  -  The  Empire  Strikes Назад = 26 ==> Terminator ,  = 23 ==> Звездные войны Эпизод VI - Возвращение из в Jedi = 22 ==> Принцесса Брайд , = 19 ==> Чужие = 18 ==> Boat , ( Das загрузки ) = 11 ==> Индиана Джонс и Последний крестовый = 11 ==> Star Trek                     Аурой  из  Khan = 10 ==> Бездны ,  = 9

Обход OLAP [ править ]

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

гремлин >  г  =  граф . traversal ( компьютер ( SparkGraphComputer )) ==> graphtraversalsource [ hadoopgraph [ gryoinputformat -> gryooutputformat ],  sparkgraphcomputer ] gremlin >  g . V (). repeat ( outE ( 'рейтинг' ). has ( 'stars' ,  5 ). inV ().  groupCount ( 'm' ). by ('имя' ).  inE ( «оцененный» ). имеет ( 'звезды' ,  5 ). outV ()).  раз ( 4 ). Колпачок ( 'м' ) ==> Star  Wars  Episode  IV  -  New Hope 35405394353105332 ==> American Beauty 31943228282020585 ==> Налетчики из в Затерянный Ковчег 31224779793238499 ==> Звездные войны Эпизод V -               Империя  наносит ответный удар  Назад  30434677119726223 ==> Godfather ,  The 30258518523013057 ==> Shawshank  Redemption ,  28297717387901031 ==> Schindler ' s Список 27539336654199309 ==> Silence из самых ягнят , 26736276376806173 ==> Fargo 26531050311325270 ==> Матрица , 26395118239203191        

Машина обхода графа Гремлина [ править ]

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

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

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

г . V (). как ( "а" ). out ( "знает" ). как ( "б" ).  выберите ( «а» , «б» ).  by ( "имя" ).  по ( "возраст" )

Язык Гремлина (то есть свободно-стиль экспрессировать обход графа) может быть представлен на любом языке хоста , который поддерживает композиции функций и функцию вложенности . Из-за этого простого требования существуют различные диалекты 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

ВЫБРАТЬ  ?  ? Б  ? С WHERE  {  ?  Лицо . ? a ex : знает ? b . ? a ex : создано ? c . ? b пример : создано ? c . ? b пример : возраст ? d . ФИЛЬТР ( ? D < 30 ) }                      

компилируется в

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

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

г . V (). match (  as ( "a" ). label (). is ( "person" ),  as ( "a" ). out ( "знает" ). as ( "b" ),  as ( "a" ). out ( "created" ). as ( "c" ),  as ( "b" ). out ( "created" ). as ( "c" ), как ( "b"). ценности ( «возраст» ). as ( "d" ),  as ( "d" ). есть ( gt ( 30 ))).  select ( "a" , "b" , "c" )

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

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

См. Также [ править ]

  • Cypher Query Language , еще один язык запросов к данным графиков
  • SPARQL , еще один язык запросов к данным графа

Ссылки [ править ]

  1. ^ "Гремлин 3.3.3" . Проверено 8 мая 2018 года .
  2. ^ Родригес, Марко А. (2015). "Машина обхода графа Гремлина и язык (приглашенный доклад)". Машина и язык обхода графа Гремлина . С. 1–10. arXiv : 1508.03843 . DOI : 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 г.