web-dev-qa-db-ja.com

Neo4j-Cypher対Gremlinクエリ言語

私はREST APIを使用してNeo4jで開発を始めています。Cypher(Neo4jのクエリ言語)とGremlin(汎用グラフクエリ/トラバーサル)言語)。

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

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

87
Rubinsh

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

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

いつでもCypherを(数日で)本当に速く学習し、その後(より長い期間実行される)一般的なグレムリンを続けることができます。

65
ulkas

クエリで数千のノードを横断する必要があります。サイファーは遅かった。 Neo4jチームは、Java APIに対してアルゴリズムを直接実装すると、100から200倍速くなると言いました。そうし、簡単に60の係数を取得しました。自信がないためにシステムでクエリを実行します。簡単なCypherクエリはJavaで簡単に記述でき、複雑なクエリは実行されません。問題は、クエリに複数の条件がある場合に、Cypherでどの順序でそのため、最初に暗号クエリが間違った方向からグラフに突入する可能性があります。グレムリンを使って多くのことを行ったわけではありませんが、グレムリンを使用すると、実行制御が大幅に向上します。

37
Heinrich

Neo4jチームのCypherへの取り組みは本当に印象的で、長い道のりを歩んできました。 Neoチームは通常、人々をそれに向かわせます。Cypherが成熟するにつれて、Gremlinはおそらくあまり注目されなくなります。サイファーは長期的に選択するのに適しています。

つまり、GremlinはGroovy DSLです。 Neo4j RESTエンドポイントで使用すると、基になるNeo4j Java APIへの完全で自由なアクセスが可能になります。同じカテゴリ内の他のスクリプトプラグイン)低レベルのパワーの点で一致します。さらに、 Gremlinプラグイン内からの暗号化 を実行できます。

いずれにせよ、両方を学ぶことができる正しいアップグレードパスがあります。私はあなたをより速く稼働させるものと一緒に行きます。 myprojects では、通常、Gremlinを使用してから、表形式の結果または表現力豊かなパターンマッチングが必要な場合にCypherを呼び出します(Gremlin内かどうかにかかわらず) DSL。

27
Matt Luongo

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

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

ただし、データのクエリだけが必要な場合は、Cypherを使用します。Cypherの方が読みやすく、保守しやすいためです。 Gremlinは、制限に達した場合のフォールバックです。

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

8
Tohotom

Cypherは、グラフデータベースをクエリするための宣言型クエリ言語です。宣言型という用語は重要です。なぜなら、命令型のようなプログラミングパラダイムとは異なるプログラミング方法だからです。 CypherやSQLなどの宣言型クエリ言語では、基になるエンジンにどのデータを取得するかを指定し、データの取得方法を指定しません。 Cypherでは、ユーザーはMATCH句で対象のサブグラフを定義します。次に、基礎となるエンジンはパターンマッチングアルゴリズムを実行して、グラフデータベース内のサブグラフの類似した出現を検索します。グレムリンは宣言的機能と命令的機能の両方です。これは、ユーザーがグラフのナビゲート方法について明示的な指示を与えなければならないグラフ走査言語です。この場合のこれらの言語の違いは、Cypherでは、Kleeneスター演算子を使用して、グラフデータベース内の任意の2つのノード間のパスを検索できることです。ただし、Gremlinでは、このようなすべてのパスを明示的に定義する必要があります。しかし、Gremlinでrepeat演算子を使用して、グラフデータベースでそのような明示的なパスの複数の出現を見つけることができます。ただし、Cypherでは明示的な構造に対して反復を行うことはできません。

3
Chandan Sharma

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

Neo4Jは、Cypherが代替パスエクスパンダーを含むAPOCプロシージャ(apoc.path.expandapoc.path.subgraphAllなど)。

グレムリンは学ぶのが難しいですが、CypherやAPOCよりも強力です。 Gremlinで考えられるロジックを実装できます。

Neo4Jにトグル可能なGremlinサーバーが付属していることを本当に願っています(読み返してみると、これが事実でした)。ライブのNeo4Jインスタンスに対してGremlinを実行できますが、多くのフープをジャンプする必要があります。私の希望は、Neo4Jの競合他社がオプションとしてGremlinを許可しているので、Neo4Jがそれに続くことです。

3
user1302130

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

2
Sagar Sarin