链接分析模式搜索

时间:2012-02-02 21:45:11

标签: algorithm social-networking graph-algorithm graph-databases

问题说明

我正在庞大的图形数据库上实现链接分析算法。

图形数据库由实体(顶点)和关系(边缘)构成。

每个实体类型都有属性。例如人:[年龄,身高,体重]

每个关系也有属性:例如呼叫(电话,电话):[日期,持续时间] 或自己(人,电话):[开始日期,结束日期]。< / p>

现在,我获得了具有以下结构的模式:

[entity-type,constrains] [relationship-type,constrains] [entity-type,constrains] [relationship-type,constrains] ... [entity-type,constrains]

例如:

[人,年龄> 20] [自己,开始日期&gt; 2010年1月1日] [手机,以'5'结尾] [通话日期&gt; 2010年1月1日] [手机,以'6'] [所有者,开始日期&lt; 1/2/2011] [人,身高&gt; 40]

我需要找到模式中所有实体和关系的所有有效赋值。

我可以使用以下原语查询数据库:

  • 查找给定约束集的前1000个 [实体类型,关系类型,实体类型] 分配。
  • 为上述
  • 找到下一个1000
  • 查找给定约束集的第一个 [具体实体,关系类型,实体类型] 分配。
  • 为上述
  • 找到下一个1000

在RAM中保留给定查询的所有答案是不可能的。 每个实体 - 关系 - 实体三元组可能有数百万(数十亿?)的分配。但是,假设整个模式的分配数量很少。

我尝试了什么:

对于链 ET1-RT1-ET2-RT2-ET3-RT3 ... 一个天真的实现将是:

Get first 1000 (ET1-RT1-ET2)   
for each concrete ET2:
    Get first 1000 (ET2-RT2-ET3)
        for each concrete ET3:
            ...

问题在于我可能不止一次地解决相同的子问题。

我正在寻找一种能够消除这种冗余的算法,这种算法也可以节省内存。

注意:

我正在寻找一种算法。不是像“使用SQL JOIN”/“使用SPARQL”......

这样的答案

1 个答案:

答案 0 :(得分:0)

动态编程在这里应该会有所帮助。

让我们将规则简化为R1-R2-R3 ...... Rk。

让next_nodes(节点x,规则R)返回符合规则R的链接x的所有节点。如果R是实体约束:如果条件满足则返回相同节点的单例集,否则返回空集。对于关系约束,它返回满足条件的所有链接节点。

Initialize cur_set to all set of nodes.

nextset = {}

For each rule R in Ri:
    for each node x in cur_set:
        nextset = nextset U next_nodes(x)
    cur_set = nextset

您应该能够将集合存储为哈希表或树(任何log(n)搜索和更新时间数据结构)。

虽然我省略了保留遍历路径的部分,但它应该很容易实现。对于集合中的每个元素,添加一个名为“path”的属性,并在每次迭代时附加当前节点。请注意,多个路径可能会导致相同的中间/最终节点。