Arangodb-aql-example-queries

提供:Dev Guides
移動先:案内検索

ArangoDB-AQLのクエリ例

この章では、 Actors and Movies データベースでのいくつかのAQLサンプルクエリを検討します。 これらのクエリはグラフに基づいています。

問題

以下に示すように頂点を接続するために、俳優のコレクションと映画のコレクション、およびactInエッジコレクション(年プロパティ付き)を指定します-

*[俳優] <-演技-> [映画]*

どのように取得しますか-

  • 「movie1」または「movie2」で演技したすべての俳優ですか?
  • 「movie1」と「movie2」の両方で演技したすべての俳優は?
  • 「actor1」と「actor2」の間のすべての一般的な映画は?
  • 3本以上の映画に出演したすべての俳優は?
  • ちょうど6人の俳優が出演したすべての映画ですか?
  • 映画による俳優の数は?
  • 俳優による映画の数は?
  • 2005年から2010年の間に俳優が演じた映画の数は?

溶液

上記のクエリに対する解答を取得する過程で、Arangoshを使用してデータセットを作成し、クエリを実行します。 AQLクエリはすべて文字列であり、Arangoshの代わりにお気に入りのドライバーに簡単にコピーできます。

Arangoshでテストデータセットを作成することから始めましょう。 まず、C:%5CApache24%5Chtdocs%5Carangodb%5Cdataset.js [このファイル]をダウンロードします−

# wget -O dataset.js
https://drive.google.com/file/d/0B4WLtBDZu_QWMWZYZ3pYMEdqajA/view?usp=sharing

出力

...
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: ‘dataset.js’
dataset.js [ <=> ] 115.14K --.-KB/s in 0.01s
2017-09-17 14:19:12 (11.1 MB/s) - ‘dataset.js’ saved [117907]

上記の出力から、JavaScriptファイル* dataset.js。がダウンロードされていることがわかります。このファイルには、データベースにデータセットを作成するためのArangoshコマンドが含まれています。 コマンドを1つずつコピーして貼り付ける代わりに、Arangoshで-javascript.execute *オプションを使用して、複数のコマンドを非対話的に実行します。 命の恩人のコマンドと考えてください!

今シェルで次のコマンドを実行します-

$ arangosh --javascript.execute dataset.js

シェルのコマンド

上記のスクリーンショットでわかるように、プロンプトが表示されたらパスワードを入力します。 これでデータが保存されたので、AQLクエリを作成して、この章の最初に挙げた特定の質問に答えます。

最初の質問

最初の質問を見てみましょう:「movie1」または「movie2」で演技したすべての俳優。 「TheMatrix」または「TheDevilsAdvocate」で行動したすべての俳優の名前を見つけたいとします-

私たちは俳優の名前を取得するために一度に1つの映画から始めます-

127.0.0.1:8529@_system> db._query("FOR x IN ANY 'movies/TheMatrix' actsIn
OPTIONS {bfs: true, uniqueVertices: 'global'} RETURN x._id").toArray();

出力

私たちは次の出力を受け取ります-

[
   "actors/Hugo",
   "actors/Emil",
   "actors/Carrie",
   "actors/Keanu",
   "actors/Laurence"
]

最初の質問

今、私たちは解決策になる2つのNEIGHBORSクエリのUNION_DISTINCTを形成し続けます-

127.0.0.1:8529@_system> db._query("FOR x IN UNION_DISTINCT ((FOR y IN ANY
'movies/TheMatrix' actsIn OPTIONS {bfs: true, uniqueVertices: 'global'} RETURN
y._id), (FOR y IN ANY 'movies/TheDevilsAdvocate' actsIn OPTIONS {bfs: true,
uniqueVertices: 'global'} RETURN y._id)) RETURN x").toArray();

出力

[
   "actors/Charlize",
   "actors/Al",
   "actors/Laurence",
   "actors/Keanu",
   "actors/Carrie",
   "actors/Emil",
   "actors/Hugo"
]

最初の質問2

二番目の質問

2番目の質問を考えてみましょう:「movie1」と「movie2」の両方で演技したすべての俳優。 これは上記の質問とほとんど同じです。 しかし、今回はUNIONではなくINTERSECTIONに興味があります-

127.0.0.1:8529@_system> db._query("FOR x IN INTERSECTION ((FOR y IN ANY
'movies/TheMatrix' actsIn OPTIONS {bfs: true, uniqueVertices: 'global'} RETURN
y._id), (FOR y IN ANY 'movies/TheDevilsAdvocate' actsIn OPTIONS {bfs: true,
uniqueVertices: 'global'} RETURN y._id)) RETURN x").toArray();

出力

私たちは次の出力を受け取ります-

[
   "actors/Keanu"
]

2番目の質問

第三の質問

3番目の質問を考えてみましょう:「actor1」と「actor2」の間のすべての一般的な映画。 これは実際には、movie1とmovie2の一般的な俳優に関する質問と同じです。 開始頂点を変更するだけです。 例として、Hugo Weaving( "Hugo")とKeanu Reevesが共演しているすべての映画を見つけましょう-

127.0.0.1:8529@_system> db._query(
   "FOR x IN INTERSECTION (
      (
         FOR y IN ANY 'actors/Hugo' actsIn OPTIONS
         {bfs: true, uniqueVertices: 'global'}
          RETURN y._id
      ),

      (
         FOR y IN ANY 'actors/Keanu' actsIn OPTIONS
         {bfs: true, uniqueVertices:'global'} RETURN y._id
      )
   )
   RETURN x").toArray();

出力

私たちは次の出力を受け取ります-

[
   "movies/TheMatrixReloaded",
   "movies/TheMatrixRevolutions",
   "movies/TheMatrix"
]

第三の質問

4番目の質問

4番目の質問について考えてみましょう。 * 3本以上の映画に出演したすべての俳優*。 この質問は異なります。ここでは隣接関数を使用できません。 代わりに、エッジインデックスとグループ化にAQLのCOLLECTステートメントを使用します。 基本的な考え方は、 startVertex (このデータセットでは常にアクターです)によってすべてのエッジをグループ化することです。 次に、ここで俳優が演じた映画の数を含めたので、結果から3本未満の映画を持つすべての俳優を削除します-

127.0.0.1:8529@_system> db._query("FOR x IN actsIn COLLECT actor = x._from WITH
COUNT INTO counter FILTER counter >= 3 RETURN {actor: actor, movies:
counter}"). toArray()

出力

[
   {
      "actor" : "actors/Carrie",
      "movies" : 3
   },

   {
      "actor" : "actors/CubaG",
      "movies" : 4
   },

   {
      "actor" : "actors/Hugo",
      "movies" : 3
   },

   {
      "actor" : "actors/Keanu",
      "movies" : 4
   },

   {
      "actor" : "actors/Laurence",
      "movies" : 3
   },

   {
      "actor" : "actors/MegR",
      "movies" : 5
   },

   {
      "actor" : "actors/TomC",
      "movies" : 3
   },

   {
      "actor" : "actors/TomH",
      "movies" : 3
   }
]

第4質問

残りの質問については、クエリの形成について説明し、クエリのみを提供します。 リーダーは、Arangoshターミナルでクエリを実行する必要があります。

5番目の質問

5番目の質問を考えてみましょう:正確に6人の俳優が出演したすべての映画。 前のクエリと同じ考え方ですが、等価フィルタを使用します。 しかし、今では俳優の代わりに映画が必要なので、* _to属性*を返します-

db._query("FOR x IN actsIn COLLECT movie = x._to WITH COUNT INTO counter FILTER
counter == 6 RETURN movie").toArray()

映画による俳優の数は?

エッジのデータセット _to で映画に対応しているのを覚えているので、同じ _to が表示される頻度をカウントします。 これはアクターの数です。 クエリは以前のものとほとんど同じですが、COLLECTの後に* FILTERなし*

db._query("FOR x IN actsIn COLLECT movie = x._to WITH COUNT INTO counter RETURN
{movie: movie, actors: counter}").toArray()

6番目の質問

6番目の質問:*俳優による映画の数*を考えてみましょう。

上記のクエリの解決策を見つける方法は、このクエリの解決策も見つけるのに役立ちます。

db._query("FOR x IN actsIn COLLECT actor = x._from WITH COUNT INTO counter
RETURN {actor: actor, movies: counter}").toArray()