子图查询方法与流程

文档序号:14609533发布日期:2018-06-05 20:31阅读:703来源:国知局
子图查询方法与流程

本发明涉及计算机技术领域,特别涉及一种子图查询方法。



背景技术:

图是计算机技术的一种重要数据结构,用于描述对象以及对象之间的拓扑关系。随着网络中越来越多的数据以图的形式表示,图数据库的数据量越来越多,管理和存储图数据库的难度与日俱增。其中,子图查询是管理图数据库的过程中经常面临的一种重要问题,子图查询是指给定一个查询图,要求服务器在图数据库中找到查询图的匹配解,以便将匹配解提供给用户。

目前子图查询方法通常包括编码过程-过滤过程-验证过程等过程。在编码过程中,会对图数据库中的每个图计算图编码,作为图的索引。在过滤过程中,当获取到查询图时,会根据图数据库中图的索引以及过滤策略,去除图数据库中不可能是查询图的匹配解的图,将剩余的图作为查询图的候选图。在验证过程中,会根据子图同构算法对每个候选图和查询图进行计算,当某个候选图与查询图之间子图同构时,将候选图作为匹配解。

在实现本发明的过程中,发明人发现相关技术至少存在以下问题:

目前越来越多的图具有时序特征,例如对于网络中不同设备之间的通信行为形成的网络拓扑图来说,通信行为之间的时序关系是这种网络拓扑图的重要特征,而上述方案中未考虑图的时序特征,导致子图查询过程的准确性较差。



技术实现要素:

本发明实施例提供了一种子图查询方法,能够解决相关技术中子图查询过程的准确性较差问题。所述技术方案如下:

第一方面,提供了一种子图查询方法,应用于服务器中,所述方法包括:

获取查询图,所述查询图的边集存在时序关系;

基于时间窗口,获取图数据流当前的快照,所述图数据流是指时序从先到后的边序列,所述快照是指所述图数据流当前处于所述时间窗口内的边序列组成的图;

基于所述查询图和所述快照,获取所述查询图当前的扩展链表,所述扩展链表包括多个链表节点,所述多个链表节点中L^i用于存储Ω(Preq(e_i)),所述L^i是指所述扩展链表中第i个链表节点,所述e_i是指所述查询图中第i条边,所述Preq(e_i)是指所述e_i的先决子查询图,所述先决子查询图是指所述e_i以及所述查询图中早于所述e_i的所有边组成的图,所述Ω(Preq(e_i))是指所述Preq(e_i)在所述快照中的匹配解;

根据所述扩展链表,获取所述查询图的匹配解,所述查询图的匹配解满足时序匹配条件,所述时序匹配条件是指:对于所述查询图的e_i、e_j以及所述匹配解中的σ_x、σ_y,所述e_i与所述e_j之间的时序、所述σ_x与所述σ_y之间的时序相同,所述σ_x是指所述匹配解中与所述e_i匹配的边,所述σ_y是指所述匹配解中与所述e_j匹配的边。

本实施例提供的方法,考虑到查询图与图数据流的时序特征,提供了一种结合时序特征的子图查询方案,通过查询图和快照构建扩展链表,从而根据扩展链表获取查询图的匹配解,由于获取到的匹配解满足时序匹配条件,即匹配解的时序特征与查询图的时序特征匹配,因此提高了子图查询过程的准确性。

在一种可能的设计中,所述根据所述扩展链表,获取所述查询图的匹配解,包括:

获取所述查询图中最晚的边e_k;

读取所述扩展链表中L^k存储的匹配解,得到所述查询图的匹配解。

在一种可能的设计中,所述基于所述查询图和所述快照,获取所述查询图当前的扩展链表,包括:

当所述图数据流的边σ_i进入所述时间窗口时,确定所述查询图中所述σ_i的匹配解;

当所述σ_i的匹配解为e_1时,将所述σ_i插入到所述扩展链表的L^1中;或,

当所述σ_i的匹配解为e_i时,将所述σ_i与所述扩展链表的L^(i-1)中存储的所有匹配解分别进行连接,得到多个候选匹配解,其中所述i为大于1的正整数;获取所述多个候选匹配解中满足所述时序匹配条件的候选匹配解,作为待插入的匹配解;将所述待插入的匹配解插入到所述扩展链表的L^i中。

在一种可能的设计中,所述基于所述查询图和所述快照,获取所述查询图当前的扩展链表,包括:

当所述图数据流的边σ_i离开所述时间窗口时,遍历所述扩展链表中每个链表节点,当遍历到的链表节点存储的任一匹配解包括所述σ_i时,将所述匹配解从所述链表节点中删除。

在一种可能的设计中,所述基于时间窗口,获取图数据流当前的快照之前,所述方法还包括:

当所述查询图为时序连通查询图时,确定所述查询图的时序序列{e_1,e_2,…,e_k},所述时序序列是指按照时序从先到后的边序列;

基于所述时序序列{e_1,e_2,…,e_k},生成对应的多个链表节点{L^1,L^2,…L^k},其中链表节点L^i对应{e_1,e_2,…e_i},所述k为所述查询图的边集中边的总数量;

其中,所述时序连通查询图是指满足时序连通条件的图,所述时序连通条件是指:查询图的边集存在序列{e_1,e_2,…,e_k},所述序列在时序上满足全序关系,且对于任意1≤j≤k,{e_1,e_2,…,e_j}组成的图为连通的图。

在一种可能的设计中,所述基于时间窗口,获取图数据流当前的快照之前,所述方法还包括:

当所述查询图不为时序连通查询图时,对所述查询图进行分解,得到子查询图集合P,所述P={P_1,P_2,…P_i,…P_k},P_i表示第i个子查询图,P_i满足所述时序连通条件,所述子查询图集合中的不同子查询图之间没有公共边;

基于所述子查询图集合P,生成对应的多个链表节点{L_1,L_2,…,L_k},其中链表节点L_i用于存储Ω(P_1)∪Ω(P_2)∪…∪Ω(P_i);

其中,所述时序连通查询图是指满足时序连通条件的图,所述时序连通条件是指:查询图的边集存在序列{e_1,e_2,…,e_k},所述序列在时序上满足全序关系,且对于任意1≤j≤k,{e_1,e_2,…,e_j}组成的图为连通的图;

在一种可能的设计中,所述扩展链表基于匹配存储树存储,所述匹配存储树是指满足存储树定义条件的前缀树;

其中,所述存储树定义条件是指:匹配存储树的n_i用于存储e_i的匹配解,所述n_i是指所述匹配存储树中深度为i的树节点;所述匹配存储树中从根节点到所述n_i之间的路径对应所述扩展链表中L^i中存储的匹配解;所述匹配存储树中任一树节点具有指向父节点的指针、指向子节点的指针以及分别指向左右兄弟节点的指针。

本实施例提供的方法,提供了一种结合匹配存储树的子图查询方法,在保证获取到的匹配解满足时序匹配条件,从而提高匹配解的准确性的基础上,极大地减少存储扩展链表所需的空间开销,并且提高更新扩展链表的速度以及从扩展链表中读取匹配解的速度。

在一种可能的设计中,所述根据所述扩展链表,获取所述查询图的匹配解,包括:

确定匹配存储树的深度k;

基于所述匹配存储树中所有深度为k的树节点的指向左右兄弟节点的指针,遍历所述匹配存储树中深度为k的多个树节点;

对于每个遍历到的树节点,沿着所述树节点至根节点之间的每个树节点的指向对应父节点的指针,从所述树节点返回至所述根节点,获取经过的每个树节点存储的匹配解,将经过的多个匹配解连接为所述查询图的匹配。

在一种可能的设计中,所述基于所述查询图和所述快照,获取所述查询图当前的扩展链表,包括:

当所述图数据流的边σ_i进入所述时间窗口时,获取待插入的匹配解,所述待插入的匹配解的时序序列为{σ1,σ2,…σ_(k-1),σk};

确定所述匹配存储树中σ_(k-1)对应的树节点;

创建σk对应的树节点,将所述σk对应的树节点作为σ_(k-1)的子节点,插入到所述匹配存储树中。

在一种可能的设计中,所述基于所述查询图和所述快照,获取所述查询图当前的扩展链表,包括:

当所述图数据流的边σ_i离开所述时间窗口时,获取所述查询图中所述σ_i的匹配解e_k;

获取所述匹配存储树中深度为k的所有树节点中所述σ_i对应的树节点,得到至少一个树节点;

删除所述至少一个树节点以及所述至少一个树节点的子节点。

在一种可能的设计中,所述基于所述查询图和所述快照,获取所述查询图当前的扩展链表,包括:

基于并发控制策略,控制多个线程并发地执行针对每个链表节点的事务,所述事务包括向对应链表节点插入匹配解的操作、从对应链表节点读取匹配解的操作或从对应链表节点删除匹配解的操作中的至少一项。

本实施例提供的方法,在子图查询方法的基础上设计了多线程并发执行事务的策略,极大地提高了子图的查询效率。

在一种可能的设计中,所述并发控制策略包括:

当确定任一待执行的事务时,为所述事务生成锁需求,所述锁需求用于在对应的线程访问对应的链表节点的过程中保持所述链表节点为锁定状态;

将所述锁需求入列至所述链表节点的锁等待队列中,所述锁等待队列用于缓存所述链表节点的每个锁需求;

当所述锁需求在所述锁等待队列中排在队首时,唤醒所述线程,由所述线程对所述链表节点上锁,在上锁成功后执行所述事务,在执行所述事务完毕后将所述锁需求从所述锁等待队列中出列。

在一种可能的设计中,所述并发控制策略包括:

当要删除匹配存储树中的任一树节点时,删除所述树节点的父节点指向所述树节点的指针;

删除所述树节点的指向左右兄弟节点的指针;

保留所述树节点的子节点指向所述树节点的指针。

第二方面,提供了一种子图查询装置,应用于服务器中,所述装置包括多个功能模块,以实现上述第一方面以及第一方面的任一种可能设计中的子图查询方法。

第三方面,提供了一种服务器,所述服务器包括处理器和存储器,所述存储器中存储有至少一条指令,所述指令由所述处理器加载并执行以实现上述第一方面以及第一方面的任一种可能设计中的子图查询方法。

第四方面,提供了一种计算机可读存储介质,所述存储介质中存储有至少一条指令,所述指令由处理器加载并执行以实现上述第一方面以及第一方面的任一种可能设计中的子图查询方法。

附图说明

为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1是本发明实施例提供的一种查询图的示意图;

图2是本发明实施例提供的一种图数据流的示意图;

图3是本发明实施例提供的一种黑客攻击模式的示意图;

图4是本发明实施例提供的一种子图查询方法的流程图;

图5是本发明实施例提供的一种查询图的时序特征的示意图;

图6是本发明实施例提供的一种图数据流的快照的示意图;

图7是本发明实施例提供的一种查询图的先决子查询图的示意图;

图8是本发明实施例提供的一种时序连通查询图的扩展链表的示意图;

图9是本发明实施例提供的一种将查询图分解为子查询图集合的示意图;

图10是本发明实施例提供的一种非时序连通查询图的扩展链表的示意图;

图11是本发明实施例提供的一种子图查询方法的流程图;

图12是本发明实施例提供的一种匹配存储树的示意图;

图13是本发明实施例提供的一种多线程并发访问时产生冲突的示意图;

图14是本发明实施例提供的一种控制多线程并发执行事务的流程图;

图15是本发明实施例提供的一种删除树节点的示意图;

图16是本发明实施例提供的一种子图查询装置的结构示意图;

图17是本发明实施例提供的一种服务器的结构示意图。

具体实施方式

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

为了方便理解,下面对本公开实施例中涉及的符号、定义和概念进行解释:

e:e表示查询图中的一条边,e_i即为查询图中第i条边。

σ:σ表示图数据流中的一条边,σ_x即为图数据流中的第x条边。

L:L表示扩展链表中的一个链表节点,L^i即为扩展链表中第i个链表节点。

∪:∪表示并集,A∪B={x|x∈A或x∈B}。

Preq(e_i):Preq(e_i)表示e_i的先决子查询图。

Ω:Ω表示匹配解,例如Ω(Preq(e_i))是指Preq(e_i)的匹配解;表示连接操作。

<:<表示数值上的小于或时间上的早于,例如e_1<e_2表示e_1早于e_2。

{}:{}表示集合。

…:…表示集合中的元素虽然无法穷举,而可以表示出元素的变化规律,例如,{e_1,e_2,…,e_k}中…表示依次递增且递增跨度为1。

图:图论的基本概念之一,图G可以用五元数组(V,E,LV,LE,l)表示,其中V表示图的顶点集,E表示图的边集,LV表示顶点集对应的标签集合,LE表示边集对应的标签集合,l为标签的映射函数,定义了V→LV的映射以及E→LE的映射。

子图:图论的基本概念之一,指顶点集和边集分别是某一图的顶点集的子集和边集的子集的图。

子图同构:如果存在一个单射函数f:V1→LV,使得(1)对于l1(u)=l2f(u),(2)(f(u),f(v))∈E2且l1(u,v)=l2(f(u),f(v))成立,则f为从G1到G2的子图同构映射函数,G1=(V1,E1)为G2=(V2,E2)的子图。

查询图:是指需要通过查询来获取匹配解的图,可以如图1所示,查询图可以包括边集、顶点集。

边集:是指查询图的所有边,其中每条边包括两个顶点,每条边为有向边,即每条边中一顶点会指向另一顶点,另外每条边可以具有一个边标签,边标签用于标识对应的边。例如,图1所示的查询图的边集为{e_1,e_2,…,e_6},以e_1为例,e_1包括顶点a和顶点b,e_1的方向为从顶点a指向顶点b,e_1的边标签为1。

顶点集:是指查询图的所有顶点,每个顶点可以具有一个顶点标签,顶点标签用于标识对应的顶点。例如,图1所示的查询图的顶点集为{a,b,…,f},其中每个顶点的顶点标签即为对应的字母。

查询图的匹配解:也可称为查询图的最终解、查询图的匹配、查询图的匹配子图等,是指与查询图的所有边均时序匹配的子图,其中时序匹配通过时序匹配条件验证。另外还可要求查询图的匹配解与查询图的所有边均结构匹配,其中结构匹配通过子图同构定义对应的算法验证。

查询图的中间解:也可称为部分解,是指与查询图的部分边均时序匹配的子图或边,包括查询图中某一边的匹配解(即与该边匹配的一条边)、查询图中某些边的匹配解(即与这些边组成的子图匹配的一个子图),查询图的中间解在插入正确的边后会扩大为查询图的匹配解,在插入错误的边后不为查询图的匹配解。另外还可以要求查询图的中间解与对应的部分边均结构匹配。

时序匹配条件:是指对于查询图的e_i、e_j以及匹配解中的σ_x、σ_y,e_i与e_j之间的时序、σ_x与σ_y之间的时序相同,σ_x是指匹配解中与e_i匹配的边,σ_y是指匹配解中与e_j匹配的边。例如,当e_i<e_j时,要求σ_x<σ_y,当e_i>e_j时,要求σ_x>σ_y,当e_i=e_j时,要求σ_x=σ_y。

无效中间解:给定一个图数据流G以及一个查询图Q,令G中当前时间窗口内的子图g为Q的中间解,如果无论未来发生什么数据更新,g这个中间解都不可能被扩大为Q的最终的匹配解的话,称g为无效中间解。

图数据流:图数据流是指时序从先到后的边序列,可以如图2所示,图数据流可以无限长,图数据流的每条边有两个顶点,每个顶点都带有标签。以图数据流中每条边表示为α为例,图数据流为{α1,α2,…},其中,每个αi对应的时间戳是ti,并且i<j时有ti<tj。

目前子图查询的方法均聚焦在静态的图,仅是关注查询图以及图数据库的结构特征,根据结构特征以及子图同构算法查找图数据库中的匹配解,而没有考虑到图数据的时序特征,更未考虑到结合时序特征进行子图查询,导致子图查询过程的准确性较差,得到的匹配解仅是结构上与查询图匹配,而匹配解在时序上通常与查询图不匹配,结果的准确性较差。

而本发明实施例对图数据的时序特征进行了研究,并提供了扩展链表作为引入时序特征的子图查询的方法,应用该方法,得到的查询图的匹配解与查询图之间时序匹配,极大地提高了子图查询过程的精确性。

本发明可以应用在各种实际应用场景中,以下以查找黑客设备的场景为例进行说明:

在网络通信中,黑客的攻击往往涉及一系列有规律的通信行为。如图3所示,网络中一台主机被病毒感染的过程往往发生如下通信:主机通过网络访问含有病毒的服务器,含有病毒的服务器向主机发送病毒脚本或病毒程序,主机运行该病毒脚本或病毒程序,导致中毒,并向黑客控制网络(Botnet,又称僵尸网络或机器人网络)的核心设备C&C(Command and Control Server,控制服务器)发送注册信息,C&C会基于注册信息注册该主机;之后,C&C会向主机发送数据获取指令,主机会接收该数据获取指令,响应该数据获取指令,将存储的重要数据发送给C&C,C&C会得到主机的重要数据,实现黑客入侵的目的。

发明人在对上述通信行为进行分析后,认识到上述通信行为具有时序特征,对上述通信行为进行建模,得到了查询图:将主机访问含有病毒的服务器的过程作为从主机到服务器的通信行为,进行建模,形成t1时刻的第一条边;将含有病毒的服务器向主机发送病毒脚本或病毒程序的过程作为从服务器到主机的通信行为,进行建模,形成了t2时刻的第二条边;将主机向C&C发送注册信息的过程作为从主机到C&C的通信行为,进行建模,形成了t3时刻的第三条边;将主机从C&C获得数据获取指令的过程作为从C&C到主机的通信行为,进行建模,形成了t4时刻的第四条边;将主机向C&C发送重要数据的过程作为从主机到C&C的通信行为,进行建模,形成了t5时刻的第五条边,将这五条边进行连接,得到查询图,该查询图在时序上符合以下关系:t1<t2<t3<t4<t5。

显然,当网络中一些通信设备的通信行为与这种查询图表征的通信行为相匹配时,可以认为这些通信设备很可能是黑客设备,那么,若能提出一种找到与查询图时序和结构相匹配的子图查询方法,即能够筛选出网络中通信行为与黑客行为相匹配的设备,也就筛选出了黑客设备。

为此,对网络通信中的实时通信行为进行了建模:对不同通信设备之间的通信行为进行建模,将通信行为的数据传输方向作为边的方向,将通信行为的发送方的IP(网络互连协议,Internet Protocol)地址和接收方的IP地址分别作为边的顶点,从而得到每个通信行为对应的边。进一步地,每个通信行为会有相应的时间戳,通过不同通信行为的时间戳可以确定不同边之间的时序。同时,每个IP地址有对应的属性,如所在的网段,所在的城市等,可以将IP地址的属性作为IP地址对应顶点的标签,如此,网络运营商或者公司的网络管理部门的网络监管设备可以获取网络中的通信信息,将这些通信信息建模成对应的边,而随着通信信息的不断发生,不断有新的边到来,形成了以边流为形式的图数据流。

而在图数据流中,采用下述实施例提供的子图查询方法,能够实时监控图数据流,查询图数据流在当前时间窗口是否具有查询图的匹配解,从而及时地发现网络攻击行为。同时,可以将查询图的匹配解对应的设备作为嫌疑黑客设备,对嫌疑黑客设备进一步分析,从而快速有效地找到嫌疑黑客设备,无需网管人员人工找出嫌疑黑客设备,减少了人力的介入,提高了效率,对网络信息安全、侦查黑客等方面具有巨大的经济价值和实用价值

本发明实施例的架构主要包括三部分:第一部分,参见以下图4实施例,本发明提出了具有时序特征的图数据流的子图同构问题,并提出了扩展链表作为该问题的基本解决方案,该方案在得到时序匹配的匹配解的基础上,能够避免无效中间解造成的无用功,极大地提高了获取匹配解的效率。第二部分,参见以下图11实施例,在图4实施例的基础上,本发明考虑到查询图的大量中间解具有共同前缀,采用前缀树的变种(匹配存储树)来存储各个中间解,极大地减少空间代价和时间代价。第三部分,参见以下图14实施例,在图4实施例的基础上,而本发明提供了并发控制策略,能够由多线程并行地执行事务,以更新扩展链表并获取匹配解,极大地提高了扩展链表的更新效率以及获取匹配解的效率。

图4是本发明实施例提供的一种子图查询方法的流程图。该发明实施例的执行主体为服务器,参见图4,该方法包括:

401、服务器获取查询图。

针对获取查询图的方式,服务器可以获取用户输入的查询图,或者接收终端发送的查询图,或者从网络中下载查询图,本实施例对获取查询图的方式不做限定。

查询图的定义详见上述定义解释部分,在此不做赘述。结合查找黑客设备的场景,查询图的边可以表征数据传输的方向,例如边的方向为从顶点a指向顶点b,可以表征顶点a代表的设备向顶点b代表的设备发送了数据包。查询图的顶点可以表征一个IP地址或一台设备,顶点的标签可以表征IP地址或设备的所在城市。

需要说明的是,本实施例中查询图的边集存在时序关系,即查询图的不同边存在时间上的先后关系,或者说早晚关系。示例性地,图1所示的查询图的边集的时序关系可以如图5所示,其中e_6<e_3<e_1表示在{e_6、e_3、e_1}中e_6最早,其次为e_3,其次为e_1,e_6<e_5<e_4表示在{e_6、e_5、e_4}中e_6最早,其次为e_5,其次为e_4。可选地,时序关系可以通过边的时间戳来判定,边的时间戳越小,判定边越早,边的时间戳越大,判定边越晚。

402、服务器基于时间窗口,获取图数据流当前的快照。

针对图数据流的获取方式,服务器可以生成图数据流,或者通过网络获取其他设备发送的图数据流。其中,随着不断有新的边插入图数据流,服务器会相应地更新图数据流。结合查找黑客设备的场景,服务器可以与网络中的网关、交换机、路由器等各个网络设备建立网络连接,每个网络设备会实时向服务器上报收集到的通行行为数据,每当服务器接收到网络设备上报的一条通信行为数据时,会根据这条通信行为数据生成一条边,并向已生成的图数据流的尾部添加该边,从而动态地更新图数据流。

本实施例中,图数据流具有时间窗口(time window):时间窗口具有一定的长度,用于获取图数据流最近一段时间内的边。随着时间的推移,图数据流会在时间窗口中滑动,即图数据流的每条边会依次前移,而在滑动过程中新的边会插入时间窗口,同时过期的边会从时间窗口中删除。其中,针对过期的边的确定方式,假设时间窗口的长度可以为M,当时间窗口内的边的数量达到M时,每当插入新的一条边,会将时间窗口内最早的边作为过期的边。

示例性地,参见图2,假设时间窗口的长度为9,当时间窗口内已经容纳了{σ_1,σ_2,…,σ_9},此时新的边σ_40需要插入,则σ_1成为了过期的边,会从时间窗口中删除,同时其他边会依次向前移动一位,以腾出空间让σ_40插入。

随着图数据流在时间窗口内的滑动,服务器可以获取图数据流当前处于时间窗口内的边序列组成的图,作为快照,以便后续基于快照获取扩展链表。其中,针对获取快照的时机,可以每当新的边插入时间窗口内即获取一次快照。示例性地,参见图6,图6给出了时间窗口的长度为9,时刻为7、8、9和40时分别对应的图数据流的快照。

403、服务器基于查询图和快照,获取查询图当前的扩展链表。

为了便于理解本发明的方案,在阐述扩展链表之前先阐述以下几个重要的定义和定理。

无效中间解:给定一个图数据流G以及一个查询图Q,令G中当前时间窗口内的子图g为Q的中间解,如果无论未来发生什么数据更新,g这个中间解都不可能被扩大为Q的匹配解的话,称g为无效中间解。显然,及早发现并过滤无效中间解能够节约很多时间和空间代价。

例如,参见图1、图5和图6,图1的查询图要求e_3早于e_1,当σ6到来时(图6a的a2b3边),σ6匹配的边为e_1,但此时,时间窗口内并没有能够匹配e_3并且早于σ6的边(虽然σ7匹配了e_3,但时间晚于σ6),那么,无论后续来了什么边,都不可能有早于σ6,同时匹配e_3的边出现,所以σ6不可能被扩大为一个Q的匹配解,也就是说任何包含σ6的中间解都是无效的,应该及早过滤掉。

先决子查询图:以边e_i的先决子查询图用符号Preq(e_i)表示为例,Preq(e_i)是指e_i的先决子查询图,先决子查询图是指e_i以及查询图中早于e_i的所有边组成的图,可以表示为{e_i}∪{所有要求早于e_i的Q中的边}。示例性地,图7示出了两个先决子查询图:Preq(e_1)和Preq(e_4)。

依据以上的两个概念,可以理解,当图数据流来了一条边σ,如果σ匹配查询图的边e,那么σ不是无效中间解的充分必要条件为:当前时间窗口内,存在子图g,其中(1)g包含σ且(2)g是Preq(e)的匹配解。如果不存在这样的g,那么σ就会是一个无效中间解,可以直接丢弃。显然,可以根据这个结论识别和过滤无效中间解。下面阐述时序连通查询图的定义,时序连通查询图将会在过滤无效中间解中起到重要作用。

时序连通查询图:给定一个查询图Q,如果Q满足(1)查询图的边集存在序列{e_1,e_2,…,e_k},该序列在时序上满足全序关系,(2)对于任意1≤j≤k,{e_1,e_2,…,e_j}组成的图为连通的图,可以确定查询图Q为时序连通查询图,该序列为查询图Q的时序序列。其中,(1)和(2)可以称为时序连通条件。

在阐述以上定义的基础上,发明人推导出以下重要定理:

定理一、给定查询图Q,如果Q是一个时序连通查询图,并且对应的边序列为e_1,e_2,e_3…e_k.那么,对所有的1≤j<k,有

Preq(e_{j+1})=Preq(e_j)∪e_{j+1};

定理二、在时间窗口内有Ω(Preq(e_{j+1}))可以由Ω(Preq(e_j))同Ω(e_{j+1})进行连接(join)操作得到。即

在以上定义和定理的基础上,以下开始阐述扩展链表的定义以及获取扩展链表的具体过程,通过扩展链表可以获取查询图的匹配解。

扩展链表:扩展链表包括多个链表节点,多个链表节点中最后一个链表节点用于存储当前时间窗口内查询图的匹配解,最后一个链表节点以外的每个链表节点用于存储当前时间窗口内查询图的每个先决子查询图的匹配解,即查询图的中间解。例如,第一个链表节点用于存储查询图第1个边对应的先决子查询图的匹配解,即与第1个边匹配的边,第二个链表节点用于存储查询图第2个边对应的先决子查询图的匹配解,即与第1个边、第2个边组成的子图匹配的子图。示例性地,扩展链表可以如图8所示。

以数学公式的方式进行阐述,假设L表示扩展链表,L^k表示扩展链表中第k个链表节点,扩展链表的表达式可以为L={L^1,L^2,…L^k}。对于给定的一个时序连通查询图P及其对应的时序序列{e_1,e_2,…,e_k},在当前时间窗口中,P对应的扩展链表L={L^1,L^2,…L^k}满足以下定义:扩展链表中的多个链表节点中L^i用于存储Ω(Preq(e_i)),Ω(Preq(e_i))是指Preq(e_i)在快照中的匹配解,同时,还可以要求每个链表节点L^i对应{e_1,e_2,…e_i},L^i是L^{i+1}在链表中的前继,是L^{i-1}的后继。其中,链表节点的前继是指小于该链表节点的所有链表节点中最大的链表节点,链表节点的后继是指大于该链表节点的所有链表节点中最小的链表节点。

针对获取扩展链表的具体过程,本实施例考虑到查询图为时序连通查询图与不为时序连通查询图的情况,分别提供以下两种设计。

在第一种可能的设计中,针对查询图为时序连通查询图的情况,获取查询图的扩展链表的过程可以包括以下步骤一至步骤四。

步骤一、当查询图为时序连通查询图时,根据查询图的时序序列,对扩展链表进行初始化。

针对确定查询图为时序连通查询图的过程,服务器可以判断查询图是否满足时序连通条件,当查询图满足时序连通条件时,确定查询图为时序连通查询图,并获取查询图的时序序列,以便根据该时序序列对扩展链表初始化。

其中,时序序列是指时序从先到后的边序列,针对获取时序序列的过程,可以获取查询图的边集,将边集中的所有边按照时间戳从小到大的顺序排序,得到时序序列。以数学公式的方式进行阐述,查询图的时序序列可以表示为{e_1,e_2,…,e_k},其中k为不小于1的正整数,k为查询图的边集中边的总数量。

针对初始化扩展链表的过程,可以基于时序序列{e_1,e_2,…,e_k},生成对应的多个链表节点{L^1,L^2,…L^k},其中链表节点L^i对应{e_1,e_2,…e_i},用于存储Ω(Preq(e_i)),每个链表节点初始化时内容为空,会通过步骤三和步骤四更新其中存储的数据。

步骤二、当图数据流的任一条边进入时间窗口时,将边对应的匹配解插入到扩展链表中。

随着时间的推移,随着图数据流在时间窗口中的滑动,图数据流的每个边会依次进入时间窗口,每当任一条边进入时间窗口时,可以获取当前的快照,确定快照中新增的边,将这条边的匹配解插入到扩展链表中对应的链表节点中。

将边的匹配解插入到链表节点的过程具体可以包括以下(1)至(3):

(1)当图数据流的边σ_i进入时间窗口时,确定查询图中σ_i的匹配解。

假设图数据流的边σ_i进入时间窗口,可以确定边σ_i的顶点和方向,遍历查询图中的每个边,对于当前遍历到的查询图的边,判断边的顶点是否与σ_i的顶点相同且边的方向是否与σ_i的方向相同,当查询图中某一条边的顶点和方向与σ_i的顶点和方向均相同时,确定该边为σ_i的匹配解。之后,判断匹配解是否为e_1,当匹配解为e_1时,执行步骤(2),当匹配解不为e_1时,执行步骤(3)。

(2)当σ_i的匹配解为e_1时,将σ_i插入到扩展链表的L^1中。

如果σ_i的匹配解是e_1,因为Preq(e_1)就是e_1本身,那么作为Preq(e_1)的匹配解,σ_i会插入到L^1中。

(3)当σ_i的匹配解为e_i(i为大于1的正整数)时,可以将σ_i与扩展链表的L^(i-1)中存储的所有匹配解分别进行连接,得到多个候选匹配解,该候选匹配解即指σ_i与匹配解连接后得到的解。对于多个候选匹配解中的每个候选匹配解,可以判断候选匹配解是否满足时序匹配条件,当候选匹配解满足时序匹配条件时,确定σ_i连接成功,则可以将σ_i对应的候选匹配解作为待插入的匹配解,插入到扩展链表L^i中,当候选匹配解不满足时序匹配条件时,确定σ_i连接不成功,则无需将σ_i对应的候选匹配解作为待插入的匹配解。

需要说明的是,由于时序连通查询图存在时序限制:e_i<e_{i+1}<e_{i+2}…,而这些边对应的边σ_i、σ_(i+1)、σ_(i+2)要晚于σ_i,而目前最晚的边就是σ_i,因此链表节点L^{i+1},L^{i+2}…以及往后的链表节点无需更新。显然,最多发生一次连接,即:σ_i同L^{i-1}存储的所有匹配解的连接。

步骤四、每当图数据流的任一条边离开时间窗口时,将边对应的匹配解从扩展链表中删除。

随着时间的推移,图数据流的每个边会依次离开时间窗口,当图数据流的边σ_i离开时间窗口时,可以遍历扩展链表中每个链表节点,当遍历到的链表节点存储的任一匹配解包括σ_i时,可以将匹配解从链表节点中删除。

在第二种可能的设计中,针对查询图不为时序连通查询图的情况,获取查询图的扩展链表的过程可以包括以下步骤一至步骤五。

步骤一、当查询图不为时序连通查询图时,对查询图进行分解,得到子查询图集合P,P={P_1,P_2,…P_i,…P_k},P_i表示第i个子查询图。其中,分解时要求P_i满足时序连通条件,且P中不同子查询图之间没有公共边。

示例性地,参见图9,对查询图进行分解后分别得到子查询图P1、子查询图P2和子查询图P3。

步骤二、基于子查询图集合P,生成对应的多个链表节点{L_1,L_2,…,L_k},组成扩展链表,其中链表节点L_i用于存储Ω(P_1)∪Ω(P_2)∪…∪Ω(P_i)。

具体地,对于P中的每个子查询图,可以确定该子查询图的时序序列,根据该时序序列的最后一个边,生成对应的链表节点。例如,假设将查询图分解为子查询图{P_1,P_2,…P_k},则生成k个链表节点{L_1,L_2,…,L_k},其中每个链表节点L_k用于存储子查询图P_k的匹配解,即子查询图P_k的最后一个边对应的先决子查询图的匹配解。示例性地,参见图10,图10示出了基于子查询图P1、子查询图P2和子查询图P3组成扩展链表的示意图。

步骤三、当图数据流的任一条边进入时间窗口时,将边对应的匹配解插入到扩展链表中。

本步骤与上述第一种可能的设计中的步骤二类似,相区别的是,上述设计中的查询图为时序连通查询图,由于时序的限制,最多发生一次连接,而本设计中的查询图不是时序连通查询图,在P_i有了新的匹配解的时候(假设匹配解为g),那么,g先跟L_(i-1)里的每个匹配解连接,得到多个候选匹配解,对于该多个候选匹配解中的任一候选匹配解,当该候选匹配解满足时序匹配条件,则作为L_(i-1)的新的匹配解,插入到L_(i-1)中,同时该候选匹配解会继续与P_{i+1}存储的每个匹配解进行连接,以判断连接后是否为L_(i+1)的新的匹配解,当连接为新的匹配解时插入到L_(i+1)中,依次类推。

404、服务器根据扩展链表,获取查询图的匹配解。

通过上述步骤403,服务器初始化了扩展链表,并随着图数据流的滑动实时对扩展链表进行更新。当要获取查询图在图数据流当前快照内的匹配解时,可以根据扩展链表获取匹配解,该查询图的匹配解符合时序匹配条件,即匹配解在时序上与查询图匹配,另外结构上也会与查询图匹配。

获取匹配解的具体过程可以包括以下步骤一至步骤二。

步骤一、确定查询图中最晚的边e_k。

当查询图为时序连通查询图时,可以获取查询图的时序序列中最后一个边,即得到了查询图中最晚的边。当查询图为非时序连通查询图时,可以获取查询图的所有查询子图的时序序列中的最后一个边,从多个查询子图的最后一个边中选取最晚的边,作为查询图中最晚的边。

步骤二、读取扩展链表中L^k存储的匹配解,得到查询图的匹配解。

由于链表节点L^k存储了最晚的边e_k对应的先决子查询图的匹配解,而最晚的边对应的先决子查询图即为查询图本身,则链表节点L^k存储的即为查询图的匹配解,因此读取链表节点L^k即可得到查询图的匹配解。

本步骤中,获取到的匹配解会与查询图之间时序匹配。示例性地,参见图1、图5和图6b。图6b为图数据流在t=8的快照,在该快照中,{a1,b3,c4,d5,e7,f8}时序上满足查询图的时序匹配条件,且结构上与查询图之间满足子图同构,因此{a1,b3,c4,d5,e7,f8}是一个匹配解。而对于{a2,b3,c4,d5,e7,f8},虽然结构满足子图同构,但是e_3要早于e_1,而σ7(a2,b3)却是晚于σ6(b3,d5)的,不符合时序匹配条件,因此不会获取为匹配解。

本实施例提供的方法,考虑到查询图与图数据流的时序特征,提供了一种结合时序特征的子图查询方案,通过查询图和快照构建扩展链表,从而根据扩展链表获取查询图的匹配解,由于获取到的匹配解满足时序匹配条件,即匹配解的时序特征与查询图的时序特征匹配,因此提高了查询过程的准确性。

综上所述,上述图4实施例阐述了一种结合扩展链表的子图查询方法,在该方法的基础上,本发明实施例还提出了一种全新的高效数据结构—匹配存储树,通过匹配存储树来存储扩展链表中每个链表节点存储的中间解,能够大量减少存储扩展链表的空间开销,并提高更新扩展链表的速度以及从扩展链表中读取匹配解的速度。

图11是本发明实施例提供的一种基于匹配存储树的子图查询方法的流程图,该方法的执行主体为服务器,包括:

1101、服务器获取查询图。

本步骤详见上述步骤401,在此不做赘述。

1102、服务器基于时间窗口,获取图数据流当前的快照。

本步骤详见上述步骤402,在此不做赘述。

1103、服务器基于查询图和快照,获取查询图当前的扩展链表。

本步骤详见上述步骤403,在此不做赘述。

1104、服务器根据扩展链表生成匹配存储树。

为了便于理解匹配存储树高效存储中间解的原理,首先阐述中间解的序列表示。给定一个扩展链表{L^1,L^2,…,L^k},假设对应的时序序列为{e_1,e_2,…e_k},显然,L^i存储{e_1,e_2,…,e_i}的匹配解。假设g是L^i存储的一个匹配解,显然,g可以表示为{σ_1,σ_2,…σ_i}的序列形式,其中σ_1、σ_2、…σ_i分别匹配e_1,e_2,…e_i。当所有中间解都表示成序列形式的时候,很显然,很多中间解具有公共前缀,即具有重复的边,例如,图8中的L^3存储的两个中间解:σ_1、σ_3和σ_4、σ_1、σ_3和σ_9具有公共前缀—σ_1、σ_3。

结合以上规律,本实施例引入了匹配存储树,匹配存储树是指满足存储树定义条件的前缀树,存储树定义条件包括以下(1)至(3):

(1)匹配存储树的n_i用于存储e_i的匹配解。n_i是指匹配存储树中深度为i的树节点,e_i的匹配解即为查询图第i个边的匹配解,即图数据流的快照中与该第i个边所匹配的边。

具体地,匹配存储树中第一层的各个树节点(n_1),用于存储快照中第一个边(e_1)的各个匹配解,匹配存储树第二层的各个树节点(n_2)用于存储快照中查询图的第二个边(e_2)的各个匹配解,以此类推。

示例性地,参见图12,查询图中e_6有一个匹配解σ_1,相应地,匹配存储树中第一层包括一个树节点n_1,n_1存储σ_1。查询图中e_5有一个匹配解σ_3,相应地,匹配存储树中第二层包括一个树节点n_2,n_2存储σ_3。查询图中e_4有两个匹配解σ_4和σ_9,相应地,匹配存储树中第三层包括两个树节点n_31和n_32,n_31存储σ_4,n_32存储σ_9。

(2)匹配存储树中从根节点到n_i之间的路径对应扩展链表中L^i中存储的匹配解。从根节点到n_i之间的路径为{n_1,n_2,…,n_i},L^i中存储的匹配解为Ω(Preq(e_i)),也就是说,{n_1,n_2,…,n_i}存储的匹配解的集合为Ω(Preq(e_i))。

具体地,匹配存储树中从根节点到n_1之间的路径对应扩展链表中L^1中存储的匹配解,即n_1存储Ω(Preq(e_1))。匹配存储树中从根节点到n_2之间的路径对应扩展链表中L^2中存储的匹配解,即{n_1,n_2}存储Ω(Preq(e_2))。显而易见地,假设匹配存储树深度为k,则匹配存储树中从根节点到n_k之间的路径对应扩展链表中L^k中存储的匹配解,即查询图的匹配解。

示例性地,参见图12,扩展链表中L^1中存储的匹配解σ_1,相应地,从根节点到n_1之间的路径为n_1,n_1存储σ_1。扩展链表中L^2中存储的匹配解为{σ_1,σ_3},相应地,从根节点到n_2之间的路径为{n_1,n_2},n_1存储σ_1,n_2存储σ_3。扩展链表中L^2中存储的匹配解为{σ_1,σ_3,σ_4}∪{σ_1,σ_3,σ_9},则从根节点到n_2之间的路径包括两条,一条经过n_1、n_2以及n_31,其中n_1存储σ_1,n_2存储σ_3,n_31存储σ_4。另一条经过n_1、n_2以及n_32,其中n_1存储σ_1,n_2存储σ_3,n_32存储σ_9。

(3)匹配存储树中任一树节点具有指向父节点的指针、指向子节点的指针以及分别指向左右兄弟节点的指针。其中,树节点的父节点是指与树节点相邻的上一层树节点,树节点的子节点是指与树节点相邻的下一层树节点,树节点的左兄弟节点是指与树节点相邻的左边的树节点,树节点的右兄弟节点是指与树节点相邻的右边的树节点。

针对树节点的各个指针的作用,指向父节点的指针用于从树节点到达父节点,指向子节点的指针用于从树节点到达子节点,指向左兄弟节点的指针用于从树节点到达左兄弟节点,指向右兄弟节点的指针用于从树节点达到右兄弟指针。

需要说明的是,本实施例提供的匹配存储树可以称为前缀树的变种,是一种改进了的前缀树:目前的前缀树中,每个树节点只包括指向子节点的指针,访问前缀树时只能沿着从上至下的方向寻找对应的树节点。而本实施例中每个树节点还添加了指向相同深度的左右兄弟节点的指针和指向父节点的指针,通过这几种指针,访问匹配存储树时不仅能沿着从上至下的方向寻找树节点,还能沿着从下至上、从左至右、从右至左的方向寻找树节点,极大地提高了灵活性,还能够提高匹配存储树的更新效率和访问效率,在后续多线程的并发控制策略中也会起到非常重要的作用。

1105、随着图数据流在时间窗口的滑动,服务器更新匹配存储树。

本步骤与上述步骤403对应,相区别的是,针对边进入时间窗口以及离开时间窗口的情况,本实施例设置了结合匹配存储树对匹配解进行更新的过程,详见以下设计一和设计二。

设计一、当图数据流的边σ_i进入时间窗时,向匹配存储树插入对应的树节点。

具体地,当图数据流的边σ_i进入时间窗时,可以获取待插入的匹配解,假设该待插入的匹配解的时序序列为{σ1,σ2,…σ_(k-1),σk},那么,根据上述步骤403提供的定理一和定理二,g是由{σ1,σ2,…σ_{k-1}}同σk拼接而来的。则可以确定匹配存储树中σ_(k-1)对应的树节点,创建σk对应的树节点,将σk对应的树节点作为σ_(k-1)的子节点,插入到匹配存储树中。

设计二、当图数据流的边σ_i离开时间窗口时,从匹配存储树删除对应的树节点。

本设计可以包括以下步骤一至步骤三。

步骤一、当图数据流的边σ_i离开时间窗时,获取查询图中σ_i的匹配解,在此假设为e_k。

步骤二、获取匹配存储树中深度为k的所有树节点中σ_i对应的树节点,得到至少一个树节点。具体地,可以遍历匹配存储树中深度为k的所有树节点,对于当前遍历到的深度为k的树节点,判断该树节点存储的匹配解是否为σ_i,当树节点存储的匹配解为σ_i,确定该树节点为σ_i对应的树节点,进而确定出至少一个树节点。

步骤三、删除至少一个树节点以及至少一个树节点的子节点。

对于匹配存储树中任一树节点来说,当该树节点存储的匹配解为σ_i时,根据存储树定义条件(2),该树节点的每个子节点到根节点的路径都会包括σ_i,则如果从该树节点的任一子节点获取匹配解,都会获取到σ_i,因此,会删除树节点以及树节点的每个子节点,也即是,删除了以该树节点为根节点的子树。

本设计中,通过设计匹配存储树的存储结构以及这种删除策略,可以极大提高删除过期的边的效率:相关技术中,对于任一种用于存储图数据的树来说,当要删除某一边时,需要遍历树的所有树节点,并判断每个树节点是否存储了待删除的边,进而对存储了待删除的边的树节点进行删除。而本设计中,无需遍历树的所有树节点,只需遍历一层树节点即可,提高了删除过期的边的效率,有助于快速更新匹配存储树。

1106、服务器访问匹配存储树,得到查询图的匹配解。

根据存储树定义条件(2),匹配存储树中最后一层的树节点到根节点之间的路径对应于最后一个链表节点存储的匹配解,即查询图的匹配解,那么,从最后一层的树节点开始向上回溯,即可获取查询图的匹配解。

针对获取查询图的匹配解的具体过程,假设匹配存储树共计k层,可以确定匹配存储树的深度k,基于匹配存储树中所有深度为k的树节点的指向左右兄弟节点的指针,遍历匹配存储树中深度为k的多个树节点,对于每个遍历到的树节点,沿着从该树节点至根节点之间的每个树节点的指向对应父节点的指针,从树节点返回至根节点,获取经过的每个树节点存储的匹配解,将经过的多个匹配解连接为查询图的匹配解。

具体地,当遍历到任一树节点时,可以沿着从该树节点的指向左右兄弟节点的指针,到达左右兄弟节点,从而遍历相同深度的树节点,同时,可以沿着从该树节点的指向父节点的指针,到达父节点,再从父节点的指向祖父节点的指针,到达祖父节点,以此类推,直至到达根节点。

示例性地,参见图12,对于图12所示的匹配存储树来说,k=3,可以从树节点n_31开始,沿着树节点n_31返回至根节点,在此过程中会经过树节点n_31、树节点n_2以及树节点n_1,分别获取树节点n_31、树节点n_2以及树节点n_1存储的匹配解,得到σ4、σ3和σ1,将σ4、σ3和σ1进行连接,即得到了查询图的匹配解。另外,在沿着树节点n_31返回至根节点的同时,可以沿着树节点n_31指向右兄弟节点的指针,到达树节点n_32,沿着树节点n_32返回至根节点,在此过程中会经过树节点n_32、树节点n_2以及树节点n_1,分别获取树节点n_32、树节点n_2以及树节点n_1存储的匹配解,得到σ9、σ3和σ1,将σ9、σ3和σ1进行连接,即得到了查询图的匹配解。

本实施例提供的方法,提供了一种结合匹配存储树的子图查询方法,在保证获取到的匹配解满足时序匹配条件,从而提高匹配解的准确性的基础上,极大地减少存储扩展链表所需的空间开销,并且提高更新扩展链表的速度以及从扩展链表中读取匹配解的速度。

综上所述,上述图11实施例阐述了一种基于匹配存储树的子图查询方法,在该方法的基础上,本实施例还提出了一种基于并发控制策略,控制多线程并发地访问匹配存储树的方法,可以由多线程并发地访问以及更新匹配存储树存储的匹配解。

为了便于理解并发控制策略,首先对并发控制策略的发明构思进行介绍:在图数据流下,边的流速可能非常高,吞吐量(单位时间内能处理的边的数量)非常关键。如果连续的两条边的计算过程互不干扰,后面的边无需等待前面的边计算结束就可以启动计算过程。例如,参见图13,在插入σ12的时候,要先向L_3^1插入新的中间解,然后从L_0^2读取所有的中间解,之后向L_0^3插入新的中间解,而σ10、σ11和σ12的三种操作互相没有冲突,所以这三个事务是可以并发执行的。进一步地,考虑到并发执行也会遇到可能冲突的情况,如σ12的操作和σ13的操作就可能存在读写冲突和写写冲突,因此需要并发控制策略来防止冲突的发生。

图14是本发明实施例提供的一种控制多线程并发执行事务的流程图,该发明实施例的执行主体为服务器,以该方法由服务器中的主线程和执行事务的线程进行交互实现为例,参见图14,该方法包括:

1401、当主线程获取任一待执行的事务时,生成事务对应的锁需求。

本实施例中,预先将插入匹配解、读取匹配解、删除匹配解等操作进行了建模,得到了各种事务,事务包括向对应链表节点插入匹配解的操作、从对应链表节点读取匹配解的操作或从对应链表节点删除匹配解的操作中的至少一项,即可以包括这三种操作的任一种或者这三种操作的任意组合。在上述图11实施例中,当要获取查询图的匹配解时,主线程可以获取到获取匹配解的操作对应的事务,当图数据流的边插入时间窗口,要向匹配存储树插入匹配解时,主线程可以获取到插入匹配解的操作对应的事务,当图数据流的边离开时间窗口,要从匹配存储树删除匹配解时,主线程可以获取到删除匹配解的操作对应的事务。

当获取到任一事务时,主线程可以确定该事务相关的链表节点,即存储了该事务对应的匹配解的链表节点,并确定执行该事务的线程,根据该链表节点和线程生成该事务的锁需求,锁需求用于在对应的线程访问对应的链表节点的过程中保持链表节点为锁定状态,以避免多个线程访问相同链表节点时造成的冲突。

其中,锁需求包括线程标识和链表节点标识,线程标识用于唯一确定对应的线程,链表节点标识用于唯一确定对应的链表节点。可选地,锁需求还可以包括锁类型,锁类型可以包括共享锁和互斥锁,通过在锁需求中携带锁类型,可以保证线程向链表节点上添加的锁的类型符合业务需求。示例性地,锁需求可以表示为<线程ID,锁类型,L^j>,表征对应的线程需要在L^j上加对应锁类型的锁。其中共享锁可以表示为S型,互斥锁可以表示为X型。

1402、主线程将锁需求入列(enqueue)至链表节点的锁等待队列中,锁等待队列用于缓存链表节点的每个锁需求。

为了保证线程执行事务的有序性,本实施例为扩展链表中每个链表节点设置了锁等待队列,锁等待队列用于缓存对应链表节点的所有锁需求,锁等待队列中的每个锁需求会按照时序从先到后进行排列。每当主线程得到锁需求后,会将锁需求入列至对应的锁等待队列中,即将锁需求插入到对应的锁等待队列的对尾,以保证锁等待队列实现先入先出。

需要说明的是,当获取到多个待入列的锁需求时,主线程会按照时序依次入列每个锁需求,即每次仅会将一个锁需求入列至对应的锁需求队列中,当锁需求入列完毕后才会将下一个锁需求入列至锁需求队列中,以保证结果的一致性。

1403、主线程生成用于执行事务的线程。

当主线程入列锁需求后,可以根据事务的处理逻辑,生成事务对应的线程,线程内写入了事务的处理逻辑,可以自动执行对应的事务。生成线程后,如果锁需求尚未在对应链表节点的锁需求队列排在队首,线程会进入睡眠状态,等待被唤醒以执行事务。另外,如果锁需求的锁类型和链表节点当前加锁状态的锁类型不一致,线程也会进入睡眠状态。

1404、当锁需求在锁等待队列中排在队首时,唤醒锁需求对应的线程,对链表节点上锁,在上锁成功后执行事务,在执行事务完毕后将锁需求从锁等待队列中出列。

关于对链表节点上锁的过程,线程在唤醒之后,会对相应的链表节点进行上锁,以避免线程执行事务时由于其他线程访问链表节点引发冲突。可选地,当锁需求包括锁类型时,如果线程要成功对链表节点进行上锁,在要求锁需求在锁等待队列中排在队首的基础上,还可以要求锁等待队列所属的链表节点当前的加锁状态和锁需求的锁类型是兼容的,即,链表节点处于未加锁状态,或者链表节点的加锁状态的锁类型和锁需求的锁类型均为共享锁。

进一步地,与上述图11实施例相结合,为了避免多线程并发访问匹配存储树时产生冲突,本实施例对并发控制策略进行了进一步改进。为了便于理解,首先对发明构思进行介绍:考虑到匹配存储树的每一层树节点对应扩展链表的链表节点,针对匹配存储树进行加锁也就完成了对扩展链表的加锁,而对匹配存储树进行加锁时,可能会面临以下场景:匹配存储树中不同的匹配解有公共前缀,当删除匹配解A的时候,可能存在与该匹配解A具有公共前缀的中间解B还需要保留。在这种场景下,假设有两个线程T1和T2,其中T1发射时间比T2早,并且假设T1在访问匹配存储树的d1层,而T2的是d2层,有两种情况可能导致冲突:

情况一、d1>d2,即d1层的深度大于d2层的深度,当T1读取d2层的中间解时,需要往根节点返回,在返回的过程中,如果需要通过的树节点已经被T2删除了,会导致冲突。

情况二、d1>d2,当T1在d1层插入中间解g={σ1,σ2…σ_{d1}}时,T1需要把新创建的σ_{d1}节点加入为σ_{d1-1}节点的子节点,然而T2可能删除了σ_{d1-1},导致冲突。

总结来看,发生冲突的核心原因在于有些线程过早删除了仍需要保留的中间解。但是,如果不删除,后续的线程就可能访问到本该删除的中间解,也会导致冲突。因此,需要任一线程删除中间解的过程对该线程之后的新线程可见,而对该线程之前的老线程不可见。

为此,本发明提供了以下并发控制策略,保证避免冲突:并发控制策略还包括:当要删除匹配存储树中的任一树节点时,删除树节点的父节点指向树节点的指针,删除树节点的指向左右兄弟节点的指针,保留树节点的子节点指向树节点的指针。

示例性地,参见图15,假设要删除树节点为节点n,节点n的左兄弟节点为nprev,节点n的右兄弟节点为nnext,节点n的父节点为nfather,会删除节点n指向nprev和nnext的指针、nfather指向节点n的指针,保留节点n的子节点指向节点n的指针,还可以保留节点n指向节点nfather的指针。

通过这种并发控制策略,由于删除了父节点指向树节点的指针,则后续生成的线程无法经过父节点访问树节点存储的数据,由于删除了左右兄弟节点的指针,保证后续生成的线程无法通过左右兄弟节点访问树节点存储的数据,避免了访问过期的数据时产生的冲突。同时,由于保留了从子节点指向树节点的指针,能够保证之前生成的线程仍能通过该树节点返回至根节点,避免了待访问的数据提前删除时产生的冲突。

本实施例提供的方法,在子图查询方法的基础上设计了多线程并发执行事务的策略,极大地提高了子图的查询效率。进一步地,通过部分删除指针的设计,能够避免多线程执行事务的冲突。

图16是本发明实施例提供的一种子图查询装置的结构示意图,应用于服务器中,如图16所示,该装置包括:查询图获取模块1601、快照获取模块1602、扩展链表获取模块1603、匹配解获取模块1604。

查询图获取模块1601,用于获取查询图,该查询图的边集存在时序关系;

快照获取模块1602,用于基于时间窗口,获取图数据流当前的快照,该图数据流是指时序从先到后的边序列,该快照是指该图数据流当前处于该时间窗口内的边序列组成的图;

扩展链表获取模块1603,用于基于该查询图和该快照,获取该查询图当前的扩展链表,该扩展链表包括多个链表节点,该多个链表节点中L^i用于存储Ω(Preq(e_i)),该L^i是指该扩展链表中第i个链表节点,该e_i是指该查询图中第i条边,该Preq(e_i)是指该e_i的先决子查询图,该先决子查询图是指该e_i以及该查询图中早于该e_i的所有边组成的图,该Ω(Preq(e_i))是指该Preq(e_i)在该快照中的匹配解;

匹配解获取模块1604,用于根据该扩展链表,获取该查询图的匹配解,该查询图的匹配解满足时序匹配条件,该时序匹配条件是指:对于该查询图的e_i、e_j以及该匹配解中的σ_x、σ_y,该e_i与该e_j之间的时序、该σ_x与该σ_y之间的时序相同,该σ_x是指该匹配解中与该e_i匹配的边,该σ_y是指该匹配解中与该e_j匹配的边。

在一种可能的设计中,该匹配解获取模块1604,包括:

获取子模块,用于获取该查询图中最晚的边e_k;

读取子模块,用于读取该扩展链表中L^k存储的匹配解,得到该查询图的匹配解。

在一种可能的设计中,该扩展链表获取模块1603,包括:

确定子模块,用于当该图数据流的边σ_i进入该时间窗口时,确定该查询图中该σ_i的匹配解;

插入子模块,用于当该σ_i的匹配解为e_1时,将该σ_i插入到该扩展链表的L^1中;或,

连接子模块,用于当该σ_i的匹配解为e_i时,将该σ_i与该扩展链表的L^(i-1)中存储的所有匹配解分别进行连接,得到多个候选匹配解,其中该i为大于1的正整数;获取子模块,用于获取该多个候选匹配解中满足该时序匹配条件的候选匹配解,作为待插入的匹配解;插入子模块,用于将该待插入的匹配解插入到该扩展链表的L^i中。

在一种可能的设计中,该扩展链表获取模块1603,用于当该图数据流的边σ_i离开该时间窗口时,遍历该扩展链表中每个链表节点,当遍历到的链表节点存储的任一匹配解包括该σ_i时,将该匹配解从该链表节点中删除。

在一种可能的设计中,该装置还包括:

确定模块,用于当该查询图为时序连通查询图时,确定该查询图的时序序列{e_1,e_2,…,e_k},该时序序列是指按照时序从先到后的边序列;

生成模块,用于基于该时序序列{e_1,e_2,…,e_k},生成对应的多个链表节点{L^1,L^2,…L^k},其中链表节点L^i对应{e_1,e_2,…e_i},该k为该查询图的边集中边的总数量;

其中,该时序连通查询图是指满足时序连通条件的图,该时序连通条件是指:查询图的边集存在序列{e_1,e_2,…,e_k},该序列在时序上满足全序关系,且对于任意1≤j≤k,{e_1,e_2,…,e_j}组成的图为连通的图。

在一种可能的设计中,该装置还包括:

分解模块,用于当该查询图不为时序连通查询图时,对该查询图进行分解,得到子查询图集合P,该P={P_1,P_2,…P_i,…P_k},P_i表示第i个子查询图,P_i满足该时序连通条件,该子查询图集合中的不同子查询图之间没有公共边;

生成模块,用于基于该子查询图集合P,生成对应的多个链表节点{L_1,L_2,…,L_k},其中链表节点L_i用于存储Ω(P_1)∪Ω(P_2)∪…∪Ω(P_i);

其中,该时序连通查询图是指满足时序连通条件的图,该时序连通条件是指:查询图的边集存在序列{e_1,e_2,…,e_k},该序列在时序上满足全序关系,且对于任意1≤j≤k,{e_1,e_2,…,e_j}组成的图为连通的图;

在一种可能的设计中,该扩展链表基于匹配存储树存储,该匹配存储树是指满足存储树定义条件的前缀树;

其中,该存储树定义条件是指:匹配存储树的n_i用于存储e_i的匹配解,该n_i是指该匹配存储树中深度为i的树节点;该匹配存储树中从根节点到该n_i之间的路径对应该扩展链表中L^i中存储的匹配解;该匹配存储树中任一树节点具有指向父节点的指针、指向子节点的指针以及分别指向左右兄弟节点的指针。

在一种可能的设计中,该匹配解获取模块1604,包括:

确定子模块,用于确定匹配存储树的深度k;

遍历子模块,用于基于该匹配存储树中所有深度为k的树节点的指向左右兄弟节点的指针,遍历该匹配存储树中深度为k的多个树节点;

连接子模块,用于对于每个遍历到的树节点,沿着该树节点至根节点之间的每个树节点的指向对应父节点的指针,从该树节点返回至该根节点,获取经过的每个树节点存储的匹配解,将经过的多个匹配解连接为该查询图的匹配。

在一种可能的设计中,该扩展链表获取模块1603,包括:

获取子模块,用于当该图数据流的边σ_i进入该时间窗口时,获取待插入的匹配解,该待插入的匹配解的时序序列为{σ1,σ2,…σ_(k-1),σk};

确定子模块,用于确定该匹配存储树中σ_(k-1)对应的树节点;

创建子模块,用于创建σk对应的树节点,将该σk对应的树节点作为σ_(k-1)的子节点,插入到该匹配存储树中。

在一种可能的设计中,该扩展链表获取模块1603,包括:

获取子模块,用于当该图数据流的边σ_i离开该时间窗口时,获取该查询图中该σ_i的匹配解e_k;

该获取子模块,还用于获取该匹配存储树中深度为k的所有树节点中该σ_i对应的树节点,得到至少一个树节点;

删除子模块,用于删除该至少一个树节点以及该至少一个树节点的子节点。

在一种可能的设计中,该扩展链表获取模块1603,还用于基于并发控制策略,控制多个线程并发地执行针对每个链表节点的事务,该事务包括向对应链表节点插入匹配解的操作、从对应链表节点读取匹配解的操作或从对应链表节点删除匹配解的操作中的至少一项。

在一种可能的设计中,该并发控制策略包括:

当确定任一待执行的事务时,为该事务生成锁需求,该锁需求用于在对应的线程访问对应的链表节点的过程中保持该链表节点为锁定状态;

将该锁需求入列至该链表节点的锁等待队列中,该锁等待队列用于缓存该链表节点的每个锁需求;

当该锁需求在该锁等待队列中排在队首时,唤醒该线程,由该线程对该链表节点上锁,在上锁成功后执行该事务,在执行该事务完毕后将该锁需求从该锁等待队列中出列。

在一种可能的设计中,该并发控制策略包括:

当要删除匹配存储树中的任一树节点时,删除该树节点的父节点指向该树节点的指针;

删除该树节点的指向左右兄弟节点的指针;

保留该树节点的子节点指向该树节点的指针。

图17是本发明实施例提供的一种服务器的结构示意图,该服务器1700可因配置或性能不同而产生比较大的差异,可以包括一个或一个以上中央处理器(central processing units,CPU)1722(例如,一个或一个以上处理器)和存储器1732,一个或一个以上存储应用程序1742或数据1744的存储介质1730(例如一个或一个以上海量存储设备)。其中,存储器1732和存储介质1730可以是短暂存储或持久存储。存储在存储介质1730的程序可以包括一个或一个以上模块(图示没标出),每个模块可以包括对服务器中的一系列指令操作。更进一步地,中央处理器1722可以设置为与存储介质1730通信,在服务器1700上执行存储介质1730中的一系列指令操作。

服务器1700还可以包括一个或一个以上电源1726,一个或一个以上有线或无线网络接口1750,一个或一个以上输入输出接口1758,一个或一个以上键盘1756,和/或,一个或一个以上操作系统1741,例如Windows ServerTM,Mac OS XTM,UnixTM,LinuxTM,FreeBSDTM等等。

该服务器1700可以用于执行上述实施例提供的子图查询方法中服务器所执行的步骤。

在示例性实施例中,还提供了一种计算机可读存储介质,例如包括指令的存储器,上述指令可由服务器中的处理器执行以完成上述实施例中的子图查询方法。例如,该计算机可读存储介质可以是只读存储器(Read-On l 17Memor17,ROM)、随机存取存储器(Random Access Memor17,RAM)、CD-ROM、磁带、软盘和光数据存储设备等。

本领域普通技术人员可以理解实现上述实施例的全部或部分步骤可以通过硬件来完成,也可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,上述提到的存储介质可以是只读存储器,磁盘或光盘等。

以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1