CN104268280A - 一种基于键值数据库的层次化存储与查询方法 - Google Patents
一种基于键值数据库的层次化存储与查询方法 Download PDFInfo
- Publication number
- CN104268280A CN104268280A CN201410552673.8A CN201410552673A CN104268280A CN 104268280 A CN104268280 A CN 104268280A CN 201410552673 A CN201410552673 A CN 201410552673A CN 104268280 A CN104268280 A CN 104268280A
- Authority
- CN
- China
- Prior art keywords
- key
- character string
- subkey
- substring
- represent
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/22—Indexing; Data structures therefor; Storage structures
- G06F16/2228—Indexing structures
- G06F16/2246—Trees, e.g. B+trees
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Data Mining & Analysis (AREA)
- Databases & Information Systems (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了一种基于键值数据库的层次化存储与查询方法,实施步骤如下:预先构建层次化键码命名规则并确定键码间的比较方法;执行数据存储请求时,根据键码比较方法来确定数据存储请求的键码排序位置并将数据插入键值数据库;执行数据查询请求时,查找第一个大于或等于目标键码目录下所有可能键码的下确界作为起始键码,从起始键码开始,将所有以目标键码开头的键值对以及子目录作为数据查询请求的结果返回。本发明能够在键值数据库的传统特性的基础上具备高速层次化数据的存储和查询能力,能够有效地组织和存储类似树状的复杂数据,可作为轻型分布式网络文件系统支持海量文件的目录方式数据存储。
Description
技术领域
本发明涉及键值数据库(Key-Value数据库)技术领域,具体涉及一种基于键值数据库的层次化存储与查询方法。
背景技术
对比典型SQL数据库,键值数据库(Key-Value数据库)用于存储无结构的键值数据,即以键码(即Key)作为索引,对Key对应的数据记录(即Value)进行读、写、删除等操作。由于键值数据库只关心通过Key索引Value的过程,不关心Value中存储的具体数据的结构和内容,因此键值数据库相较于SQL数据库而言,具有功能专一、平面化存取数据性能高、分布式处理的可扩展性强的优点。
目前,键值数据库对数据本身的结构表达能力较弱,整个数据库可以被简单地看成一张扁平的一维数组形式的大表,使用key作为数组的索引,value是数组中对应元素的数据。这种扁平化的一对一存储查询模式存在以下不足。
一、现实生活中的数据往往是具有一定属性层次的。以图1所示的班级学生的考试成绩为例,1班包括小王和小李等学生节点,每一位学生又分别包括语文、数学等科目节点,每一个科目节点对应一个考试成绩的数值,例如小王的语文成绩为91分。如果想按照图1所示的数据组织,分层分类存储各个同学的分数数据,则键值数据库现有的扁平化的一对一<key,value>存储模式很难满足该存储需求。
二、现有的键值数据库很难对某同一层次的数据进行查询并迭代。参见图1,若键值数据库存储各个人的考试成绩的话,通常的key-value对描述可能是:<“1班的小王的语文成绩”,91>,若我们想从中查询1班都有哪几位学生时,尽管上述键值数据库中key的信息包含了该问题的答案,但现有的键值数据库将很难做出查询。这是因为现有的键值数据库不存在层次化的存储结构,所以只能够通过迭代整个数据库中所有的Key的方式来逐一查询并提取信息,整体效率相对较低,耗时长。
发明内容
本发明要解决的技术问题是:针对现有技术的上述技术问题,提供一种能够在键值数据库的传统特性的基础上具备高速层次化数据的存储和查询能力,能够有效地组织和存储类似树状的复杂数据,可作为轻型分布式网络文件系统支持海量文件的目录方式数据存储的基于键值数据库的层次化存储与查询方法。
为了解决上述技术问题,本发明采用的技术方案为:
一种基于键值数据库的层次化存储与查询方法,其实施步骤如下:
1)预先在有序存储的键值数据库中构建层次化键码命名规则,所述层次化键码命名规则将键码定义为以分隔符开头、且由分隔符和子串交替组合组成,分隔符的数量表示键码的级数;确定两个合法的键码之间的大小比较方法,级数越大则键码越大,级数相同的键码则根据字符串比较确定大小;
2)接收键值数据库的访问请求,如果访问请求为数据存储请求,则跳转执行步骤3),如果访问请求为数据查询请求,则跳转执行步骤4);
3)根据所述两个合法的键码之间的大小比较方法来确定数据存储请求的键码排序位置,然后按照排序位置将数据存储请求的数据插入键值数据库,返回执行步骤2);
4)在键值数据库中按照从小到大的顺序查找第一个大于或等于数据查询请求的目标键码keydir目录下所有可能键码的下确界作为起始键码keystart,从起始键码keystart开始,按照从小到大的顺序将所有以目标键码keydir开头的键值对以及子目录作为数据查询请求的结果返回。
优选地,所述步骤1)中确定的两个合法的键码之间的大小比较方法如下:
1.1)接收由key1和key2组成的两个合法的键码;
1.2)比较key1和key2之间的级数大小,如果key1和key2的级数不同,则跳转执行步骤1.3),否则跳转执行步骤1.4);
1.3)判断key1的级数大于key2的级数是否成立,如果成立则判定key1比key2大,否则判定key2比key1大,返回比较结果并退出;
1.4)初始化i为1;
1.5)判断key1的级数大于或等于i是否成立,如果成立则跳转执行步骤1.6);否则判定key1等于key2,返回比较结果并退出;
1.6)判断key1和key2的前i级子串是否相等,如果相等则将i增加1,跳转执行步骤1.5);否则,判断key1的第i级子串大于key2的第i级子串是否成立,如果成立则判定key1比key2大,否则判定key2比key1大,返回比较结果并退出。
优选地,所述步骤3)的详细步骤如下:
3.1)接收用户的数据存储请求<newKey,newValue>,其中newKey表示数据存储请求的键码,newValue表示数据存储请求的键值;
3.2)判定所述键值数据库是否为空,如果键值数据库为空,则直接将所述数据存储请求的键值对<newKey,newValue>存入键值数据库并退出;如果键值数据库非空,则跳转执行下一步;
3.3)顺序查找第一个大于或等于所述数据存储请求的键码newKey的目标键码existed_key;
3.4)判断所述数据存储请求的键码newKey是否等于目标键码existed_key,如果所述数据存储请求的键码newKey等于目标键码existed_key,则判定所述数据存储请求的键码newKey在键值数据库中是否已经存在,将目标键码existed_key对应的键值替换为数据存储请求的键值对<newKey,newValue>中的新键值newValue并退出;否则,将所述数据存储请求的键值对<newKey,newValue>插入保存在目标键码existed_key对应的键值对前。
优选地,所述步骤4)的详细步骤如下:
4.1)初始化查询结果集合Sret;在键值数据库中按照从小到大的顺序查找第一个大于或等于数据查询请求的目标键码keydir目录下所有可能键码的下确界作为起始键码keystart,将起始键码keystart作为当前指针键码keynext;所述数据查询请求的目标键码keydir满足式(1)所示字符串形式,所述目标键码keydir目录下所有可能键码的下确界符合式(2)所示字符串形式;
式(1)中,表示目标键码keydir的第i级子串,i表示目标键码keydir的级数,/表示分隔符;
式(2)中,表示目标键码keydir的第i-1级子串;α表示构成键码子串的字符串全集中排序规则最小的字符串;/表示分隔符;
4.2)判断当前指针键码keynext以式(1)所示字符串开头、匹配式(3)所示字符串形式的第i+1层目录两个条件是否同时成立,如果同时成立则将当前指针键码keynext对应的键值对<keynext,Value>加入到查询结果集合Sret,后移查找指针得到新的当前指针键码keynext,跳转执行步骤4.2);否则跳转执行步骤4.3);
式(3)中,表示目标键码keydir的第i级子串,表示当前指针键码keynext的第i+1级子串,/表示分隔符;
4.3)判断当前指针键码keynext以字符串式(1)开头、同时匹配式(4)所示字符串形式的n层结构两个条件是否仍然成立,如果成立则判定当前指针键码keynext位于目标键码keydir下的某一级子目录中,跳转执行步骤4.4),否则跳转执行步骤4.6);
式(4)中,表示目标键码keydir的第i级子串,表示当前指针键码keynext的第i+1级子串,表示当前指针键码keynext的第n级子串,/表示分隔符;
4.4)判定式(3)所示字符串形式的子目录为目标键码keydir的下一级目录,将式(3)所示字符串作为键码和子目录标识生成式(5)所示形式的键值对并加入到查询结果集合Sret;
式(5)所示形式的键值对中,键码为式(3)所示的字符串,键值[dir]表示子目录标识,/表示分隔符;
4.5)跳过当前指针键码keynext对应目录下的所有键码,从当前指针键码keynext开始,按照从小到大的顺序查找第一个大于式(6)所示字符串形式的键码作为新的当前指针键码keynext,判断新的当前指针键码keynext以式(1)所示字符串开头是否成立,如果成立则跳转执行步骤4.3),否则跳转执行步骤4.6);
式(6)中,表示目标键码keydir的第i级子串,表示当前指针键码keynext的第i+1级子串,α表示构成键码子串的字符串全集中排序规则最小的字符串,/表示分隔符;表示对于当前指针键码keynext中使用Next方法返回一个字符串subkeynext,所述Next方法具体是指针对当前指针键码keynext下所有子串可能构成的字符串全集中的任意字符串s,如果该字符串s大于或等于目标键码keydir的第i级子串则将大于目标键码keydir的第i级子串且小于或等于该字符串s之间的子串subkeynext作为结果返回;
4.6)判断当前指针键码keynext大于如式(7)所示字符串形式的键码是否成立,如果成立,则代表当前指针键码keynext所代表的如式(8)所示字符串形式的第n层键码中已无以式(1)所示字符串开头的键值对数据,从当前指针键码keynext开始,按照从小到大的顺序查找第一个大于如式(9)所示字符串形式的键码作为当前指针键码keynext;如果不成立,则按照从小到大的顺序查找第一个等于或大于如式(7)所示字符串形式的键码作为当前指针键码keynext;
式(7)中,表示目标键码keydir的第i级子串;αi+1表示第i+1级字符串为构成键码子串的字符串全集中排序规则最小的字符串的子串,αn表示第n级字符串为构成键码子串的字符串全集中排序规则最小的字符串的子串;/表示分隔符;
式(8)中,表示目标键码keydir的第n级子串,/表示分隔符;
式(9)中,表示目标键码keydir的第i级子串;αi+1表示第i+1级字符串为构成键码子串的字符串全集中排序规则最小的字符串的子串,αn表示第n级字符串为构成键码子串的字符串全集中排序规则最小的字符串的子串;αn+1表示第n+1级字符串为构成键码子串的字符串全集中排序规则最小的字符串的子串;/表示分隔符;
4.7)检测当前指针Key键码keynext是否已经到达键值数据库的文件尾部,如果尚未到达文件尾部则跳转执行步骤4.3);否则跳转执行步骤4.8);
4.8)将查询结果集合Sret的内容作为数据查询请求的结果返回。
优选地,所述步骤4.1)和4.5)中按照从小到大的顺序查找具体是指从小到大的顺序进行逐一顺序查找、二分查找或者SkipList查找。
本发明基于键值数据库的层次化存储与查询方法具有下述优点:本发明通过预先在有序存储的键值数据库中构建层次化键码命名规则以及确定两个合法的键码之间的大小比较方法,针对数据存储请求,根据两个合法的键码之间的大小比较方法来确定数据存储请求的键码排序位置,然后按照排序位置将数据存储请求的数据插入键值数据库;针对数据查询请求,在键值数据库中按照从小到大的顺序查找第一个大于或等于数据查询请求的目标键码目录下所有可能键码的下确界作为起始键码,从起始键码开始,按照从小到大的顺序将所有以目标键码开头的键值对以及子目录作为数据查询请求的结果返回,因此使得一个已存在的有序存储键值数据库(比如:LevelDB等),在不改变已有的简单有效的Key-Value平面化一对一存储的前提下,同时具备层次化数据的存储能力与查询能力,使得键值数据库不但具有功能专一、平面化存取数据性能高、分布式处理的可扩展性强等传统特性,也同时具备了高速层次化数据的存储能力与查询能力,从而可以有效组织存储类似树状的复杂数据,还可以作为轻型分布式网络文件系统,支持海量文件的目录方式的数据存储。
附图说明
图1为常见的具有属性层次的学生考试成绩数据结构示意图。
图2为本发明实施例的基本方法流程示意图。
图3为本发明实施例中两个合法的Key之间的大小比较方法的流程示意图。
图4为本发明实施例中步骤3)执行数据存储请求的流程示意图。
图5为本发明实施例中步骤4)执行数据查询请求的流程示意图。
图6为本发明实施例中键值数据库已存储数据的层次结构示意图。
图7为本发明实施例中键值数据库已存储数据的初始数据实例示意图。
图8为本发明实施例中键值数据库执行数据存储请求的过程示意图。
图9为本发明实施例中键值数据库执行数据存储请求后的数据实例示意图。
图10为本发明实施例中执行数据查询请求时针对keynext=/a/b的查询过程示意图。
图11为本发明实施例中执行数据查询请求时针对keynext=/a/e的查询过程示意图。
图12为本发明实施例中执行数据查询请求时针对keynext=/b/c的查询过程示意图。
图13为本发明实施例中执行数据查询请求时针对keynext=/a/c/f/g的查询过程示意图。
图14为本发明实施例中执行数据查询请求时针对keynext=/b/d/e/f的查询过程示意图。
具体实施方式
如图2所示,本实施例基于键值数据库的层次化存储与查询方法的实施步骤如下:
1)预先在有序存储的键值数据库中构建层次化键码命名规则,层次化键码命名规则将键码定义为以分隔符开头、且由分隔符和子串交替组合组成,分隔符的数量表示键码的级数;确定两个合法的键码之间的大小比较方法,级数越大则键码越大,级数相同的键码则根据字符串比较确定大小;
2)接收键值数据库的访问请求,如果访问请求为数据存储请求,则跳转执行步骤3),如果访问请求为数据查询请求,则跳转执行步骤4);
3)根据两个合法的键码之间的大小比较方法来确定数据存储请求的键码排序位置,然后按照排序位置将数据存储请求的数据插入键值数据库,返回执行步骤2);
4)在键值数据库中按照从小到大的顺序查找第一个大于或等于数据查询请求的目标键码keydir目录下所有可能键码的下确界作为起始键码keystart,从起始键码keystart开始,按照从小到大的顺序将所有以目标键码keydir开头的键值对以及子目录作为数据查询请求的结果返回。
本实施例中层次化键码命名规则如下:键码定义为以分隔符开头、且由分隔符和子串交替组合组成,其形式类似分隔符的数量表示键码的级数;确定两个合法的键码之间的大小比较方法,级数越大则键码越大,级数相同的键码则根据字符串比较确定大小。本实施例中分隔符使用“/”表示,键码的子串是指除了最小字符串外其他所有某类字符任意组合的字符串,层次化key是由规定的分隔符与key子串相互交替组合在一起的字符串,必须以分隔符开头。键码的级数为分隔符“/”的数目,用Level(key)表示。本实施例中,定义从键码key字符串的起始位置开始,第n个分隔符与第n+1个分隔符中间所夹着的字符串称为键码key的第n级子串,表示为(为阐述方便,下文中n从1开始计算)。对于字符串形式为的键码而言,字符串称为key的第i层目录;而起完整的字符串则称为第n层的key。上图所示的层次化数据,层次化查询数据库中以/a目录层次下的所有key与子目录,应该得到如下key-value列表:</a/b2,100>,</a/b1,[dir]>。其中[dir]表示/a/b1是目录。
如图3所示,步骤1)中确定的两个合法的键码之间的大小比较方法如下:
1.1)接收由key1和key2组成的两个合法的键码;
1.2)比较key1和key2之间的级数大小(判断Level(key1)==Level(key2)是否成立),如果key1和key2的级数不同,则跳转执行步骤1.3),否则跳转执行步骤1.4);
1.3)判断key1的级数大于key2的级数(Level(key1)>Level(key2))是否成立,如果成立则判定key1比key2大(key1>key2),否则判定key2比key1大(key1<key2),返回比较结果并退出;
1.4)初始化i为1;
1.5)判断key1的级数大于或等于i(i<=Level(key1))是否成立,如果成立则跳转执行步骤1.6);否则判定key1等于key2,返回比较结果并退出;
1.6)判断key1和key2的前i级子串是否相等(),如果相等则将i增加1,跳转执行步骤1.5);否则,判断key1的第i级子串大于key2的第i级子串()是否成立,如果成立则判定key1比key2大(key1>key2),否则判定key2比key1大(key1<key2),返回比较结果并退出。
本实施例中,判断key1的第i级子串大于key2的第i级子串是否成立时采用常规字符串大小比较方法:将等长度不同的两个key子串,从前至后顺序地逐个比较每个字符的ASCII编码值,比较过程中,首次出现ASCII值大的那个字符串为较大字符串,另一个为较小字符串;若两个字符串的每个字符ASCII编码值都完全相同,则两字符串相等。
需要说明的是,比较每个字符的ASCII编码值的具体算法不受限制,但必须在字符串集合上满足全序关系(比如常见的按字母编码逐个进行比较的字符串比较方法)。
如图4所示,步骤3)的详细步骤如下:
3.1)接收用户的数据存储请求<newKey,newValue>,其中newKey表示数据存储请求的键码,newValue表示数据存储请求的键值;
3.2)判定键值数据库是否为空,如果键值数据库为空,则直接将数据存储请求的键值对<newKey,newValue>存入键值数据库并退出;如果键值数据库非空,则跳转执行下一步;
3.3)顺序查找第一个大于或等于数据存储请求的键码newKey的目标键码existed_key;
3.4)判断数据存储请求的键码newKey是否等于目标键码existed_key(existed_key==newKey),如果数据存储请求的键码newKey等于目标键码existed_key,则判定数据存储请求的键码newKey在键值数据库中是否已经存在,将目标键码existed_key对应的键值替换为数据存储请求的键值对<newKey,newValue>中的新键值newValue并退出;否则,将数据存储请求的键值对<newKey,newValue>插入保存在目标键码existed_key对应的键值对前。需要说明的是,若目标键码existed_key不满足existed_key==newKey,则一定能够找到这样一个目标键码existed_key,它满足newKey<existed_key,并且在当前数据库中,任何小于目标键码existed_key的less_existed_key,都满足less_existed_key<newKey(即在数据库已有键值对中,一定存在一个第一个比数据存储请求的键码newKey大的目标键码existed_key),因此本实施例中只需要将<newKey,newValue>键值对插入保存到目标键码existed_key对应的键值对前即可。
如图5所示,步骤4)的详细步骤如下:
4.1)初始化查询结果集合Sret;在键值数据库中按照从小到大的顺序查找第一个大于或等于数据查询请求的目标键码keydir目录下所有可能键码的下确界作为起始键码keystart,将起始键码keystart作为当前指针键码keynext;数据查询请求的目标键码keydir满足式(1)所示字符串形式,目标键码keydir目录下所有可能键码的下确界符合式(2)所示字符串形式;
式(1)中,表示目标键码keydir的第i级子串,i表示目标键码keydir的级数,/表示分隔符;
式(2)中,表示目标键码keydir的第i-1级子串;α表示构成键码子串的字符串全集中排序规则最小的字符串;/表示分隔符;本实施例中,构成键码子串的字符串为小写字母,因此构成键码子串的字符串全集中排序规则最小的字符串为a;
4.2)判断当前指针键码keynext以式(1)所示字符串开头、匹配式(3)所示字符串形式的第i+1层目录两个条件是否同时成立,如果同时成立则将当前指针键码keynext对应的键值对<keynext,Value>加入到查询结果集合Sret,后移查找指针得到新的当前指针键码keynext,跳转执行步骤4.2);否则跳转执行步骤4.3);
式(3)中,表示目标键码keydir的第i级子串,表示当前指针键码keynext的第i+1级子串,/表示分隔符;
4.3)判断当前指针键码keynext以字符串式(1)开头、同时匹配式(4)所示字符串形式的n层结构两个条件是否仍然成立,如果成立则判定当前指针键码keynext位于目标键码keydir下的某一级子目录中,跳转执行步骤4.4),否则跳转执行步骤4.6);
式(4)中,表示目标键码keydir的第i级子串,表示当前指针键码keynext的第i+1级子串,表示当前指针键码keynext的第n级子串,/表示分隔符;
4.4)判定式(3)所示字符串形式的子目录为目标键码keydir的下一级目录,将式(3)所示字符串作为键码和子目录标识生成式(5)所示形式的键值对并加入到查询结果集合Sret;
式(5)所示形式的键值对中,键码为式(3)所示的字符串,键值[dir]表示子目录标识,/表示分隔符;
4.5)跳过当前指针键码keynext对应目录下的所有键码,从当前指针键码keynext开始,按照从小到大的顺序查找第一个大于式(6)所示字符串形式的键码作为新的当前指针键码keynext,判断新的当前指针键码keynext以式(1)所示字符串开头是否成立,如果成立则跳转执行步骤4.3),否则跳转执行步骤4.6);
式(6)中,表示目标键码keydir的第i级子串,表示当前指针键码keynext的第i+1级子串,α表示构成键码子串的字符串全集中排序规则最小的字符串,/表示分隔符;表示对于当前指针键码keynext中使用Next方法返回一个字符串subkeynext,Next方法具体是指针对当前指针键码keynext下所有子串可能构成的字符串全集中的任意字符串s,如果该字符串s大于或等于目标键码keydir的第i级子串则将大于目标键码keydir的第i级子串且小于或等于该字符串s之间的子串subkeynext作为结果返回;
4.6)判断当前指针键码keynext大于如式(7)所示字符串形式的键码是否成立,如果成立,则代表当前指针键码keynext所代表的如式(8)所示字符串形式的第n层键码中已无以式(1)所示字符串开头的键值对数据,从当前指针键码keynext开始,按照从小到大的顺序查找第一个大于如式(9)所示字符串形式的键码作为当前指针键码keynext;如果不成立,则按照从小到大的顺序查找第一个等于或大于如式(7)所示字符串形式的键码作为当前指针键码keynext;
式(7)中,表示目标键码keydir的第i级子串;αi+1表示第i+1级字符串为构成键码子串的字符串全集中排序规则最小的字符串的子串,αn表示第n级字符串为构成键码子串的字符串全集中排序规则最小的字符串的子串;/表示分隔符;
式(8)中,表示目标键码keydir的第n级子串,/表示分隔符;
式(9)中,表示目标键码keydir的第i级子串;αi+1表示第i+1级字符串为构成键码子串的字符串全集中排序规则最小的字符串的子串,αn表示第n级字符串为构成键码子串的字符串全集中排序规则最小的字符串的子串;αn+1表示第n+1级字符串为构成键码子串的字符串全集中排序规则最小的字符串的子串;/表示分隔符;
4.7)检测当前指针Key键码keynext是否已经到达键值数据库的文件尾部,如果尚未到达文件尾部则跳转执行步骤4.3);否则跳转执行步骤4.8);
4.8)将查询结果集合Sret的内容作为数据查询请求的结果返回。
本实施例中,将表示目标键码keydir目录下所有可能键码的下确界。由层次化排序规则,易证明:一个数据库中,式(1)所示字符串形式的Keydir目录下的所有可能的键码Ki一定满足式(10)。
即键码Ki大于或等于式(2)所示字符串。因此,将式(2)所示字符串使用目标键码keydir目录下所有可能键码的下确界由于键值数据库中的键码是按序存储的,因此的定义允许查询方法迅速定位数据库中第i层的key的起始位置。
本实施例中定义了Next()方法,则的含义如下:构造一个比略大,并且最接近于的subkeynext字符串。该字符串subkeynext满足: 若 则必有 对于式(1)所示字符串形式的Keydir,其目录下的最小键码应为式(2)所示字符串,且满足
本实施例中,步骤4.1)和4.5)中按照从小到大的顺序查找具体是指从小到大的顺序进行逐一顺序查找、二分查找或者SkipList查找。其中,使用二分查找或者SkipList查找能够有效提升查找的效率,使得查找速度更快,从而能够有效提升键值数据库的查询性能。
本实施例中,针对键码Key的任何子串subkeykey均为仅由小写字母组成的字符串。假设键值数据库已存储如图6所示的数据,其中虚线表示键值对(Key-Value对),实线表示键码(Key)的层次结构,则该数据在键值数据库中顺序存储的key-value数据实例如图7所示。下面将结合上述数据以及具体的数据存储请求或数据查询请求来对本实施例执行数据存储请求或者数据查询请求的过程进行详细说明。
(一)数据存储请求。假设数据存储请求的数据<newKey,newValue>为</b/d,5>,即需要将</b/d,5>层次化存储进键值数据库,如图8所示,其操作步骤如下:①、根据步骤3.1),接收用户的数据存储请求求</b/d,5>,其中newKey为/b/d,newValue为5;②、根据步骤3.2),判定键值数据库是否为空,如果键值数据库为空,则直接将数据存储请求的键值对存入键值数据库并退出;如果键值数据库非空,则跳转执行下一步;③、根据步骤3.3),顺序查找第一个大于或者等于数据存储请求的newKey(/b/d)的目标键码existed_key,查找得到的目标键码existed_key的值为/a/c/d;④、根据步骤3.4),将数据存储请求的键值对</b/d,5>插入保存在目标键码existed_key对应的键值对</a/c/d,4>前。键值数据库在执行上述数据存储请求后,最终得到的的数据实例如图9所示。
(二)数据查询请求。假设数据查询请求的目标键码keydir为/a,即查询/a目录层次下的键码与子目录情况,则操作步骤如下:
第一步:在键值数据库中按照顺序搜索第一个大于或者等于数据查询请求目标键码keydir目录下所有可能键码的下确界MinKeyi+1作为起始键码keystart,将起始键码keystart作为当前指针键码keynext;由于目标键码keydir的字符串为/a,则目标键码keydir目录下所有可能键码的下确界为/a/a,第一个大于或者等于的起始键码keystart为/a/b。
第二步:从起始键码keystart开始从数据库顺序获取当前指针键码keynext。
如图10所示,针对当前指针键码keynext=/a/b的查询过程如下:①、由于/a目录下所有可能键码的下确界MinKeyi+1为/a/a,根据步骤4.1),顺序查找数据库中第一个大于等于/a/a的起始键码keystart,查找指针指向/a/b;②、根据步骤4.2),从起始键码keystart=/a/b开始进行查询操作;③、根据步骤4.2),由于/a/b以/a开头、满足形式两个条件同时成立,所以将当前指针键码keynext对应的键值对</a/b,1>加入到查询结果集合Sret。
如图11所示,针对keynext=/a/e的查询过程如下:①、结束上一个当前指针键码keynext(/a/b)的查询过程,查找指针指向新的当前指针键码keynext(/a/e);②、根据前述的查询过程步骤4.2),由于/a/e以/a开头、满足形式两个条件同时成立,所以将当前指针键码keynext对应键值对</a/e,2>加入到查询结果集合Sret。
如图12所示,针对keynext=/b/c的查询过程如下:①、结束上一个当前指针键码keynext(/a/e)的查询过程,查找指针指向当前指针键码keynext(/b/c);②、根据前述的查询过程步骤4.2),由于/b/c以/b形式开头,不符合/a形式开头,则需要跳转执行步骤4.6),式(7)所示字符串为/a/a,式(8)所示的字符串为/a/a/a,由于/b/c>/a/a,那么从/b/c开始顺序快速搜索出第一个大于/a/a/a的键码(即/a/c/d)作为当前指针键码keynext;③、由于当前指针键码keynext(/a/c/d)没有到达键值数据库的文件尾部,因此跳转执行步骤4.2),然后由于当前指针键码keynext(/a/c/d)以/a形式开头符合步骤4.4)的条件,判定当前指针键码keynext能匹配式(4)所示字符串形式的n层结构,式(3)所示字符串/a/c为目标键码keydir的下一级目录,将式(3)所示字符串形式的键码以及子目录标识[dir]生成键值</a/c,[dir]>对加入到查询结果集合Sret。
如图13所示,针对当前指针键码keynext=/a/c/f/g的查询过程如下:①、承接前面的操作,根据步骤4.3)查找指针从上一个当前指针键码keynext(/a/c/d)开始,顺序获取下一个当前指针键码keynext;②、根据步骤4.5),式(6)所示字符串为/a/c/a,因此顺序查找在本数据库中第一个大于/a/c/a的当前指针键码keynext(即/a/c/f/g);③、由于当前指针键码keynext/a/c/f/g以/a形式开头符合步骤4.4)的条件,即当前指针键码keynext以字符串式(1)开头、同时能匹配式(4)所示字符串形式的n层结构,因此跳转步骤4.4)。根据步骤4.4),判定式(3)所示字符串/a/c为目标键码keydir的下一级目录,将式(3)所示字符串形式的键码以及子目录标识[dir]生成键值</a/c,[dir]>对加入到查询结果集合Sret。
如图14所示,针对keynext=/b/d/e/f的查询过程如下:①、查找指针移动到当前指针键码keynext(/b/d/e/f),顺序获取keynext;②、根据查找步骤4.2)和4.6),当前指针键码keynext(/b/d/e/f)以/b形式开头,则不符合/a形式开头,式(7)所示字符串为/a/a/a/a,式(8)所示的字符串为/a/a/a/a/a,且/b/d/e/f>/a/a/a/a,那么从/b/c开始顺序快速搜索出第一个大于/a/a/a/a/a的key,此时可知当前指针键码keynext(/b/d/e/f)相邻的键码到达数据库文件尾部;③、执行步骤4.7),将查询结果集合Sret返回给用户。
以上所述仅是本发明的优选实施方式,本发明的保护范围并不仅局限于上述实施例,凡属于本发明思路下的技术方案均属于本发明的保护范围。应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理前提下的若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。
Claims (5)
1.一种基于键值数据库的层次化存储与查询方法,其特征在于实施步骤如下:
1)预先在有序存储的键值数据库中构建层次化键码命名规则,所述层次化键码命名规则将键码定义为以分隔符开头、且由分隔符和子串交替组合组成,分隔符的数量表示键码的级数;确定两个合法的键码之间的大小比较方法,级数越大则键码越大,级数相同的键码则根据字符串比较确定大小;
2)接收键值数据库的访问请求,如果访问请求为数据存储请求,则跳转执行步骤3),如果访问请求为数据查询请求,则跳转执行步骤4);
3)根据所述两个合法的键码之间的大小比较方法来确定数据存储请求的键码排序位置,然后按照排序位置将数据存储请求的数据插入键值数据库,返回执行步骤2);
4)在键值数据库中按照从小到大的顺序查找第一个大于或等于数据查询请求的目标键码keydir目录下所有可能键码的下确界作为起始键码keystart,从起始键码keystart开始,按照从小到大的顺序将所有以目标键码keydir开头的键值对以及子目录作为数据查询请求的结果返回。
2.根据权利要求1所述的基于键值数据库的层次化存储与查询方法,其特征在于,所述步骤1)中确定的两个合法的键码之间的大小比较方法如下:
1.1)接收由key1和key2组成的两个合法的键码;
1.2)比较key1和key2之间的级数大小,如果key1和key2的级数不同,则跳转执行步骤1.3),否则跳转执行步骤1.4);
1.3)判断key1的级数大于key2的级数是否成立,如果成立则判定key1比key2大,否则判定key2比key1大,返回比较结果并退出;
1.4)初始化i为1;
1.5)判断key1的级数大于或等于i是否成立,如果成立则跳转执行步骤1.6);否则判定key1等于key2,返回比较结果并退出;
1.6)判断key1和key2的前i级子串是否相等,如果相等则将i增加1,跳转执行步骤1.5);否则,判断key1的第i级子串大于key2的第i级子串是否成立,如果成立则判定key1比key2大,否则判定key2比key1大,返回比较结果并退出。
3.根据权利要求2所述的基于键值数据库的层次化存储与查询方法,其特征在于,所述步骤3)的详细步骤如下:
3.1)接收用户的数据存储请求<newKey,newValue>,其中newKey表示数据存储请求的键码,newValue表示数据存储请求的键值;
3.2)判定所述键值数据库是否为空,如果键值数据库为空,则直接将所述数据存储请求的键值对<newKey,newValue>存入键值数据库并退出;如果键值数据库非空,则跳转执行下一步;
3.3)顺序查找第一个大于或等于所述数据存储请求的键码newKey的目标键码existed_key;
3.4)判断所述数据存储请求的键码newKey是否等于目标键码existed_key,如果所述数据存储请求的键码newKey等于目标键码existed_key,则判定所述数据存储请求的键码newKey在键值数据库中是否已经存在,将目标键码existed_key对应的键值替换为数据存储请求的键值对<newKey,newValue>中的新键值newValue并退出;否则,将所述数据存储请求的键值对<newKey,newValue>插入保存在目标键码existed_key对应的键值对前。
4.根据权利要求1或2或3所述的基于键值数据库的层次化存储与查询方法,其特征在于,所述步骤4)的详细步骤如下:
4.1)初始化查询结果集合Sret;在键值数据库中按照从小到大的顺序查找第一个大于或等于数据查询请求的目标键码keydir目录下所有可能键码的下确界作为起始键码keystart,将起始键码keystart作为当前指针键码keynext;所述数据查询请求的目标键码keydir满足式(1)所示字符串形式,所述目标键码keydir目录下所有可能键码的下确界符合式(2)所示字符串形式;
式(1)中,表示目标键码keydir的第i级子串,i表示目标键码keydir的级数,/表示分隔符;
式(2)中,表示目标键码keydir的第i-1级子串;α表示构成键码子串的字符串全集中排序规则最小的字符串;/表示分隔符;
4.2)判断当前指针键码keynext以式(1)所示字符串开头、匹配式(3)所示字符串形式的第i+1层目录两个条件是否同时成立,如果同时成立则将当前指针键码keynext对应的键值对<keynext,Value>加入到查询结果集合Sret,后移查找指针得到新的当前指针键码keynext,跳转执行步骤4.2);否则跳转执行步骤4.3);
式(3)中,表示目标键码keydir的第i级子串,表示当前指针键码keynext的第i+1级子串,/表示分隔符;
4.3)判断当前指针键码keynext以字符串式(1)开头、同时匹配式(4)所示字符串形式的n层结构两个条件是否仍然成立,如果成立则判定当前指针键码keynext位于目标键码keydir下的某一级子目录中,跳转执行步骤4.4),否则跳转执行步骤4.6);
式(4)中,表示目标键码keydir的第i级子串,表示当前指针键码keynext的第i+1级子串,表示当前指针键码keynext的第n级子串,/表示分隔符;
4.4)判定式(3)所示字符串形式的子目录为目标键码keydir的下一级目录,将式(3)所示字符串作为键码和子目录标识生成式(5)所示形式的键值对并加入到查询结果集合Sret;
式(5)所示形式的键值对中,键码为式(3)所示的字符串,键值[dir]表示子目录标识,/表示分隔符;
4.5)跳过当前指针键码keynext对应目录下的所有键码,从当前指针键码keynext开始,按照从小到大的顺序查找第一个大于式(6)所示字符串形式的键码作为新的当前指针键码keynext,判断新的当前指针键码keynext以式(1)所示字符串开头是否成立,如果成立则跳转执行步骤4.3),否则跳转执行步骤4.6);
式(6)中,表示目标键码keydir的第i级子串,表示当前指针键码keynext的第i+1级子串,α表示构成键码子串的字符串全集中排序规则最小的字符串,/表示分隔符;表示对于当前指针键码keynext中使用Next方法返回一个字符串subkeynext,所述Next方法具体是指针对当前指针键码keynext下所有子串可能构成的字符串全集中的任意字符串s,如果该字符串s大于或等于目标键码keydir的第i级子串则将大于目标键码keydir的第i级子串且小于或等于该字符串s之间的子串subkeynext作为结果返回;
4.6)判断当前指针键码keynext大于如式(7)所示字符串形式的键码是否成立,如果成立,则代表当前指针键码keynext所代表的如式(8)所示字符串形式的第n层键码中已无以式(1)所示字符串开头的键值对数据,从当前指针键码keynext开始,按照从小到大的顺序查找第一个大于如式(9)所示字符串形式的键码作为当前指针键码keynext;如果不成立,则按照从小到大的顺序查找第一个等于或大于如式(7)所示字符串形式的键码作为当前指针键码keynext;
式(7)中,表示目标键码keydir的第i级子串;αi+1表示第i+1级字符串为构成键码子串的字符串全集中排序规则最小的字符串的子串,αn表示第n级字符串为构成键码子串的字符串全集中排序规则最小的字符串的子串;/表示分隔符;
式(8)中,表示目标键码keydir的第n级子串,/表示分隔符;
式(9)中,表示目标键码keydir的第i级子串;αi+1表示第i+1级字符串为构成键码子串的字符串全集中排序规则最小的字符串的子串,αn表示第n级字符串为构成键码子串的字符串全集中排序规则最小的字符串的子串;αn+1表示第n+1级字符串为构成键码子串的字符串全集中排序规则最小的字符串的子串;/表示分隔符;
4.7)检测当前指针Key键码keynext是否已经到达键值数据库的文件尾部,如果尚未到达文件尾部则跳转执行步骤4.3);否则跳转执行步骤4.8);
4.8)将查询结果集合Sret的内容作为数据查询请求的结果返回。
5.根据权利要求4所述的基于键值数据库的层次化存储与查询方法,其特征在于:所述步骤4.1)和4.5)中按照从小到大的顺序查找具体是指从小到大的顺序进行逐一顺序查找、二分查找或者SkipList查找。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410552673.8A CN104268280B (zh) | 2014-10-17 | 2014-10-17 | 一种基于键值数据库的层次化存储与查询方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410552673.8A CN104268280B (zh) | 2014-10-17 | 2014-10-17 | 一种基于键值数据库的层次化存储与查询方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN104268280A true CN104268280A (zh) | 2015-01-07 |
CN104268280B CN104268280B (zh) | 2017-07-07 |
Family
ID=52159801
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201410552673.8A Active CN104268280B (zh) | 2014-10-17 | 2014-10-17 | 一种基于键值数据库的层次化存储与查询方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN104268280B (zh) |
Cited By (13)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2016169322A1 (zh) * | 2015-04-22 | 2016-10-27 | 中兴通讯股份有限公司 | 数据库的查询方法和装置、计算机存储介质 |
CN106468559A (zh) * | 2015-08-20 | 2017-03-01 | 高德信息技术有限公司 | 一种导航语音播报方法及装置 |
CN108153911A (zh) * | 2018-01-24 | 2018-06-12 | 广西师范学院 | 数据的分布式云存储方法 |
CN108319589A (zh) * | 2018-03-14 | 2018-07-24 | 腾讯科技(深圳)有限公司 | 参数字符串处理方法、装置、计算机可读存储介质和设备 |
CN108549682A (zh) * | 2018-03-30 | 2018-09-18 | 宁波诺信睿聚投资有限责任公司 | 数据对象资源的管理方法、装置、设备及存储介质 |
CN108628892A (zh) * | 2017-03-21 | 2018-10-09 | 北京京东尚科信息技术有限公司 | 有序数据存储的方法、装置、电子设备和可读存储介质 |
CN108763413A (zh) * | 2018-05-23 | 2018-11-06 | 唐山高新技术产业园区兴荣科技有限公司 | 数据存储格式及其数据查找定位方法 |
CN109388641A (zh) * | 2018-10-22 | 2019-02-26 | 无锡华云数据技术服务有限公司 | 一种检索键值数据库中键的共同前缀的方法、设备、介质 |
CN109446258A (zh) * | 2018-10-22 | 2019-03-08 | 郑州云海信息技术有限公司 | 一种分布式数据存储方法及系统 |
CN110309144A (zh) * | 2018-03-22 | 2019-10-08 | 北京新媒传信科技有限公司 | 一种运用redis构建树形数据结构的方法及装置 |
WO2021012211A1 (zh) * | 2019-07-24 | 2021-01-28 | 华为技术有限公司 | 一种为数据建立索引的方法以及装置 |
CN112328739A (zh) * | 2020-10-13 | 2021-02-05 | 成都安易迅科技有限公司 | 字符查询方法、装置、计算机设备及计算机可读存储介质 |
CN112487032A (zh) * | 2020-11-27 | 2021-03-12 | 北京三快在线科技有限公司 | 数据查询的方法、装置、存储介质及电子设备 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101510209A (zh) * | 2009-03-30 | 2009-08-19 | 北京金山软件有限公司 | 实现实时检索的方法、系统和服务器 |
CN102725755A (zh) * | 2011-12-31 | 2012-10-10 | 华为技术有限公司 | 文件访问方法及系统 |
US20130103658A1 (en) * | 2011-10-19 | 2013-04-25 | Vmware, Inc. | Time series data mapping into a key-value database |
CN103544156A (zh) * | 2012-07-10 | 2014-01-29 | 腾讯科技(深圳)有限公司 | 文件存储方法及装置 |
-
2014
- 2014-10-17 CN CN201410552673.8A patent/CN104268280B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101510209A (zh) * | 2009-03-30 | 2009-08-19 | 北京金山软件有限公司 | 实现实时检索的方法、系统和服务器 |
US20130103658A1 (en) * | 2011-10-19 | 2013-04-25 | Vmware, Inc. | Time series data mapping into a key-value database |
CN102725755A (zh) * | 2011-12-31 | 2012-10-10 | 华为技术有限公司 | 文件访问方法及系统 |
CN103544156A (zh) * | 2012-07-10 | 2014-01-29 | 腾讯科技(深圳)有限公司 | 文件存储方法及装置 |
Non-Patent Citations (1)
Title |
---|
王兆永: "面向大规模批量日志数据存储方法的研究", 《中国优秀硕士学位论文全文数据库 信息科技辑》 * |
Cited By (21)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2016169322A1 (zh) * | 2015-04-22 | 2016-10-27 | 中兴通讯股份有限公司 | 数据库的查询方法和装置、计算机存储介质 |
CN106468559A (zh) * | 2015-08-20 | 2017-03-01 | 高德信息技术有限公司 | 一种导航语音播报方法及装置 |
CN106468559B (zh) * | 2015-08-20 | 2019-10-22 | 高德信息技术有限公司 | 一种导航语音播报方法及装置 |
CN108628892B (zh) * | 2017-03-21 | 2020-11-20 | 北京京东尚科信息技术有限公司 | 有序数据存储的方法、装置、电子设备和可读存储介质 |
CN108628892A (zh) * | 2017-03-21 | 2018-10-09 | 北京京东尚科信息技术有限公司 | 有序数据存储的方法、装置、电子设备和可读存储介质 |
CN108153911A (zh) * | 2018-01-24 | 2018-06-12 | 广西师范学院 | 数据的分布式云存储方法 |
CN108153911B (zh) * | 2018-01-24 | 2022-07-19 | 广西师范学院 | 数据的分布式云存储方法 |
CN108319589A (zh) * | 2018-03-14 | 2018-07-24 | 腾讯科技(深圳)有限公司 | 参数字符串处理方法、装置、计算机可读存储介质和设备 |
CN108319589B (zh) * | 2018-03-14 | 2021-08-10 | 腾讯科技(深圳)有限公司 | 参数字符串处理方法、装置、计算机可读存储介质和设备 |
CN110309144A (zh) * | 2018-03-22 | 2019-10-08 | 北京新媒传信科技有限公司 | 一种运用redis构建树形数据结构的方法及装置 |
CN108549682A (zh) * | 2018-03-30 | 2018-09-18 | 宁波诺信睿聚投资有限责任公司 | 数据对象资源的管理方法、装置、设备及存储介质 |
CN108763413B (zh) * | 2018-05-23 | 2021-07-23 | 唐山高新技术产业园区兴荣科技有限公司 | 基于数据存储格式的数据查找定位方法 |
CN108763413A (zh) * | 2018-05-23 | 2018-11-06 | 唐山高新技术产业园区兴荣科技有限公司 | 数据存储格式及其数据查找定位方法 |
CN109388641B (zh) * | 2018-10-22 | 2019-10-18 | 无锡华云数据技术服务有限公司 | 一种检索键值数据库中键的共同前缀的方法、设备、介质 |
CN109446258A (zh) * | 2018-10-22 | 2019-03-08 | 郑州云海信息技术有限公司 | 一种分布式数据存储方法及系统 |
CN109388641A (zh) * | 2018-10-22 | 2019-02-26 | 无锡华云数据技术服务有限公司 | 一种检索键值数据库中键的共同前缀的方法、设备、介质 |
WO2021012211A1 (zh) * | 2019-07-24 | 2021-01-28 | 华为技术有限公司 | 一种为数据建立索引的方法以及装置 |
US11868332B2 (en) | 2019-07-24 | 2024-01-09 | Huawei Cloud Computing Technologies Co., Ltd. | Data index establishment method, and apparatus |
CN112328739A (zh) * | 2020-10-13 | 2021-02-05 | 成都安易迅科技有限公司 | 字符查询方法、装置、计算机设备及计算机可读存储介质 |
CN112328739B (zh) * | 2020-10-13 | 2023-11-03 | 成都安易迅科技有限公司 | 字符查询方法、装置、计算机设备及计算机可读存储介质 |
CN112487032A (zh) * | 2020-11-27 | 2021-03-12 | 北京三快在线科技有限公司 | 数据查询的方法、装置、存储介质及电子设备 |
Also Published As
Publication number | Publication date |
---|---|
CN104268280B (zh) | 2017-07-07 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN104268280A (zh) | 一种基于键值数据库的层次化存储与查询方法 | |
CN104991905B (zh) | 一种基于层次索引的数学表达式检索方法 | |
CN110851722A (zh) | 基于字典树的搜索处理方法、装置、设备和存储介质 | |
CN108846016B (zh) | 一种面向中文分词的搜索算法 | |
CN103198079B (zh) | 相关搜索的实现方法和装置 | |
CN105335481B (zh) | 一种大规模字符串文本的后缀索引构造方法及装置 | |
CN102541995A (zh) | 对散列序列矩阵的索引和查询 | |
CN102246172A (zh) | 用于电子内容的分布式索引搜索的系统及方法 | |
CN103678491A (zh) | 一种基于Hadoop中小文件优化和倒排索引的方法 | |
CN107330094B (zh) | 动态存储键值对的布鲁姆过滤器树结构及键值对存储方法 | |
CN106599091B (zh) | 基于键值存储的rdf图结构存储和索引方法 | |
CN102750375A (zh) | 一种基于随机游走的服务和标签推荐方法 | |
CN108369497B (zh) | 在示例编程中从输入模式中进行学习 | |
CN103365992A (zh) | 一种基于一维线性空间实现Trie树的词典检索方法 | |
CN101369278B (zh) | 一种近似匹配方法和装置 | |
CN104636349A (zh) | 一种索引数据压缩以及索引数据搜索的方法和设备 | |
Tomohiro et al. | Palindrome pattern matching | |
CN101251845B (zh) | 利用改进的Wu-Manber算法进行多模式串匹配的方法 | |
KR20170065374A (ko) | 버킷 단위의 정렬을 기반으로 하는 해시 충돌 처리 방법 | |
CN102831224A (zh) | 一种数据索引库的建立方法、搜索建议生成方法和装置 | |
CN103699647A (zh) | 一种字符串词典的索引方法及系统 | |
CN100483409C (zh) | 一种字符数据的检索方法 | |
CN104268158A (zh) | 一种结构化数据分布式索引及检索方法 | |
KR100999408B1 (ko) | 해시트리를 이용한 url 검색방법 | |
WO2012058076A1 (en) | Methods for prefix indexing |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |