Arangodb-aql-example-queries
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番目の質問を考えてみましょう:「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"
]
第三の質問
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
}
]
残りの質問については、クエリの形成について説明し、クエリのみを提供します。 リーダーは、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()