Neo4j - linguagem de consulta Cypher vs Gremlin

102

Estou começando a desenvolver com o Neo4j usando a API REST. Eu vi que existem duas opções para realizar consultas complexas - Cypher (linguagem de consulta do Neo4j) e Gremlin (a linguagem de consulta / passagem de gráfico de propósito geral).

Aqui está o que eu quero saber - há alguma consulta ou operação que pode ser feita usando o Gremlin e não pode ser feita com o Cypher? ou vice-versa?

Cypher parece muito mais claro para mim do que Gremlin, e em geral parece que os caras do Neo4j estão indo com Cypher. Mas - se Cypher é limitado em comparação com Gremlin - eu realmente gostaria de saber isso com antecedência.

Rubinsh
fonte
1
Cypher é uma linguagem declarativa completa não turing. Gremlin é um invólucro sofisticado da API Neo4j Java e é imperativo. Claramente, há coisas possíveis de fazer em gremlin que não podem ser criptografadas.
Prakhar Agrawal
1
O Apache Spark 3 incluirá o Cypher, que diz muito sobre a visão deles sobre isso.
Walker Rowe

Respostas:

77

Para consultas gerais, Cypher é suficiente e provavelmente mais rápido. A vantagem do Gremlin sobre o Cypher é quando você entra em uma travessia de alto nível. No Gremlin, você pode definir melhor o padrão de percurso exato (ou seus próprios algoritmos), enquanto no Cypher o mecanismo tenta encontrar a melhor solução de percurso por si só.

Eu pessoalmente uso o Cypher por causa de sua simplicidade e, até o momento, não tive nenhuma situação em que tive que usar o Gremlin (exceto trabalhar com as funções de importação / exportação do Gremlin graphML). Espero, entretanto, que mesmo que precise usar o Gremlin, o faria para uma consulta específica que encontraria na rede e nunca mais voltaria.

Você sempre pode aprender Cypher realmente rápido (em dias) e depois continuar com o (de longa duração) Gremlin geral.

ulkas
fonte
2
Há um novo tutorial online começando em neo4j.org/learn/cypher para você começar também.
Peter Neubauer
3
Eu entendi que o Cypher era mais parecido com o SQL, no sentido de que você diz a ele o que quer e ele descobre como fazer. Com Gremlin, você emite comandos de passagem exatas, aos quais ele deve obedecer.
Stewart
2
Para mim, Gremlin era significativamente mais rápido do que Cypher na maioria das consultas.
Joan
9
A partir do TinkerPop 3.x , Gremlin tem características imperativas e declarativas. Você pode escrever seus percursos para definir um padrão de percurso exato, conforme declarado nesta resposta, ou pode usar a etapa de correspondência para simplesmente definir o padrão que está procurando e Gremlin resolverá isso.
stephen mallette,
41

Precisamos percorrer milhares de nós em nossas consultas. Cypher era lento. A equipe do Neo4j nos disse que implementar nosso algoritmo diretamente na API Java seria 100-200 vezes mais rápido. Fizemos isso e obtivemos facilmente o fator 60 disso. No momento, não temos nenhuma consulta Cypher em nosso sistema devido à falta de confiança. As consultas Easy Cypher são fáceis de escrever em Java, as consultas complexas não funcionam. O problema é que, quando você tem várias condições em sua consulta, não há como no Cypher dizer em qual ordem realizar os percursos. Portanto, sua consulta de cifra pode ir primeiro selvagem para o gráfico em uma direção errada. Não fiz muito com Gremlin, mas posso imaginar que você tenha muito mais controle de execução com Gremlin.

Heinrich
fonte
Quando você diz "diretamente contra a API Java", quer dizer Neo4j embutido em Java?
Pavel
2
Usando extensões de servidor dentro do neo4j instalado como um servidor autônomo.
Heinrich
12
Atualização de 2018 - dada uma grande variedade de tipos de índices nativos em versões modernas do neo4j, esta resposta está substancialmente desatualizada; neo4j publicou números de desempenho
FrobberOfBits de
3
"implementar nosso algoritmo diretamente na API Java" é, na verdade, um pouco enganador. Obviamente, a maneira mais rápida de ir do ponto A ao ponto B é pegar o caminho mais curto. Isso requer o conhecimento de informações adicionais específicas. Ir para um nível mais baixo sempre terá um desempenho melhor do que o planejador da máquina, porque você sabe que pode fazer suposições que a máquina não pode. No entanto, o Cypher pode facilmente superar um algoritmo de baixo nível implementado ingenuamente, requer muito menos conhecimento para ser usado e é muito mais rápido de implementar. Especialmente porque o Cypher fica melhor a cada lançamento do Neo4j. (planejadores mais inteligentes)
Tezra
29

Os esforços da equipe Neo4j no Cypher têm sido realmente impressionantes, e já percorreu um longo caminho. A equipe Neo normalmente empurra as pessoas em sua direção e, à medida que Cypher amadurece, Gremlin provavelmente receberá menos atenção. Cypher é uma boa escolha a longo prazo.

Dito isso, o Gremlin é um DSL Groovy. Usá-lo por meio de seu endpoint REST Neo4j permite acesso total e irrestrito à API Java Neo4j subjacente. Ele (e outros plug-ins de script na mesma categoria) não podem ser comparados em termos de potência de baixo nível. Além disso, você pode executar o Cypher de dentro do plugin Gremlin .

De qualquer forma, há um caminho de atualização lógico onde você aprende os dois. Eu escolheria aquele que o deixa pronto e rápido. Em meus projetos , normalmente uso Gremlin e chamo Cypher (de dentro do Gremlin ou não) quando preciso de resultados tabulares ou correspondência de padrão expressiva - ambos são uma dor no DSL Gremlin.

Matt Luongo
fonte
20

Comecei a usar o Gremlin. No entanto, na época, a interface REST era um pouco instável, então mudei para Cypher. Tem um suporte muito melhor para Neo4j. No entanto, existem alguns tipos de consultas que simplesmente não são possíveis com o Cypher, ou em que o Cypher não consegue otimizar totalmente da mesma forma que você com o Gremlin.

O Gremlin é construído sobre o Groovy, então você pode realmente usá-lo como uma maneira genérica de fazer o Neo4j executar o código 'Java' e realizar várias tarefas do servidor, sem ter que receber o hit HTTP da interface REST. Entre outros, Gremlin permitirá que você modifique dados.

No entanto, quando tudo que quero é consultar os dados, escolho o Cypher, pois é mais legível e fácil de manter. Gremlin é o substituto quando uma limitação é atingida.

Louis-Philippe Huberdeau
fonte
1
Cypher tem suporte para atualização de consultas a partir do Neo4j 1.7, consulte docs.neo4j.org/chunked/snapshot/cypher-query-lang.html
Peter Neubauer
3
Observe que a interface REST será desativada no TinkerPop 3. Os usuários deverão enviar strings do Gremlin para o Gremlin Server (que é basicamente Rexster, renomeado e melhorado).
jbmusso
10

As consultas Gremlin podem ser geradas programaticamente. (Consulte http://docs.sqlalchemy.org/en/rel_0_7/core/tutorial.html#intro-to-generative-selects para saber o que quero dizer.) Isso parece um pouco mais complicado com o Cypher.

Tohotom
fonte
@MattLuongo: 1, eu não sabia sobre neo4django, 2, não é aplicável em todos os casos (por exemplo, a linguagem não é Python) 3, não é o mesmo se você escrever a consulta programaticamente ou usar uma biblioteca para criar o consulta programaticamente para você. Nesse sentido, o neo4django pode ser considerado uma solução alternativa ao Cypher e ao Gremlin.
Tohotom de
3
Oh, claro que não espero que o neo4django seja imediatamente aplicável; foi um exemplo, assim como o SQL Alchemy estava em sua resposta. Mas não é verdade que gerar Cypher é mais difícil. Cypher e Gremlin têm abordagens diferentes como linguagens de consulta, mas não vejo como o Cypher é mais difícil de gerar programaticamente ...
Matt Luongo
8

Cypher só funciona para consultas simples. Quando você começa a incorporar lógica de negócios complexa em suas travessias de gráfico, ela se torna proibitivamente lenta ou para de funcionar completamente.

Neo4J sabe claramente que cifra não é cortá-lo, pois eles também fornecem os procedimentos APOC que incluem um expansor caminho alternativo ( apoc.path.expand, apoc.path.subgraphAll, etc.).

Gremlin é mais difícil de aprender, mas é mais poderoso do que Cypher e APOC. Você pode implementar qualquer lógica que imaginar em Gremlin.

Eu realmente gostaria que o Neo4J fosse enviado com um servidor Gremlin alternável (pela leitura, esse costumava ser o caso). Você pode fazer o Gremlin correr contra uma instância do Neo4J ao vivo, mas isso envolve pular através de muitos aros. Minha esperança é que, uma vez que os concorrentes do Neo4J estão permitindo o Gremlin como uma opção, o Neo4J faça o mesmo.

user1302130
fonte
1
sendo neo4j o banco de dados gráfico mais popular do mundo, acho que pode haver uma razão para eles não terem adotado o gremlin ainda.
Luk Aron
1
já que você não compartilha quais podem ser esses motivos, não vejo qualquer valor em seu comentário
user1302130
4

Cypher é uma linguagem de consulta declarativa para consultar bancos de dados de gráficos. O termo declarativo é importante porque é uma forma diferente de programação dos paradigmas de programação como imperativo.

Em uma linguagem de consulta declarativa como Cypher e SQL, informamos ao mecanismo subjacente quais dados desejamos buscar e não especificamos como queremos que os dados sejam buscados.

No Cypher, um usuário define um subgráfico de interesse na cláusula MATCH. Em seguida, o mecanismo subjacente executa um algoritmo de correspondência de padrões para pesquisar as ocorrências semelhantes de subgráficos no banco de dados de gráficos.

Gremlin tem características declarativas e imperativas. É uma linguagem de passagem de gráfico em que o usuário deve fornecer instruções explícitas sobre como o gráfico deve ser navegado.

A diferença entre essas linguagens neste caso é que no Cypher podemos usar um operador estrela de Kleene para encontrar caminhos entre quaisquer dois nós em um banco de dados de grafos. Em Gremlin, entretanto, teremos que definir explicitamente todos esses caminhos. Mas podemos usar um operador de repetição em Gremlin para encontrar várias ocorrências de tais caminhos explícitos em um banco de dados de gráficos. No entanto, fazer iterações sobre estruturas explícitas não é possível no Cypher.

Chandan Sharma
fonte
3

Se você usar gremlin, ele permitirá que você migre o para diferentes bancos de dados de gráficos. Como a maioria dos bancos de dados de gráficos oferece suporte para a travessia de gremlin, é uma boa ideia escolher o gremlin.

Singaravelan
fonte
2

Resposta longa curta: Use cypher para consulta e gremlin para travessia. Você mesmo verá o tempo de resposta.

Sagar Sarin
fonte
Como fazer isso ?
Optimus