Gremlin es un lenguaje transversal de gráficos y una máquina virtual desarrollada por Apache TinkerPop de Apache Software Foundation . Gremlin funciona tanto para bases de datos de gráficos basadas en OLTP como para procesadores de gráficos basados en OLAP . La base de autómatas y lenguaje funcional de Gremlin le permite a Gremlin admitir de forma natural consultas imperativas y declarativas , agnosticismo del lenguaje host, lenguajes específicos de dominio definidos por el usuario , un compilador / optimizador extensible, modelos de ejecución de una y varias máquinas, evaluación híbrida en profundidad y amplitud , así como Turing Completeness. [2]
Diseñada por | Marko A. Rodríguez |
---|---|
Desarrollador | Apache TinkerPop de Apache Software Foundation |
Apareció por primera vez | 2009 |
Lanzamiento estable | Gremlin 3.4.10 [1] |
SO | Multiplataforma (multiplataforma) |
Licencia | Licencia Apache 2.0 |
Sitio web | Sitio oficial |
Dialectos | |
Gremlin ‑ Java8, Gremlin ‑ Groovy, Gremlin ‑ Python, Gremlin ‑ Scala, Gremlin ‑ Clojure, Gremlin ‑ PHP, Gremlin ‑ JavaScript, Gremlin ‑ Typeset | |
Influenciado por | |
Expresión regular , XPath , Ripple, SPARQL , SQL , Java / JVM |
Como analogía explicativa, Apache TinkerPop y Gremlin son para graficar bases de datos lo que JDBC y SQL son para bases de datos relacionales . Asimismo, la máquina transversal de Gremlin es graficar la computación como lo que la máquina virtual Java es para la computación de propósito general. [3]
Historia
- 2009-10-30 nace el proyecto, y de inmediato se llama "TinkerPop"
- 2009-12-25 v0.1 es la primera versión
- 2011-05-21 v1.0 es lanzado
- 2012-05-24 v2.0 es lanzado
- 2015-01-16 TinkerPop se convierte en un proyecto de Incubadora Apache
- 2015-07-09 v3.0.0-incubating es lanzado
- 2016-05-23 Apache TinkerPop se convierte en un proyecto de primer nivel
- 2016-07-18 v3.1.3 y v3.2.1 son los primeros lanzamientos como Apache TinkerPop
- 2017-12-17 v3.3.1 es lanzado
- 2018-05-08 v3.3.3 es lanzado
- 2019-08-05 v3.4.3 es lanzado
- 2020-02-20 v3.4.6 es lanzado
Integración de proveedores
Gremlin es un lenguaje transversal de gráficos con licencia de Apache2 que pueden utilizar los proveedores de sistemas de gráficos. Por lo general, existen dos tipos de proveedores de sistemas de gráficos: bases de datos de gráficos OLTP y procesadores de gráficos OLAP. La siguiente tabla describe los proveedores de gráficos que admiten Gremlin.
Vendedor | Sistema de gráficos |
---|---|
Neo4j | base de datos de gráficos |
OrientDB | base de datos de gráficos |
DataStax Enterprise (5.0+) | base de datos de gráficos |
Hadoop ( jirafa ) | procesador gráfico |
Hadoop ( chispa ) | procesador gráfico |
InfiniteGraph | base de datos de gráficos |
JanusGraph | base de datos de gráficos |
Cosmos DB | base de datos de gráficos |
Amazonas Neptuno | base de datos de gráficos |
Ejemplos de recorrido
Los siguientes ejemplos de consultas y respuestas de Gremlin en un entorno Gremlin-Groovy están relacionados con una representación gráfica del conjunto de datos MovieLens . [4] El conjunto de datos incluye a los usuarios que califican las películas. Cada usuario tiene una ocupación y cada película tiene una o más categorías asociadas. El esquema gráfico de MovieLens se detalla a continuación.
usuario - calificado [ estrellas : 0 - 5 ] -> películausuario - ocupación -> ocupaciónpelícula - categoría -> categoría
Travesías simples
Para cada vértice del gráfico, emita su etiqueta, luego agrupe y cuente cada etiqueta distinta.
gremlin > g . V (). etiqueta (). groupCount () ==> [ ocupación: 21 , película: 3883 , categoría: 18 , usuario: 6040 ]
¿En qué año se hizo la película más antigua?
gremlin > g . V (). hasLabel ( 'película' ). valores ( 'año' ). min () ==> 1919
¿Cuál es la calificación promedio de Die Hard?
gremlin > g . V (). tiene ( 'película' , 'nombre' , 'Die Hard' ). inE ( 'calificado' ). valores ( 'estrellas' ). media () ==> 4.121848739495798
Proyección transversal
Para cada categoría, emita un mapa de su nombre y la cantidad de películas que representa.
gremlin > g . V (). hasLabel ( 'categoría' ). como ( 'a' , 'b' ). seleccione ( 'a' , 'b' ). por ( 'nombre' ). por ( INE ( 'categoría' .) contar ()) ==> [ A: Animación , b: 105 ] ==> [ R: Los niños ' s , b: 251 ] ==> [ A: Comedia , b: 1200 ] ==> [ a: Aventura , b: 283 ] ==> [ a: Fantasía , b: 68 ] ==> [ a: Romance , b: 471 ] ==> [ a: Drama , b: 1603 ] = => [ a: Acción , b: 503 ] ==> [ a: Crimen , b: 211 ] ==> [ a: Thriller , b: 492 ] ==> [ a: Horror , b: 343 ] ==> [ a: Sci - Fi , b: 276 ] ==> [ a: Documental , b: 127 ] ==> [ a: Guerra , b: 143 ] ==> [ a: Musical , b: 114 ] ==> [ a: Mystery , b: 106 ] ==> [ a: Film - Noir , b: 44 ] ==> [ a: Western , b: 68 ]
Para cada película con al menos 11 calificaciones, emita un mapa de su nombre y calificación promedio. Ordene los mapas en orden decreciente por su calificación promedio. Emite los primeros 10 mapas (es decir, los 10 primeros).
gremlin > g . V (). hasLabel ( 'película' ). como ( 'a' , 'b' ). donde ( inE ( 'calificado' ). count (). es ( gt ( 10 ))). seleccione ( 'a' , 'b' ). por ( 'nombre' ). por ( inE ( 'clasificado' ). valores ( 'estrellas' ). media ()). orden (). por ( seleccione ( '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: Sospechosos habituales , The , b: 4.517106001121705 ] ==> [ a: Schindler ' s List , b: 4.510416666666667 ] ==> [ a: Mal Pantalones , La , b: 4.507936507936508 ] ==> [ a: Sunset Blvd . ( Un . K . A . Sunset bulevar ), b: 4.491489361702127 ] ==> [ a: Raiders de la perdida Ark , b: 4,47772 ]
Recorridos de coincidencia de patrones declarativos
Gremlin admite la coincidencia de patrones de gráficos declarativos similar a SPARQL . Por ejemplo, la siguiente consulta a continuación usa el paso match () de Gremlin .
¿Qué películas de acción de los 80 les gustan a los programadores de treinta y tantos? Cuente las películas en grupo por su nombre y clasifique el mapa de recuento de grupos en orden decreciente por valor. Recorte el mapa en los 10 primeros y emita las entradas del mapa.
gremlin > g . V (). match ( __ . as ( 'a' ). hasLabel ( 'movie' ), __ . as ( 'a' ). out ( 'category' ). has ( 'name' , 'Action' ), __ . as ( ' a ' ). tiene ( ' año ' , entre ( 1980 , 1990 )), __ . as ( ' a ' ). inE ( ' calificado ' ). as ( ' b ' ), __ . as ( ' b ' ). tiene ( 'estrellas' , 5 ), __ . as ( 'b' ). outV (). as ( 'c' ), __ . as ( 'c' ). out ( 'ocupación' ). has ( 'nombre' , 'programador' ), __ . as ( 'c' ). tiene ( 'edad' , entre ( 30 , 40 ))). seleccione ( 'a' ). groupCount (). por ( 'nombre' ). orden ( local ). por ( valueDecr ). límite ( locales , 10 ) ==> Raiders de la perdida Ark = 26 ==> Estrella Wars Episodio V - El Imperio contraataca Volver = 26 ==> Terminator , La = 23 ==> Estrella Wars Episodio VI - Retorno de la Jedi = 22 ==> Princesa Prometida , La = 19 ==> Extraterrestres = 18 ==> Barco , La ( Das Boot ) = 11 ==> Indiana Jones y la Última Cruzada = 11 ==> Star Trek La ira de Khan = 10 ==> Abismo , El = 9
Recorrido OLAP
¿Qué películas son más centrales en el gráfico implícito de 5 estrellas?
gremlin > g = gráfico . traversal ( computadora ( SparkGraphComputer )) ==> graphtraversalsource [ hadoopgraph [ gryoinputformat -> gryooutputformat ], sparkgraphcomputer ] gremlin > g . V (). repetir ( outE ( 'calificado' ). has ( 'estrellas' , 5 ). inV (). groupCount ( 'm' ). by ( 'nombre' ). inE ( 'calificado' ). has ( 'estrellas' , 5 ). outV ()). veces ( 4 ). casquillo ( 'm' ) ==> Estrella Wars Episodio IV - Una Nueva Esperanza 35405394353105332 ==> Americano Belleza 31943228282020585 ==> En busca de la perdida Arca 31224779793238499 ==> Estrella Wars Episodio V - El imperio contraataca Volver 30434677119726223 ==> padrino , El 30258518523013057 ==> Shawshank Redemption , The 28297717387901031 ==> Schindler ' s List 27539336654199309 ==> El silencio de los corderos , El 26736276376806173 ==> Fargo 26531050311325270 ==> Matrix , El 26395118239203191
Máquina transversal de gráficos Gremlin
Gremlin es una máquina virtual compuesta por un conjunto de instrucciones y un motor de ejecución. Se establece una analogía entre Gremlin y Java .
Ecosistema de Java | Ecosistema Gremlin |
---|---|
Lenguaje de programación Apache Groovy | Gremlin-Groovy |
Lenguaje de programación Scala | Gremlin-Scala |
Lenguaje de programación Clojure | Gremlin-Clojure |
... | ... |
Lenguaje de programación Java | Gremlin-Java8 |
Conjunto de instrucciones de Java | Biblioteca de pasos de gremlin |
Máquina virtual de Java | Máquina transversal Gremlin |
Pasos de Gremlin (conjunto de instrucciones)
El siguiente recorrido es un recorrido de Gremlin en el dialecto Gremlin-Java8.
g . V (). como ( "a" ). out ( "sabe" ). como ( "b" ). seleccione ( "a" , "b" ). por ( "nombre" ). por ( "edad" )
El lenguaje Gremlin (es decir, el estilo fluido de expresar un recorrido de gráfico) se puede representar en cualquier lenguaje anfitrión que admita la composición de funciones y el anidamiento de funciones . Debido a este simple requisito, existen varios dialectos de Gremlin, incluidos Gremlin-Groovy, Gremlin-Scala, Gremlin-Clojure, etc. El recorrido anterior de Gremlin-Java8 se compila finalmente en una secuencia de pasos llamada recorrido . Una representación de cadena del recorrido anterior que se proporciona a continuación.
[ GraphStep ( [] , vértice ) @ [ a ] , VertexStep ( OUT , [ sabe ] , vértice ) @ [ b ] , SelectStep ( [ a , b ] , [ valor ( nombre ), valor ( edad ) ] ) ]
Los pasos son las primitivas de la máquina transversal de gráficos Gremlin. Son las instrucciones parametrizadas que finalmente ejecuta la máquina. El conjunto de instrucciones de Gremlin es de aproximadamente 30 pasos. Estos pasos son suficientes para proporcionar computación de propósito general y lo que normalmente se requiere para expresar los motivos comunes de cualquier consulta transversal de gráfico.
Dado que Gremlin es un lenguaje, un conjunto de instrucciones y una máquina virtual, es posible diseñar otro lenguaje transversal que se compile en la máquina transversal Gremlin (análogo a cómo Scala compila en la JVM ). Por ejemplo, el popular lenguaje de coincidencia de patrones de gráficos SPARQL puede compilarse para ejecutarse en la máquina Gremlin. La siguiente consulta SPARQL
SELECCIONE ? A ? B ? C DONDE { ? A una Persona . ? un ex : sabe ? b . ? un ex : creado ? c . ? b ex : creado ? c . ? b ex : la edad ? d . FILTRO ( ? D < 30 ) }
se compilaría para
[ GraphStep ( [] , vértice ), MatchStep ( Y , [[ MatchStartStep ( a ), LabelStep , IsStep ( eq ( Persona )), MatchEndStep ] , [ MatchStartStep ( a ), VertexStep ( OUT , [ sabe ] , vértice ), MatchEndStep ( b ) ] , [ MatchStartStep ( a ), VertexStep ( OUT , [ creado ] , vértice ), MatchEndStep ( c ) ] , [ MatchStartStep ( b ), VertexStep ( OUT , [ creado ] , vértice ), MatchEndStep ( c ) ] , [ MatchStartStep ( b ), PropertiesStep ( [ edad ] , valor ), MatchEndStep ( d ) ] , [ MatchStartStep ( d ), IsStep ( gt ( 30 )), MatchEndStep ]] ), SelectStep ( [ a , b , c ] ) ] .
En Gremlin-Java8, la consulta SPARQL anterior se representaría como se muestra a continuación y se compilaría en la secuencia de pasos Gremlin idéntica (es decir, transversal).
g . V (). coincidir ( como ( "a" ). etiqueta (). es ( "persona" ), como ( "a" ). fuera ( "sabe" ). como ( "b" ), como ( "a" ). fuera ( "creado" ). como ( "c" ), como ( "b" ). fuera ( "creado" ). como ( "c" ), como ( "b" ). valores ( "edad" ). como ( " d " ), como ( " d " ). es ( gt ( 30 ))). seleccionar ( "a" , "b" , "c" )
Gremlin Machine (máquina virtual)
La máquina transversal de gráficos de Gremlin se puede ejecutar en una sola máquina o en un clúster de cómputo de varias máquinas. El agnosticismo de ejecución permite que Gremlin se ejecute tanto en bases de datos de gráficos (OLTP) como en procesadores de gráficos (OLAP).
Ver también
- Cypher Query Language , otro lenguaje de consulta sobre datos gráficos
- SPARQL , otro lenguaje de consulta sobre datos gráficos
Referencias
- ^ "Gremlin 3.4.10" . Consultado el 18 de enero de 2021 .
- ^ Rodríguez, Marko A. (2015). "La máquina y el lenguaje transversal del gráfico Gremlin (charla invitada)". El lenguaje y la máquina transversal de gráficos de Gremlin . págs. 1-10. arXiv : 1508.03843 . doi : 10.1145 / 2815072.2815073 . ISBN 9781450339025. S2CID 10533031 .
- ^ "Los beneficios de la máquina transversal de gráficos Gremlin" . 2015-09-14 . Consultado el 17 de septiembre de 2015 .
- ^ "El lenguaje transversal del gráfico Gremlin" . 2015-08-19 . Consultado el 22 de agosto de 2015 .
enlaces externos
- Página de inicio de Apache TinkerPop
- sql2gremlin.com (TinkerPop2)
- Rodríguez, MA, " The Gremlin Graph Traversal Machine and Language ", Actas de la Conferencia sobre lenguajes de programación de bases de datos de ACM, octubre de 2015.