一种基于外存的图数据存储方法及子图查询方法

文档序号:6428889阅读:204来源:国知局
专利名称:一种基于外存的图数据存储方法及子图查询方法
技术领域
本发明属于数据库技术领域、图数据管理领域,主要涉及一种基于外存的对大规模图数据进行存储、构建索引和执行子图查询的方法。
背景技术
图数据库是一种利用图的结构和属性来表示与存储信息的新型数据库技术,是 NoSQL数据库的一种。一般的图数据库应该能存储任何形式的图,包括地理上的地图、社会关系网络等等。图数据库是基于图论的,它利用了图论中点、边等概念。其中,点常用来代表现实中的实体,如人、公司、账户及其他一切你希望记录的事物。边用来连接两个点,用来表示两点之间的关系。一般而言,点或边上还会附带其他信息。比如一个基于社交网络的图上,每个点代表一个人,那么这个点上不但包含有这人的名字,一般还会有诸如住址、联系方式等其他信息,而边上就可能会有两个人具体关系的描述,比如父子关系、朋友关系等。相较于传统关系数据库,图数据库能更为直接地映射到面向对象的应用中去,同时也能更自然地扩展到海量数据集上。图数据库不依赖于模式,所以它们也更适合于管理那些会经常被更新的数据。其中,子图查询是图数据库领域里极为重要的一项需求。例如, 给定一个社交网络图,我们想了解某种人物关系的存在情况。显然,我们可以将这种特殊的人物关系用一个查询图表示出来,之后,这就需要我们进行在大的社交网络图中找出查询图的所有匹配。然而,对于子图查询,现有的方法和系统中,一方面,它们大部分都是基于内存的方法,所以只支持小规模图上的运算,这显然无法适应现阶段不断增长的数据规模;另一方面,它们都需要建立复杂的索引结构,而这些结构无法适应数据图的不断更新。可见,传统的图数据库技术已经无法满足日益增长的图数据的存储和查询的需求。

发明内容
本发明的目的在于提出了一种基于外存的图数据存储方法及子图查询方法,用以支持对大规模图数据的存储、索引及子图查询,并很好的支持了扩展性。本发明实施例提供一种大规模图数据存储与索引的方法,包括基于图数据中边结构的数据组织方法;基于B+树的图数据存储;基于位图的索引构建;基于数据直方图的代价估计;对大规模图数据的动态更新的支持;本发明实施例提供一种支持对大规模图数据进行子图匹配查询的装置,包括对子图查询的解析的部分;对子图查询的分解的部分;
对分解出的查询图的子模块进行处理的部分;对所有子模块处理结果进行整合的部分。其中,对子图查询的分解,我们设计了两种模式的分解,分别为基于邻接边的子图分解;基于星结构的子图分解。本发明的技术方案为一种基于外存的图数据存储方法,其步骤为1)对图数据格式统一为一种标准图数据格式;其中,所述标准图数据格式为以 “t#NNumberofVertices NumberofEdges”开始,然后是图中的点信息ν,一个点对应于一行,格式为“V i LabelofVerticesj ”,然后是图的边信息e,一条边对应于一行,格式为“e v_iv_j”;最后以“t#-l”结束;其中,N为图的标识,NumberofVertices为图中点的数量, NumberofEdges为图中边的数量,i是点的标识符,LabelofVertices」是点上的唯一的标签信息,v_i是边的起点信息,v_j为边的终点信息;2)根据图数据中每条边的起点和终点的标签信息,对图中的边进行分类存储,然后对每类边建立B+-Tree索引;3)按照图数据中每个点上的标签信息,将图中的点划分为若干域,同一域中每一个点按点的标识符顺序依次对应于一位;然后根据边的起点、终点标签信息,为步骤2)中的每一类边建立一位图索引;4)对每一类边建立一起点信息数据直方图和一终点信息数据直方图,记录同类边的统计信息。进一步的,按照字典序为每类边建立B+-Tree索引。进一步的,为每一类边建立以位图索引的方法为首先根据边的起点、终点标签信息建立每一类边的起点位图索引和终点位图索引,然后对于某条边<v,u>属于某类<L1; L2>,v在所有标签是L1的点中的第k名,则在<L1; L2>对应的起点位图索引第k列取值为1, u在所有标签是L2的点中的第η名,则在这类边的终点位图索引第η列取值为1。进一步的,每一类边的起点数据直方图和终点数据直方图的建立方法为设有Ii1 条边属于类<L1; L2>,且这Ii1条边的起点都为v,同时ν为所有标签是L1的点中的第k名,则在<L1; L2>对应的起点数据直方图第k列取值为Ii1 ;同理,设有n2条边属于类<L1; L2>,且这 n2条边的终点都为u,同时u为所有标签是L2的点中的第m名,则在<L1; L2>对应的终点数据直方图第m列取值为n2。进一步的,当删除一条边时,首先找到所删除的边在B+-Tree中位置,然后在图数据中予以删除并重新统计边的分布信息,用以更新这类边的数据直方图。进一步的,当从边的统计信息中某个点不再含有该类的边,则将该类边的位图索引的对应位置变为O。进一步的,当新增一条边时,首先找到所新增的边在B+-Tree中位置,然后在图数据中增加该边并重新统计边的分布信息,用以更新这类边的数据直方图;如果新增之后发现某个点从没有该类的边变成含有该类边,则将该类别的位图索引的对应位置变为1。进一步的,当更新一个点时,首先遍历这个点可能在的所有的边的类,然后更新这个点的所有的相关边。
一种基于权利要求1所述方法存储图数据的子图查询方法,其步骤为1)根据图数据的数据直方图索引搜索源查询子图中当前最优的邻接边P ;2)从源查询子图中去掉P,得到一个减小的查询子图,并将P作为查询子图的子模式保存起来;在剩余查询子图中重复利用数据直方图索引找当前最优的邻接边,然后将其去掉并作为一子模式保存,直到将源查询子图分解完,得到一子模式集合;3)根据每一查询子模式所对应的边信息,找出该边对应的类,然后读取这个类对应的位图索引;4)将读取的所有位图索引的对应部分进行一次逻辑“与”运算,当“与,,运算结果为“1”时,从边信息的B+-Tree存储中读出匹配的边信息,得到所有子模式在图数据中匹配的边;5)对于所有匹配的边,如果两个匹配的边所对应的子模式包含有相同的查询点, 则将这两个子模式所对应的匹配边拼接起来,得到与源查询子图匹配的查询结果。一种基于权利要求1所述方法存储图数据的子图查询方法,其步骤为1)根据图数据的数据直方图索引搜索源查询子图中当前最优的星结构P ;2)从源查询子图中去掉P,得到一个减小的查询子图,并将P作为查询子图的子模式保存起来;在剩余查询子图中重复利用数据直方图索引找当前最优的星结构,然后将其去掉并作为一子模式保存,直到将源查询子图分解完,得到一子模式集合;3)根据每一查询子模式所对应的边信息,找出该边对应的类,然后读取这个类对应的位图索引;4)将读取的所有位图索引的对应部分进行一次逻辑“与”运算,当“与,,运算结果为“1”时,从边信息的B+-Tree存储中读出匹配的边信息,得到所有子模式在图数据中匹配的边;5)对于所有匹配的边,如果两个匹配的边所对应的子模式包含有相同的查询点, 则将这两个子模式所对应的匹配边拼接起来,得到与源查询子图匹配的查询结果。与现有技术相比,本发明的积极效果为本发明利用位图索引的思想,将图数据有效地组织起来,并极好地支持了子图匹配查询。相较于现有技术,一方面本发明是基于外存的,进而保证了比已有的大部分基于内存的技术有更高的可扩展性;另一方面本发明能获得极高的效率,快于已有的基于外存的图数据库技术。另外,本发明的内容支持对大规模图数据的动态更新,这是现有的基于外存的图数据库技术所不具备的。


图1为本发明实施例中本方法的整体框架的图示;图2为本发明实施例中大规模图数据预处理的方法的图示;图3为本发明实施例中大规模图数据子图查询的方法的图示;图4为本发明实施例中大规模图数据的更新方法的图示。
具体实施例方式本发明是针对图数据的特点进行存储与查询的方法,整个方法框架参见图1。方法分为两大部分,数据预处理部分和查询执行部分。数据预处理主要是我们针对大规模图数据的特点设计的对其进行存储并构建索引的方法,其中,构建的索引包括基于数据直方图的代价估计模块、针对图数据的位图索引和B+-Tree存储;查询执行部分是针对我们所设计的索引与存储进行子图查询的实现方法,查询执行部分是先利用代价估计模块对查询图进行分解,得到若干子模式,然后利用位图索引将子模式之间进行连接得到中间结果,之后,我们根据中间结果利用数据预处理部分生成的B+-Tree存储的图数据找到子模式的在图数据上的匹配结果,进而将这些子模式的结果拼接起来,从而得到最终结果。在我们的方法中,我们所利用的B+-Tree技术是业内公知的一种基于外存的技术,它保证了我们的方法能实现利用外存来支持大规模图数据的存储和管理,以有别于现有的大部分方法。现有方法多是基于内存的,无法满足大规模的图数据。另一方面,在索引中,我们合理地利用了位图的思想,并在子图匹配查询的过程中结合位图的优势,从而使得我们能快速地执行子图查询。同时各个索引模块之间界限清晰,索引内部也并不是过于复杂,这使得我们的索引易于更新,进而有别于现有的少数几个能扩展到外存的方法。现有的方法有几个能扩展到外存,但鉴于其本身索引结构的复杂,无法支持图数据的动态更新。参见图2,实施例中,大规模图数据预处理的方法包括步骤101 大规模图数据的规范化。实际中,我们得到的原始数据会是各种各样的形式,我们首先就需要将这些数据转化成我们规定的格式,这里我们会提供一个标准化的图数据格式。该数据格式中以 "t#NNumberofVertices NumberofEdges,,开始,以 ‘‘t#-l,,结束,其中 N 为这个图的标识, NumberofVertices为图中点的数量,NumberofEdges为图中边的数量,t为用以表示数据开始。然后,紧跟着的就是图中的点信息,一个点对应于一行,格式是“V i LabelofVertices, i”,其中i是点的标识符,这里我们要求i从0开始,以1为单位递增,LabelofVertices_i 是点上的唯一的标签信息;之后,便是边信息,一条边也对应于一行“e v_i v_j”,其中,v_i 是这条边的起点信息,v_j为这条边的终点信息。示例如下t#N NumberofVertices NumberofEdgesν O NumberofVertices_0......ν NumberofVertices-I NumberofVertices_n-le x_0 y_0......e x_NumberofEdges-l y_NumberofEdges-lt#-l该示例为一个标识符为N的图的示例。它包含有η个点,一个点对应以字母“V” 开始的一行,编号从O到NumberofVertices-1,每一个点对应于唯一的标签。注意,这里虽然每个点只对应于一个标签,但不同的点可以有相同的标签。然后就是所有边的信息,共计有NumberofEdges条边,每条边对应以字母“e”开始的一行,之后跟着的先是边的起点的编号,然后是边的终点的编号。这里,我们提供图数据的格式规范,然后根据此规范要求查询图。现实中,用户需要将自己所需处理的图文件,按照这个格式进行转化。例如,对于三元组 < 主体,谓词,客体>形式的RDF数据,我们在处理的过程中,就以其中所有的实体作为点,并按照字典序为其打上标识符。然后根据每个实体的本体信息,为每个点打上标签。之后,我们根据三元组中实体的关系,将这些点连接起来,形成边。如此,我们就可以形成一个符合我们规范的图,进而可以利用我们的方法,对图进行操作。步骤102 大规模图数据的组织和管理。当图数据符合我们规范的图数据之后,我们就需要对其进行组织和管理。这里我们将会按照图中每条边的起点和终点的标签信息,对图中所有的边进行分类。然后,对于每类边,我们按照字典序为其建立B+-Tree索引。B+-Tree是常见的基于外存的数据结构,它可以显著减少定位记录时所经历的中间过程,从而加快存取速度,进而方便我们在进行子图查询的时候读取边上的信息。这里,由于每个点都对应于一个标签,所以每条边根据其起点和终点的标签都能对应上唯一的一个标签对。比如,假设点1的标签是A,点2的标签是B,那么如果存在边<1, 2>,则<1,2>对应的标签对是<A,B〉。根据每条边上的标签信息,我们可以将边进行分类。 例如,接上面的例子,如果<3,4>对应的标签对也是<A,B>,那么我们将<1,2>和<3,4>划为一类边。然后,我们就可以将所有的边分成若干类,并把同类的边存储在一起。存储时, 我们可以按照起点和终点的标识符的大小对边规定出大小顺序,进而按照B+-Tree的方式对同类边进行组织。在这里,为了提高效率,我们冗余地保存边的信息,即同一类的边将被分别保存两次。第一次,这些边将先按起点标识符的字典序排序,如起点一样,按终点标识符的字典序排序;第二次,这些边将先按终点标识符的字典序排序,如终点一样,按起点标识符的字典序排序。步骤103 大规模图数据位图索引构建。为了快速的实现查询,本方法利用位图索引的思想在上面数据结构的基础上为图数据构建索引。由于利用了位图索引,子图查询中的很多操作均可转换成位运算,从而将极大地节省I/O操作和空间消耗,进而减少运算的时间。首先,我们按照每个点上的标签信息,将点划分为若干域。所有标签一样的点在同一个域中。如果给定的域包含η个点,则在这个域对应的位图索引就会包含η个比特位, 每一个点按标识符顺序依次对应于一位。如此,则对于步骤102中所述的每一类边,都会对应到两个域的位图索引——起点的位图索引和终点位图索引,这里记为HeadBitMap和 TailBitMap。假设存在某条边<v,u>属于某类<L1;L2>,设ν在所有标签是L1的点中的第k 名,则在<L1; L2>对应的HeadBitMap的第k列取值为1 ;同理,若u在所有标签是L2的点中的第η名,则在这类边的TailBitMap的第η列取值为1。如此,我们就可以为步骤102中所述的每一类边建立位图索引,进而利用其提升后面的子图查询效率。步骤104 大规模图数据数据立方图索引的构建。当一个子图查询进来之后,我们会先将子图查询进行分解,将其分解成若干子模式,然后先对子模式进行处理,最后将子模式拼装起来。实际中,每个查询图都远不止一种分解方法,所以我们需要设计一个好的策略来确定一个合适的分解。为此,我们利用数据直方图的思想,为我们进行代价估计提供依据。承接上文所述,我们将图数据中的边按上面的标签信息分成了若干个类,相同类的边组织在一起,并为之建立了位图索引。这里,对任意类的边,我们为其建立两个数据直方图——起点信息数据直方图和终点信息数据直方图,在这里我们将它们分别表示为HeadHistogram和TailHistogram。数据直方图是数据库领域常用的一种统计信息表示方式,用以记录数据的分布。在这里,我们用直方图的方式来记录同类边的统计信息, 以方便对后面的查询过程的优化。直方图构建过程如下假设有Ii1条边属于类<L1; L2>, 且这Ii1条边的起点都为v,同时ν在所有标签是L1的点中的第k名,则在<L1; L2>对应的 HeadHistogram的第k列取值为Ii1 ;同理,假设有n2条边属于类<L1; L2>,且这n2条边的终点都为u,同时u在所有标签是L2的点中的第m名,则在<L1; L2>对应的TailHistogram的第m列取值为n2。注意,此处叫和 均可为0;参见图3,实施例中,大规模图数据子图查询的方法的包括步骤201:查询分解这里,我们假设每个查询图和数据图有同样的格式规范,但是每个查询图的规模远小于数据图的规模。我们的目标是在数据图中找出所有与查询图同构的子图。以我们目前所了解的情况来看,现有的方法都是基于查询图点的依次匹配。具体而言,这些方法首先都会找出针对查询图的点的信息来找到其在数据图上的可能的匹配, 然后将这些可能的候选点按照查询图的结构拼起来。如果能拼装成功,则拼装结果即为查询的解;若一个解都没拼出来,则当前查询图在数据图上无解。方法之间的差异主要体现在针对点信息找可能匹配的过程及可能的匹配之间的拼装的方法上。但是这里我们为了高效地利用我们的索引以提高查询效率,我们首先将查询图分解成若干子模式,然后将找出每个子模式的可能的匹配,然后将它们拼装出解。通过理论上的分析可知,对一个查询图而言,找出最优的分解方法是不能在可接受的时间内实现的,所以我们提出了一个近似的分解方法。同时,根据分解出的子模式的不同,最终的效率也会不尽一样。这里我们按照分解的最终子模式的不同,分别设计了两种分解的方法基于邻接边的子图分解和基于星结构的子图分解。基于邻接边的子图分解是将子图分解成若干邻接边,所谓邻接边就是指两条相邻的边组成的边对;基于星结构的子图分解是将子图分解成若干星结构,所谓星结构就是一组有公共端点的边。理论上可以证明,找出最优的分解是无法在可接受的时间里完成的,所以本发明中我们借鉴贪心算法的思想进行分解,进而得到局部最优的分解方案。首先,我们利用前文所述的数据直方图索引找出当前最优的邻接边(或者星结构)P,具体而言,我们首先枚举出所有可能的子模式,然后对于每个子模式,我们读出这个模式所有的边所对应的数据直方图的值,进而求出这些值的乘积,并以这个乘积来作为子模式的代价。注意,这里由于我们在接下来的拼接操作是类似于关系数据库的连接操作,而连接操作在业内公知就是用直方图的乘积来估算代价的,所以这里我们使用我们数据直方图的值的乘积来估计子模式代价。当算出所有的子模式代价之后,以代价最小的子结构为当前最优的邻接边(或者星结构)P。找出最优子模式后,我们从查询图中去掉P,从而得到一个减小的查询图,并将P 作为子模式保存起来。之后,在这个减小的查询图中我们重复利用数据直方图索引找当前最优的邻接边(或者星结构)并去掉的过程。在这里,由于每次找到的当前最优子模式都是在减小的查询图上得到的,所以每次过程都能保证引入之前没引入过的边。因此,此过程迭代若干次之后,一定能将源查询图分解完。当整个源查询图的所有边都被去掉时,分解结
束ο如此,我们就可以得到一个覆盖掉查询图中所有边的子模式集合,这个集合是近似最优的分解结果。步骤202:子模式处理当子模式分解好之后,我们需要对每个子模式进行处理。在这里,我们根据查询子模式中每条边上的信息,找出该子模式对应的边对应的类,然后把这个类对应的位图索引读出来。由于不论是邻接边还是星结构,这些子模式中都会含有一个公共端点。所以, 我们可以将所有位图索引的对应于公共端点的部分拿出来进行一次逻辑“与”运算,以此来确定查询图中公共端点可能对应的数据图上的点。具体而言,如果某个子模式的公共端点中对应于某条边的起点,那么我们就将这条边的起点标签信息对应的位图索引——即 HeadBitMap——读出来;如果某个子模式的公共端点中对应于某条边的终点,那么我们就将这条边的终点标签信息对应的位图索引——即TailBitMap——读出来。之后,我们对这些位图进行一次大的逻辑“与”运算,如果逻辑“与”运算结果中某一位若为0,则意味着这一位对应的那个点不可能成为进入最终解。这可以极大地剪枝掉不少中间结果。之后,我们按照这个位图索引与运算的结果中的“1”,从边信息的B+-Tree存储中读出相应的边信息。这些边信息读出来之后,我们就可以按照子模式的结果,组装出当前子模式在数据图上的匹配。可以通过理论证明,这样操作后得到的解是与当前子模式匹配的边。步骤203:子模式拼接当所有子模式在数据图上的匹配都找到之后,我们就需要将这些子模式的匹配结果拼接起来。在这里,我们的操作将类似于关系数据库的连接操作,也即根据不同子模式之间相同的查询点将它们的匹配连接起来。两个不同子模式对应的两个匹配的边之间是可拼接的,前提在于如果这两个匹配的边对应的子模式包含有相同的查询点,那么这两个匹配的边在该查询点对应的位置上有相同的值。根据这个原则,我们依次将每个子模式的匹配边拼接起来,从而得到最终结果。而由于每一个点都是通过根据边的标签信息形成的类找到的,所以这个点上的标签一定是对的,从而保证了查询结果中点的正确性;同时,由于每一条边至少存在与一个子模式中,所以这也就可以保证查询结果中边匹配的正确性;最后,由于我们的拼接,保证了查询结果在符合查询图的结果。参见图4,实施例中,大规模图数据的更新方法的包括步骤301:边信息的更新这里我们规定,当更新边信息的时候不会改变点信息,不论是新增还是删除边都不会增加或者删除点。这样规定可以保证各部分之间的独立性,从而使得增强本方法的鲁棒性,即当某个部分被修改,对其他部分会尽量少地产生影响。具体而言,我们规定当如果新增的边中包含有新的点,我们先调用点信息更新模块新增点,之后再新增边;如果删除某条边后,哪怕某个点不再和任意边连接,仍然不删除这个点。基于上述规定,当删除一条边时,我们首先根据这条边的标签信息确定其所属的类,然后改变这个类的相关索引。具体而言,首先我们找到所删除的边在B+-Tree中位置,并予以删除。在这个过程中我们需重新统计边的分布信息,即重新对具有相同端点的边进行计数,得到的计数用以更新这类边的数据直方图。若从统计信息中我们发现某个点不再含有该类的边,也即计数为0,则将位图索引的对应位置变为0。新增边的过程与上述过程类似,仅仅将在B+-Tree部分的操作由删除改为新增,同时,如果新增之后发现某个点从没有该类的边变成含有该类边,则将位图索引的对应位置变为1。B+-Tree的增加、删除和范围查询是在业内有公知的高效,所以这也就保证我们的方法的可行性与效率。而每次新增或删除一条边,只需要最多修改位图索引中的一位,这也保证我们有较低的更新代价。步骤302 点信息的更新这里我们仍然规定,当更新点信息的时候不会改变边信息,不论是新增还是删除点都不能增加或者删除边。所以如果我们要删除某个点时,先调用点信息更新模块删除所有相关的边,之后再删除点;而新增点的时候,对边信息影响相对较小。基于上述规定,当更新一个点时,我们首先更新这个点的所有的相关边,这就需要我们遍历这个点可能在的所有的边的类。例如,我们打算更新标签信息为L的点V,那么我们需要更改所有与L相关的边的类的索引信息,哪怕这个类的边不存在与ν相关的边。之后,我们就需要更新这些类的B+-Tree上所有的与ν相关的边信息,然后更新位图索引及数据直方图相应位。综上所述,本发明实例中,针对规模日益增长的图数据,我们设计了一种基于外存的存储与索引图数据的方法,并结合这些方法实现了对大规模图数据的进行子图匹配查询。在这里,我们利用B+-Tree、位图索引和数据直方图等技术,存储图数据并为其构建索引。这些技术简洁有效,不但能极好地支持对大规模图数据的存储和管理,还能支持对图数据的更新。在查询时,我们有效地利用我们的存储结构与索引,设计了相应的方法来高效地支持子图匹配。显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若对本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。
权利要求
1.一种基于外存的图数据存储方法,其步骤为1)对图数据格式统一为一种标准图数据格式;其中,所述标准图数据格式为以 “t#NNumberofVertices NumberofEdges”开始,然后是图中的点信息ν,一个点对应于一行,格式为“V i LabelofVerticesj”,然后是图的边信息e,一条边对应于一行,格式为“e v_iv_j”;最后以“t#-l”结束;其中,N为图的标识,NumberofVertices为图中点的数量, NumberofEdges为图中边的数量,i是点的标识符,LabelofVertices」是点上的唯一的标签信息,v_i是边的起点信息,v_j为边的终点信息;2)根据图数据中每条边的起点和终点的标签信息,对图中的边进行分类存储,然后对每类边建立B+-Tree索引;3)按照图数据中每个点上的标签信息,将图中的点划分为若干域,同一域中每一个点按点的标识符顺序依次对应于一位;然后根据边的起点、终点标签信息,为步骤幻中的每一类边建立一位图索引;4)对每一类边建立一起点信息数据直方图和一终点信息数据直方图,记录同类边的统计fe息。
2.如权利要求1所述的方法,其特征在于按照字典序为每类边建立B+-Tree索引。
3.如权利要求1或2所述的方法,其特征在于为每一类边建立以位图索引的方法为 首先根据边的起点、终点标签信息建立每一类边的起点位图索引和终点位图索引,然后对于某条边<v,u>属于某类<L1; L2>,ν在所有标签是L1的点中的第k名,则在<L1; L2>对应的起点位图索引第k列取值为l,u在所有标签是L2的点中的第η名,则在这类边的终点位图索引第η列取值为1。
4.如权利要求3所述的方法,其特征在于每一类边的起点数据直方图和终点数据直方图的建立方法为设有Ii1条边属于类<L1; L2>,且这Ii1条边的起点都为v,同时ν为所有标签是L1的点中的第k名,则在<L1; L2>对应的起点数据直方图第k列取值为Ii1 ;同理,设有 n2条边属于类<L1; L2>,且这n2条边的终点都为u,同时u为所有标签是L2的点中的第m名, 则在<L1; L2>对应的终点数据直方图第m列取值为n2。
5.如权利要求1所述的方法,其特征在于当删除一条边时,首先找到所删除的边在 B+-Tree中位置,然后在图数据中予以删除并重新统计边的分布信息,用以更新这类边的数据直方图。
6.如权利要求5所述的方法,其特征在于当从边的统计信息中某个点不再含有该类的边,则将该类边的位图索引的对应位置变为O。
7.如权利要求1所述的方法,其特征在于当新增一条边时,首先找到所新增的边在 B+-Tree中位置,然后在图数据中增加该边并重新统计边的分布信息,用以更新这类边的数据直方图;如果新增之后发现某个点从没有该类的边变成含有该类边,则将该类别的位图索引的对应位置变为1。
8.如权利要求1所述的方法,其特征在于,当更新一个点时,首先遍历这个点可能在的所有的边的类,然后更新这个点的所有的相关边。
9.一种基于权利要求1所述方法存储图数据的子图查询方法,其步骤为1)根据图数据的数据直方图索引搜索源查询子图中当前最优的邻接边P;2)从源查询子图中去掉P,得到一个减小的查询子图,并将P作为查询子图的子模式保存起来;在剩余查询子图中重复利用数据直方图索引找当前最优的邻接边,然后将其去掉并作为一子模式保存,直到将源查询子图分解完,得到一子模式集合;3)根据每一查询子模式所对应的边信息,找出该边对应的类,然后读取这个类对应的位图索引;4)将读取的所有位图索引的对应部分进行一次逻辑“与”运算,当“与”运算结果为“1” 时,从边信息的B+-Tree存储中读出匹配的边信息,得到所有子模式在图数据中匹配的边;5)对于所有匹配的边,如果两个匹配的边所对应的子模式包含有相同的查询点,则将这两个子模式所对应的匹配边拼接起来,得到与源查询子图匹配的查询结果。
10. 一种基于权利要求1所述方法存储图数据的子图查询方法,其步骤为1)根据图数据的数据直方图索引搜索源查询子图中当前最优的星结构P;2)从源查询子图中去掉P,得到一个减小的查询子图,并将P作为查询子图的子模式保存起来;在剩余查询子图中重复利用数据直方图索引找当前最优的星结构,然后将其去掉并作为一子模式保存,直到将源查询子图分解完,得到一子模式集合;3)根据每一查询子模式所对应的边信息,找出该边对应的类,然后读取这个类对应的位图索引;4)将读取的所有位图索引的对应部分进行一次逻辑“与”运算,当“与”运算结果为“1” 时,从边信息的B+-Tree存储中读出匹配的边信息,得到所有子模式在图数据中匹配的边;5)对于所有匹配的边,如果两个匹配的边所对应的子模式包含有相同的查询点,则将这两个子模式所对应的匹配边拼接起来,得到与源查询子图匹配的查询结果。
全文摘要
本发明公开了一种基于外存的图数据存储方法及子图查询方法,属于数据库技术领域。本方法为1)对图数据格式统一为一种标准图数据格式;2)根据图数据中每条边的起点和终点的标签信息,对图中的边进行分类存储并对每类边建立B+-Tree索引;3)按照图数据中每个点上的标签信息,将图中的点划分为若干域,同一域中每一点按标识符顺序依次对应于一位;然后根据边的起点、终点标签信息,为2)中每一类边建立一位图索引;4)对每一类边建立一起点信息数据直方图和一终点信息数据直方图。关于子图查询,首先对对查询子图进行分解,然后将分解出的子模块进行查询并将查询结果进行整合。本发明具有查询效率高、可扩展性好的特点。
文档编号G06F17/30GK102254012SQ20111020269
公开日2011年11月23日 申请日期2011年7月19日 优先权日2011年7月19日
发明者彭鹏, 贾爱霞, 赵东岩, 邹磊 申请人:北京大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1