我有一個問題,似乎很適合圖形數據庫,但我不確定應用它的最佳方法。如何使用圖形數據庫進行信譽擴散?
首先有一組對象可以有定向鏈接(數千萬個,典型的鏈接輸入/輸出數量是每個對象幾千個)。然後,每個對象都可以從潛在的非常大量的用戶(也有數千萬)中累積聲譽(認爲upvotes,karma等)。
棘手的部分是,每當用戶調整對象的聲譽,我想基於一些相當複雜的規則,以更新其所有的鏈接對象的聲譽(可能超越一級)。
在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 APIs,我無法弄清楚如何將這個問題映射到他們可以做的事情上。
以Tinkerpop爲例,對象是頂點,對象之間的鏈接是邊(到目前爲止都是好的),聲譽是...?可能是VertexPropetries,但我不確定事情會如何擴展,每個頂點的用戶數量可能與用戶數量一樣多。或者可能聲譽是來自用戶頂點的加權邊緣......這似乎具有不同類型的性能問題。
你可以將這種問題簡單地翻譯成流行的圖形數據庫之一嗎?
在你的SQL例子中,它看起來有點像每個對象有每個用戶的「信譽」。所有用戶的「聲譽」是不一樣的嗎?您能否更好地澄清一下object_reputations在模型中的含義? –
@stephenmallette正確,每個物體對每個用戶都有不同的聲望。並非所有的對象都會在實踐中使用(這取決於聲望在圖表中擴散的程度),但是可能有10%的所有對象都對某個特定用戶有聲望。 –