问题说明
我正在庞大的图形数据库上实现链接分析算法。
图形数据库由实体(顶点)和关系(边缘)构成。
每个实体类型都有属性。例如人:[年龄,身高,体重] 。
每个关系也有属性:例如呼叫(电话,电话):[日期,持续时间] 或自己(人,电话):[开始日期,结束日期]。< / 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] 。
我需要找到模式中所有实体和关系的所有有效赋值。
我可以使用以下原语查询数据库:
在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”......
这样的答案答案 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”的属性,并在每次迭代时附加当前节点。请注意,多个路径可能会导致相同的中间/最终节点。