110

私はRESTAPIを使用してNeo4jで開発を始めています。複雑なクエリを実行するには、Cypher(Neo4jのクエリ言語)とGremlin(汎用グラフクエリ/トラバーサル言語)の2つのオプションがあることがわかりました。

これが私が知りたいことです-Gremlinを使用して実行でき、Cypherでは実行できないクエリまたは操作はありますか?またはその逆?

CypherはGremlinよりもはるかに明確に見えます。一般的に、Neo4jのメンバーはCypherを使用しているようです。しかし、CypherがGremlinと比較して制限されている場合は、事前にそれを知りたいと思います。

4

9 に答える 9

88

一般的なクエリの場合、Cypherで十分であり、おそらくより高速です。サイファーに対するグレムリンの利点は、高レベルのトラバースに入るときです。グレムリンでは、正確なトラバーサルパターン(または独自のアルゴリズム)をより適切に定義できますが、サイファーでは、エンジンが最適なトラバーサルソリューション自体を見つけようとします。

私はその単純さのために個人的にCypherを使用しており、これまで、Gremlinを使用しなければならない状況はありませんでした(GremlinのgraphMLインポート/エクスポート機能を使用する場合を除く)。ただし、Gremlinを使用する必要がある場合でも、ネット上で見つけた特定のクエリに対して使用し、二度と戻ってこないことを期待しています。

あなたはいつでもCypherを本当に速く(数日で)学び、それから(より長期の)一般的なGremlinを続けることができます。

于 2012-12-12T09:26:47.033 に答える
47

クエリでは、何千ものノードをトラバースする必要があります。サイファーは遅かった。Neo4jチームは、Java APIに対して直接アルゴリズムを実装すると、100〜200倍高速になると語っています。私たちはそうし、それから簡単に60を因数分解しました。現在のところ、信頼性が不足しているため、システムに単一のCypherクエリはありません。Easy CypherクエリはJavaで簡単に記述でき、複雑なクエリは実行されません。問題は、クエリに複数の条件がある場合、トラバーサルを実行する順序をCypherで判断する方法がないことです。そのため、サイファークエリが最初に間違った方向にグラフに組み込まれる可能性があります。私はGremlinをあまり使用していませんが、Gremlinを使用すると実行制御が大幅に向上することを想像できます。

于 2013-03-22T14:43:59.653 に答える
29

サイファーに対するNeo4jチームの取り組みは非常に印象的であり、長い道のりを歩んできました。Neoチームは通常、人々をそれに向かって押し進めます。Cypherが成熟するにつれて、Gremlinはおそらく注目を集めることはなくなります。サイファーは長期的には良い選択です。

そうは言っても、GremlinはGroovyDSLです。Neo4j RESTエンドポイントを介して使用すると、基盤となるNeo4jJavaAPIへの完全な無制限のアクセスが可能になります。それ(および同じカテゴリの他のスクリプトプラグイン)は、低レベルの電力の点で一致することはできません。さらに、 Gremlinプラグイン内からCypherを実行できます。

いずれにせよ、両方を学ぶための正しいアップグレードパスがあります。私はあなたをより速く立ち上げて実行させるものと一緒に行きます。私の プロジェクトでは、通常、Gremlinを使用し、表形式の結果または表現力豊かなパターンマッチングが必要な場合は、(Gremlin内からかどうかに関係なく)Cypherを呼び出します。どちらもGremlinDSLの問題です。

于 2013-01-04T16:20:57.227 に答える
20

私は最初にGremlinを使い始めました。しかし、当時はRESTインターフェースが少し不安定だったので、Cypherに切り替えました。Neo4jのサポートが大幅に向上しています。ただし、Cypherでは単純に不可能なタイプのクエリや、CypherがGremlinで可能な方法を完全に最適化できないタイプのクエリがあります。

GremlinはGroovy上に構築されているため、RESTインターフェイスからHTTPヒットを取得することなく、Neo4jに「Java」コードを実行させてサーバーからさまざまなタスクを実行させる一般的な方法として実際に使用できます。特に、Gremlinを使用するとデータを変更できます。

ただし、データをクエリするだけの場合は、Cypherの方が読みやすく、保守が簡単なので、Cypherを使用します。グレムリンは、制限に達したときのフォールバックです。

于 2012-12-11T19:03:26.453 に答える
10

グレムリンクエリはプログラムで生成できます。(http://docs.sqlalchemy.org/en/rel_0_7/core/tutorial.html#intro-to-generative-selectsを参照して、私が何を意味するかを確認してください。)これはCypherでは少し注意が必要なようです。

于 2013-04-11T07:39:59.847 に答える
9

サイファーは単純なクエリに対してのみ機能します。複雑なビジネスロジックをグラフトラバーサルに組み込み始めると、非常に遅くなるか、完全に機能しなくなります。

Neo4Jは、代替パスエクスパンダー(、など)を含むAPOCプロシージャも提供するため、Cypherがそれをカットしていないことを明確に認識していapoc.path.expandますapoc.path.subgraphAll

グレムリンは習得が難しいですが、サイファーやAPOCよりも強力です。グレムリンで考えられる任意のロジックを実装できます。

Neo4Jに切り替え可能なGremlinサーバーが同梱されていることを本当に望んでいます(読んでみると、これは以前はそうでした)。ライブのNeo4Jインスタンスに対してGremlinを実行することはできますが、多くのフープをジャンプする必要があります。私の希望は、Neo4Jの競合他社がオプションとしてグレムリンを許可しているので、Neo4Jがそれに続くことです。

于 2019-04-10T00:03:13.927 に答える
8

Cypherは、グラフデータベースをクエリするための宣言型クエリ言語です。宣言型という用語は重要です。これは、命令型のようなプログラミングパラダイムとは異なるプログラミング方法であるためです。

CypherやSQLのような宣言型クエリ言語では、基になるエンジンにどのデータをフェッチするかを指示し、データのフェッチ方法を指定しません。

Cypherでは、ユーザーはMATCH句で対象のサブグラフを定義します。次に、基盤となるエンジンがパターンマッチングアルゴリズムを実行して、グラフデータベース内のサブグラフの類似したオカレンスを検索します。

グレムリンは、宣言型と命令型の両方の機能です。これはグラフ走査言語であり、ユーザーはグラフのナビゲート方法について明示的な指示を与える必要があります。

この場合のこれらの言語の違いは、Cypherでは、クリーネ閉包演算子を使用して、グラフデータベース内の任意の2つのノード間のパスを見つけることができることです。ただし、Gremlinでは、そのようなすべてのパスを明示的に定義する必要があります。しかし、Gremlinで繰り返し演算子を使用して、グラフデータベースでそのような明示的なパスの複数のオカレンスを見つけることができます。ただし、Cypherでは明示的な構造に対して反復を行うことはできません。

于 2019-02-20T07:34:30.173 に答える
4

グレムリンを使用する場合は、別のグラフデータベースに移行できます。ほとんどのグラフデータベースはグレムリントラバーサルをサポートしているため、グレムリンを選択することをお勧めします。

于 2019-10-26T10:51:47.823 に答える
3

長い答え短い:クエリにはサイファーを使用し、トラバーサルにはグレムリンを使用します。応答のタイミングは自分で確認できます。

于 2018-03-20T18:36:29.280 に答える