Algorithm 链接分析模式搜索
问题描述 我正在一个巨大的图形数据库上实现一个链接分析算法 图形数据库由实体(顶点)和关系(边)构成 每个实体类型都有属性。例如Person:[年龄、身高、体重] 每个关系也有属性:例如呼叫(电话、电话):[日期、持续时间]或拥有(个人、电话):[开始日期、结束日期] 现在,我得到了具有以下结构的模式: [实体类型,约束][关系类型,约束][实体类型,约束][关系类型,约束]。。。[实体类型、约束条件] 例如: [个人,年龄>20岁][拥有,开始日期>2010年1月1日][电话,以“5”结尾][通话日期>2010年1月1日][电话,以“6”开头][拥有,开始日期40] 我需要找到模式中所有实体和关系的所有有效赋值 我可以使用以下原语查询数据库:Algorithm 链接分析模式搜索,algorithm,social-networking,graph-algorithm,graph-databases,Algorithm,Social Networking,Graph Algorithm,Graph Databases,问题描述 我正在一个巨大的图形数据库上实现一个链接分析算法 图形数据库由实体(顶点)和关系(边)构成 每个实体类型都有属性。例如Person:[年龄、身高、体重] 每个关系也有属性:例如呼叫(电话、电话):[日期、持续时间]或拥有(个人、电话):[开始日期、结束日期] 现在,我得到了具有以下结构的模式: [实体类型,约束][关系类型,约束][实体类型,约束][关系类型,约束]。。。[实体类型、约束条件] 例如: [个人,年龄>20岁][拥有,开始日期>2010年1月1日][电话,以“5”结尾][
- 查找给定约束集的前1000个[实体类型、关系类型、实体类型]分配
- 为以上内容查找下一个1000
- 查找给定约束集的第一个[具体实体、关系类型、实体类型]指定
- 为以上内容查找下一个1000
Get first 1000 (ET1-RT1-ET2)
for each concrete ET2:
Get first 1000 (ET2-RT2-ET3)
for each concrete ET3:
...
问题是我可能不止一次地解决相同的子问题
我正在寻找一种算法,消除这种冗余,这也是内存效率
注:
我在找一个算法。不是为了回答“使用SQL连接”/“使用SPARQL”…动态编程应该在这里有所帮助 让我们将规则简化为R1-R2-R3…Rk 让next_节点(node x,Rule 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
您应该能够将集合存储为哈希表或树(任何日志(n)搜索和更新时间数据结构)
虽然我省略了保持遍历路径的部分,但这应该很容易做到。对于集合中的每个元素,添加一个名为“path”的属性,并在每次迭代时追加当前节点。请注意,多条路径可能会指向同一中间/最终节点。不确定算法,但您是否考虑过只记录子问题的结果;我希望我有一个很好的链接you@Gerrat:恐怕简单的查找表太大了。我这里需要更复杂的东西。此方法将只存储满足条件的路径。它将重新评估失败的路径(大多数路径)。它可能还需要大量的临时存储。@LiorKogan您只需要满足条件的路径,对吗?它不会重新评估失败的路径(每个条件最多在一个节点上测试一次)。是的,它确实需要很大的空间。