问题描述
我正在一个巨大的图形数据库上实现一个链接分析算法。
图数据库由实体(顶点)和关系(边)构成。
每个实体类型都有属性。例如Person : [age,height,weight]。
每个关系也有属性:例如Call(Phone,Phone) : [date, duration]或 Own(Person, Phone) : [start-date, end-date]。
现在,我得到了具有以下结构的模式:
[实体类型,约束] [关系类型,约束] [实体类型,约束] [关系类型,约束] ... [实体类型,约束]
例如:
[人,年龄>20] [拥有,开始日期>1/1/2010] [电话,以“5”结尾] [通话日期>1/1/2010] [电话,以“6”开头] [拥有由,开始日期<1/2/2011] [人,身高>40]。
我需要为模式中的所有实体和关系找到所有有效的分配。
我可以使用以下原语查询数据库:
- 查找给定约束集的前 1000 个[entity-type,relationship-type,entity-type]分配。
- 为上述查找下一个 1000
- 为给定的一组约束找到第一个[concrete-entity,relationship-type,entity-type]分配。
- 为上述查找下一个 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”之类的答案......