本發(fā)明屬于語義網(wǎng)技術(shù)領(lǐng)域,具體涉及一種結(jié)合spark平臺的owlhorst規(guī)則分布式并行推理算法。
背景技術(shù):
語義萬維網(wǎng)中的rdf和owl標準已在各個領(lǐng)域有著廣泛的應(yīng)用,如一般知識(dbpedia)、醫(yī)療生命科學(lodd)、生物信息學(uniprot)、地理信息系統(tǒng)(linkedgeodata)和語義搜索引擎(watson)等。隨著語義萬維網(wǎng)的應(yīng)用,產(chǎn)生了海量的語義信息。由于數(shù)據(jù)的復(fù)雜性和大規(guī)模性,如何通過語義信息并行推理高效地發(fā)現(xiàn)其中隱藏的信息是一個亟待解決的問題。由于語義網(wǎng)數(shù)據(jù)的急速增長,集中式環(huán)境的內(nèi)存限制,已不適用于大規(guī)模數(shù)據(jù)的推理。
研究rdfs/owl分布式并行推理是目前較新的一個領(lǐng)域。j.urbani等人在rdfs/owl規(guī)則集上采用webpie進行推理,能夠滿足大數(shù)據(jù)的并行推理;但該算法針對每一條規(guī)則啟用一個或者多個mapreduce任務(wù)進行推理,由于job的啟動相對耗時,因此隨著rdfs/owl推理規(guī)則的增加,整體推理的效率受到了限制。顧榮等人提出了基于mapreduce的高效可擴展的語義推理引擎(yarm),使推理在一次mapreduce任務(wù)內(nèi)即可完成rdfs規(guī)則的推理;但該算法并不適用于復(fù)雜的owl規(guī)則的推理。此外,當某一規(guī)則產(chǎn)生的新三元組重復(fù)時,yarm會存在過多的冗余計算且產(chǎn)生無用數(shù)據(jù)。汪璟玢等人提出結(jié)合rete的rdf數(shù)據(jù)分布式并行推理算法,該算法結(jié)合rdf數(shù)據(jù)本體,構(gòu)建模式三元組列表和規(guī)則標記模型;在rdfs/owl推理階段,結(jié)合mapreduce實現(xiàn)rete算法中的alpha階段和beta階段,從而實現(xiàn)rete算法的分布式推理;但該算法在連接beta網(wǎng)絡(luò)推理時需要消耗較多的內(nèi)存且進行多次迭代時效率低下,因而此算法受到集群內(nèi)存和平臺的限制。顧榮等人提出了一種基于spark的高效并行推理引擎(cichlid),結(jié)合rdd的編程模型,優(yōu)化了并行推理算法;但該算法未考慮規(guī)則能否被激活,均需要進行推理,因而造成了推理性能的浪費和傳輸?shù)娜哂唷?/p>
由于語義網(wǎng)數(shù)據(jù)的急速增長,集中式環(huán)境的內(nèi)存限制,已不適用于大規(guī)模數(shù)據(jù)的推理。目前存在分布式推理引擎雖然能夠?qū)崿F(xiàn)數(shù)據(jù)的并行推理,但是mapreduce任務(wù)啟動個數(shù)多且耗時,對于復(fù)雜的owlhorst規(guī)則無法執(zhí)行推理,且存在過多的冗余計算且產(chǎn)生無用數(shù)據(jù),以及消耗大量的內(nèi)存多次迭代效率低下,導(dǎo)致無法在數(shù)據(jù)量增大的情況下能夠高效且正確的實現(xiàn)rdfs/owl規(guī)則的推理。
需要解決的技術(shù)問題:
1.解決如何結(jié)合rdf數(shù)據(jù)本體構(gòu)建模式三元組rdd和規(guī)則標記模型,以及treat算法中alpha階段的構(gòu)建,從而能夠高效并行的完成owlhorst全部規(guī)則的推理。
2.結(jié)合提出的分布式方案提出了對應(yīng)的并行推理方案,從而滿足大規(guī)模數(shù)據(jù)的分布式并行推理的需求。
技術(shù)實現(xiàn)要素:
為了解決上述問題,本發(fā)明提供一種結(jié)合spark平臺的owlhorst規(guī)則分布式并行推理算法。本發(fā)明針對owlhorst規(guī)則,提出了dprs算法(distributedparallelreasoningalgorithmbasedonspark)。該算法在數(shù)據(jù)量動態(tài)增加的情況下能夠高效地構(gòu)建alpha網(wǎng)絡(luò),并執(zhí)行正確的推理。
為實現(xiàn)上述目的,本發(fā)明采用以下技術(shù)方案實現(xiàn):一種結(jié)合spark平臺的owlhorst規(guī)則分布式并行推理算法,其特征在于,包括以下步驟:s1:加載模式三元組集合pj_rdd、ok_rdd和rulem_linkvar_rdd并廣播;模式三元組(si,pj,ok)指的是三元組中主語、謂語和賓語的定義都在本體文件中其中,i,j,k表示具體的某個元素;模式三元組集合包含pj_rdd與ok_rdd設(shè)模式三元組(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規(guī)則中用于連接兩個前件的模式三元組項,將每一條規(guī)則的連接變量信息以<key,value>的形式存儲在rulem_link_rdd,其中key存儲該規(guī)則所有用于前件連接的模式三元組項,value存儲該規(guī)則結(jié)論部分的模式三元組項;s2:構(gòu)建規(guī)則標記模型flag_rulem并廣播;flag_rulem標識規(guī)則m的狀態(tài)是否為激活;規(guī)則不能激活時,flag_rulem=0;規(guī)則激活且為類型1時,flag_rulem=1;規(guī)則激活且為類型2時,flag_rulem=2;其中類型1表示:只包含一個前件的規(guī)則或模式三元組與實例三元組組合的規(guī)則,且只有一個實例三元組;類型2:模式三元組與實例三元組組合的規(guī)則,且有多個實例三元組;s3:對flag_rulem=1或flag_rulem=2的規(guī)則并行執(zhí)行owlhorst規(guī)則的并行推理,并輸出中間結(jié)果;s4:刪除重復(fù)三元組;s5:如果產(chǎn)生新的模式三元組數(shù)據(jù),則跳至s2,如果產(chǎn)生新的實例三元組數(shù)據(jù),則跳至s3,否則算法結(jié)束;實例三元組(si,pj,ok)指的是三元組中主語、謂語和賓語至少有一個的定義不是在本體文件中,且是具體的實例,其中,i,j,k表示具體的某個元素。
與現(xiàn)有技術(shù)相比,本發(fā)明具有以下優(yōu)點:
1.結(jié)合spark平臺構(gòu)建模式三元組集合并廣播,減少了網(wǎng)絡(luò)傳輸?shù)拈_銷。
2.設(shè)計的沖突集更新策略,加快了數(shù)據(jù)更新速度從而提升了推理的效率。
附圖說明
圖1為本發(fā)明的總體框架示意圖。
圖2為owlhorst規(guī)則結(jié)構(gòu)圖。
具體實施方式
下面結(jié)合附圖和具體實施例對本發(fā)明做進一步解釋說明。
本發(fā)明提供一種結(jié)合spark平臺的owlhorst規(guī)則分布式并行推理算法,其包括以下步驟:dprs算法主要包括以下幾個步驟:
1.加載模式三元組集合pj_rdd、ok_rdd和rulem_linkvar_rdd并廣播。
2.構(gòu)建規(guī)則標記模型flag_rulem并廣播。
3.對flag_rulem的規(guī)則并行執(zhí)行owlhorst規(guī)則的并行推理,并輸出中間結(jié)果。
4.刪除重復(fù)三元組。
5.如果產(chǎn)生新的模式三元組數(shù)據(jù),則跳至2,如果產(chǎn)生新的實例三元組數(shù)據(jù),則跳至3,否則算法結(jié)束。
本發(fā)明的整體框架圖參見圖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))設(shè)模式三元組(si,pj,ok),結(jié)合定義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規(guī)則中用于連接兩個前件的模式三元組項,根據(jù)規(guī)則描述,連接變量可以不止一個。本文將每一條規(guī)則的連接變量信息以<key,value>的形式存儲在rulem_link_rdd,其中key存儲該規(guī)則所有用于前件連接的模式三元組項,value存儲該規(guī)則結(jié)論部分的模式三元組項。
dprs算法根據(jù)連接變量的類型,對owlhorst規(guī)則進行分類。本文引用owlhorst規(guī)則時采用owl-規(guī)則編號的形式,例如owl-4表示圖2中的第4條規(guī)則。同時,給每條規(guī)則分配一個規(guī)則名稱標記,規(guī)則名稱標記即為該規(guī)則所對應(yīng)的名稱(例如,規(guī)則owl-4的規(guī)則名稱標記為owl-4)。具體的規(guī)則分類如下:
1)類型1:只包含一個前件的規(guī)則或schematriple與instancetriple組合的規(guī)則,且只有一個instancetriple,可以在map推理過程中直接輸出推理結(jié)果(圖2中規(guī)則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組合的規(guī)則,且有多個instancetriple的,需要結(jié)合map和reducebykey兩個階段推理(圖2中規(guī)則owl-1、owl-2、owl-4、owl-7、owl-15、owl-16)。
定義5.(規(guī)則前件模式標記indexmn)設(shè)cmn為規(guī)則m的第n個規(guī)則前件,indexmn表示是否存在滿足該規(guī)則前件的模式三元組,即標識規(guī)則前件cmn的schemardd是否為空。結(jié)合定義4,規(guī)則前件模式標記indexmn定義如下:
定義6.(規(guī)則標記flag_rulem)標識規(guī)則m的狀態(tài)是否為激活。結(jié)合定義6進行定義規(guī)則標記flag_rulem如下:
flag_rulem={0,1,2}公式(3-3)
其中,規(guī)則不能激活時,flag_rulem=0;規(guī)則激活且為類型1時,flag_rulem=1;規(guī)則激活且為類型2時,flag_rulem=2。
在本發(fā)明具體實施例中dprs算法過程包括以下步驟:
加載模式三元組與構(gòu)建規(guī)則標記模型
由于模式三元組的數(shù)量遠遠少于實例三元組,dprs算法將schematriple加載到schemardd中并廣播。并構(gòu)建每條規(guī)則中的模式三元組或模式三元組連接后的數(shù)據(jù)(rulem_linkvar_rdd或oj_rdd或pk_rdd)為alpha寄存器并廣播,保存對應(yīng)的schematriple。
為了盡早判斷出不可能被激活的規(guī)則,dprs算法根據(jù)owl規(guī)則構(gòu)建每一條規(guī)則內(nèi)schematriple間的關(guān)系oj_rdd或pk_rdd,并判斷schemardd中是否存在規(guī)則前件中的schematriple,生成對應(yīng)規(guī)則的標記flag_rulem,構(gòu)建所有規(guī)則的標記模型,將規(guī)則標記模型加載到flag_rulem并廣播。
通過schemardd和構(gòu)建規(guī)則標記模型能夠過濾大量instancetriple,減少map階段鍵值對的輸出,從而減少了無效的網(wǎng)絡(luò)傳輸,提高整體推理效率。
map階段
map階段主要完成對輸入的數(shù)據(jù)進行選擇過濾以及執(zhí)行類型1的推理,結(jié)果的輸出形式為鍵值對,本文提出的數(shù)據(jù)分配與過濾算法具體步驟如下.
算法map算法
輸入rdf三元組格式數(shù)據(jù)
輸出以鍵值對的形式輸出instancetriple
step1獲取廣播變量中的oj_rdd、pk_rdd和rulem_linkvar_rdd以及規(guī)則標記flag_rulem。
step2對于輸入的?(si,pj,ok)∈instancetriple判斷所有flag_rulem的值。如果值為0,則跳至step3,如果值為1,則跳至step4,否則跳至step5.
step3對(si,pj,ok)不做任何處理。
step4結(jié)合oj_rdd或pk_rdd執(zhí)行類型1的規(guī)則推理,根據(jù)規(guī)則的結(jié)論直接輸出對應(yīng)的三元組<rulem,
step5獲取對應(yīng)規(guī)則中的模式三元組alpha寄存器oj_rdd、pk_rdd或rulem_linkvar_rdd,判斷當前的實例三元組是否滿足前件連接變量的條件;滿足,則構(gòu)建對應(yīng)的鍵值對<rulem_linkvar,(si,pj,ok)>輸出;不滿足,則不做處理。
以圖2中規(guī)則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
類似于規(guī)則8,推理可以在map階段就得到規(guī)則產(chǎn)生的三元組結(jié)果,那么reduce階段就可以對規(guī)則8產(chǎn)生的三元組去重并輸出。
以圖2中規(guī)則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中規(guī)則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
如上所描述的規(guī)則9和15,以規(guī)則9為例,在map階段需要對輸入的三元組進行處理,以“rule9+連接變量”為key,如果謂語為type,那么value中標記為type且資源為連接變量;如果謂語為sameas,那么value中標記為sameas且資源為賓語。
reduce階段:連接推理
reduce階段主要完成連接推理。利用rdd的reducebykey,結(jié)合owlhorst規(guī)則,根據(jù)schemardd和alpha寄存器以及map階段的instancetriple輸出結(jié)果完成連接推理,得到推理結(jié)果.本文提出的連接推理算法具體步驟如下:
算法reduce算法
輸入鍵值對形式的instancetriple
輸出連接推理生成的三元組
step1.獲取廣播變量中的ok_rdd、pj_rdd和rulem_linkvar_rdd以及規(guī)則標記flag_rulem。
step2.獲取相同鍵對應(yīng)的迭代器;如果key為rulem,則表示為類型1,直接將value的三元組
為了更加明確reduce階段的連接推理,以圖2中規(guī)則9(type+sameas規(guī)則)為例,偽碼描述如下:
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中規(guī)則15(somevaluesfrom規(guī)則)為例,偽碼描述如下:
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
由上述的規(guī)則9和規(guī)則15的偽碼,以規(guī)則9為例,在reduce階段,根據(jù)輸入的key和values,我們通過values中的flag值來進行區(qū)分并構(gòu)建輸出的三元組。
刪除重復(fù)三元組
在執(zhí)行算法推理的過程中會產(chǎn)生大量重復(fù)的三元組數(shù)據(jù)到?jīng)_突集中,如不刪除沖突集中的重復(fù)三元組,則更新alpha寄存器時將會產(chǎn)生重復(fù)三元組數(shù)據(jù),浪費系統(tǒng)資源,降低推理效率。如果每次推理后都能夠及時刪除沖突集中的重復(fù)三元組,那將會減少很大的網(wǎng)絡(luò)傳輸開銷。本文借助rdd的distinct和subtract完成刪除重復(fù)三元組算法。
通過上述的刪除重復(fù)三元組后,沖突集中的模式三元組分別更新到對應(yīng)的alpha寄存器中,實例三元組則合并到實例文件中。
算法復(fù)雜性分析是衡量一個算法效率的重要指標,dprs算法的復(fù)雜性分析與集中式算法有著不同的方式。在分析dprs算法的復(fù)雜性時,可以將其分解為map和reduce兩個階段進行算法復(fù)雜性分析。設(shè)實驗數(shù)據(jù)集中包含n個三元組,其中含有n個模式三元組,且mapreduce過程中map任務(wù)的并行數(shù)設(shè)為k,reduce階段接收shuffle傳輸?shù)膶嵗M數(shù)設(shè)為m,reduce任務(wù)的并行數(shù)設(shè)為t。dprs算法在map階段對于輸入的每個三元組,都對pj_rdd、ok_rdd和flag_rulem掃描一次,進而判斷該三元組能否參與某些規(guī)則推理。如果能,結(jié)合其他數(shù)據(jù)進行規(guī)則推理,則以規(guī)則名稱拼接連接變量為key,中間結(jié)果為value作為map的輸出。因此,map階段的時間復(fù)雜性為:o(n*n/k)。由于圖2owlhorst規(guī)則中,規(guī)則1、2、3、4、15、16都含有兩個實例三元組前件,將上述規(guī)則稱作多實例變量規(guī)則,多實例變量規(guī)則的reduce階段則需要遍歷兩次輸入的實例三元組與模式三元組連接,才能得到推理結(jié)果。因此在reduce階段的時間復(fù)雜性分為單變量和多變量進行分析:reduce階段多變量的時間復(fù)雜性為:o(n*m/t)。由于n的數(shù)目非常少,可以認為其量級為常數(shù)。
以上是本發(fā)明的較佳實施例,凡依本發(fā)明技術(shù)方案所作的改變,所產(chǎn)生的功能作用未超出本發(fā)明技術(shù)方案的范圍時,均屬于本發(fā)明的保護范圍。