我有一个问题,似乎很适合图形数据库,但我不确定应用它的最佳方法。如何使用图形数据库进行信誉扩散?
首先有一组对象可以有定向链接(数千万个,典型的链接输入/输出数量是每个对象几千个)。然后,每个对象都可以从潜在的非常大量的用户(也有数千万)中累积声誉(认为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%的所有对象都对某个特定用户有声望。 –