大规模知识图谱的分布式存储与检索技术研究

1    绪论

1.1    课题研究背景

分布式理论上支持无限扩充,且增加了系统并发能力,同时也可以减轻检索过程中过多的服务请求对单台服务器造成过大的处理压力,从而有效的增加查询速度。

分布式方案的选择也意味着更为复杂的系统设计,因此有必要研究针对大规模数据集的分布式存储和检索技术。

1.2    国内外相关工作现状

知识图谱的存储方案目前有:

1、基于关系数据库,Rstar、3store

2、基于文件系统,SystemⅡ

3、图数据库,Neo4j、Taitan

4、基于内存,DBLink、Sesame

5、基于NoSql

数据集拆分方法主要有:

1、静态方式,直接把ID或者其他关键字给取模

2、动态方式--Hash

3、负载均衡

1.3    课题研究内容及意义

由于分布式的一些特点会导致分布式环境中通信开销大,因此研究如何通过数据集合的有效拆分减少查询的次数,从而减少服务器之间的通信是有意义的。

1.4    论文的组织结构

第一章、课题相关内容,课题分析与总结,本文组织结构

第二章、描述了基于词汇语义相似度及节点度数的方法

第三章、研究子图查询方法

第四章、系统设计

第五章、系统搭建,实验

第六章、对本文提出的方法进行总结,并提出不足之处

2    基于词汇语义相似度及节点度数的分布式存储

2.1    基于词汇语义相似度及节点度数的知识图谱分布式存储策略

定义1,图G定义为G(V,E,L),其中V={v1,v2,...,vn}表示顶点,表示边,即关系,L为节点之间关系的标签。

2.2    图谱分割

2.2.1    常见的数据划分方法

1、哈希方法

2、聚类划分方法

聚类包括下列典型类型:

    1、基于层次的算法

    2、基于划分的算法

    3、基于密度的算法

    4、基于网格的算法(grid)

    5、基于模型的算法(model)

聚类划分

3、基于知网词汇语义相似度方法

词语距离计算

    1、统计

    2、把本体或者分类关系组织成树状结构来进行量化计算

基于知识体系

基于语料库

在网络基础上计算相似度

哈希方法及其改进的一些算法主要集中在数据集在分配时要考虑小同存储服务器的负载升使得服务器群的容错性高,而聚类划分和基于知网语义相似度的方法是采用人工智能的非监督或者监督方法来对数据集合划分,它们的主要的侧重点是相同或者类似的节点划分在一起,从而在查询中更容易在一台机器查找相关信息,但是如果给定的数据集合聚合程度很高,使得相当多的数据集中在极少数的机器上,必然会导致机器的负载承受的问题,当某些服务器聚集了更多关系紧密的节点及关系数据,当超过负载,在集群服务器多线程并发查找消息时必然会影响数据查询的效率。

2.2.2    基于词汇语义相似度和节点度数的分割方法

本文提出基于词汇语义相似度及节点密度的分割方法,在分割的时候综合考虑了关系标签语义的相似度以及节点和关系的密度,使得关系密切的点和关系尽量集中分布到一台服务器上。

对于N台存储服务器,首先随机选取度数最大并且不存在直接关系的N个节点(例如,不存在直接关系的节点,即不允许直接关系(Vi,Vj)的存在,允许间接联系(Vi,Vk),(Vk,Vj) 存在),对于剩下的全部节点,计算待分配的节点和全部的服务器中的节点组成的图中的总度数和,并且计算待分配节点和服务器中节点组成新的关系的标签的语义相似度的平均值(例如待分布节点Vi和服务器Ni中的节点Vj、Vk、Vm组成关系,求得关系(Vi,Vj)、(Vi,Vk)、(Vi,Vm)标签的相似度并取平均值,即

其中分子为待计算的节点同服务器中当前存在的节点形成的关系的标签的语义相似度之和,分母为待计算的节点同服务器中的节点形成关系数量)作为权重求和的一部分;接着计算待分配节点和服务器中的全部节点形成的图的总度数之和并除以全部节点数量的均值,

其中分子为待计算的节点同服务器中的节点形成关系数量之和加上Ni服务器中已存在的关系数量,分母为Ni服务器中的节点数量并加上待加入的节点数量1,并选取这些均值作为权重求和的一部分,最后把相似度的平均值与度数的平均值相加,然后按照总和最大的顺序递减排列候选服务器作为待分布的候选服务器的选择顺序,即

在确定候选服务器的排序后(优先选择的顺序,第一个为最优选择,最后一个为最差选择),接下来考虑负载均衡的问题。

对于负载均衡,采用一致性哈希方法的改进算法即带负载上限的方法来解决此问题。就是为每台服务器加入了一个能够承担的最大负载上限,其中最大负载上限为平均负载的(1+e)倍,此处的自定义e值自定为0.2,(例如存储服务的平均负载为100,当此服务器的负载为100 ∗ (1 + 0.2)时,如果当前待加入的节点及关系在加入服务器Ni后会导致此服务器的负载容量与平均负载相差20%时,就要排除当前候选服务器,然后按排好的顺序顺位选择下一个候选服务器,以此类推)。

分割算法伪代码

2.3    跨服务器关系节点冗余方法

CAP原则又称CAP定理,指的是在一个分布式系统中,一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)。CAP 原则指的是,这三个要素最多只能同时实现两点,不可能三者兼顾。

因为分区容错性是分布式数据库的一个根本条件,所以只存在CP、AP两种组合,其中CP对应一致性和分区容错性,所以可用性相对不高,而AP对应可用性和分区容错性,所以一般会导致一致性不太好。本文由于要对数据节点之间的关系进行冗余,由于冗余会导致一致性问题,这里主要选择CP模式。

冗余方法伪代码

数据集合复制冗余流程图

2.4    本章小结

本章节主要讨论了数据集合在分布式数据库中是如何划分的问题,分别对哈希方法及其相关的一些改进方法包括一致性哈希算法、考虑了负载上限的一致性哈希算法、加入了虚拟节点的一致性哈希算法)、聚类划分、基于知网词汇语义划分三类方法进行了介绍,,然后根据上面讨论的方法的相应优缺点,提出了本文采用的数据分割方法,即基于词汇语义相似度及节点密度的分割方法,此方法在考虑了节点关系密度的同时考虑了关系标签的语义相似度,使得关系更为紧密的图分布到同一台服务器,最后在此基础上加入了负载均衡的考虑,在本文中自定义负载上限值为1+e,其中e自定义为0.2。在均衡分割完数据集合后,对于跨不同服务器的节点和关系采用了复制冗余的方法,并对这些节点关系进行了标记。以上这些方法将会对下面的子图查询产生影响。

3    知识图谱子图检索

3.1    常用子图查询方法

当前子图查询作为nosql数据库的研究重点,受到了相当的关注。子图查询通常采用“过滤−−>验证”策略。

3.1.1    图的相关定义

定义2.子图查询,对于给定的图数据库G = {G1, G2, … Gn}和查询图q,找出所有匹配的图Gi,其中Gi ∈ D,使得q ⊆ Gi。

3.2    基于节点度数递减的子图查询方法

图的遍历包括深度和广度优先遍历两种方式。

两种方法都只能遍历每一个节点,却不能遍历每两个节点之间的关系(也就是图中所有的路径),而子图查询需要在存储服务器中查找所有节点及路径都相同的图,要遍历所有的关系,可以通过剪枝的方式来实现。

此算法在剪枝过程中要遵循正确性、准确性、高效性。前者正确性要求树枝不是随意的去修剪的,假如无所限制的修剪,很有可能会把含有最优解的树枝给剪掉。

因此,在剪枝过程中首先要保证的就是此操作不会使正确结果丢失从而影响最终结果的优良程度。

第二个准确的特性要求在保证了正确的前提上,在某个应用场景中去剪掉不可能包含最优解的枝条,最大化的去修剪,从而使得最终结果达到最优化,故评估一个算法设计是否优异的重要标准就是剪枝过程中每个步骤的准确性。

最后的高效性要求一个算法的好坏取决于搜索次数以及运行时间的减少,但是较少的搜索的次数与较少的搜索时间是相互矛盾的,因此在效率和优化上选择一个合适的折中方案,以期搜索的次数以及运行的时间尽可能的少。

剪枝算法优化,简单来说就是在遍历过程中加上某些限制条件,这些条件可以防止某些不必要的搜索,从而提高遍历的效率,但是剪枝到最后会剪掉所有的节点及关系,也就是相当于剪掉的枝条最后可以完整的组织成原始图。

原始图

方法一:按任意节点开始剪枝

随机剪枝

方法二:按节点最大度数递减剪枝

度数递减剪枝

方法三:按层次进行剪枝

层次剪枝

方法四:按节点度数递增进行剪枝

度数递增剪枝

如果子图分割成2级子图的个数越少,那么需要的查询的次数必定也最少,比较上面的方法,只有最大度数降低递减方法得到的子图数量最少,所以此文选取节点度数递减剪枝方法来分割子图,从而保证子图查询的次数降到最低。

子图查询的伪代码
子图查询的流程图

3.3    本章小结

本章讲解了图的两种遍历方法,这些方法主要用于节点的遍历而不是关系的遍历,接着介绍了剪枝的方法,本文采用节点最大度数递减的方式来进行剪枝,这样得到的2级子图个数最少,也使得待查询的子图查询数据库的次数最少,查询后根据查询到的结果汇聚成符合需要的图。

4    原型系统设计与实现

4.1    总体设计

分布式数据和存储

4.2    存储子系统实现

此部分主要将数据集合按照上文介绍的方式存放到各个机器中。首先因为知识图谱是非结构化的数据模型,此文准备采用nosql数据库来表示这种类型的数据,本系统数据库设计选用Neo4j。

具体功能实现,首先用本文提出的方法对数据集合进行分割,然后利用Neo4j的批量导入工具—neo4j-import来分别对不同存储服务器中的Neo4j数据库导入分割完成并冗余的关系和节点。

4.3    检索子系统实现

首先在子图查询中,根据客户端的子图输入,首先对查询子图按照上文介绍的剪枝方法进行查询图分割;

然后根据分割后的不同2级子图多线程的形式在分布式存储服务器中去查询结果。具体实现用键值对来存放2级子图,其中key值为2级子图的根节点,value为保存2级子图的叶子节点的对象。

最后对查询的图进行过滤验证后得到最终结果。具体实现为,根据每个2级子图的根节点去查询此根节点的所有关系及节点,然后根据这些结果与键值对进行比对,如果某一个key值对应的叶子节点对象缺失或者不同,那说明这个子图在分布式存储服务器中不存在,如果叶子对象存在,继续比较,直到待查询的2级子图的所有叶子节点均存在为止。

此处查询由于是采用的剪枝方法,故而只需要查询剪枝后的2级子图的根节点,而不是对所有的节点或者关系去查询,因而查询的次数相对较少,剪枝的2级子图根据剪枝的原则,所有的2级子图正好可以组成待查询的子图,利用这个原则,系统的子图查询,也只需要查询节点的所有直接关系,而不需要去查询节点的间接关系,查询速度也会相对较快。

4.4    本章小结

本章主要介绍了本文系统是如何设计的。首先在数据库的选择上比较了当前主流的一些支持非结构化数据的nosql数据库,主要比较了Redis、Mongo DB、Neo4j等数据库的优缺点,最终选择在查询及支持图数据结构上具有优势的Neo4j数据库;接着按照在第二章第二节节讨论的方法对数据集合的分割,并按照第二章第三节介绍的方法进行复制冗余,然后根据Neo4j的批量数据导入命令导入节点及关系数据,包括复制冗余数据;最后介绍子图查询的功能实现方法,首先根据上文介绍的方法分割子图,然后查询,根据查询结果进行过滤验证汇聚等得出查询结果。

5    实验与分析

5.1    实验方案

5.1.1    程序开发硬件环境

5.1.2    程序开发软件环境

5.2    数据集

数据集统计信息

实验数据集主要来自网络及模拟数据,其中实体数量为 960万个,关系数量为10000万个,每个实体包含标签及属性,每个关系包含标签及属性,整个数据集为非连通、无向结构。

5.3    实验方法

实验的目的在于验证本文提出的方法在子图查询中是否有效,评定的方式主要为同一个子图在四种不同条件下分割的数据集中的平均查询时间,这四种条件分别为:一致性hash分割方法(数据集不包含冗余)、基于词汇语义相似度和节点度数分割方法(数据集不包含冗余)、一致性hash分割方法(数据集包含冗余)、基于词汇语义相似度和节点度数分割方法(数据集包含冗余)。

5.3.1    子图检索实验

5.4    实验结果及其分析

5.4.1    实体关系非冗余

5.4.2    实体关系冗余

图 5-3 实验结果对比

从图5-3中可以发现,冗余的数据集合比非冗余的数据集合在子图查询中的时间要少,这个结果不受子图拆分成2级子图数量的影响,总结得出本文提出的数据集合分割方法要优于hash方法。

5.5    本章小结

本章主要首先介绍了实验所用的计算机硬件方面以及软件方面的配置,随后实验结果部分对比了子图在采用不同分割方法的数据集中查询的效率,最后实验分析部分对实验的结果给出了解释,实验结果显示无论在数据不冗余的情况下还是冗余的情况下本文提出的方法的查询速度较hash方法快。

6    总结与展望

6.1    总结

本文主要在分布式存储中对数据集合的划分方法做了一些探讨,提出了基于语义相似度及节点度数的数据集合分割方法,然后用子图查询来检验此方法是否可行。通过实验结果分析,在此种分割方法下,能够有效提高查询的速度。

本文的研究工作主要有以下几个方面:

1、对数据集根据其数据结构特点进行划分,使得关系紧密的节点尽可能的划分到同一台服务器中,并通过对每台服务器设定负载上限值来平衡每台服务器的负载,最后对数据集进行了适当的冗余,这种冗余主要是为了查询的方便,对跨不同服务器的关系,对关系上的两个节点在不同的服务器上分别进行复制备份。

2、在子图查询上,对子图的拆分采用节点度数递减的方法来进行剪枝,剪下的枝条为拥有一个根节点的2级子图,此种剪枝方法相对其它方法,生成的2级子图数量较少。

最后,相对于传统数据集分割方法,本文采用的方法,无论在查询时间上还是存储空间占用上都具有一定的优势。

6.2    展望

此方法尽管相对普通方法查询有一定的速度的提高,但是还有诸多不足的地方,下面对未来的研究的工作展望如下:

1、本文是基于语义相似度及节点度数的权重求和方式来使得关系紧密的节点及关系尽量分割到一块,同时也考虑了负载均衡,并设置了自定义的值来作为负载上限的参数值,但是在实际情况中,当数据集合关系密集的节点及关系的规模远远超过单台存储服务器的负载时,这样会使得紧密关系的节点之间完全分开,从而违背了关系相近的节点关系分布到一起的初衷。同时关于负载参数的设置也应该针对不同的情况采用不同的方法。

2、对于子图的查询,子图的拆分方法选用的是节点最大度数剪枝,这个目的使得在遍历整个图节点及关系的情况下,节点的查询次数最少。这里没有针对具体关系的查询,并且在节点查询时会查询与此节点所有相关的关系,如果在与此节点关系数量非常多的情况下,会产生大量的多余的结果,从而会增加服务器的负荷,因此在不同的应用背景下要考虑不同的方法以适合当时情形。

致谢

参考文献

你可能感兴趣的:(大规模知识图谱的分布式存储与检索技术研究)