あり、このクエリを実行するには、いくつかの方法があり、そしてそれはまた、あなたがパラメータを追加したい場所によって異なりますが、簡潔にするために私はあなたが問題に近づく方法の一つを理解するのを助けるために、この非常に冗長な質問を以下に構築しました。
あなたのユーザーレコードの_id
を特定し、次に従うすべての友人の_id
を見つけて、1つのクエリですべての関連するレビューを解決することです。
私は、以下の異なるアプローチを取る、それはにある:
- あなたは
- を書かれているレビューは、あなたが
- に従う者決定決定あなたは従う人々が
- を書いたレビューを確認しあなたのクチコミをあなたのフォローしている人々のものと合併してください。
これらをマージすることは可能ですクエリをより最適にまとめることができましたが、どのようなデータが利用できるかを確認するのに役立つように、これを壊して各ステージの出力と最終的な回答を表示する価値があると思いました。
AQLグラフクエリについて理解しておくべき重要なことは、クエリ実行時に頂点、エッジ、パスにアクセスする方法です。
パスはそれ自身のオブジェクトであり、パス情報としてどのように悪用するかを理解するために、そのオブジェクトの内容を調べる価値があります。
このクエリでは、前提としています
users
文書コレクションが含まれているユーザー
places
文書コレクションは場所
follows
エッジコレクションは
reviews
エッジコレクションはレビューの人々が を書い追跡する他のユーザー以下のユーザーを追跡が含まれています
注:各レコードにid
を指定する場合は、review
のid
を使用しました。このIDを知っていれば、user
とplace
の両方のid
が得られます。 review
。
LET my_reviews = (
FOR vertices, edges, paths IN 1..1 OUTBOUND "users/6327" reviews
RETURN {
name: FIRST(paths.vertices).name,
review_id: FIRST(paths.edges)._id,
review: FIRST(paths.edges).review,
place: LAST(paths.vertices).place
}
)
LET who_i_follow = (
FOR v IN 1..1 OUTBOUND "users/6327" follows
RETURN v
)
LET reviews_of_who_i_follow = (
FOR users IN who_i_follow
FOR vertices, edges, paths in 1..1 OUTBOUND users._id reviews
RETURN {
name: FIRST(paths.vertices).name,
review_id: FIRST(paths.edges)._id,
review: FIRST(paths.edges).review,
place: LAST(paths.vertices).place
}
)
RETURN {
my_reviews: my_reviews,
who_i_follow: who_i_follow,
reviews_of_who_i_follow: reviews_of_who_i_follow,
merged_reviews: UNION(my_reviews, reviews_of_who_i_follow)
}
paths.vertices
における最初の頂点は、開始頂点(users/6327
)である
paths.vertices
における最後の頂点は、例えば、パスの終端でありますあなたはpaths.edges
での最初のエッジがplace
製user
はここでのparamを取り、クエリの別のよりコンパクトなバージョン、「あなた」であるユーザーの_idであることをレビューです
に従う者。
LET target_users = APPEND(TO_ARRAY(@user), (
FOR v IN 1..1 OUTBOUND @user follows RETURN v._id
))
LET selected_reviews = (
FOR u IN target_users
FOR vertices, edges, paths in 1..1 OUTBOUND u reviews
LET user = FIRST(paths.vertices)
LET place = LAST(paths.vertices)
LET review = FIRST(paths.edges)
RETURN {
name: user.name,
review_id: review._id,
review: review.review,
place: place.place
}
)
RETURN selected_reviews
非常によく記述され説明されています。努力に感謝します。 私は、問題を小さなステップに分解しなければならないと感じました。私は間違いを犯したと思います。データを一度に抽出しようとしていました。 同じクエリを解決しようとしているときに、グラフデータベースを通常のRDBMSと比較すると、それほど効率的ではありませんか? – Fouad
助けてくれてうれしいです。グラフ・データベースを使用する必要があるかどうか尋ねることは良い質問です。多対多表を使用する従来のRDBMSデータベースでデータ・モデルをテストする価値があります。グラフデータベースのキーは、大規模なデータセットを処理する場合、RDBMSよりもパフォーマンスが一般的に低下することです。グラフデータベースは、グラフの問題を解決するためのクエリー表記法を提供し、エッジにデータを簡単に保存できます。すべてはRDBMSデータベースで行うことができますが、より多くの作業を行う必要があります。元の質問の範囲を超えて、それは常に質問する価値があります。 –