2

以下に示すように、IBM Graph (Cassandra に支えられた TitanDB) でモデル化された非常に基本的なニュース フィードがあります。

ここに画像の説明を入力

次のことを行うクエリを作成しようとしています。

  1. 頂点から開始USER: John.Smith
  2. ユーザーからの最新の 15 の投稿FRIENDSを自分の投稿と組み合わせて取得します。
  3. USER: John.Smithそれらの投稿のいずれかが好きかどうかを確認しis_liked、各投稿の単純なブール プロパティとして返します。

このクエリには、いくつかの前提条件があります。

  • 返される各投稿では、投稿のプロパティUSERも返される必要があります。この質問のために、avatarプロパティのみが必要です。
  • これらの結果をページ付けできるようにする必要があります。つまり、上位 15 件の投稿を取得したら、次の 15 件、次の投稿などを返すことができる必要があります。

ユーザーの友達を取得するのに問題はありませんLATEST_POSTS

g.V().hasLabel("USER").has("userid", "John.Smith").both("FRIEND").out("LATEST_POST");

私はTinkerpopのドキュメントを読みましたが、私の要件を満たすためにこのクエリに基づいて構築を開始する方法についてまだ迷っています。

また、パフォーマンス、データ モデリング、スキーマ、またはインデックス作成のアドバイスに関するこのアプローチに関するコメントは、非常に役立ちます。つまり、このアプローチでフィードをリアルタイムで大規模に取得できると期待する必要がありますか?

前もって感謝します。

4

2 に答える 2

4

特定のグラフ スキーマの場合、クエリは次のようになります。

g.V().has("user", "userid", "John.Smith").as("john").
  union(identity(), both("FRIEND")).as("user").
  out("LATEST_POST").
  flatMap(emit().repeat(out("PREVIOUS_POST")).range(page * pageSize, (page + 1) * pageSize)).as("post").
  choose(__.in("LIKED").where(eq("john")), constant(true), constant(false)).as("likedByJohn")
  select("user", "post", "likedByJohn")

しかし、Alaa は、このアプローチはスケーリングしないことと、グラフ スキーマを改善する方法をすでに指摘しています。

于 2016-10-25T12:19:51.020 に答える