CN118394979B - 用于Neo4j图数据库闪回查询方法、装置和存储介质 - Google Patents
用于Neo4j图数据库闪回查询方法、装置和存储介质 Download PDFInfo
- Publication number
- CN118394979B CN118394979B CN202410872463.0A CN202410872463A CN118394979B CN 118394979 B CN118394979 B CN 118394979B CN 202410872463 A CN202410872463 A CN 202410872463A CN 118394979 B CN118394979 B CN 118394979B
- Authority
- CN
- China
- Prior art keywords
- data
- file
- graph database
- flashback
- actual
- 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.)
- Active
Links
- 238000000034 method Methods 0.000 title claims abstract description 61
- 238000013500 data storage Methods 0.000 claims abstract description 104
- 238000004590 computer program Methods 0.000 claims description 16
- 230000000977 initiatory effect Effects 0.000 claims description 3
- 238000012163 sequencing technique Methods 0.000 claims description 2
- 239000002699 waste material Substances 0.000 abstract description 6
- 230000008569 process Effects 0.000 description 7
- 230000005540 biological transmission Effects 0.000 description 6
- 230000001360 synchronised effect Effects 0.000 description 6
- 230000008859 change Effects 0.000 description 5
- 238000010586 diagram Methods 0.000 description 4
- 238000012986 modification Methods 0.000 description 4
- 230000004048 modification Effects 0.000 description 4
- 238000012545 processing Methods 0.000 description 4
- 230000008901 benefit Effects 0.000 description 3
- 230000006870 function Effects 0.000 description 3
- 230000002688 persistence Effects 0.000 description 3
- 238000006243 chemical reaction Methods 0.000 description 2
- 238000004891 communication Methods 0.000 description 2
- 238000005516 engineering process Methods 0.000 description 2
- 238000004519 manufacturing process Methods 0.000 description 2
- 238000005192 partition Methods 0.000 description 2
- 238000011084 recovery Methods 0.000 description 2
- 230000003068 static effect Effects 0.000 description 2
- OKTJSMMVPCPJKN-UHFFFAOYSA-N Carbon Chemical compound [C] OKTJSMMVPCPJKN-UHFFFAOYSA-N 0.000 description 1
- 241000282326 Felis catus Species 0.000 description 1
- 108010001267 Protein Subunits Proteins 0.000 description 1
- 238000004458 analytical method Methods 0.000 description 1
- 238000004364 calculation method Methods 0.000 description 1
- 238000012790 confirmation Methods 0.000 description 1
- 238000013523 data management Methods 0.000 description 1
- 238000013461 design Methods 0.000 description 1
- 238000011161 development Methods 0.000 description 1
- 229910021389 graphene Inorganic materials 0.000 description 1
- 238000003780 insertion Methods 0.000 description 1
- 230000037431 insertion Effects 0.000 description 1
- 230000007774 longterm Effects 0.000 description 1
- 238000010295 mobile communication Methods 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本申请涉及一种用于Neo4j图数据库闪回查询方法、装置和存储介质,其中,该用于Neo4j图数据库闪回查询方法包括:通过在接收到针对Neo4j图数据库的数据建立版本请求的情况下,获取针对Neo4j图数据库的数据存储文件的写入请求,其中,写入请求包括数据存储文件的文件名和实际写入位置;对Neo4j图数据库中的数据文件类型的数据存储文件基于预设的大小进行划分,得到若干数据块;根据实际写入位置确定若干数据块中变化的数据块;将变化的数据块和非数据文件类型的数据存储文件一并提交至版本库,得到Neo4j图数据库的数据版本号;根据数据版本号进行闪回查询得到目标闪回查询结果,减少了Git库的存储资源的浪费,提高了Git库的存储资源利用率。
Description
技术领域
本申请涉及数据库领域,特别是涉及用于Neo4j图数据库闪回查询方法、装置和存储介质。
背景技术
Neo4j图数据库是一个高性能的图数据库,它在底层使用图的数据结构来存储数据,而不是像关系型数据库一样使用表的数据结构来存储数据。Neo4j提供了大规模的可扩展性,在一台机器上可以处理数十亿节点/关系/属性的图,可以扩展到多台机器上并行运行。Neo4j数据库文件会被持久化到磁盘存储中以获得长期的持久性,数据文件一般存储在Neo4j目录下的/data/databases/graph.db中(v3.0+版本)。与传统的关系型数据库不同,Neo4j是一个无模式的数据库,且数据库的内部只有点、关系、属性和索引等,因此Neo4j使用固定的记录长度来持久化数据库,并通过这些文件中的偏移量来快速进行数据的插入和查询。
数据库的闪回查询是根据过去的一个时刻或者系统更改号(SCN值),返回当时已经提交的数据快照,既可以用作查询历史版本的数据,也可以起到一定的数据恢复作用。专利《一种PostgreSQL数据库的数据闪回查询及恢复方法、装置》、专利《一种基于dolt数据库的数据闪回查询方法及装置》分别提出不同的方法实现数据库的闪回查询,但是它们适用的都是关系型数据库,对Neo4j这一类的图数据库都不适用。
在相关技术中,基于Neo4j图数据库实现数据闪回查询的方法,往往是将Neo4j的数据存储文件都提交至Git库,对数据存储文件建立版本,从而实现Neo4j图数据库的闪回查询。然而,Neo4j的每次修改(增加记录、删除记录、修改记录)都会持久化到数据存储文件中,Neo4j是基于文件存储的,通过使用Git库对文件建立版本以实现闪回查询。但是Git库在建立版本时,会同时完整地保存修改前的文件和修改后的文件,即使只修改了一个大文件中的很小部分内容,Git库也会完整地保存修改后的文件,由于重复保存未修改的文件内容,造成磁盘空间的浪费,同时由于Git库的快速膨胀,影响Git命令的计算效率。
针对相关技术中存在由于现有Neo4j数据闪回查询方式导致Git库可用存储资源浪费和Git库存储资源利用率低的问题,目前还没有提出有效的解决方案。
发明内容
在本实施例中提供了一种用于Neo4j图数据库闪回查询方法、装置和存储介质,以解决相关技术中由于现有Neo4j数据闪回查询方式导致Git库可用存储资源浪费和Git库存储资源利用率低的问题。
第一个方面,在本实施例中提供了一种用于Neo4j图数据库闪回查询方法,包括:
在接收到针对Neo4j图数据库的数据建立版本请求的情况下,获取针对Neo4j图数据库的数据存储文件的写入请求,其中,写入请求包括数据存储文件的文件名和实际写入位置;
判断Neo4j图数据库的数据存储文件的类型是否为数据文件类型,若是,则将Neo4j图数据库的数据存储文件基于预设的大小进行划分,得到若干数据块;
根据实际写入位置确定若干数据块中变化的数据块;
将变化的数据块和Neo4j图数据库中的非数据文件类型的数据存储文件一并提交至版本库,得到Neo4j图数据库的数据版本号;
根据数据版本号进行闪回查询得到目标闪回查询结果。
在其中的一些实施例中,在获取针对数据存储文件的写入请求之前,还包括:
判断当前线上环境是否有写入请求正在执行,若否,则向线上环境发起暂停执行写入请求,将Neo4j图数据库的数据存储文件同步至闪回查询环境中。
在其中的一些实施例中,写入请求参数还包括写入请求操作执行时间戳和实际配置页的大小;其中,若干数据块的大小为实际配置页的大小的整数倍。
在其中的一些实施例中,根据实际写入位置确定若干数据块中变化的数据块,包括:
根据实际写入位置和数据块的大小确定变化的数据块。
在其中的一些实施例中,根据实际写入位置确定若干数据块中变化的数据块,包括:
根据写入请求操作执行时间戳对写入请求进行排序,得到待处理写入请求队列;
初始化一个存储键值对结构,存储键值对结构的键为数据存储文件的文件名,存储键值对结构中的值为变化的数据块的实际位置集合;
获取待处理写入请求队列中的当前写入请求,当前写入请求包括当前写入请求文件名和当前写入请求实际写入位置;
根据当前写入请求实际写入位置确定变化的数据块的实际位置;
判断存储键值对结构中是否存在当前写入请求文件名;
若否,则新建一个位置集合,将变化的数据块的实际位置添加至新建的位置集合中,得到包含变化的数据块的实际位置的位置集合;
若是,则获取存储键值对结构中与当前写入请求文件名对应的位置集合,将变化的数据块的实际位置添加至与当前写入请求文件名对应的位置集合中,得到包含变化的数据块的实际位置的位置集合;
将当前写入请求从待处理写入请求队列中移除,重复上述操作直至处理完所有待处理写入请求队列中的写入请求,得到目标存储键值对结构,目标存储键值对结构即为变化的数据块。
在其中的一些实施例中,根据实际写入位置确定若干数据块中变化的数据块,包括:
根据变化的数据块的实际位置复制数据存储文件中对应位置的文件内容至目标存储键值对结构中,得到变化的数据块。
在其中的一些实施例中,根据数据版本号进行闪回查询得到目标闪回查询结果,包括:
在接收到闪回查询请求的情况下,根据闪回查询请求调取版本库中所有的未变动的数据块和变动的数据块;
根据数据存储文件的文件名将调取的数据块中相同文件名的数据块进行组合,得到目标数据文件集合;
将目标数据文件集合存储至闪回查询环境的固定目录下;
重启Neo4j服务;
根据数据版本号在固定目录下进行闪回查询,得到目标闪回查询结果。
第二个方面,在本实施例中提供了一种用于Neo4j图数据库闪回查询装置,应用于Neo4j图数据库,包括:获取模块、判断模块、定位模块、版本模块以及闪回查询模块,其中:
获取模块,用于在接收到针对Neo4j图数据库的数据建立版本请求的情况下;获取针对Neo4j图数据库的数据存储文件的写入请求,其中,写入请求包括数据存储文件的文件名和实际写入位置;
判断模块,用于判断Neo4j图数据库的数据存储文件的类型是否为数据文件类型,若是,则将Neo4j图数据库的数据存储文件基于预设的大小进行划分,得到若干数据块;
定位模块,用于根据实际写入位置确定若干数据块中变化的数据块;
版本模块,用于将变化的数据块和Neo4j图数据库中的非数据文件类型的数据存储文件一并提交至版本库,得到Neo4j图数据库的数据版本号;
闪回查询模块,用于根据数据版本号进行闪回查询得到目标闪回查询结果。
第三个方面,在本实施例中提供了一种电子装置,包括存储器、处理器以及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现上述第一个方面所述的用于Neo4j图数据库闪回查询方法。
第四个方面,在本实施例中提供了一种存储介质,其上存储有计算机程序,该程序被处理器执行时实现上述第一个方面所述的用于Neo4j图数据库闪回查询方法。
与相关技术相比,在本实施例中提供的用于Neo4j图数据库闪回查询方法,通过在接收到针对Neo4j图数据库的数据建立版本请求的情况下,获取针对Neo4j图数据库的数据存储文件的写入请求,其中,写入请求包括数据存储文件的文件名和实际写入位置;判断Neo4j图数据库的数据存储文件的类型是否为数据文件类型,若是,则将Neo4j图数据库的数据存储文件基于预设的大小进行划分,得到若干数据块;根据实际写入位置确定若干数据块中变化的数据块;将变化的数据块和Neo4j图数据库中的非数据文件类型的数据存储文件一并提交至版本库,得到Neo4j图数据库的数据版本号;根据数据版本号进行闪回查询得到目标闪回查询结果,减少了Git库的存储资源的浪费,提高了Git库的存储资源利用率。
本申请的一个或多个实施例的细节在以下附图和描述中提出,以使本申请的其他特征、目的和优点更加简明易懂。
附图说明
此处所说明的附图用来提供对本申请的进一步理解,构成本申请的一部分,本申请的示意性实施例及其说明用于解释本申请,并不构成对本申请的不当限定。在附图中:
图1是本实施例的用于Neo4j图数据库闪回查询方法的终端的硬件结构框图。
图2是本实施例的用于Neo4j图数据库闪回查询方法的流程图。
图3是本实施例的变化的数据块定位方法流程图。
图4是本实施例的另一种用于Neo4j图数据库闪回查询方法的流程图。
图5是本实施例的用于Neo4j图数据库闪回查询装置的结构框图。
具体实施方式
为更清楚地理解本申请的目的、技术方案和优点,下面结合附图和实施例,对本申请进行了描述和说明。
除另作定义外,本申请所涉及的技术术语或者科学术语应具有本申请所属技术领域具备一般技能的人所理解的一般含义。在本申请中的“一”、“一个”、“一种”、“该”、“这些”等类似的词并不表示数量上的限制,它们可以是单数或者复数。在本申请中所涉及的术语“包括”、“包含”、“具有”及其任何变体,其目的是涵盖不排他的包含;例如,包含一系列步骤或模块(单元)的过程、方法和系统、产品或设备并未限定于列出的步骤或模块(单元),而可包括未列出的步骤或模块(单元),或者可包括这些过程、方法、产品或设备固有的其他步骤或模块(单元)。在本申请中所涉及的“连接”、“相连”、“耦接”等类似的词语并不限定于物理的或机械连接,而可以包括电气连接,无论是直接连接还是间接连接。在本申请中所涉及的“多个”是指两个或两个以上。“和/或”描述关联对象的关联关系,表示可以存在三种关系,例如,“A和/或B”可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。通常情况下,字符“/”表示前后关联的对象是一种“或”的关系。在本申请中所涉及的术语“第一”、“第二”、“第三”等,只是对相似对象进行区分,并不代表针对对象的特定排序。
在本实施例中提供的方法实施例可以在终端、计算机或者类似的运算装置中执行。比如在终端上运行,图1是本实施例的用于Neo4j图数据库闪回查询方法的终端的硬件结构框图。如图1所示,终端可以包括一个或多个(图1中仅示出一个)处理器102和用于存储数据的存储器104,其中,处理器102可以包括但不限于微处理器MCU或可编程逻辑器件FPGA等的处理装置。上述终端还可以包括用于通信功能的传输设备106以及输入输出设备108。本领域普通技术人员可以理解,图1所示的结构仅为示意,其并不对上述终端的结构造成限制。例如,终端还可包括比图1中所示更多或者更少的组件,或者具有与图1所示出的不同配置。
存储器104可用于存储计算机程序,例如,应用软件的软件程序以及模块,如在本实施例中的用于Neo4j图数据库闪回查询方法对应的计算机程序,处理器102通过运行存储在存储器104内的计算机程序,从而执行各种功能应用以及数据处理,即实现上述的方法。存储器104可包括高速随机存储器,还可包括非易失性存储器,如一个或者多个磁性存储装置、闪存、或者其他非易失性固态存储器。在一些实例中,存储器104可进一步包括相对于处理器102远程设置的存储器,这些远程存储器可以通过网络连接至终端。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
传输设备106用于经由一个网络接收或者发送数据。上述的网络包括终端的通信供应商提供的无线网络。在一个实例中,传输设备106包括一个网络适配器(NetworkInterface Controller,简称为NIC),其可通过基站与其他网络设备相连从而可与互联网进行通讯。在一个实例中,传输设备106可以为射频(RadioFrequency,简称为RF)模块,其用于通过无线方式与互联网进行通讯。
在本实施例中提供了一种用于Neo4j图数据库闪回查询方法,图2是本实施例的用于Neo4j图数据库闪回查询方法的流程图,如图2所示,该流程包括如下步骤:
步骤S201,在接收到针对Neo4j图数据库的数据建立版本请求的情况下,获取针对Neo4j图数据库的数据存储文件的写入请求,其中,写入请求包括数据存储文件的文件名和实际写入位置。
具体地,Neo4j图数据库的数据基于文件进行存储,数据存储文件类型有多种,例如存储节点信息的文件neostore.nodestore.db、存储属性信息的文件neostore.propertystore.db以及存储关系信息的文件neostore.relationshipstore.db等等。在闪回查询中,使用Git库对Neo4j图数据库的所有文件建立版本号,通过查询版本号实现闪回查询。在实现数据库的闪回查询之前,先要对Neo4j图数据库的数据提交至Git库建立版本号。
具体过程为:在接收到针对Neo4j图数据库的数据建立版本请求的情况下,先通过日志模块,获取具体地写入请求,写入请求的类型包括对Neo4j图数据库的数据进行增加、删除或修改等操作。其中,写入请求包括如上所述的所有数据存储文件类型中的数据的写入请求,且写入请求参数包括数据存储文件的文件名和实际写入位置,通过文件名可以区分数据存储文件的文件类型,通过实际写入位置可以确定执行写入过程的具体位置,从而修改变动的数据,对数据存储文件进行修改得到新的版本数据文件。上述获取到的写入请求都存储于闪回查询环境中。
Neo4j在服务启动的时候,会根据用户配置初始化Neo4j服务的缓存并在记录更新的过程中使用缓存完成记录更新,并在合适的时候,将缓存中的内容刷新到数据存储文件中去,完成持久化。Neo4j在上述持久化的过程中,使用PageSwapper接口的实现类去将缓存中的内容刷新到数据存储文件中。Neo4j在管理缓存的时候,会自动将缓存分隔成页,记为Page,每一个Page会有一个页的标识,记为PageID,一个Page的大小记为PageSize,PageSize的值默认为8KB,具体也可以由系统参数指定,本实施例中对此不做具体限定。另外,Neo4j在持久化时,会使用PageSwapper接口的默认实现类SingleFilePageSwapper来实现。SingleFilePageSwapper类实现了PageSwapper接口的写入(write())方法,用来将某一个PageID对应的Page内容写入到数据存储文件中去。Neo4j将PageID进行转换,得到了文件的实际写入位置fileOffset,并最后调用SingleFilePageSwapper类的交换出(swapOut())方法进行实际写入,swapOut()方法接收的参数就包括了数据存储文件的实际写入位置fileOffset。
日志模块可以通过面向切面编程(Aspect Oriented Programming 简称AOP拦截)的方式,或者是增加日志log的方法,记录下swapOut()方法执行时的参数,包括文件的实际写入位置fileOffset,结合上下文环境,日志模块同时还可以记录下该方法执行时的数据存储文件的文件名fileName。
步骤S202,判断Neo4j图数据库的数据存储文件的类型是否为数据文件类型,若是,则将Neo4j图数据库的数据存储文件基于预设的大小进行划分,得到若干数据块。
具体地,由于Neo4j图数据库的数据存储文件类型不同,对Neo4j图数据库的数据存储文件的处理方式也不同,目前,数据存储文件可以分为两类,一类是存储具体的记录数据的,该类文件会随着记录数的增加而越来越大,将此类文件称为数据文件,此类数据存储文件适合进行分割;另一类是存储统计数据(比如记录的最大ID值等)或者索引数据的,为非数据文件,存储统计数据的文件会随着记录数的变化而变化,但文件本身较小,而且文件也不会越来越大,因此存储统计数据的文件没有必要进行分割;存储索引数据的文件,由于存储格式非常复杂,也不适合进行分割。本申请中主要是由于数据文件类型的数据增长,导致提交至Git库的文件增长,占用大量的内存,由于重复存储未变动的数据导致Git库大量存储空间的浪费。因此,先判断Neo4j图数据库的数据存储文件的类型是否为数据文件类型,若为数据文件类型,则将Neo4j图数据库的数据存储文件基于预设的大小进行划分,得到若干数据块,若为非数据文件类型,则不进行划分处理,直接提交原文件至Git库。
步骤S203,根据实际写入位置确定若干数据块中变化的数据块。
具体地,在将数据存储文件划分成若干数据块后,将写入请求中的实际写入位置转换成在具体的数据块中的实际位置,从而得到变化的数据块。
步骤S204,将变化的数据块和Neo4j图数据库中的非数据文件类型的数据存储文件一并提交至版本库,得到Neo4j图数据库的数据版本号。
具体地,Neo4j进行数据管理时,将数据都写入到固定目录的数据存储文件中,将变化的数据块和非数据文件类型的数据存储文件一并提交至Git库,Git库返回一个哈希值,该哈希值作为Neo4j图数据库的数据版本号。其中,Git库中的版本数据以划分后的数据块的形式储存。
步骤S205,根据数据版本号进行闪回查询得到目标闪回查询结果。
在接收到数据库闪回查询请求后,根据数据版本号在Git库中查询得到该版本号下所有的数据块,将查询得到的所有数据块的文件更新至该版本下,得到闪存查询环境下的固定目录,在该固定目录下闪回查询得到目标闪回查询结果。
通过上述步骤S201至步骤S205,在接收到针对Neo4j图数据库的数据建立版本请求的情况下,获取针对Neo4j图数据库的数据存储文件的写入请求,其中,写入请求包括数据存储文件的文件名和实际写入位置;判断Neo4j图数据库的数据存储文件的类型是否为数据文件类型,若是,则将Neo4j图数据库的数据存储文件基于预设的大小进行划分,得到若干数据块;根据实际写入位置确定若干数据块中变化的数据块;将变化的数据块和Neo4j图数据库中的非数据文件类型的数据存储文件一并提交至版本库,得到Neo4j图数据库的数据版本号;根据数据版本号进行闪回查询得到目标闪回查询结果。与现有技术中直接将整个数据存储文件提交至Git库建立版本号相比,本申请通过将数据存储文件划分成若干数据块,通过写入实际位置定位到具体变动的数据块,将变动的数据块的数据存储文件和Neo4j图数据库中的非数据文件类型的数据存储文件一并提交至Git库建立版本号,对没有变动的数据块不再提交至Git库建立版本号,减少了Git库中由于对没有变动的数据存储文件重复数建立版本号而浪费Git库的存储资源,提高了Git库存储资源的利用率。
在其中的一些实施例中,在获取针对数据存储文件的写入请求之前,还包括:
判断当前线上环境是否有写入请求正在执行,若否,则向线上环境发起暂停执行写入请求,将Neo4j图数据库的数据存储文件同步至闪回查询环境中。
具体地,为避免数据闪回查询功能对线上环境读写请求的影响,设置一个同步模块,将Neo4j数据库的数据存储文件从线上环境同步到闪回查询环境中。
同步模块接收到建立数据版本的请求时,首先,判断当前线上环境是否有写入请求正在执行中,如果有写入请求正在执行中,则随机等待一段时间后再检查,直到没有写入请求正在执行中。如果没有写入请求正在执行中,则向线上环境发出请求,暂停写入请求的执行,得到线上环境的确认后,同步模块开启同步工作,使用同步工具将Neo4j图数据库的数据存储文件同步至闪回查询环境中。同步完成后,向线上环境发出请求,恢复线上环境写请求的执行,同时记录下此时的时间戳T。
在另一个实施例中,写入请求参数还包括写入请求操作执行时间戳和实际配置页的大小;其中,若干数据块的大小为实际配置页的大小的整数倍。
具体地,在通过日志模块获取具体的写入请求时,获取的写入请求参数还包括写入请求操作执行时间戳和实际配置页的大小;根据各写入请求操作执行时间戳对写入请求操作进行排序,根据排序好的写入请求有序定位出所有发生变动的数据块。Neo4j在管理缓存的时候,会自动将缓存分隔成页,记为Page即配置页,每一个Page会有一个页的标识,记为PageID,一个Page的大小记为PageSize,PageSize的值默认为8KB,具体也可以由系统参数指定,本实施例中对此不做具体限定,根据实际需求将多个配置页组成一个数据块,数据块的大小chunkSize为实际配置页的大小的整数倍。
在其他一些实施例中,根据实际写入位置确定若干数据块中变化的数据块,包括:根据实际写入位置和数据块的大小确定变化的数据块。
具体地,从请求参数中得到实际写入位置fileOffset,将实际写入位置fileOffset转换成变化数据块位置chunkID,其具体转换公式为:
chunkID=fileOffset/chunkSize。
在本实施例中还提供了一种变化的数据块定位方法,图3是本实施例的变化的数据块定位方法流程图,如图3所示,根据实际写入位置确定若干数据块中变化的数据块,包括:
步骤S301,根据写入请求操作执行时间戳对写入请求进行排序,得到待处理写入请求队列S。
具体的,日志模块根据写入请求操作执行时间戳的先后顺序对写入请求进行排序,得到排序后的待处理写入请求队列S。
步骤S302,初始化一个存储键值对结构,存储键值对结构的键为数据存储文件的文件名,存储键值对结构中的值为变化的数据块的实际位置集合。
具体地,初始化一个存储键值对结构Map,记为PageMap,PageMap的键为写入请求文件名fileName,值为变化的数据块的实际位置集合set。
步骤S303,获取待处理写入请求队列中的当前写入请求,当前写入请求包括当前写入请求文件名和当前写入请求实际写入位置;根据当前写入请求实际写入位置确定变化的数据块的实际位置。
按顺序从待处理请求队列S中获取一个写入请求作为当前写入请求,该当前写入请求包括写入请求文件名和写入请求实际写入位置。将写入请求实际写入位置fileOffset转换成变化的数据块的实际位置chunkID,转换公式为:chunkID=fileOffset/chunkSize;chunkSize为数据块的大小。
步骤S304,判断存储键值对结构中是否存在当前写入请求文件名;判断PageMap中是否存在该写入请求文件名fileName1。若否,则执行步骤S305,若是,则执行步骤S306。
步骤S305,新建一个位置集合,将变化的数据块的实际位置添加至新建的位置集合中,得到包含变化的数据块的实际位置的位置集合;并执行步骤S307。
具体地,新建一个位置集合set,将变化的数块的实际位置添加至新建的集合set中,以该set为值添加至PageMap中。
步骤S306,获取存储键值对结构中与当前写入请求文件名对应的位置集合,将变化的数据块的实际位置添加至与当前写入请求文件名对应的位置集合中,得到包含变化的数据块的实际位置的位置集合。并执行步骤S307。
具体地,从PageMap中获取与该写入请求文件名对应的位置集合set,将转换后的数据块的实际写入位置chunkID添加至对应的位置集合set中,并存储与PageMap中。
步骤S307,将当前写入请求从待处理写入请求队列中移除。将当前写入请求从待处理请求队列S中移除,查找待处理请求队列S中的下一个写入请求。
步骤S308,判断待处理请求队列S中是否还有待处理的写入请求,若是,则返回步骤S303;否则,执行步骤S309。
步骤S309,输出目标存储键值对结构,目标存储键值对结构即为变化的数据块。
在其中一些实施例中,根据实际写入位置确定若干数据块中变化的数据块,包括:根据变化的数据块的实际位置复制数据存储文件中对应位置的文件内容至目标存储键值对结构中,得到变化的数据块。
具体地,根据变化数据块位置chunkID在从线上环境同步至闪回查询环境中的数据库存储文件中找到对应位置的文件,将文件内容复制至目标存储键值对结构中,得到变化的数据块。其中,其文件内容根据{起始位置,结束位置}确定,起始位置=chunkID×chunkSize;结束位置的计算方式如下,例如:该数据存储文件的大小为99M,chunkSize=10;
若(chunkID+1)×chunkSize大于该数据库存储文件大小,则结束位置=该数据库存储文件大小;若chunkID=9,即(9+1)×10=100,大于数据存储文件大小99,则将变化数据块的结束位置定位在99M。
若(chunkID+1)×chunkSize小于等于该数据库存储文件大小,则结束位置=(chunkID+1)×chunkSize;若chunkID=1,即(1+1)×10=20,小于数据存储文件大小99,则将变化数据块的结束位置定位在20M的位置;
并该新文件以“原文件名_chunkID”命名,得到变化的数据块。
在另一个实施例中,根据数据版本号进行闪回查询得到目标闪回查询结果,包括:
在接收到闪回查询请求的情况下,根据闪回查询请求调取版本库中所有的未变动的数据块和变动的数据块;根据数据存储文件的文件名将调取的数据块中相同文件名的数据块进行组合,得到目标数据文件集合;将目标数据文件集合存储至闪回查询环境的固定目录下;重启Neo4j服务;根据数据版本号在固定目录下进行闪回查询,得到目标闪回查询结果。
具体地,在接收到闪回查询请求的情况下,可以根据数据版本号进行闪回查询,也可以根据写入请求操作执行时间戳进行闪回查询。根据数据版本号进行闪回查询,先向Git版本库提交申请,Git版本库根据提交的版本号,将Git库中该版本号的数据块进行整合,将带有相同前缀的文件,按照文件名中chunkID的值从小到大的顺序组合成一个文件,组合的过程可以使用linux系统中的cat命令来完成,得到组合后的文件,将组合后的文件以命名为“原文件名”。将组合后的文件存放至闪回查询环境的固定目录下,将Neo4j服务的数据目录指定为闪回查询环境的固定目录,并重启Neo4j服务。根据需要查询的版本号在更新后的Neo4j服务的数据目录下闪回查询,查询得到目标闪回查询结果。根据写入请求操作执行时间戳进行闪回查询,查找时间戳范围内的最新的数据版本号,以这个数据版本号为基准,向Git版本库提交申请进行闪回查询,得到目标闪回查询结果。
在本实施例中还提供了一种用于Neo4j图数据库闪回查询方法。图4是本实施例的另一种用于Neo4j图数据库闪回查询方法的流程图,如图4所示,该流程包括如下步骤:
步骤S401,接收请求,接收针对Neo4j图数据库的数据建立版本请求,
步骤S402,同步数据,在当前线上环境没有写入请求正在执行的情况下,通过同步模块,将Neo4j图数据库的数据存储文件同步至闪回查询环境中。
步骤S403,记录写入请求队列,通过日志模块,记录数据存储文件的写入请求,按写入请求操作执行时间戳对写入请求进行排序,得到待处理写入请求队列,其中,写入请求参数包括:数据存储文件的文件名、实际写入位置、写入请求操作执行时间戳和实际配置页的大小。
步骤S404,判断Neo4j图数据库的数据存储文件的类型是否为数据文件类型,若是,则执行步骤S405,若否,则执行步骤S409;
步骤S405,将Neo4j图数据库的数据存储文件基于预设的大小进行划分,得到若干数据块;其中,数据块的大小为实际配置页的大小的整数倍。
步骤S406,按顺序获取写入请求队列中的写入请求,根据写入请求参数中的实际写入位置和数据块的大小确定变化的数据块;
步骤S407,初始化一个存储键值对结构,将获取的变化的数据块存储至存储键值对结构中,其中,存储键值对的键为数据存储文件的文件名,值为变化的数据块的实际位置。
步骤S408,根据变化的数据块的实际位置复制数据存储文件中对应位置的文件内容至目标存储键值对结构中,得到变化的数据块;
步骤S409,将变化的数据块和非数据文件类型的数据存储文件一并提交至Git版本库,生成对应的版本号;
步骤S410,根据版本号进行闪回查询,得到目标闪回查询结果。
通过上述步骤S401至步骤S410,通过将数据文件类型的数据存储文件划分成小的数据块,通过写入请求中的实际写入位置定位至数据块中的写入位置,从而定位出变化的数据块,将变化的数据块和非数据文件类型的数据存储文件一并提交至Git库,没有变化的数据块不提交至Git库,根据提交的数据文件生成新的版本号,与目前直接将整个数据存储文件提交至Git库建立版本号相比,通过本申请,排除了没有变化的数据块的内容在Git库中进行重复备份,从而减少了Git库可用存储资源的浪费,提高了Git库存储资源的利用率。
在本实施例中还提供了一种用于Neo4j图数据库闪回查询装置,该装置用于实现上述实施例及优选实施方式,已经进行过说明的不再赘述。以下所使用的术语“模块”、“单元”、“子单元”等可以实现预定功能的软件和/或硬件的组合。尽管在以下实施例中所描述的装置较佳地以软件来实现,但是硬件,或者软件和硬件的组合的实现也是可能并被构想的。
图5是本实施例的用于Neo4j图数据库闪回查询装置的结构框图,如图5所示,该装置50包括:获取模块51、判断模块52、定位模块53、版本模块54以及闪回查询模块55,其中:
获取模块51,用于在接收到针对Neo4j图数据库的数据建立版本请求的情况下;获取针对Neo4j图数据库的数据存储文件的写入请求,其中,写入请求包括数据存储文件的文件名和实际写入位置;
判断模块52,用于判断Neo4j图数据库的数据存储文件的类型是否为数据文件类型,若是,则将Neo4j图数据库的数据存储文件基于预设的大小进行划分,得到若干数据块;
定位模块53,用于根据实际写入位置确定若干数据块中变化的数据块;
版本模块54,用于变化的数据块和Neo4j图数据库中的非数据文件类型的数据存储文件一并提交至版本库,得到Neo4j图数据库的数据版本号;
闪回查询模块55,用于根据数据版本号进行闪回查询得到目标闪回查询结果。
需要说明的是,上述各个模块可以是功能模块也可以是程序模块,既可以通过软件来实现,也可以通过硬件来实现。对于通过硬件来实现的模块而言,上述各个模块可以位于同一处理器中;或者上述各个模块还可以按照任意组合的形式分别位于不同的处理器中。
在本实施例中还提供了一种电子装置,包括存储器和处理器,该存储器中存储有计算机程序,该处理器被设置为运行计算机程序以执行上述任一项方法实施例中的步骤。
可选地,上述电子装置还可以包括传输设备以及输入输出设备,其中,该传输设备和上述处理器连接,该输入输出设备和上述处理器连接。
可选地,在本实施例中,上述处理器可以被设置为通过计算机程序执行以下步骤:
S1,在接收到针对Neo4j图数据库的数据建立版本请求的情况下,获取针对Neo4j图数据库的数据存储文件的写入请求,其中,写入请求包括数据存储文件的文件名和实际写入位置。
S2,判断Neo4j图数据库的数据存储文件的类型是否为数据文件类型,若是,则将Neo4j图数据库的数据存储文件基于预设的大小进行划分,得到若干数据块。
S3,根据实际写入位置确定若干数据块中变化的数据块。
S4,将变化的数据块和Neo4j图数据库中的非数据文件类型的数据存储文件一并提交至版本库,得到Neo4j图数据库的数据版本号。
S5,根据数据版本号进行闪回查询得到目标闪回查询结果。
需要说明的是,在本实施例中的具体示例可以参考上述实施例及可选实施方式中所描述的示例,在本实施例中不再赘述。
此外,结合上述实施例中提供的用于Neo4j图数据库闪回查询方法,在本实施例中还可以提供一种存储介质来实现。该存储介质上存储有计算机程序;该计算机程序被处理器执行时实现上述实施例中的任意一种用于Neo4j图数据库闪回查询方法。
应该明白的是,这里描述的具体实施例只是用来解释这个应用,而不是用来对它进行限定。根据本申请提供的实施例,本领域普通技术人员在不进行创造性劳动的情况下得到的所有其它实施例,均属本申请保护范围。
需要说明的是,本申请所涉及的用户信息(包括但不限于用户设备信息、用户个人信息等)和数据(包括但不限于用于分析的数据、存储的数据、展示的数据等),均为经用户授权或者经过各方充分授权的信息和数据。
显然,附图只是本申请的一些例子或实施例,对本领域的普通技术人员来说,也可以根据这些附图将本申请适用于其他类似情况,但无需付出创造性劳动。另外,可以理解的是,尽管在此开发过程中所做的工作可能是复杂和漫长的,但是,对于本领域的普通技术人员来说,根据本申请披露的技术内容进行的某些设计、制造或生产等更改仅是常规的技术手段,不应被视为本申请公开的内容不足。
“实施例”一词在本申请中指的是结合实施例描述的具体特征、结构或特性可以包括在本申请的至少一个实施例中。该短语出现在说明书中的各个位置并不一定意味着相同的实施例,也不意味着与其它实施例相互排斥而具有独立性或可供选择。本领域的普通技术人员能够清楚或隐含地理解的是,本申请中描述的实施例在没有冲突的情况下,可以与其它实施例结合。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一非易失性计算机可读取存储介质中,该计算机程序在执行时,可包括如上述各方法的实施例的流程。其中,本申请所提供的各实施例中所使用的对存储器、数据库或其它介质的任何引用,均可包括非易失性和易失性存储器中的至少一种。非易失性存储器可包括只读存储器(Read-OnlyMemory,ROM)、磁带、软盘、闪存、光存储器、高密度嵌入式非易失性存储器、阻变存储器(ReRAM)、磁变存储器(Magnetoresistive Random Access Memory,MRAM)、铁电存储器(Ferroelectric Random Access Memory,FRAM)、相变存储器(Phase Change Memory,PCM)、石墨烯存储器等。易失性存储器可包括随机存取存储器(Random Access Memory,RAM)或外部高速缓冲存储器等。作为说明而非局限,RAM可以是多种形式,比如静态随机存取存储器(Static Random Access Memory,SRAM)或动态随机存取存储器(Dynamic RandomAccess Memory,DRAM)等。本申请所提供的各实施例中所涉及的数据库可包括关系型数据库和非关系型数据库中至少一种。非关系型数据库可包括基于区块链的分布式数据库等,不限于此。本申请所提供的各实施例中所涉及的处理器可为通用处理器、中央处理器、图形处理器、数字信号处理器、可编程逻辑器、基于量子计算的数据处理逻辑器等,不限于此。
以上所述实施例仅表达了本申请的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对专利保护范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本申请构思的前提下,还可以做出若干变形和改进,这些都属于本申请的保护范围。因此,本申请的保护范围应以所附权利要求为准。
Claims (10)
1.一种用于Neo4j图数据库闪回查询方法,其特征在于,包括:
在接收到针对所述Neo4j图数据库的数据建立版本请求的情况下,获取针对所述Neo4j图数据库的数据存储文件的写入请求,其中,所述写入请求包括所述数据存储文件的文件名和实际写入位置;
判断所述Neo4j图数据库的数据存储文件的类型是否为数据文件类型,若是,则将所述Neo4j图数据库的数据存储文件基于预设的大小进行划分,得到若干数据块;
根据所述实际写入位置确定所述若干数据块中变化的数据块;
将所述变化的数据块和所述Neo4j图数据库中的非数据文件类型的数据存储文件一并提交至版本库,得到所述Neo4j图数据库的数据版本号;
根据所述数据版本号进行闪回查询得到目标闪回查询结果;其中,
所述根据所述实际写入位置确定所述若干数据块中对应位置的数据块,包括:
将所述实际写入位置转换成所述若干数据块中的实际位置,根据所述实际位置确定变化的数据块。
2.根据权利要求1所述的用于Neo4j图数据库闪回查询方法,其特征在于,在所述获取针对数据存储文件的写入请求之前,所述方法还包括:
判断当前线上环境是否有写入请求正在执行,若否,则向所述线上环境发起暂停执行写入请求,将所述Neo4j图数据库的数据存储文件同步至闪回查询环境中。
3.根据权利要求1所述的用于Neo4j图数据库闪回查询方法,其特征在于,所述写入请求参数还包括写入请求操作执行时间戳和实际配置页的大小;其中,
所述若干数据块的大小为所述实际配置页的大小的整数倍。
4.根据权利要求1所述的用于Neo4j图数据库闪回查询方法,其特征在于,所述根据所述实际写入位置确定所述若干数据块中变化的数据块,包括:
根据所述实际写入位置和所述数据块的大小确定所述变化的数据块。
5.根据权利要求3所述的用于Neo4j图数据库闪回查询方法,其特征在于,所述根据所述实际写入位置确定所述若干数据块中变化的数据块,包括:
根据所述写入请求操作执行时间戳对所述写入请求进行排序,得到待处理写入请求队列;
初始化一个存储键值对结构,所述存储键值对结构的键为所述数据存储文件的文件名,所述存储键值对结构中的值为所述变化的数据块的实际位置集合;
获取所述待处理写入请求队列中的当前写入请求,所述当前写入请求包括当前写入请求文件名和当前写入请求实际写入位置;
根据所述当前写入请求实际写入位置确定所述变化的数据块的实际位置;
判断所述存储键值对结构中是否存在所述当前写入请求文件名;
若否,则新建一个位置集合,将所述变化的数据块的实际位置添加至所述新建的位置集合中,得到包含所述变化的数据块的实际位置的位置集合;
若是,则获取所述存储键值对结构中与所述当前写入请求文件名对应的位置集合,将所述变化的数据块的实际位置添加至所述与所述当前写入请求文件名对应的位置集合中,得到包含所述变化的数据块的实际位置的位置集合;
将所述当前写入请求从所述待处理写入请求列表中移除,重复上述操作直至处理完所有待处理写入请求列表中的写入请求,得到目标存储键值对结构,所述目标存储键值对结构即为所述变化的数据块。
6.根据权利要求5所述的用于Neo4j图数据库闪回查询方法,其特征在于,所述根据所述实际写入位置确定所述若干数据块中变化的数据块,包括:
根据所述变化的数据块的实际位置复制所述数据存储文件中对应位置的文件内容至所述目标存储键值对结构中,得到所述变化的数据块。
7.根据权利要求1所述的用于Neo4j图数据库闪回查询方法,其特征在于,所述根据所述数据版本号进行闪回查询得到目标闪回查询结果,包括:
在接收到闪回查询请求的情况下,根据所述闪回查询请求调取所述版本库中所有的未变动的数据块和所述变动的数据块;
根据所述数据存储文件的文件名将调取的所述数据块中相同文件名的数据块进行组合,得到目标数据文件集合;
将所述目标数据文件集合存储至闪回查询环境的固定目录下;
重启所述Neo4j服务;
根据数据版本号在所述固定目录下进行闪回查询,得到目标闪回查询结果。
8.一种用于Neo4j图数据库闪回查询装置,其特征在于,包括:获取模块、判断模块、定位模块、版本模块以及闪回查询模块,其中:
所述获取模块,用于在接收到针对所述Neo4j图数据库的数据建立版本请求的情况下;获取针对所述Neo4j图数据库的数据存储文件的写入请求,其中,所述写入请求包括所述数据存储文件的文件名和实际写入位置;
所述判断模块,用于判断所述Neo4j图数据库的数据存储文件的类型是否为数据文件类型,若是,则将所述Neo4j图数据库的数据存储文件基于预设的大小进行划分,得到若干数据块;
所述定位模块,用于根据所述实际写入位置确定所述若干数据块中变化的数据块;其中,所述根据所述实际写入位置确定所述若干数据块中对应位置的数据块,包括:将所述实际写入位置转换成所述若干数据块中的实际位置,根据所述实际位置确定变化的数据块;
所述版本模块,用于将所述变化的数据块和Neo4j图数据库中的非数据文件类型的数据存储文件一并提交至版本库,得到所述Neo4j图数据库的数据版本号;
所述闪回查询模块,用于根据所述数据版本号进行闪回查询得到目标闪回查询结果。
9.一种电子装置,包括存储器和处理器,其特征在于,所述存储器中存储有计算机程序,所述处理器被设置为运行所述计算机程序以执行权利要求1至权利要求7中任一项所述的用于Neo4j图数据库闪回查询方法。
10.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现权利要求1至权利要求7中任一项所述的用于Neo4j图数据库闪回查询及恢复方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202410872463.0A CN118394979B (zh) | 2024-07-01 | 2024-07-01 | 用于Neo4j图数据库闪回查询方法、装置和存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202410872463.0A CN118394979B (zh) | 2024-07-01 | 2024-07-01 | 用于Neo4j图数据库闪回查询方法、装置和存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN118394979A CN118394979A (zh) | 2024-07-26 |
CN118394979B true CN118394979B (zh) | 2024-09-17 |
Family
ID=91999764
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202410872463.0A Active CN118394979B (zh) | 2024-07-01 | 2024-07-01 | 用于Neo4j图数据库闪回查询方法、装置和存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN118394979B (zh) |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CA2049690A1 (en) * | 1990-08-23 | 1992-02-24 | Masato Maebayashi | Firmware modification system wherein older version can be retrieved |
CN106649412A (zh) * | 2015-11-04 | 2017-05-10 | 阿里巴巴集团控股有限公司 | 一种数据处理方法和设备 |
Family Cites Families (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6636878B1 (en) * | 2001-01-16 | 2003-10-21 | Sun Microsystems, Inc. | Mechanism for replicating and maintaining files in a spaced-efficient manner |
US9223793B1 (en) * | 2009-06-03 | 2015-12-29 | American Megatrends, Inc. | De-duplication of files for continuous data protection with remote storage |
CN105493080B (zh) * | 2013-12-23 | 2019-08-16 | 华为技术有限公司 | 基于上下文感知的重复数据删除的方法和装置 |
US9892153B2 (en) * | 2014-12-19 | 2018-02-13 | Oracle International Corporation | Detecting lost writes |
EP4204938A1 (en) * | 2020-12-21 | 2023-07-05 | Huawei Technologies Co., Ltd. | Method and system of storing data to data storage for variable size deduplication |
CN115292094B (zh) * | 2022-08-10 | 2023-11-14 | 广州鼎甲计算机科技有限公司 | 数据恢复处理方法、装置、设备、存储介质和程序产品 |
CN115934718A (zh) * | 2022-12-06 | 2023-04-07 | 贵州易鲸捷信息技术有限公司 | 基于多版本时间戳排序机制的数据闪回查询或闪回恢复方法 |
CN117724893A (zh) * | 2023-08-02 | 2024-03-19 | 行吟信息科技(上海)有限公司 | 数据处理方法、装置、电子设备和存储介质 |
-
2024
- 2024-07-01 CN CN202410872463.0A patent/CN118394979B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CA2049690A1 (en) * | 1990-08-23 | 1992-02-24 | Masato Maebayashi | Firmware modification system wherein older version can be retrieved |
CN106649412A (zh) * | 2015-11-04 | 2017-05-10 | 阿里巴巴集团控股有限公司 | 一种数据处理方法和设备 |
Also Published As
Publication number | Publication date |
---|---|
CN118394979A (zh) | 2024-07-26 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109033360B (zh) | 一种数据查询方法、装置、服务器及存储介质 | |
CN108205577B (zh) | 一种数组构建、数组查询的方法、装置及电子设备 | |
KR20200122994A (ko) | 키 값 첨부 | |
CN106407303A (zh) | 数据存储、查询方法及装置 | |
CN106682110B (zh) | 一种基于哈希格网索引的影像文件存储和管理系统及方法 | |
CN111400334B (zh) | 数据处理方法、装置、存储介质及电子装置 | |
CN106874459A (zh) | 流式数据存储方法及装置 | |
CN107798063A (zh) | 快照处理方法和快照处理装置 | |
CN110109866B (zh) | 一种文件系统目录的管理方法及设备 | |
CN113779286B (zh) | 管理图数据的方法及装置 | |
CN111797119A (zh) | 一种缓存装置、系统及缓存方法 | |
CN114840487A (zh) | 分布式文件系统的元数据管理方法和装置 | |
JP5149815B2 (ja) | メディア装置コンテンツの変更の識別 | |
CN114443598A (zh) | 写数据方法、装置、计算机设备及存储介质 | |
CN118394979B (zh) | 用于Neo4j图数据库闪回查询方法、装置和存储介质 | |
CN112380004A (zh) | 内存管理方法、装置、计算机可读存储介质及电子设备 | |
CN108804571B (zh) | 一种数据存储方法、装置以及设备 | |
CN116010345A (zh) | 一种实现流批一体数据湖的表服务方案的方法、装置及设备 | |
CN113918096A (zh) | 一种算法镜像包的上传方法、装置及应用 | |
CN115904211A (zh) | 一种存储系统、数据处理方法及相关设备 | |
WO2011160392A1 (zh) | 名单管理方法及装置 | |
CN113127717A (zh) | 一种密钥检索方法和系统 | |
EP2164005B1 (en) | Content addressable storage systems and methods employing searchable blocks | |
CN112084141A (zh) | 一种全文检索系统扩容方法、装置、设备及介质 | |
CN117540056B (zh) | 数据查询的方法、装置、计算机设备和存储介质 |
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 |