Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 链接分析模式搜索_Algorithm_Social Networking_Graph Algorithm_Graph Databases - Fatal编程技术网

Algorithm 链接分析模式搜索

Algorithm 链接分析模式搜索,algorithm,social-networking,graph-algorithm,graph-databases,Algorithm,Social Networking,Graph Algorithm,Graph Databases,问题描述 我正在一个巨大的图形数据库上实现一个链接分析算法 图形数据库由实体(顶点)和关系(边)构成 每个实体类型都有属性。例如Person:[年龄、身高、体重] 每个关系也有属性:例如呼叫(电话、电话):[日期、持续时间]或拥有(个人、电话):[开始日期、结束日期] 现在,我得到了具有以下结构的模式: [实体类型,约束][关系类型,约束][实体类型,约束][关系类型,约束]。。。[实体类型、约束条件] 例如: [个人,年龄>20岁][拥有,开始日期>2010年1月1日][电话,以“5”结尾][

问题描述

我正在一个巨大的图形数据库上实现一个链接分析算法

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

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

每个关系也有属性:例如呼叫(电话、电话):[日期、持续时间]或拥有(个人、电话):[开始日期、结束日期]

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

[实体类型,约束][关系类型,约束][实体类型,约束][关系类型,约束]。。。[实体类型、约束条件]

例如:

[个人,年龄>20岁][拥有,开始日期>2010年1月1日][电话,以“5”结尾][通话日期>2010年1月1日][电话,以“6”开头][拥有,开始日期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连接”/“使用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您只需要满足条件的路径,对吗?它不会重新评估失败的路径(每个条件最多在一个节点上测试一次)。是的,它确实需要很大的空间。