本发明属于语义网技术领域,具体涉及一种结合spark平台的owlhorst规则分布式并行推理算法。
背景技术:
语义万维网中的rdf和owl标准已在各个领域有着广泛的应用,如一般知识(dbpedia)、医疗生命科学(lodd)、生物信息学(uniprot)、地理信息系统(linkedgeodata)和语义搜索引擎(watson)等。随着语义万维网的应用,产生了海量的语义信息。由于数据的复杂性和大规模性,如何通过语义信息并行推理高效地发现其中隐藏的信息是一个亟待解决的问题。由于语义网数据的急速增长,集中式环境的内存限制,已不适用于大规模数据的推理。
研究rdfs/owl分布式并行推理是目前较新的一个领域。j.urbani等人在rdfs/owl规则集上采用webpie进行推理,能够满足大数据的并行推理;但该算法针对每一条规则启用一个或者多个mapreduce任务进行推理,由于job的启动相对耗时,因此随着rdfs/owl推理规则的增加,整体推理的效率受到了限制。顾荣等人提出了基于mapreduce的高效可扩展的语义推理引擎(yarm),使推理在一次mapreduce任务内即可完成rdfs规则的推理;但该算法并不适用于复杂的owl规则的推理。此外,当某一规则产生的新三元组重复时,yarm会存在过多的冗余计算且产生无用数据。汪璟玢等人提出结合rete的rdf数据分布式并行推理算法,该算法结合rdf数据本体,构建模式三元组列表和规则标记模型;在rdfs/owl推理阶段,结合mapreduce实现rete算法中的alpha阶段和beta阶段,从而实现rete算法的分布式推理;但该算法在连接beta网络推理时需要消耗较多的内存且进行多次迭代时效率低下,因而此算法受到集群内存和平台的限制。顾荣等人提出了一种基于spark的高效并行推理引擎(cichlid),结合rdd的编程模型,优化了并行推理算法;但该算法未考虑规则能否被激活,均需要进行推理,因而造成了推理性能的浪费和传输的冗余。
由于语义网数据的急速增长,集中式环境的内存限制,已不适用于大规模数据的推理。目前存在分布式推理引擎虽然能够实现数据的并行推理,但是mapreduce任务启动个数多且耗时,对于复杂的owlhorst规则无法执行推理,且存在过多的冗余计算且产生无用数据,以及消耗大量的内存多次迭代效率低下,导致无法在数据量增大的情况下能够高效且正确的实现rdfs/owl规则的推理。
需要解决的技术问题:
1.解决如何结合rdf数据本体构建模式三元组rdd和规则标记模型,以及treat算法中alpha阶段的构建,从而能够高效并行的完成owlhorst全部规则的推理。
2.结合提出的分布式方案提出了对应的并行推理方案,从而满足大规模数据的分布式并行推理的需求。
技术实现要素:
为了解决上述问题,本发明提供一种结合spark平台的owlhorst规则分布式并行推理算法。本发明针对owlhorst规则,提出了dprs算法(distributedparallelreasoningalgorithmbasedonspark)。该算法在数据量动态增加的情况下能够高效地构建alpha网络,并执行正确的推理。
为实现上述目的,本发明采用以下技术方案实现:一种结合spark平台的owlhorst规则分布式并行推理算法,其特征在于,包括以下步骤:s1:加载模式三元组集合pj_rdd、ok_rdd和rulem_linkvar_rdd并广播;模式三元组(si,pj,ok)指的是三元组中主语、谓语和宾语的定义都在本体文件中其中,i,j,k表示具体的某个元素;模式三元组集合包含pj_rdd与ok_rdd设模式三元组(si,pj,ok),则pj_rdd={<pj,{(si,ok)}>},表示具有相同pj且pj∉{rdf:type}的所有模式三元组中(si,ok)组成的集合,ok_rdd={<ok,{si}>},表示具有相同ok且pj∈{rdf:type}的所有模式三元组中si组成的集合;rulem_link_rdd在rdfs/owl规则中用于连接两个前件的模式三元组项,将每一条规则的连接变量信息以<key,value>的形式存储在rulem_link_rdd,其中key存储该规则所有用于前件连接的模式三元组项,value存储该规则结论部分的模式三元组项;s2:构建规则标记模型flag_rulem并广播;flag_rulem标识规则m的状态是否为激活;规则不能激活时,flag_rulem=0;规则激活且为类型1时,flag_rulem=1;规则激活且为类型2时,flag_rulem=2;其中类型1表示:只包含一个前件的规则或模式三元组与实例三元组组合的规则,且只有一个实例三元组;类型2:模式三元组与实例三元组组合的规则,且有多个实例三元组;s3:对flag_rulem=1或flag_rulem=2的规则并行执行owlhorst规则的并行推理,并输出中间结果;s4:删除重复三元组;s5:如果产生新的模式三元组数据,则跳至s2,如果产生新的实例三元组数据,则跳至s3,否则算法结束;实例三元组(si,pj,ok)指的是三元组中主语、谓语和宾语至少有一个的定义不是在本体文件中,且是具体的实例,其中,i,j,k表示具体的某个元素。
与现有技术相比,本发明具有以下优点:
1.结合spark平台构建模式三元组集合并广播,减少了网络传输的开销。
2.设计的冲突集更新策略,加快了数据更新速度从而提升了推理的效率。
附图说明
图1为本发明的总体框架示意图。
图2为owlhorst规则结构图。
具体实施方式
下面结合附图和具体实施例对本发明做进一步解释说明。
本发明提供一种结合spark平台的owlhorst规则分布式并行推理算法,其包括以下步骤:dprs算法主要包括以下几个步骤:
1.加载模式三元组集合pj_rdd、ok_rdd和rulem_linkvar_rdd并广播。
2.构建规则标记模型flag_rulem并广播。
3.对flag_rulem的规则并行执行owlhorst规则的并行推理,并输出中间结果。
4.删除重复三元组。
5.如果产生新的模式三元组数据,则跳至2,如果产生新的实例三元组数据,则跳至3,否则算法结束。
本发明的整体框架图参见图1。
定义1.(模式三元组,schematriple)指的是三元组中主语(subject)、谓语(predicate)和宾语(object)的定义都在本体文件中。schematriple表示为大写的s,p,o组成的(si,pj,ok),其中,i,j,k表示具体的某个元素。
定义2.(实例三元组,instancetriple)指的是三元组中主语(subject)、谓语(predicate)和宾语(object)至少有一个的定义不是在本体文件中,且是具体的实例。instancetriple表示为小写的s,p,o组成的(si,pj,ok),其中,i,j,k表示具体的某个元素。
定义3.(模式三元组集合,schemardd(包含pj_rdd与ok_rdd))设模式三元组(si,pj,ok),结合定义1,则pj_rdd={<pj,{(si,ok)}>},表示具有相同pj且pj∉{rdf:type}的所有模式三元组中(si,ok)组成的集合,ok_rdd={<ok,{si}>},表示具有相同ok且pj∈{rdf:type}的所有模式三元组中si组成的集合。schemardd表示pj_rdd与ok_rdd合并后的集合。
定义4.(连接变量,rulem_link_rdd)。连接变量为在rdfs/owl规则中用于连接两个前件的模式三元组项,根据规则描述,连接变量可以不止一个。本文将每一条规则的连接变量信息以<key,value>的形式存储在rulem_link_rdd,其中key存储该规则所有用于前件连接的模式三元组项,value存储该规则结论部分的模式三元组项。
dprs算法根据连接变量的类型,对owlhorst规则进行分类。本文引用owlhorst规则时采用owl-规则编号的形式,例如owl-4表示图2中的第4条规则。同时,给每条规则分配一个规则名称标记,规则名称标记即为该规则所对应的名称(例如,规则owl-4的规则名称标记为owl-4)。具体的规则分类如下:
1)类型1:只包含一个前件的规则或schematriple与instancetriple组合的规则,且只有一个instancetriple,可以在map推理过程中直接输出推理结果(图2中规则owl-3、owl-5a、owl-5b、owl-6、owl-8a、owl-8b、owl-9、owl-12a、owl-12b、owl-12c、owl-13a、owl-13b、owl-13c、owl-14a、owl-14b)。
2)类型2:schematriple与instancetriple组合的规则,且有多个instancetriple的,需要结合map和reducebykey两个阶段推理(图2中规则owl-1、owl-2、owl-4、owl-7、owl-15、owl-16)。
定义5.(规则前件模式标记indexmn)设cmn为规则m的第n个规则前件,indexmn表示是否存在满足该规则前件的模式三元组,即标识规则前件cmn的schemardd是否为空。结合定义4,规则前件模式标记indexmn定义如下:
定义6.(规则标记flag_rulem)标识规则m的状态是否为激活。结合定义6进行定义规则标记flag_rulem如下:
flag_rulem={0,1,2}公式(3-3)
其中,规则不能激活时,flag_rulem=0;规则激活且为类型1时,flag_rulem=1;规则激活且为类型2时,flag_rulem=2。
在本发明具体实施例中dprs算法过程包括以下步骤:
加载模式三元组与构建规则标记模型
由于模式三元组的数量远远少于实例三元组,dprs算法将schematriple加载到schemardd中并广播。并构建每条规则中的模式三元组或模式三元组连接后的数据(rulem_linkvar_rdd或oj_rdd或pk_rdd)为alpha寄存器并广播,保存对应的schematriple。
为了尽早判断出不可能被激活的规则,dprs算法根据owl规则构建每一条规则内schematriple间的关系oj_rdd或pk_rdd,并判断schemardd中是否存在规则前件中的schematriple,生成对应规则的标记flag_rulem,构建所有规则的标记模型,将规则标记模型加载到flag_rulem并广播。
通过schemardd和构建规则标记模型能够过滤大量instancetriple,减少map阶段键值对的输出,从而减少了无效的网络传输,提高整体推理效率。
map阶段
map阶段主要完成对输入的数据进行选择过滤以及执行类型1的推理,结果的输出形式为键值对,本文提出的数据分配与过滤算法具体步骤如下.
算法map算法
输入rdf三元组格式数据
输出以键值对的形式输出instancetriple
step1获取广播变量中的oj_rdd、pk_rdd和rulem_linkvar_rdd以及规则标记flag_rulem。
step2对于输入的∀(si,pj,ok)∈instancetriple判断所有flag_rulem的值。如果值为0,则跳至step3,如果值为1,则跳至step4,否则跳至step5.
step3对(si,pj,ok)不做任何处理。
step4结合oj_rdd或pk_rdd执行类型1的规则推理,根据规则的结论直接输出对应的三元组<rulem,
step5获取对应规则中的模式三元组alpha寄存器oj_rdd、pk_rdd或rulem_linkvar_rdd,判断当前的实例三元组是否满足前件连接变量的条件;满足,则构建对应的键值对<rulem_linkvar,(si,pj,ok)>输出;不满足,则不做处理。
以图2中规则8a(inverseof)为例,伪码描述如下:
input:(s1,p1,o1)
output:<key,value>
begin
if(flag_rule8==1){
for(inverseinbc_inverseof.value){
if(p1equalinverse.p)
yield(rule8,(s1,inverse.q,o1))
}
end
类似于规则8,推理可以在map阶段就得到规则产生的三元组结果,那么reduce阶段就可以对规则8产生的三元组去重并输出。
以图2中规则9(type+sameas)为例,伪码描述如下:
input:(s1,p1,o1)
output:<key,value>
begin
if(flag_rule9==2){
if(p1equal“rdf:type”){
yield(rule9+s1,(“flag=type,resource=”+s1))
}
elseif(p1equal“owl:sameas”){
yield(rule9+s1,(“flag=sameas,resource=”+o1))
}
}
end
以图2中规则15(somevaluesfrom)为例,伪码描述如下:
input:(s1,p1,o1)
output:<key,value>
begin
if(flag_rule15==2){
for(inverseinbc_vpw.value){
if(p1equal“rdf:type”){
if(o1equalinverse.w){
yield(rule15+inverse.p+o1,(“flag=type,”+inverse.v))
//输出的value中flag标识type或者generic,用来reduce中判断为s或o
}
}
elseif(p1equalinverse.p){
yield(rule15+p1+o1,(“flag=generic,”+s1))
}
}
end
如上所描述的规则9和15,以规则9为例,在map阶段需要对输入的三元组进行处理,以“rule9+连接变量”为key,如果谓语为type,那么value中标记为type且资源为连接变量;如果谓语为sameas,那么value中标记为sameas且资源为宾语。
reduce阶段:连接推理
reduce阶段主要完成连接推理。利用rdd的reducebykey,结合owlhorst规则,根据schemardd和alpha寄存器以及map阶段的instancetriple输出结果完成连接推理,得到推理结果.本文提出的连接推理算法具体步骤如下:
算法reduce算法
输入键值对形式的instancetriple
输出连接推理生成的三元组
step1.获取广播变量中的ok_rdd、pj_rdd和rulem_linkvar_rdd以及规则标记flag_rulem。
step2.获取相同键对应的迭代器;如果key为rulem,则表示为类型1,直接将value的三元组
为了更加明确reduce阶段的连接推理,以图2中规则9(type+sameas规则)为例,伪码描述如下:
input:<rulem_linkvar,iterator<string>values>
output:(s,p,o)
begin:
valiter=values
while(iter.hasnext){
vartypes,sameas/*用来保存flag为type或sameas的集合*/
value=iter.next
if(value.flag==“type”)
types.add(value.resource);
elsesameas.add(value.resource);
}
for(vintypes)
for(winsameas)
yield(null,triple(v,”rdf:type”,w));
end
为了更加明确reduce阶段的连接推理,以图2中规则15(somevaluesfrom规则)为例,伪码描述如下:
input:<rulem_linkvar,iterator<values>>或<rulem,iterator<(s,p,o)>>
output:(s,p,o)
begin:
valiter=values
while(iter.hasnext){
vartypes,generic//用来保存flag为type和generic的集合
for(valueinvalues)
if(value.type==“typetriple”)types.add(value.resource);
elsegeneric.add(value.resource);
for(vintypes)
for(uingeneric)
yield(null,triple(u,”rdf:type”,v));
}
end
由上述的规则9和规则15的伪码,以规则9为例,在reduce阶段,根据输入的key和values,我们通过values中的flag值来进行区分并构建输出的三元组。
删除重复三元组
在执行算法推理的过程中会产生大量重复的三元组数据到冲突集中,如不删除冲突集中的重复三元组,则更新alpha寄存器时将会产生重复三元组数据,浪费系统资源,降低推理效率。如果每次推理后都能够及时删除冲突集中的重复三元组,那将会减少很大的网络传输开销。本文借助rdd的distinct和subtract完成删除重复三元组算法。
通过上述的删除重复三元组后,冲突集中的模式三元组分别更新到对应的alpha寄存器中,实例三元组则合并到实例文件中。
算法复杂性分析是衡量一个算法效率的重要指标,dprs算法的复杂性分析与集中式算法有着不同的方式。在分析dprs算法的复杂性时,可以将其分解为map和reduce两个阶段进行算法复杂性分析。设实验数据集中包含n个三元组,其中含有n个模式三元组,且mapreduce过程中map任务的并行数设为k,reduce阶段接收shuffle传输的实例三元组数设为m,reduce任务的并行数设为t。dprs算法在map阶段对于输入的每个三元组,都对pj_rdd、ok_rdd和flag_rulem扫描一次,进而判断该三元组能否参与某些规则推理。如果能,结合其他数据进行规则推理,则以规则名称拼接连接变量为key,中间结果为value作为map的输出。因此,map阶段的时间复杂性为:o(n*n/k)。由于图2owlhorst规则中,规则1、2、3、4、15、16都含有两个实例三元组前件,将上述规则称作多实例变量规则,多实例变量规则的reduce阶段则需要遍历两次输入的实例三元组与模式三元组连接,才能得到推理结果。因此在reduce阶段的时间复杂性分为单变量和多变量进行分析:reduce阶段多变量的时间复杂性为:o(n*m/t)。由于n的数目非常少,可以认为其量级为常数。
以上是本发明的较佳实施例,凡依本发明技术方案所作的改变,所产生的功能作用未超出本发明技术方案的范围时,均属于本发明的保护范围。