私はグラフデータベースに適しているような問題がありますが、それを適用する最善の方法は不明です。評判拡散にグラフデータベースを使用するには?
第1の方向のリンクを持つことができるオブジェクトのセットがあります(そのうちの何百万の数十は、/アウト数の典型的なリンクは、オブジェクトあたり数千です)。そして、各オブジェクトは潜在的に非常に多数のユーザーからの評判(upvotes、karmaなど)を蓄積することができます(数千万も)。
難しいのは、ユーザーがオブジェクトの評判を調整するたびに、いくつかのかなり複雑なルールに基づいて、すべてのリンクされたオブジェクトの評判を(おそらく第1度を超えて)更新することです。 SQLで
、これはこのようなものになります。これはグラフを扱っているので
CREATE TABLE objects (id INTEGER PRIMARY KEY);
CREATE TABLE object_links (from_object_id INTEGER, to_object_id INTEGER);
CREATE TABLE users (id INTEGER PRIMARY KEY);
CREATE TABLE object_reputations (object_id INTEGER, user_id INTEGER, reputation FLOAT);
UPDATE
object_reputations
SET
object_reputations.reputation = object_reputations.reputation + ... # some formula goes here
FROM
object_reputations
INNER JOIN object_links
ON object_reputations.object_id = object_links.to_object_id
WHERE
object_links.from_object_id = ...;
を、グラフデータベースは、自然なフィット感であるように見えるが、のNeo4j/OrientDBの迅速な読み取りからでしょう/ Blazegraph/Tinkerpop APIを使用しているので、私はどのようにしてこの問題を彼らができることにマップするのかを理解できません。
例としてTinkerpopを使用して、オブジェクトは、オブジェクト間のリンクは(今のところ、すべての良い)エッジの頂点されていると評判がありますか...? VertexPropetriesの可能性はありますが、ユーザーと同じように頂点ごとに多くのプロパティが潜在的にどのように拡大するかはわかりません。あるいは、評判はユーザーの頂点からの重み付けされたエッジです...異なる種類のパフォーマンスの問題があるようです。
あなたは人気のグラフデータベースの一つにこの種の問題の簡単な翻訳を与えることができますか?
SQLの例では、各オブジェクトがユーザーごとに「評判」を持つように見えます。 「評判」はすべてのユーザーにとって同じではありませんか?あなたのモデルでobject_reputationsが何をしているのかを明確にしてください。 –
@stephenmallette修正すると、すべてのオブジェクトはすべてのユーザーに異なる評判を与えます。すべてのオブジェクトが実際にはそうではなく(評判がグラフにどれだけ拡散しているかにもよるが)、すべてのオブジェクトの10%が1つの特定のユーザーにとって評判を持つだろう。 –