CN112506876A - 一种支持sql查询的无损压缩查询方法 - Google Patents
一种支持sql查询的无损压缩查询方法 Download PDFInfo
- Publication number
- CN112506876A CN112506876A CN202011362702.6A CN202011362702A CN112506876A CN 112506876 A CN112506876 A CN 112506876A CN 202011362702 A CN202011362702 A CN 202011362702A CN 112506876 A CN112506876 A CN 112506876A
- Authority
- CN
- China
- Prior art keywords
- query
- sequence
- probability
- tree
- code word
- 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
Images
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/10—File systems; File servers
- G06F16/17—Details of further file system functions
- G06F16/174—Redundancy elimination performed by the file system
- G06F16/1744—Redundancy elimination performed by the file system using compression, e.g. sparse files
-
- 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/24—Querying
- G06F16/245—Query processing
- G06F16/2455—Query execution
- G06F16/24553—Query execution of query operations
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/30—Information retrieval; Database structures therefor; File system structures therefor of unstructured textual data
- G06F16/31—Indexing; Data structures therefor; Storage structures
- G06F16/316—Indexing structures
- G06F16/322—Trees
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Data Mining & Analysis (AREA)
- Databases & Information Systems (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Software Systems (AREA)
- Computational Linguistics (AREA)
- Compression, Expansion, Code Conversion, And Decoders (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了一种支持SQL查询的无损压缩查询方法。本发明将文本数据根据预设的分隔符进行分割,分割后的文本数据形成序列集合,利用基于n‑gram(n元语法)的上下文概率模型估计序列集合中各个序列的每个字符的潜在概率分布,获得每个字符的潜在概率分布后对序列集合中各个序列进行压缩,压缩后的序列通过线性扫描的不解压顺序进行多种方式的查询。本发明在保证概率分布的准确性以更好地适应数据分布的变化,并且能够确保编码后的数据支持不解压的查询,提高了查询的效率。
Description
技术领域
本发明涉及了一种数据压缩领域的无损压缩查询方法,具体涉及了一种支持SQL查询的无损压缩查询方法。
背景技术
近年来,随着互联网以及计算机技术的发展,网络上的信息也呈现出爆炸式的增长。这些信息中,除了图片视频等数据外,由各类系统和设备产生的日志信息等文本数据也占了相当大的比重。面对如此庞大的数据量,如何更加有效地存储和传输这些海量数据成了大数据时代的一项重要挑战。在实际应用中,人们往往需要在存储和传输数据之前,首先对数据进行压缩,以此来减小数据量,从而缓和存储和传输的压力。
数据压缩技术是减少存储数据所需的空间大小的技术,通常分为有损压缩和无损压缩。本发明所涉及到的是无损压缩技术,具体涉及到算术编码器技术。其核心思想是将待编码的字符序列映射到[0,1)之间的一个概率区间,每个待编码字符都会使得原有的概率区间上继续缩小,并且无论有多长的原始字符序列,最终都只会被编码成一个概率区间中的值,即只有一个码字。
算术编码器是一种基于熵的编码器。熵编码器通常包含两个核心模块,一是用于估计字符概率的概率模型,另一个则是利用概率模型计算得到的概率进行编码操作的编码器。概率模型越是准确,计算得到的概率分布越是接近真实值,则编码器得到的编码结果越是接近原始数据的信息熵,压缩效果则越好。在实际使用中,算术编码器往往使用静态概率分布,通常基于该假设的编码方法都达不到理想的压缩效果。
发明内容
为了解决背景技术中存在的问题和需求,本发明提供一种支持SQL查询的无损压缩方法。
本发明采用的技术方案如下:
本发明将文本数据根据预设的分隔符进行分割,分割后的文本数据形成序列集合,利用基于n-gram(n元语法)的上下文概率模型估计序列集合中各个序列的每个字符的潜在概率分布,获得每个字符的潜在概率分布后对序列集合中各个序列进行压缩,压缩后的序列通过线性扫描的不解压顺序进行多种方式的查询。
方法具体步骤如下:
1.按照预设的分隔符将文本数据进行切分,分割后的文本数据形成序列集合;
2.根据序列集合来建立基于n-gram(n元语法)的上下文概率模型并以前缀树的形式存储上下文概率模型;
3.利用算数编码器根据序列所在路径上的各个概率将序列集合中每一个序列编码成码字,完成对序列集合的压缩过程;
4.将码字打包成固定长度的数据包,存储到磁盘上,获得压缩数据;
5.在压缩数据上集成B+树,提高查询效率;
6.在压缩数据上进行查询。
所述步骤2具体为:
2.1建立基于n-gram的上下文概率模型,上下文概率模型是用n元语法以序列集合的前若干个字符的概率来估计下一个字符出现的概率;
针对每个序列集合中的每个字符用公式处理获得概率:
其中,si表示第i个字符,n表示n元语法中预测下一个字符概率的时候所需该字符前面序列的长度,(1≤n≤i<l),p(si|si-1,si-2,...,si-n+1)表示根据si-1,si-2,...,si-n+1序列确定第i个字符si的概率;p(si,si-1,si-2,...,si-n+1)表示si,si-1,si-2,…,si-n+1序列在序列集合中的概率,p(si-1,si-2,...,si-n+1)表示si-1,si-2,...,si-n+1序列在序列集合中的概率;
由该公式可知si的概率分布取决于字符s0到si-1所组成序列的概率。特别地,当i=0时,字符si的概率等于序列集合中字符si出现的频率除以序列集合中的总字符数;
2.2建立前缀树索引来存储上下文概率模型;
用前缀树来表示上下文概率模型中的概率分布,具体为:用前缀树的边表示序列集合的字符,用边的节点存储每个可能出现的字符的出现的概率,其中前缀树的根节点为空。
所述查询有面向压缩数据的三种SQL查询方式,分别为精确查询q1,范围查询q2以及前缀查询q3,查询具体为:在取回符合条件的码字后,再经过算数编码器的解码器按照上下文概率模型给出的概率分布进行解码,即可得到查询结果。
所述步骤5具体为:
在B+树中设置的键的长度是固定为1个字节(可以表示的键值范围为65536个)。
B+树包括根节点、左子树和右子树。待插入的码字插入B+树前,B+树的节点存储的为已有的码字键,待插入的码字的为码字值,待插入的码字所对应的码字值与节点的码字键比较后,插入节点所在的对应子树后,待插入的码字值成为对应子树中节点的码字键,查询压缩数据过程中,只查询根节点的左子树或者右子树;特别地,第一个插入树中的码字值无需经过比较,直接作为树的根节点,其值变为根节点中的键。
具体过程为:
待插入的码字值在插入B+树的过程中和节点的码字键比较,分两种情况;B+树内的节点码字键K(该值有可能是某个码字截取高位获得的)和要插入码字的码字值V比较,码字键K所在节点包括左子树和右子树,码字值V小于码字键K,码字值V插入的码字键K所在节点的左子树;码字值V大于码字键K,码字值V插入的码字键K所在节点的右子树,不断继续码字值V与下一个码字键的比较以及码字值V的插入直到所有码字插入完毕。
K和V的有效位数n分别为nK和nV,如果nK>nV并且K[0:nV]=V[0:nV],其中,K[0:nV]表示码字键K的前nV个位数,V[0:nV]表示码字键V的前nV个位数,那么显然码字键K要比码字值V大,码字值V将分配插入所在节点的右子树,继续码字值V与下一个码字键的比较以及码字值V的插入;反之,若nK<nV并且K[0:nK]=V[0:nK],则该值插入所在节点的左子树。
本发明具有的有益效果是:本发明提出了一种基于上下文的概率模型,该模型在保证概率分布的准确性以更好地适应数据分布的变化,并且能够确保编码后的数据支持不解压的查询;本发明可以保证在压缩数据上直接进行SQL查询,同时,为了进一步的提高查询效率,本发明还可以在压缩数据上建立数据库索引来加速查询。
附图说明
图1是整体框架图;
图2是近似存储n-gram的前缀树结构;
图3是码字分包存储过程图。
具体实施方式
现结合具体实施和示例对本发明的技术方案作进一步说明。
本发明的整体框架图如图1所示,具体实施过程和工作原理如下:
1.按照预设的分隔符将文本数据进行切分,分隔符例如空格,分割后的文本数据形成序列集合。例如文本“The apple is red”会被分割成一个含有4个序列(单词)的集合。
2.根据序列集合来建立基于n-gram(n元语法)的上下文概率模型并以前缀树的形式存储上下文概率模型。
步骤2具体为:
2.1建立基于n-gram的上下文概率模型,本发明借助了计算语言学领域的n-gram模型技术来描述上下文概率模型;上下文概率模型本质上可以看作一种字符级别的条件概率分布,即是用n元语法以序列集合的前若干个字符的概率来估计下一个字符出现的概率;
针对每个序列集合中的每个字符用公式处理获得概率:
其中,si表示第i个字符,n表示字符序数,(1≤n≤i<l),p(si|si-1,si-2,...,si-n+1)表示根据si-1,si-2,...,si-n+1序列确定第i个字符si的概率;p(si,si-1,si-2,...,si-n+1)表示si,si-1,si-2,...,si-n+1序列在序列集合中的概率,p(si-1,si-2,...,si-n+1)表示si-1,si-2,...,si-n+1序列在序列集合中的概率;
由该公式可知si的概率分布取决于字符s0到si-1所组成序列的概率。特别地,当i=0时,字符si的概率等于序列集合中字符si出现的频率除以序列集合中的总字符数;
2.2建立前缀树索引来存储上下文概率模型;
由于字符的概率是由其n-gram前缀(prefix)的概率计算得到,因此用前缀树来表示上下文概率模型中的概率分布,具体为:用前缀树的边表示序列集合的字符,用边的节点存储每个可能出现的字符的出现的概率,其中前缀树的根节点为空,$表示前缀树中剩下的字符的总概率。
实施例如图2所示,图2中树高为3(即存储3-gram),字符集合为{a,b,c,d}时的前缀树结构。其中,每个边表示一个字符,而从根节点出发的一系列边构成前缀。每个节点中存储着特定前缀下不同字符出现的条件概率。其中,第1层节点(根节点为第0层)1阶的n-gram值,即统计直接字符频率得出的概率。对每一个特定的节点,它的下一个字符的概率自然不是均匀的,概率较高的字符单独构成一条边,对应的孩子节也被保留下来点,存放其概率值,而那些概率较小的字符则被合并成一个特殊字符,如图2中的“$”,其对应的孩子节点中存储了这些符号出现概率的总和(在图中层号为1的$指向的节点概率值为0.2)。处于节省空间的考虑,$指向的节点没有子节点。同时,其中包含的所有符号的概率被视作相等的,同时其中记录了剩余可能出现的字符总数以便计算平均概率值。
3.利用算数编码器根据序列所在路径上的各个概率将序列集合中每一个序列编码成码字,完成对序列集合的压缩过程。
4.将码字打包成固定长度的数据包,存储到磁盘上,获得压缩数据。存储策略的基本思想如图3所示。分配给码字的最小单位称为数据包。一个码字可以占用一个或多个包,用一个位向量来标记下一个包是否同属于同一个码字。如图3所示,包0和包1用于存储码字0。向量的第一位设置为1,表示下一个数据包仍输入码字0。向量的第二位是0,因此包1是码字0的最后一个包。并不是所有码字都能充分利用分配的数据包。从图中可以看出,在包1和包2的末尾仍存在一些未使用的位。编码器完成编码后,码字从最高有效位开始,从左至右依次填充到每个包中,而未使用的位始终位于码字占用的最后一个包的尾部。在实际情况下,包的大小通常为2字节。
5.在压缩数据上集成B+树,提高查询效率。
步骤5具体为:在B+树中设置的键的长度是固定为1个字节(可以表示的键值范围为65536个)。
B+树包括根节点、左子树和右子树,待插入的码字插入B+树前,B+树的节点存储的为已有的码字键,待插入的码字的为码字值,待插入的码字所对应的码字值与节点的码字键比较后,插入节点所在的对应子树后,待插入的码字值成为对应子树中节点的码字键,查询压缩数据过程中,只查询根节点的左子树就可得到查询结果,查询的效率从而得到提高;
具体过程为:
待插入的码字值在插入B+树的过程中和节点的码字键比较,分两种情况;B+树内的节点的码字键K(该值有可能是某个码字截取高位获得的)和要插入码字的码字值V比较,码字键K所在节点包括左子树和右子树,码字值V小于码字键K,码字值V插入的码字键K所在节点的左子树;码字值V大于码字键K,码字值V插入的码字键K所在节点的右子树,不断继续码字值V与下一个码字键的比较以及码字值V的插入直到所有码字插入完毕。
K和V的有效位数n分别为nK和nV,如果nK>nV并且K[0:nV]=V[0:nV],其中,K[0:nV]表示码字键K的前nV个位数,V[0:nV]表示码字键V的前nV个位数,那么显然码字键K要比码字值V大,码字值V将分配插入所在节点的右子树,继续码字值V与下一个码字键的比较以及码字值V的插入;反之,若nK<nV并且K[0:nK]=V[0:nK],则该值插入所在节点的左子树。
由于B+树是有序索引,因此在范围查询和前缀查询过程中,在找到第一个符合要求的叶子节点后,只需顺序扫描叶子节点,直到遇到第一个不符合要求的叶子节点为止,然后返回符合要求叶子节点中的码字即可。而由于B+树中存储的键值有可能只是码字的一部分,查询结果的两侧需要进一步过滤,但是在实际编码中的键值占用空间的选取和平均的码字长度接近,只需要考虑有限位的比较。
6.在压缩后的数据上进行查询。本发明定了面向压缩数据的三种SQL查询方式。精确查询q1,范围查询q2以及前缀查询q3的查询的形式如下,其中v1到v4指的是SQL中包含的查询序列:
q1:s=v1
q2:v2<s<v3
q3:s=v4%
在第一类查询,即精确查询q1中,查询序列压缩方式与原始数据中字符序列的压缩方式一致,得到一个编码后的码字c(v1),那么查询结果就可以通过直接匹配c(v1)=c(s1)得到。
范围查询基于算术编码的数值特性。对于范围查询q2,首先对字符序列v2和v3进行编码,得到两对编码后的概率区间上下界,[low(v2),high(v2))和[low(v3),high(v3))。
那么,由于high(v2)≤low(v3),可以将(v2,v3)转化为编码后的范围(low(v2),high(v3)),按照这一范围对压缩数据上的码字进行匹配即可。
前缀查询q3可以视作范围查询的一种特殊情况,若字符串v为字符串s的前缀,那么对s的编码相当于在编码v的基础上继续缩小对应的概率区间,故s编码最后一个字符时的区间,必然被包含在s对应的区间内,那么前缀查询即可以被转换成范围查询。前缀查询q3将被转化为码字区间(low(v4),high(v4))在编码后数据上的匹配过程。
上述三种查询方式具体为:在取回符合条件的码字后,再经过算数编码器的解码器按照上下文概率模型给出的概率分布进行解码,即可得到查询结果。
Claims (5)
1.一种支持SQL查询的无损压缩查询方法,其特征在于:将文本数据根据预设的分隔符进行分割,分割后的文本数据形成序列集合,利用基于n-gram(n元语法)的上下文概率模型估计序列集合中各个序列的每个字符的潜在概率分布,获得每个字符的潜在概率分布后对序列集合中各个序列进行压缩,压缩后的序列通过线性扫描的不解压顺序进行多种方式的查询。
2.根据权利要求1所述的一种支持SQL查询的无损压缩查询方法,其特征在于:方法具体步骤如下:
1.按照预设的分隔符将文本数据进行切分,分割后的文本数据形成序列集合;
2.根据序列集合来建立基于n-gram(n元语法)的上下文概率模型并以前缀树的形式存储上下文概率模型;
3.利用算数编码器根据序列所在路径上的各个概率将序列集合中每一个序列编码成码字,完成对序列集合的压缩过程;
4.将码字打包成固定长度的数据包,存储到磁盘上,获得压缩数据;
5.在压缩数据上集成B+树,提高查询效率;
6.在压缩数据上进行查询。
3.根据权利要求2所述的一种支持SQL查询的无损压缩查询方法,其特征在于:所述步骤2具体为:
2.1建立基于n-gram的上下文概率模型,上下文概率模型是用n元语法以序列集合的前若干个字符的概率来估计下一个字符出现的概率;
针对每个序列集合中的每个字符用公式处理获得概率:
其中,si表示第i个字符,n表示n元语法中预测下一个字符概率的时候所需该字符前面序列的长度,(1≤n≤i<l),p(si|si-1,si-2,...,si-n+1)表示根据si-1,si-2,...,si-n+1序列确定第i个字符si的概率;p(si,si-1,si-2,...,si-n+1)表示si,si-1,si-2,...,si-n+1序列在序列集合中的概率,p(si-1,si-2,...,si-n+1)表示si-1,si-2,...,si-n+1序列在序列集合中的概率;
当i=0时,字符si的概率等于序列集合中字符si出现的频率除以序列集合中的总字符数;
2.2建立前缀树索引来存储上下文概率模型;
用前缀树来表示上下文概率模型中的概率分布,具体为:用前缀树的边表示序列集合的字符,用边的节点存储每个可能出现的字符的出现的概率,其中前缀树的根节点为空。
4.根据权利要求2所述的一种支持SQL查询的无损压缩查询方法,其特征在于:所述查询有面向压缩数据的三种SQL查询方式,分别为精确查询q1,范围查询q2以及前缀查询q3,查询具体为:在取回符合条件的码字后,再经过算数编码器的解码器按照上下文概率模型给出的概率分布进行解码,即可得到查询结果。
5.根据权利要求2所述的一种支持SQL查询的无损压缩查询方法,其特征在于:所述步骤5具体为:B+树包括根节点、左子树和右子树。待插入的码字插入B+树前,待插入的码字所对应的码字值与节点的码字键比较后,插入节点所在的对应子树后,待插入的码字值成为对应子树中节点的码字键,查询压缩数据过程中,只查询根节点的左子树或者右子树。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011362702.6A CN112506876B (zh) | 2020-11-27 | 2020-11-27 | 一种支持sql查询的无损压缩查询方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011362702.6A CN112506876B (zh) | 2020-11-27 | 2020-11-27 | 一种支持sql查询的无损压缩查询方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112506876A true CN112506876A (zh) | 2021-03-16 |
CN112506876B CN112506876B (zh) | 2022-05-13 |
Family
ID=74967166
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202011362702.6A Active CN112506876B (zh) | 2020-11-27 | 2020-11-27 | 一种支持sql查询的无损压缩查询方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112506876B (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117579081A (zh) * | 2023-11-23 | 2024-02-20 | 哈尔滨工程大学 | 一种二进制数据无损压缩方法、设备及存储介质 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2014049594A1 (en) * | 2012-09-28 | 2014-04-03 | Sqream Technologies Ltd | A system and a method for executing sql basic operators on compressed data without decompression process |
CN107851108A (zh) * | 2015-06-23 | 2018-03-27 | 微软技术许可有限责任公司 | 使用位向量搜索索引的匹配文档 |
CN108256076A (zh) * | 2018-01-18 | 2018-07-06 | 广州大学 | 分布式海量数据处理方法及装置 |
-
2020
- 2020-11-27 CN CN202011362702.6A patent/CN112506876B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2014049594A1 (en) * | 2012-09-28 | 2014-04-03 | Sqream Technologies Ltd | A system and a method for executing sql basic operators on compressed data without decompression process |
CN107851108A (zh) * | 2015-06-23 | 2018-03-27 | 微软技术许可有限责任公司 | 使用位向量搜索索引的匹配文档 |
CN108256076A (zh) * | 2018-01-18 | 2018-07-06 | 广州大学 | 分布式海量数据处理方法及装置 |
Non-Patent Citations (2)
Title |
---|
HIDEAKI KIMURA等: "Correlation Maps: A Compressed Access Method for Exploiting Soft Functional Dependencies", 《PROCEEDINGS OF THE VLDB ENDOWMENT》 * |
黄缙华等: "基于EMS时间序列数据的实时全息无损压缩方法的研究与应用", 《广东电力》 * |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117579081A (zh) * | 2023-11-23 | 2024-02-20 | 哈尔滨工程大学 | 一种二进制数据无损压缩方法、设备及存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN112506876B (zh) | 2022-05-13 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
EP0695040B1 (en) | Data compressing method and data decompressing method | |
US9223765B1 (en) | Encoding and decoding data using context model grouping | |
EP1147612B1 (en) | Code book construction for variable to variable length entropy encoding | |
CN1183683C (zh) | 使用前缀预测的位自适应编码方法 | |
EP0673122B1 (en) | Coding apparatus | |
CN101783788B (zh) | 文件压缩、解压缩方法、装置及压缩文件搜索方法、装置 | |
CN116681036B (zh) | 基于数字孪生的工业数据存储方法 | |
US20060004858A1 (en) | Self-Adaptive Prefix Encoding for Stable Node Identifiers | |
JPH0779262B2 (ja) | 圧縮データの符号化方法 | |
KR101969848B1 (ko) | 유전자 데이터를 압축하는 방법 및 장치 | |
CN101667843B (zh) | 嵌入式系统的数据压缩、及解压缩方法与装置 | |
EP0127815B1 (en) | Data compression method | |
CN116610265B (zh) | 一种商务信息咨询系统的数据存储方法 | |
WO2010108373A1 (zh) | 一种对词库压缩编码及解码的方法和系统 | |
US7148821B2 (en) | System and method for partition and pattern-match decoding of variable length codes | |
CN112506876B (zh) | 一种支持sql查询的无损压缩查询方法 | |
Anisimov et al. | Variable-length prefix codes with multiple delimiters | |
CN1426629A (zh) | 使用多个编码器的优化无损压缩的方法和装置 | |
CN116827354B (zh) | 一种文件数据分布式存储管理系统 | |
Cannane et al. | General‐purpose compression for efficient retrieval | |
US20060125660A1 (en) | Digital data compression robust relative to transmission noise | |
CN117579081B (zh) | 一种二进制数据无损压缩方法、设备及存储介质 | |
JP2590287B2 (ja) | データ圧縮方法およびデータ圧縮装置 | |
US6794999B1 (en) | Resilient parameterized prefix codes for adaptive coding | |
JPH1155125A (ja) | 文字データの圧縮・復元方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |