Neo4j: lenguaje de consulta Cypher vs Gremlin

102

Estoy empezando a desarrollar con Neo4j usando la API REST. Vi que hay dos opciones para realizar consultas complejas: Cypher (lenguaje de consulta de Neo4j) y Gremlin (el lenguaje de consulta / transversal de gráfico de propósito general).

Esto es lo que quiero saber: ¿hay alguna consulta u operación que se pueda realizar con Gremlin y que no se pueda realizar con Cypher? ¿o viceversa?

Cypher me parece mucho más claro que Gremlin, y en general parece que los chicos de Neo4j van con Cypher. Pero, si Cypher es limitado en comparación con Gremlin, realmente me gustaría saberlo de antemano.

Rubinsh
fuente
1
Cypher es un lenguaje declarativo completo no turing. Gremlin es un envoltorio elegante sobre la API de Java Neo4j y es imperativo. Claramente, hay cosas que se pueden hacer en gremlin que no se pueden hacer en cypher.
Prakhar Agrawal
1
Apache Spark 3 incluirá Cypher, que dice mucho sobre su opinión al respecto.
Walker Rowe

Respuestas:

77

Para consultas generales, Cypher es suficiente y probablemente más rápido. La ventaja de Gremlin sobre Cypher es cuando te adentras en travesías de alto nivel. En Gremlin, puede definir mejor el patrón de recorrido exacto (o sus propios algoritmos) mientras que en Cypher el motor intenta encontrar la mejor solución de recorrido por sí mismo.

Yo personalmente uso Cypher debido a su simplicidad y, hasta la fecha, no he tenido situaciones en las que tuviera que usar Gremlin (excepto trabajando con las funciones de importación / exportación de graphML de Gremlin). Sin embargo, espero que incluso si tuviera que usar Gremlin, lo haría para una consulta específica que encontraría en la red y no volvería nunca más.

Siempre puedes aprender Cypher muy rápido (en días) y luego continuar con el Gremlin general (a más largo plazo).

ulkas
fuente
2
Hay un nuevo tutorial en línea que comienza en neo4j.org/learn/cypher para que usted también comience.
Peter Neubauer
3
Comprendí que Cypher se parecía más a SQL, en el sentido de que le dices lo que quieres y te explica cómo hacerlo. Con Gremlin, emite comandos de recorrido exactos, que debe obedecer.
Stewart
2
Para mí, Gremlin resultó ser significativamente más rápido que Cypher en la mayoría de las consultas.
Joan
9
A partir de TinkerPop 3.x , Gremlin tiene características tanto imperativas como declarativas. Puede escribir sus recorridos para definir un patrón de recorrido exacto como se indica en esta respuesta o puede usar el paso de coincidencia para definir simplemente el patrón que está buscando y Gremlin lo resolverá.
stephen mallette
42

Tenemos que atravesar miles de nodos en nuestras consultas. Cypher fue lento. El equipo de Neo4j nos dijo que implementar nuestro algoritmo directamente contra la API de Java sería 100-200 veces más rápido. Lo hicimos y obtuvimos fácilmente el factor 60. A partir de ahora, no tenemos una sola consulta Cypher en nuestro sistema debido a la falta de confianza. Las consultas Easy Cypher son fáciles de escribir en Java, las consultas complejas no funcionan. El problema es que cuando tiene varias condiciones en su consulta, no hay forma en Cypher de decir en qué orden realizar los recorridos. Por lo tanto, es posible que su consulta cifrada se vuelva loca en el gráfico en una dirección incorrecta primero. No he hecho mucho con Gremlin, pero me imagino que obtendrás mucho más control de ejecución con Gremlin.

Heinrich
fuente
Cuando dice "directamente contra la API de Java", ¿se refiere a Neo4j incrustado en Java?
Pavel
2
Usando extensiones de servidor dentro de neo4j instalado como servidor independiente.
Heinrich
12
Actualización de 2018: dada una amplia gama de tipos de índices nativos en las versiones modernas de neo4j, esta respuesta está sustancialmente desactualizada; neo4j ha publicado cifras de rendimiento
FrobberOfBits
3
"implementar nuestro algoritmo directamente contra la API de Java" es en realidad un poco engañoso. Obviamente, la forma más rápida de llegar del punto A al punto B es tomar el camino más corto. Eso requiere conocer información adicional y específica. Ir a un nivel bajo siempre superará a un planificador de máquinas, porque sabe que puede hacer suposiciones que la máquina no puede. Sin embargo, Cypher puede superar fácilmente a un algoritmo de bajo nivel implementado de forma ingenua, requiere mucho menos conocimiento para su uso y es mucho más rápido de implementar. Especialmente porque Cypher mejora con cada lanzamiento de Neo4j. (planificadores más inteligentes)
Tezra
29

Los esfuerzos del equipo de Neo4j en Cypher han sido realmente impresionantes y han recorrido un largo camino. El equipo de Neo generalmente empuja a la gente hacia eso, y a medida que Cypher madura, Gremlin probablemente recibirá menos atención. Cypher es una buena opción a largo plazo.

Dicho esto, Gremlin es un DSL maravilloso. Usarlo a través de su punto final REST de Neo4j permite un acceso completo y sin restricciones a la API Java de Neo4j subyacente. Este (y otros complementos de script en la misma categoría) no se pueden igualar en términos de potencia de bajo nivel. Además, puede ejecutar Cypher desde el complemento Gremlin .

De cualquier manera, hay una ruta de actualización sensata en la que aprende ambos. Yo elegiría el que te ayude a ponerte en marcha más rápido. En mi proyectos , normalmente uso Gremlin y luego llamo a Cypher (desde dentro de Gremlin o no) cuando necesito resultados tabulares o coincidencia de patrones expresivos; ambos son un dolor en el DSL de Gremlin.

Matt Luongo
fuente
20

Inicialmente comencé a usar Gremlin. Sin embargo, en ese momento, la interfaz REST era un poco inestable, así que cambié a Cypher. Tiene un soporte mucho mejor para Neo4j. Sin embargo, hay algunos tipos de consultas que simplemente no son posibles con Cypher, o en las que Cypher no puede optimizar del todo la forma en que puede hacerlo con Gremlin.

Gremlin está construido sobre Groovy, por lo que puede usarlo como una forma genérica de hacer que Neo4j ejecute código 'Java' y realice varias tareas desde el servidor, sin tener que recibir el acceso HTTP desde la interfaz REST. Entre otros, Gremlin te permitirá modificar datos.

Sin embargo, cuando todo lo que quiero es consultar datos, elijo Cypher, ya que es más legible y más fácil de mantener. Gremlin es la alternativa cuando se alcanza una limitación.

Louis-Philippe Huberdeau
fuente
1
Cypher tiene soporte para actualizar consultas a partir de Neo4j 1.7, ver docs.neo4j.org/chunked/snapshot/cypher-query-lang.html
Peter Neubauer
3
Tenga en cuenta que la interfaz REST desaparecerá en TinkerPop 3. Se espera que los usuarios envíen cadenas de Gremlin al servidor Gremlin (que es básicamente Rexster, renombrado y mejorado).
jbmusso
10

Las consultas de Gremlin se pueden generar mediante programación. (Consulte http://docs.sqlalchemy.org/en/rel_0_7/core/tutorial.html#intro-to-generative-selects para saber a qué me refiero). Esto parece ser un poco más complicado con Cypher.

Tohotom
fuente
@MattLuongo: 1, no sabía sobre neo4django, 2, no es aplicable en todos los casos (por ejemplo, el lenguaje no es Python) 3, no es lo mismo si escribe la consulta mediante programación usted mismo o usa una biblioteca para crear el consulta mediante programación para usted. En este sentido, neo4django puede considerarse una solución alternativa a Cypher y Gremlin.
Tohotom
3
Oh, por supuesto que no espero que neo4django sea inmediatamente aplicable; fue un ejemplo, tal como lo fue SQL Alchemy en su respuesta. Pero no es cierto que generar Cypher sea más difícil. Cypher y Gremlin adoptan enfoques diferentes como lenguajes de consulta, pero no veo cómo Cypher es más difícil de generar programáticamente ...
Matt Luongo
8

Cypher solo funciona para consultas simples. Cuando comienza a incorporar lógica de negocios compleja en sus recorridos de gráficos, se vuelve prohibitivamente lento o deja de funcionar por completo.

Neo4J sabe claramente que Cypher no es así enfriamiento, ya que también proporcionan los procedimientos APOC que incluyen un expansor ruta alternativa ( apoc.path.expand, apoc.path.subgraphAll, etc).

Gremlin es más difícil de aprender, pero es más poderoso que Cypher y APOC. Puede implementar cualquier lógica que se le ocurra en Gremlin.

Realmente deseo que Neo4J se envíe con un servidor Gremlin conmutable (por leer, este solía ser el caso). Puede hacer que Gremlin se ejecute contra una instancia de Neo4J en vivo, pero implica saltar a través de muchos aros. Mi esperanza es que dado que los competidores de Neo4J están permitiendo Gremlin como una opción, Neo4J hará lo mismo.

usuario1302130
fuente
1
neo4j es la base de datos gráfica más popular del mundo, creo que podría haber una razón por la que aún no han adoptado gremlin.
Luk Aron
1
ya que no comparte cuáles podrían ser esas razones, no veo ningún valor en su comentario
user1302130
4

Cypher es un lenguaje de consulta declarativo para consultar bases de datos de gráficos. El término declarativo es importante porque es una forma diferente de programar que los paradigmas de programación como imperativo.

En un lenguaje de consulta declarativo como Cypher y SQL, le decimos al motor subyacente qué datos queremos obtener y no especificamos cómo queremos que se obtengan los datos.

En Cypher, un usuario define un subgráfico de interés en la cláusula MATCH. Luego, el motor subyacente ejecuta un algoritmo de coincidencia de patrones para buscar ocurrencias similares de subgráfico en la base de datos de gráficos.

Gremlin tiene características tanto declarativas como imperativas. Es un lenguaje de recorrido de gráficos en el que un usuario debe dar instrucciones explícitas sobre cómo navegar por el gráfico.

La diferencia entre estos lenguajes en este caso es que en Cypher podemos usar un operador de estrella de Kleene para encontrar rutas entre dos nodos dados en una base de datos de gráficos. En Gremlin, sin embargo, tendremos que definir explícitamente todos esos caminos. Pero podemos usar un operador de repetición en Gremlin para encontrar múltiples ocurrencias de tales rutas explícitas en una base de datos de gráficos. Sin embargo, hacer iteraciones sobre estructuras explícitas no es posible en Cypher.

Chandan Sharma
fuente
3

Si usa gremlin, entonces le permitirá migrar a diferentes bases de datos de gráficos. Dado que la mayoría de las bases de datos de gráficos admiten el recorrido de gremlin, es una buena idea elegir el gremlin.

Singaravelan
fuente
2

Respuesta larga y corta: use cypher para consultas y gremlin para recorrido. Verá usted mismo el tiempo de respuesta.

Sagar Sarin
fuente
como hacer eso ?
Optimus