本发明属于图数据处理的技术领域。
背景技术:
在这个数据爆炸的时代,各类应用每天都会产生海量的数据,同时各类应用所产生的数据也在不断地飞速增长中。常见的应用如社交网络平台微博,电话网络,web服务器请求,道路网络等等,这些应用都可以方便的用图结构,特别是有标签图结构来进行表示。包括但不限于以上所提到的这些应用,这些应用所涉及的数据都是以一种流模式的方式不断产生的。
由于数据量的巨大,基于原始图的查询是很困难的。一方面是由于原始图的规模太大,基于原始图的查询可能需要不断地将部分原始图读入内存,这是十分耗费资源和计算时间的。另一方面,在大规模原始图上的搜索查询也是十分耗费时间的。
当前数据应用的另一个特点是大部分都是流模式下的数据应用,即图上的边是一条一条到来的,而到来的速率十分密集,有可能是井喷式的。而更靠近当前时间的数据可能是更有意义的,用户可能会更感兴趣。
为适应大数据的数据容量大以及输入输出速度快的特征,并满足各种在线应用数据实时处理的需求,基于图压缩与略图的查询研究成为了支持很多应用的一种有效手段。然而研究多是基于静态图以及非标签图处理的。因此,如何构建支持流模式下有标签图动态处理的略图成为一个难题。
技术实现要素:
本发明目的是解决流模式下大规模图数据的处理与查询这一问题,提供一种基于最小略图的流模式下有向标签图的略图构建方法。本发明通过对图数据顶点的两级哈希映射以及对边标签的质数表示,将有向标签图数据的方向与标签信息压缩到略图中,保留了原始图的完整信息与图结构,使压缩后的略图能够支持原始图上的各项查询。
本发明提供的基于最小略图的流模式下有向标签图的略图构建方法,以最小略图思想为基础,构建出的略图可以仅使用原始图亚线性的存储空间的前提条件下,保留原图上点和边的标签信息以及图结构信息,同时快速支持原始图支持的各项通用图查询;同时,由于流模式下子窗口的使用,使略图可以自动处理失效数据,以适应流模式下滑动窗口的特殊需求;具体步骤如下:
第1、根据最大存储空间要求或压缩比率要求分配略图存储空间
使用略图的目的是为了利用有限的存储空间,通常是只使用原图存储空间亚线性的存储空间来进行存储。因此,在构建略图之前,需要根据事先要求的压缩比率或允许使用的最大存储空间来为略图分配存储空间。由于略图占用的存储空间与图数据点标签、点标识符以及边标签的映射范围相关,因此需要在给定压缩比率要求或略图占用最大存储空间的基础上确定点标签、点标识符以及边标签的映射范围。具体分为两种情况,具体方法如下:
(1)根据最大存储空间要求分配略图存储空间
给定能够存储n个数据单元的空间,同时已知不同点标签的总数量为l1,不同点标识符的总数量为l2,不同边标签的总数量为l3(对于未知数据的统计信息可通过对数据一小段时间的运行统计得出)。通常情况下,哈希函数的映射范围会远小于被映射数据项的实际数量,以达到存储压缩的目的。在满足存储空间上限要求的前提下,点标签与点标识符的映射范围与点标签总数量和点标识符总数量呈正比,边标签的映射范围远小于边标签的实际数量,则:
第1.1、确定点标签的映射范围
点标签的映射范围是[1…w],其中w远小于点标签实际总数量l1,满足:
w<<l1
第1.2、确定点标识符的映射范围
点标识符的映射范围是[1…d],其中d远小于点标识符实际总数量l2,满足:
d<<l2,并且:
(w*d)*(w*d)≤n,并且:
第1.3、确定边标签的映射范围
边标签的映射范围是[1…k],其中k远小于边标签实际总数量l3,满足:
k<<l3
第1.4、根据点标签和标识符的映射范围分配略图存储空间
在确定了以上三个映射范围后,可知最终所需存储单元是大小为(w*d)*(w*d)的矩阵,且所有矩阵元初值为1。
(2)根据压缩比率要求分配略图存储空间
假设给定的输入数据图的边总数量为ne,压缩比率为δ(δ∈(0,1)),不同点标签的总数量为l1,不同点标识符的总数量为l2,不同边标签的总数量为l3。通常情况下,哈希函数的映射范围会远小于被映射数据项的实际数量,以达到存储压缩的目的。在满足压缩比率下限要求的前提下,点标签与点标识符的映射范围与点标签总数量和点标识符总数量呈正比,边标签的映射范围远小于边标签的实际数量,则:
第1.1、确定点标签的映射范围
点标签的映射范围是[1…w],其中w远小于点标签实际总数量l1,满足:
w<<l1
第1.2、确定点标识符的映射范围
点标识符的映射范围是[1…d],其中d远小于点标识符实际总数量l2,满足:
d<<l2,并且:
(w*d)*(w*d)≤ne*δ,并且:
第1.3、确定边标签的映射范围
边标签的映射范围是[1…k],其中k远小于边标签实际总数量l3,满足:
k<<l3
第1.4、根据点标签和标识符的映射范围分配略图存储空间
在确定了以上三个映射范围后,可知最终所需存储单元是大小为(w*d)*(w*d)的矩阵,且所有矩阵元初值为1。
第2、对输入边的两个端点的点标签和标识符进行两级哈希映射
在分配了略图需要占用的存储单元后,需要利用有限的存储单元保存原始图上的结构信息以及点和边的标签信息。对比无标签图来说,对有标签图的略图存储需要保存更多的信息,又不能显著增加存储代价。我们将在这一部分详细描述通过两级哈希映射的方法,使用与无标签图同等存储代价的存储空间同时保存图数据点的标签和结构信息。
第2.1、根据点标签的映射结果确定数据应插入的略图子矩阵
基于图数据点标签和标识符的映射范围,给定输入边e=(a,b;la,lb,le),其中a是输入边的起点标识符,b是输入边的终点标识符,la是输入边的起点标签,lb是输入边的终点标签,le是输入边的边标签。则:
使用选自一组相互独立的哈希函数组的哈希函数h1将输入边的起点标签映射到[1…w]范围内,并假设结果为h1_a;使用同样的哈希函数h1将输入边的终点标签映射到[1…w]范围内,并假设结果为h1_b。则数据应插入的略图子矩阵为:
[d*(h1_a-1)+1…d*h1_a]*[d*(h1_b-1)+1…d*h1_b]
在进行点标签映射后,起点标签相同的图数据边都被映射到相连的矩阵行;终点标签相同的图数据边都被映射到相连的矩阵列,因此可以方便的提供基于点标签的查询。
第2.2、根据点标识符的映射结果确定数据应插入的略图矩阵元
在进行点标签映射后得到的子矩阵内对图数据边的两个端点的点标识符进行进一步映射,可以将边的信息映射到唯一矩阵元,方法如下:
使用选自一组相互独立的哈希函数组的同一个哈希函数h1将输入边的起点标识符映射到[1…d]范围内,并假设结果为
在进行点标识符映射后,起点标识符相同的图数据边都被映射到同一矩阵行;终点标识符相同的图数据边都被映射到同一矩阵列,因此可以方便的提供基于点标识符的查询,完整的保留了图的结构信息以及点标签和标识符信息。
第3、对输入边的边标签进行哈希映射
在完成在对输入图数据边的两个端点的标签和标识符进行映射后,本发明需要进一步区分两个端点的标签和标识符相同的不同类型的边;即区分端点标签和标识符相同但标签不同的边。为了实现对原始图进行压缩的目的,本发明需要使用一个存储单元来存储端点标签和标识符相同但边标签不同的边。本发明使用基础数论,使用质数的特性来实现这一目的。具体步骤如下:
第3.1、根据边标签的映射范围确定使用的质数序列
本发明在步骤1中确定了边标签的映射范围为[1…k],在此基础上,使用从2开始的k个连续的递增质数作为质数序列。例如当k为10时,则使用从2开始的10个连续的递增质数{2,3,5,7,11,13,17,19,23,29}作为质数序列。
第3.2、根据边标签的映射结果确定边标签所对应的质数
使用选自一组相互独立的哈希函数组的哈希函数h1将输入边的边标签映射到[1…k]范围内,并假设结果为
质数序列中的第
例如,假设边标签le使用哈希函数h1得到的哈希映射结果为5,则使用质数11表示边标签le。
第3.3、更新当前矩阵元的数据信息
在得到边标签所对应的质数后,需要利用得到的信息对当前矩阵元存储的数据进行更新。当前矩阵元在步骤2中被定位为:
则该矩阵元中的值被更新为当前值*pe。
利用这种方式,本发明使用一个存储元对不同边的数据信息进行了存储。一个存储元中存储的数据能够被多少个边标签所对应的质数所整除,就包含了多少个对应的边标签。
第4、流模式滑动窗口模型下自动处理失效数据
本发明的另一适用场景是流模式滑动窗口模型下对失效数据的自动处理。由于本发明仅使用原始数据亚线性的存储空间来存储数据,因此无法存储每一到来边的到来时刻,因此需要在仅存储小部分边到来时刻的前提下自动删除失效边的数据。考虑到边的到来是以到来的秒为时刻描述的,而大多数应用的更新精度并没有要求到秒,因此可以根据实际应用的更新精度要求将滑动窗口划分为子窗口,每一子窗口的大小为要求的更新精度。对每一子窗口中的所有数据仅存储这一子窗口开始的时间点,当这一时间点超时失效时,判定整个子窗口的数据超时失效。具体方法如下:
第4.1、确定子窗口大小
滑动窗口及子窗口的大小是由实际应用决定的。假设滑动窗口大小为wt,子窗口大小为ws,则一个滑动窗口共包含
第4.2、判断是否需要使用新的子窗口
给定当前输入边的时间戳为te,最新子窗口的起始时间为t。假设te-t<ws,则不需要使用新的子窗口;否则使用新的子窗口,并将最新子窗口起始时间更新为te。
第4.3、删除失效数据
当使用新的子窗口时,删除起始时间最早的子窗口,子窗口的数量始终保持在
本发明的优点和积极效果:
本发明提出的流模式下有标签图的略图构建方法,在仅使用原始图亚线性空间的前提下,保留了原始图的结构信息以及点和边的标签和标识符信息,因此能够支持原始图上支持的各种查询。相比无标签图来说,本发明使用两级哈希映射,在不显著提高存储空间的基础上,保留了更多的图信息。特别地,在需要对边标签的信息进行存储时,本发明利用质数的特性,将不同边转化成不同质数,因此仅使用一个整数就可以同时进行多条边信息的存储。
同时,本发明考虑到流模式下历史数据的失效问题,采用子窗口的划分,在满足实际应用更新精度的前提下,无需存储每条边的到来时刻。事实上,通过子窗口的划分,只需要存储最新子窗口的开始时间,当通过对最新子窗口开始时间与当前时间的比较可以得知是否需要启用新的子窗口。由于子窗口的数量是固定的,因此,当需要启用新的子窗口时,最老的子窗口会自然地被删除掉。同时,由于子窗口的使用以及对应用更新精度的要求,一般情况下,每一子窗口中的数据量不会过多。因此,也满足了仅使用一个整数就存储当前子窗口所有边的要求,不会使得到的整数过大而难以处理。
附图说明
图1是社交网络有向标签图。
图2是根据压缩比率要求构建略图过程中的更新边信息示意图。
图3是根据压缩比率要求构建略图的多略图低误差示意图。
图4是交易平台网络有向标签图。
图5是根据最大存储空间要求构建略图过程中的更新边信息示意图。
图6是根据最大存储空间要求构建略图的多略图低误差示意图。
图7是系统流程图。
具体实施方式
实施例1:根据压缩比率要求的基于最小略图的流模式下有向标签图的略图构建方法
一、根据压缩比率要求分配略图存储空间我们对如下图1的有向标签图,按照本发明的方法对略图存储空间进行分配。图1选自一部分社交网络图。原图中点标签包括用户类型、信息类型等10个标签;点标识符包括用户名、信息等10个标识符;边标签包括20个不同话题。总的数据量在100,000条,压缩比率要求在1/100,那么使用的数据空间能够存储不超过
综合考虑压缩比率要求的限制以及点标签、点标识符和边标签的实际数量,我们将点标签的映射范围确定在[1…5],将点标识符的映射范围确定在[1…5],将边标签的映射范围确定在[1…5]。则占用的存储空间为(5*5)*(5*5)=625个存储单元,不超过要求的存储上线1000,并且
二、对输入边的两个端点的点标签和标识符进行两级哈希映射
先将输入边的两个端点的点标签映射到[1…5]的范围内,再将输入边的两个端点的点标识符映射到[1…5]的范围内,得到定位的存储元。假设输入的图数据边为:
e=(a,b;la,lb,le)
其中a是输入边的起点标识符,b是输入边的终点标识符,la是输入边的起点标签,lb是输入边的终点标签,le是输入边的边标签。假设la的映射结果为3,lb的映射结果为4,则定位的存储子矩阵为:[11…15]*[16…20]。假设进一步对点标识符进行映射,a的映射结果为2,b的映射结果为1,则定位的存储元为(12,16),如图2左半部分所示的e存储元。
三、对输入边的边标签进行哈希映射
根据边标签的映射范围[1..5]确定所使用的质数序列为{2,3,5,7,11}。假设对le进行映射结果为3,则le所对应的质数为5。假设当前存储元子窗口中的值为5,则信息更新后当前子窗口的值更新为25,如图2右半部分所示。
四、流模式滑动窗口模型下自动处理失效数据
假设滑动窗口大小为300,子窗口大小为30,则子窗口个数为10。当如图2右半部分所示对数据进行更新时,若不需要启用新的子窗口,则只更新当前最新子窗口的信息即可。若判断后需要启用新的子窗口,则启用新的子窗口,并删除最老的子窗口。
五、提高查询准确率
当只使用一个略图时,会产生由于哈希冲突造成的误差。例如将10个标签映射到[1…5]的范围内,则会有不同的标签映射到同一矩阵行/列。为减小由哈希冲突带来的误差,可使用v个略图,如图3所示。对于每个略图使用相同的更新策略,但选用来自相互独立的哈希函数组的不同哈希函数对标签和标识符进行映射。查询时,查询所有v个略图并选取最小值作为结果,即使用最小略图思想可在最大程度上减小由哈希冲突造成的误差。图7展示了将流模式下的有向标签图构建成略图的基本流程。
实施例2:根据最大存储空间要求的基于最小略图的流模式下有向标签图的略图构建方法
一、根据最大存储空间要求分配略图存储空间
我们对图4的有向标签图,按本发明的方法对略图存储空间进行分配。图4选自一部分交易平台网络图。原图中点标签说明了买家或卖家所卖物品的品类,包括电器、母婴等12个标签;点标识符包括买家的账号、卖家的店铺名等12个标识符;边标签包括25个物品名。总的数据量为500,000条,最大存储空间限制在3000。
受限于最大存储空间的要求,同时考虑到点标签、点标识符和边标签的实际数量,我们将点标签的映射范围确定在[1…7],将点标识符的映射范围确定在[1…7],将边标签的映射范围确定在[1…7]。则占用的存储空间为(7*7)*(7*7)=2401个存储单元,不超过要求的最大存储空间3000,并且
二、对输入边的两个端点的点标签和标识符进行两级哈希映射
先将输入边的两个端点的点标签映射到[1…7]的范围内,再将输入边的两个端点的点标识符映射到[1…7]的范围内,得到定位的存储元。假设输入的图数据边为:
e=(a,b;la,lb,le)
其中a是输入边的起点标识符,b是输入边的终点标识符,la是输入边的起点标签,lb是输入边的终点标签,le是输入边的边标签。假设la的映射结果为2,lb的映射结果为5,则定位的存储子矩阵为:[15…21]*[29…34]。假设进一步对点标识符进行映射,a的映射结果为6,b的映射结果为3,则定位的存储元为(20,31),如图5左半部分所示的e存储元。
三、对输入边的边标签进行哈希映射
根据边标签的映射范围[1..9]确定所使用的质数序列为{2,3,5,7,11,13,17}。假设对le进行映射结果为4,则le所对应的质数为7。假设当前存储元子窗口中的值为3,则信息更新后当前子窗口的值更新为21,如图5右半部分所示。
四、流模式滑动窗口模型下自动处理失效数据
假设滑动窗口大小为500,子窗口大小为25,则子窗口个数为20。当如图5右半部分所示对数据进行更新时,若不需要启用新的子窗口,则只更新当前最新子窗口的信息即可。若判断后需要启用新的子窗口,则启用新的子窗口,并删除最老的子窗口。
五、提高查询准确率
当只使用一个略图时,会产生由于哈希冲突造成的误差。例如将12个标签映射到[1…7]的范围内,则会有不同的标签映射到同一矩阵行/列。为减小由哈希冲突带来的误差,可使用v个略图,如图6所示。对于每个略图使用相同的更新策略,但选用来自相互独立的哈希函数组的不同哈希函数对标签和标识符进行映射。查询时,查询所有v个略图并选取最小值作为结果,即使用最小略图思想可在最大程度上减小由哈希冲突造成的误差。