Neo4j - linguaggio di query Cypher vs Gremlin


102

Sto iniziando a sviluppare con Neo4j utilizzando l'API REST. Ho visto che ci sono due opzioni per eseguire query complesse: Cypher (il linguaggio di query di Neo4j) e Gremlin (il linguaggio di query / attraversamento del grafico per scopi generali).

Ecco cosa voglio sapere: c'è qualche query o operazione che può essere eseguita utilizzando Gremlin e non può essere eseguita con Cypher? o vice versa?

Cypher mi sembra molto più chiaro di Gremlin, e in generale sembra che i ragazzi di Neo4j stiano andando con Cypher. Ma - se Cypher è limitato rispetto a Gremlin - mi piacerebbe davvero saperlo in anticipo.


1
Cypher è un linguaggio dichiarativo completo non-turing. Gremlin è un fantastico wrapper sull'API Java di Neo4j ed è imperativo. Chiaramente, ci sono cose che è possibile fare in gremlin che non puoi fare in cifra.
Prakhar Agrawal,

1
Apache Spark 3 includerà Cypher, che la dice lunga sulla loro opinione su questo.
Walker Rowe

Risposte:


77

Per le query generali, Cypher è sufficiente ed è probabilmente più veloce. Il vantaggio di Gremlin rispetto a Cypher è quando ti metti in traversata di alto livello. In Gremlin, puoi definire meglio il modello di attraversamento esatto (oi tuoi algoritmi) mentre in Cypher il motore cerca di trovare da solo la migliore soluzione di attraversamento.

Personalmente uso Cypher per la sua semplicità e, ad oggi, non ho avuto nessuna situazione in cui ho dovuto usare Gremlin (tranne lavorare con le funzioni di import / export di Gremlin graphML). Mi aspetto, tuttavia, che anche se dovessi usare Gremlin, lo farei per una query specifica che troverei in rete e non tornerei mai più.

Puoi sempre imparare Cypher molto velocemente (in pochi giorni) e poi continuare con il generale Gremlin (a lungo termine).


2
C'è un nuovo tutorial online che inizia su neo4j.org/learn/cypher anche per te.
Peter Neubauer

3
Ho capito che Cypher era più simile a SQL, in quanto gli dici quello che vuoi e funziona come farlo. Con Gremlin, impartisci comandi di attraversamento esatti, a cui deve obbedire.
Stewart

2
Per me Gremlin è risultato essere significativamente più veloce di Cypher nella maggior parte delle query.
Joan

9
A partire da TinkerPop 3.x , Gremlin ha caratteristiche sia imperative che dichiarative. Puoi scrivere i tuoi attraversamenti per definire un modello di attraversamento esatto come indicato in questa risposta oppure puoi utilizzare il passaggio di corrispondenza per definire semplicemente il modello che stai cercando e Gremlin lo risolverà.
stephen mallette

42

Dobbiamo attraversare migliaia di nodi nelle nostre query. Cypher era lento. Il team di Neo4j ci ha detto che l'implementazione del nostro algoritmo direttamente contro l'API Java sarebbe 100-200 volte più veloce. Lo abbiamo fatto e ne abbiamo ricavato facilmente un fattore 60. Al momento non abbiamo una singola query Cypher nel nostro sistema a causa della mancanza di fiducia. Le query Easy Cypher sono facili da scrivere in Java, le query complesse non verranno eseguite. Il problema è che quando hai più condizioni nella tua query non c'è modo in Cypher di dire in quale ordine eseguire gli attraversamenti. Quindi la tua query di cifratura potrebbe entrare selvaggiamente nel grafico prima nella direzione sbagliata. Non ho fatto molto con Gremlin, ma immagino che tu abbia molto più controllo dell'esecuzione con Gremlin.


Quando dici "direttamente contro l'API Java" intendi Neo4j incorporato in Java?
Pavel

2
Utilizzo delle estensioni del server all'interno di neo4j installato come server autonomo.
Heinrich

12
Aggiornamento dal 2018: data una vasta gamma di tipi di indice nativi nelle versioni moderne di neo4j, questa risposta è sostanzialmente obsoleta; neo4j ha pubblicato i numeri delle prestazioni
FrobberOfBits

3
"implementare il nostro algoritmo direttamente contro l'API Java" è in realtà un po 'fuorviante. Ovviamente, il modo più veloce per andare dal punto A al punto B è prendere il percorso più breve. Ciò richiede la conoscenza di informazioni aggiuntive, specifiche. Andare a un livello basso supererà sempre un pianificatore di macchine, perché sai che puoi fare supposizioni che la macchina non può. Tuttavia, Cypher può facilmente superare un algoritmo di basso livello implementato in modo ingenuo, richiede molte meno conoscenze da usare ed è molto più veloce da implementare. Soprattutto da quando Cypher migliora con ogni versione di Neo4j. (pianificatori più intelligenti)
Tezra

29

Gli sforzi del team di Neo4j su Cypher sono stati davvero impressionanti e hanno fatto molta strada. Il team di Neo in genere spinge le persone a farlo e, man mano che Cypher matura, Gremlin probabilmente riceverà meno attenzione. Cypher è una buona scelta a lungo termine.

Detto questo, Gremlin è un DSL Groovy. Usarlo attraverso il suo endpoint REST Neo4j consente un accesso completo e illimitato all'API Java Neo4j sottostante. Esso (e altri plugin di script nella stessa categoria) non possono essere abbinati in termini di potenza di basso livello. Inoltre, puoi eseguire Cypher dall'interno del plug-in Gremlin .

Ad ogni modo, c'è un percorso di aggiornamento sano in cui impari entrambi. Vorrei quello che ti fa funzionare più velocemente. Nei miei progetti , in genere utilizzo Gremlin e quindi chiamo Cypher (dall'interno di Gremlin o meno) quando ho bisogno di risultati tabulari o di corrispondenza di pattern espressivi: entrambi sono un problema nel Gremlin DSL.


20

Inizialmente ho iniziato a usare Gremlin. Tuttavia, al momento, l'interfaccia REST era un po 'instabile, quindi sono passato a Cypher. Ha un supporto molto migliore per Neo4j. Tuttavia, ci sono alcuni tipi di query che semplicemente non sono possibili con Cypher o in cui Cypher non può ottimizzare il modo in cui puoi farlo con Gremlin.

Gremlin è costruito su Groovy, quindi puoi effettivamente usarlo come un modo generico per far sì che Neo4j esegua il codice "Java" ed esegua varie attività dal server, senza dover prendere l'http HTTP dall'interfaccia REST. Tra gli altri, Gremlin ti consentirà di modificare i dati.

Tuttavia, quando tutto ciò che voglio è interrogare i dati, scelgo Cypher perché è più leggibile e più facile da mantenere. Gremlin è il fallback quando viene raggiunto un limite.


1
Cypher supporta l'aggiornamento delle query a partire da Neo4j 1.7, vedere docs.neo4j.org/chunked/snapshot/cypher-query-lang.html
Peter Neubauer

3
Notare che l'interfaccia REST scomparirà in TinkerPop 3. Gli utenti dovranno inviare stringhe di Gremlin a Gremlin Server (che è fondamentalmente Rexster, rinominato e migliorato).
jbmusso

10

Le query Gremlin possono essere generate a livello di programmazione. (Vedi http://docs.sqlalchemy.org/en/rel_0_7/core/tutorial.html#intro-to-generative-selects per sapere cosa intendo.) Questo sembra essere un po 'più complicato con Cypher.


@ MattLuongo: 1, non conoscevo neo4django, 2, non è applicabile in tutti i casi (es. Il linguaggio non è Python) 3, non è lo stesso se scrivi la query da solo o usi una libreria per creare il eseguire query a livello di codice per te. A questo proposito neo4django può essere considerato una soluzione alternativa a Cypher e Gremlin.
Tohotom

3
Oh, ovviamente non mi aspetto che neo4django sia immediatamente applicabile; era un esempio, proprio come SQL Alchemy lo era nella tua risposta. Ma non è vero che generare Cypher sia più difficile. Cypher e Gremlin adottano approcci diversi come linguaggi di query, ma non vedo come Cypher sia più difficile da generare a livello di programmazione ...
Matt Luongo

8

Cypher funziona solo per query semplici. Quando inizi a incorporare una logica aziendale complessa nei tuoi attraversamenti grafici, diventa proibitivamente lento o smette di funzionare del tutto.

Neo4j chiaramente sa che Cypher non è il massimo, perché forniscono anche le procedure APOC che includono un espansore percorso alternativo ( apoc.path.expand, apoc.path.subgraphAllecc).

Gremlin è più difficile da imparare ma è più potente di Cypher e APOC. Puoi implementare qualsiasi logica ti venga in mente in Gremlin.

Vorrei davvero che Neo4J fosse fornito con un server Gremlin attivabile (da leggere in giro, questo era il caso). Puoi far funzionare Gremlin contro un'istanza Neo4J dal vivo, ma implica saltare molti ostacoli. La mia speranza è che, poiché i concorrenti di Neo4J stanno consentendo Gremlin come opzione, Neo4J seguirà l'esempio.


1
neo4j essendo il DB grafico più popolare al mondo, penso che potrebbe esserci una ragione per cui non hanno ancora adottato gremlin.
Luk Aron

1
dal momento che non condividi quali potrebbero essere questi motivi, non vedo alcun valore nel tuo commento
user1302130

4

Cypher è un linguaggio di query dichiarativo per l'interrogazione di database a grafo. Il termine dichiarativo è importante perché è un modo diverso di programmare rispetto a paradigmi di programmazione come imperativo.

In un linguaggio di query dichiarativo come Cypher e SQL diciamo al motore sottostante quali dati vogliamo recuperare e non specifichiamo come vogliamo che i dati vengano recuperati.

In Cypher un utente definisce un sottografo di interesse nella clausola MATCH. Quindi il motore sottostante esegue un algoritmo di corrispondenza del modello per cercare le occorrenze simili del sottografo nel database del grafico.

Gremlin è sia caratteristiche dichiarative che imperative. È un linguaggio di attraversamento del grafico in cui un utente deve fornire istruzioni esplicite su come navigare nel grafico.

La differenza tra questi linguaggi in questo caso è che in Cypher possiamo usare un operatore a stella Kleene per trovare percorsi tra due nodi qualsiasi in un database a grafo. A Gremlin tuttavia dovremo definire esplicitamente tutti questi percorsi. Ma possiamo usare un operatore di ripetizione in Gremlin per trovare più occorrenze di tali percorsi espliciti in un database a grafo. Tuttavia, eseguire iterazioni su strutture esplicite non è possibile in Cypher.


3

Se usi gremlin, ti consente di migrare il in diversi database di grafi, poiché la maggior parte dei database di grafi supporta l'attraversamento di gremlin, è una buona idea scegliere il gremlin.


2

Risposta lunga breve: usa cypher per query e gremlin per traversal. Vedrai tu stesso il tempismo di risposta.


come farlo ?
Optimus
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.