亚洲成年人黄色一级片,日本香港三级亚洲三级,黄色成人小视频,国产青草视频,国产一区二区久久精品,91在线免费公开视频,成年轻人网站色直接看

用于存儲(chǔ)編碼三元組的數(shù)據(jù)庫控制器、方法及系統(tǒng)與流程

文檔序號(hào):12702089閱讀:309來源:國知局
用于存儲(chǔ)編碼三元組的數(shù)據(jù)庫控制器、方法及系統(tǒng)與流程
本發(fā)明涉及數(shù)據(jù)存儲(chǔ)領(lǐng)域。具體地,本發(fā)明的實(shí)施例涉及用于描述圖形數(shù)據(jù)的三元組在分布式存儲(chǔ)環(huán)境內(nèi)的存儲(chǔ)。

背景技術(shù):
關(guān)系數(shù)據(jù)庫按照行與列來存儲(chǔ)數(shù)據(jù)。行與列組成了需要在存儲(chǔ)數(shù)據(jù)之前被限定的表。對(duì)這些表以及對(duì)包含在這些表上的數(shù)據(jù)之間的關(guān)系的限定被稱為模式。關(guān)系數(shù)據(jù)庫使用固定的模式。通過以節(jié)點(diǎn)和弧的形式存儲(chǔ)數(shù)據(jù),圖形數(shù)據(jù)庫表現(xiàn)出對(duì)關(guān)系數(shù)據(jù)庫的顯著擴(kuò)展,其中節(jié)點(diǎn)表示實(shí)體或?qū)嵗?,弧表示任意兩個(gè)節(jié)點(diǎn)之間的某種類型的關(guān)系。在無向圖中,認(rèn)為從節(jié)點(diǎn)A至節(jié)點(diǎn)B的弧與從節(jié)點(diǎn)B至節(jié)點(diǎn)A的弧相同。而在有向圖中,這兩個(gè)方向被處理為不同的弧。圖形數(shù)據(jù)庫用于各種不同的應(yīng)用,這些應(yīng)用一般可以分為兩種主要類型。第一種類型由具有較大的類描述集的復(fù)雜的基于知識(shí)的系統(tǒng)組成(稱為“基于知識(shí)的應(yīng)用”),如智能決策支持及自學(xué)習(xí)。第二種類型包括涉及對(duì)交易數(shù)據(jù)進(jìn)行圖形搜索的應(yīng)用(稱為“交易數(shù)據(jù)應(yīng)用”),如社交數(shù)據(jù)及商業(yè)智能。很多應(yīng)用可以同時(shí)表現(xiàn)出這兩個(gè)類型。但是,大多數(shù)應(yīng)用可以主要地表征為基于知識(shí)的應(yīng)用或交易數(shù)據(jù)應(yīng)用。圖形數(shù)據(jù)庫可以用于維護(hù)能夠?qū)⒋罅康慕Y(jié)構(gòu)化或非結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)在各種字段中的大型“語義網(wǎng)絡(luò)”。語義網(wǎng)絡(luò)以知識(shí)表示的形式被使用,并且是由表示概念的節(jié)點(diǎn)和表示這些概念之間的語義關(guān)系的弧組成的有向圖。有多種類型的圖形表示。圖形數(shù)據(jù)可以作為多維數(shù)組或作為鏈接至其他符號(hào)的符號(hào)來存儲(chǔ)在存儲(chǔ)器中。另一種形式的圖形表示是“元組”的使用,“元組”是由每個(gè)都具有特定類型的對(duì)象組成的有限序列或有序列表。已知包含n個(gè)對(duì)象的元組為“n元組”,其中n可以是大于0的任意非負(fù)整數(shù)。通常將長度為2的元組(2-元組)稱為對(duì)(pair),將3-元組稱為三元組,將4-元組稱為四元組等等。資源描述框架(RDF)是作為語義網(wǎng)絡(luò)標(biāo)準(zhǔn)的用于概念描述或信息建模的一般方法。當(dāng)今可用的RDF數(shù)據(jù)量在不斷地增長并且已經(jīng)不可能將其存儲(chǔ)在單個(gè)服務(wù)器中。為了能夠存儲(chǔ)和搜索大量的數(shù)據(jù),必須在多個(gè)服務(wù)器中對(duì)數(shù)據(jù)進(jìn)行維護(hù)。必須使用針對(duì)分布式系統(tǒng)專門定制的算法和數(shù)據(jù)結(jié)構(gòu)以協(xié)同的方式來完成數(shù)據(jù)的添加、刪除和查詢。期望以使得能夠進(jìn)行計(jì)算效率高的數(shù)據(jù)查詢、維護(hù)和操作的方式來存儲(chǔ)圖形數(shù)據(jù)。如同所有的計(jì)算硬件一樣,也總是存在存儲(chǔ)數(shù)據(jù)的存儲(chǔ)節(jié)點(diǎn)(如服務(wù)器)會(huì)出現(xiàn)故障的某種風(fēng)險(xiǎn)。因此,已知在本領(lǐng)域中提供存儲(chǔ)數(shù)據(jù)拷貝的“冗余”存儲(chǔ)節(jié)點(diǎn)以防存儲(chǔ)節(jié)點(diǎn)出現(xiàn)故障。但是,從基礎(chǔ)設(shè)施的提供、維護(hù)及運(yùn)行成本的方面來講,提供這樣的冗余存儲(chǔ)節(jié)點(diǎn)會(huì)很昂貴。隨著存儲(chǔ)節(jié)點(diǎn)的可靠性的增加,從單次使用成本方面來講,單純?yōu)榱嗽诹硪粋€(gè)節(jié)點(diǎn)出現(xiàn)故障時(shí)能夠進(jìn)行數(shù)據(jù)恢復(fù)而提供冗余存儲(chǔ)節(jié)點(diǎn)的價(jià)值在不斷減小。

技術(shù)實(shí)現(xiàn)要素:
本發(fā)明的實(shí)施例提供了用于存儲(chǔ)被編碼為三元組的圖形數(shù)據(jù)的數(shù)據(jù)庫的數(shù)據(jù)庫控制器,每個(gè)三元組包括主語、謂語和賓語,并且每個(gè)三元組存儲(chǔ)在數(shù)據(jù)項(xiàng)集合中的數(shù)據(jù)項(xiàng)內(nèi),所述數(shù)據(jù)項(xiàng)集合是根據(jù)存儲(chǔ)在數(shù)據(jù)項(xiàng)內(nèi)的三元組來排序的。每個(gè)數(shù)據(jù)項(xiàng)存儲(chǔ)在分布于網(wǎng)絡(luò)中的多個(gè)存儲(chǔ)節(jié)點(diǎn)中的存儲(chǔ)節(jié)點(diǎn)中。該數(shù)據(jù)庫控制器包括:存儲(chǔ)請(qǐng)求接收器,其被配置成接收在該數(shù)據(jù)庫中存儲(chǔ)三元組的請(qǐng)求;以及數(shù)據(jù)項(xiàng)生成模塊,其被配置成生成兩個(gè)或更多個(gè)數(shù)據(jù)項(xiàng),每個(gè)數(shù)據(jù)項(xiàng)具有三元組的以下不同版本:第一版本,其中在數(shù)據(jù)項(xiàng)中主語在謂語和賓語之前;第二版本,其中在數(shù)據(jù)項(xiàng)中謂語在主語和賓語之前;以及第三版本,其中在數(shù)據(jù)項(xiàng)中賓語在主語和謂語之前。數(shù)據(jù)庫控制器還包括:指令分配器,其被配置成針對(duì)所述兩個(gè)或更多個(gè)數(shù)據(jù)項(xiàng)中的每一個(gè)數(shù)據(jù)項(xiàng),從所述多個(gè)存儲(chǔ)節(jié)點(diǎn)中選擇存儲(chǔ)節(jié)點(diǎn)以指示存儲(chǔ)該數(shù)據(jù)項(xiàng),該選擇是依靠該數(shù)據(jù)項(xiàng)在所述經(jīng)排序的集合中的位置做出的。所述指令分配器包括冗余模塊,所述冗余模塊被配置成確保指示所述多個(gè)存儲(chǔ)節(jié)點(diǎn)中的至少兩個(gè)不同存儲(chǔ)節(jié)點(diǎn)存儲(chǔ)包括三元組的版本的數(shù)據(jù)項(xiàng)。有利地,本發(fā)明的實(shí)施例提供了容錯(cuò)分布式存儲(chǔ)系統(tǒng),其利用排序來存儲(chǔ)和查詢被存儲(chǔ)為三元組的圖形數(shù)據(jù)。實(shí)施例提供或?qū)崿F(xiàn)了以下用于存儲(chǔ)數(shù)據(jù)的技術(shù):所述技術(shù)使得在對(duì)所存儲(chǔ)的數(shù)據(jù)的范圍查詢的執(zhí)行上以及當(dāng)存儲(chǔ)節(jié)點(diǎn)出現(xiàn)故障時(shí)對(duì)所存儲(chǔ)的數(shù)據(jù)的恢復(fù)上都具有很高的效率。為了執(zhí)行有效的范圍查詢(rangequery),按照至少兩種(例如,三種)不同的順序,例如,SPO、POS和OSP(其中貫穿本文獻(xiàn),可以用P表示謂語,用S表示主語,以及用O表示賓語)中的兩種(或三種),來存儲(chǔ)三元組。同一三元組的兩個(gè)或更多個(gè)版本中的首項(xiàng)元素的變化是頭等重要的。雖然不是必需的,但也期望剩余兩個(gè)元素的位置的變化。所述冗余模塊或等同的功能確保出于有效的范圍查詢目的而提供的三元組的至少兩個(gè)不同版本還可以充當(dāng)副本,以便當(dāng)存儲(chǔ)節(jié)點(diǎn)出現(xiàn)故障時(shí)提供容錯(cuò)性??傊景l(fā)明的實(shí)施例提供了以下數(shù)據(jù)庫,該數(shù)據(jù)庫將圖形數(shù)據(jù)存儲(chǔ)為按兩個(gè)或更多個(gè)版本復(fù)制的編碼三元組,其中每個(gè)版本(以其被存儲(chǔ)的形式)將該三元組的不同元素作為首項(xiàng)元素以提供有效的范圍查詢;并且該數(shù)據(jù)庫還使用那些復(fù)制的版本來提供數(shù)據(jù)冗余以進(jìn)行丟失數(shù)據(jù)的再生。在本發(fā)明的實(shí)施例中,每個(gè)三元組(如RDF三元組)被存儲(chǔ)為數(shù)據(jù)項(xiàng)或數(shù)據(jù)項(xiàng)的一部分,例如存儲(chǔ)為簡單的字符串對(duì)象,并且在圖形G中是唯一的。所以關(guān)于G的所有信息都保存在數(shù)據(jù)項(xiàng)中。三元組作為數(shù)據(jù)項(xiàng)(按照數(shù)據(jù)項(xiàng)來編碼)被存儲(chǔ)在有序數(shù)據(jù)集合中,該有序數(shù)據(jù)集合分布在分布式網(wǎng)絡(luò)環(huán)境(如對(duì)等網(wǎng)絡(luò)環(huán)境)中的網(wǎng)絡(luò)存儲(chǔ)節(jié)點(diǎn)中的處理中。運(yùn)行在每個(gè)存儲(chǔ)節(jié)點(diǎn)上的處理有利于存儲(chǔ)數(shù)據(jù)項(xiàng)的有序子集。該處理和運(yùn)行該處理的網(wǎng)絡(luò)存儲(chǔ)節(jié)點(diǎn)在本文獻(xiàn)中或多或少可互換地被引用,從上下文中可以清楚地看出何時(shí)專門地意指前者或后者。本發(fā)明的實(shí)施例使得能夠?qū)?shù)據(jù)運(yùn)行有效的查詢過程。例如,對(duì)dmin與dmax(當(dāng)按次序放置時(shí))之間的數(shù)據(jù)項(xiàng)范圍進(jìn)行檢索的過程執(zhí)行以下步驟:客戶端應(yīng)用程序向處理之一A發(fā)送請(qǐng)求;A執(zhí)行映射功能,獲取該處理的包含所請(qǐng)求的數(shù)據(jù)范圍的一個(gè)子集的各個(gè)存儲(chǔ)節(jié)點(diǎn)ID(或標(biāo)記)(在示例性情況下,數(shù)據(jù)項(xiàng)均勻地分布并且每個(gè)處理負(fù)責(zé)存儲(chǔ)大量的數(shù)據(jù)項(xiàng))。例如,考慮客戶端應(yīng)用程序請(qǐng)求的數(shù)據(jù)項(xiàng)存儲(chǔ)在處理A和處理B中;A向自身和向B廣播對(duì)所請(qǐng)求的數(shù)據(jù)項(xiàng)的每個(gè)子集進(jìn)行檢索的請(qǐng)求;每個(gè)處理以所請(qǐng)求的數(shù)據(jù)項(xiàng)來回復(fù)A;A收集結(jié)果(保持它們的順序)并且回復(fù)客戶端應(yīng)用程序。從上面的示例可以看出,本發(fā)明的實(shí)施例能夠更有效地查詢數(shù)據(jù)。此外,如在使用常規(guī)技術(shù)的情況下一樣,不需要按請(qǐng)求中的每個(gè)數(shù)據(jù)項(xiàng)來重復(fù)步驟。本發(fā)明的實(shí)施例中的圖形數(shù)據(jù)可以是有向圖形數(shù)據(jù),所以從第一圖形節(jié)點(diǎn)至第二圖形節(jié)點(diǎn)的弧不被認(rèn)為是與從第二圖形節(jié)點(diǎn)至第一圖形節(jié)點(diǎn)的弧相同。語義網(wǎng)絡(luò)形成為知識(shí)或信息的表示,其中圖形節(jié)點(diǎn)表示概念如實(shí)體或?qū)嵗”硎靖拍钪g的語義關(guān)系。在本發(fā)明的實(shí)施例中,將圖形數(shù)據(jù)編碼為三元組,所述三元組是三個(gè)對(duì)象的有限序列或有序列表,每個(gè)對(duì)象都具有特定類型。可選地,三元組可以是資源描述框架(RDF)三元組。貫穿本文獻(xiàn),應(yīng)當(dāng)理解,在引用“RDF三元組”的地方,它是三元組的示例性形式,遵守RDF標(biāo)準(zhǔn)。此外,對(duì)“三元組”的引用包括正在討論的三元組是RDF三元組的可能性。類似地,在本文獻(xiàn)其他地方所討論的RDF處理器是用于API包裝器與所存儲(chǔ)的數(shù)據(jù)項(xiàng)之間的交互的處理器的示例。資源描述框架(RDF)是作為語義網(wǎng)絡(luò)的標(biāo)準(zhǔn)的用于概念描述或信息建模的一般方法。對(duì)語義網(wǎng)絡(luò)中的信息建模進(jìn)行的標(biāo)準(zhǔn)化允許運(yùn)行在共用語義網(wǎng)絡(luò)上的應(yīng)用程序之間的互操作性。RDF通過提供作為用于描述RDF中的詞匯表的語言的RDF模式(RDFS),來維護(hù)具有明確的正式語義的詞匯表??蛇x地,三元組的元素中的一個(gè)或更多個(gè)元素中的每一個(gè)元素(元素是謂語、賓語或主語)是統(tǒng)一資源標(biāo)識(shí)符(URI)。RDF和其他三元組格式是以以下概念為前提的:使用如URI等網(wǎng)絡(luò)標(biāo)識(shí)符來標(biāo)識(shí)事物(即,對(duì)象、資源或?qū)嵗?,并且從簡單的屬性和屬性值方面來描述那些所?biāo)識(shí)的“事物”。從三元組方面來講,主語可以是用于標(biāo)識(shí)用于描述實(shí)體的網(wǎng)絡(luò)資源的URI,謂語可以是用于標(biāo)識(shí)屬性的類型(例如顏色)的URI,并且賓語可以是用于指示具有特定類型屬性的具體實(shí)例的URI,所述特定類型屬性在其網(wǎng)絡(luò)資源具體化方面歸屬于所述實(shí)體。URI的使用使得三元組能夠?qū)㈥P(guān)于資源的簡單語句表示為由表示資源以及它們各自的屬性和值的節(jié)點(diǎn)和弧組成的圖形??梢允褂肧PARQL協(xié)議和RDF查詢語言(SPARQL)來查詢RDF圖形。這由萬維網(wǎng)聯(lián)盟的RDF數(shù)據(jù)存取工作組(DAWG)標(biāo)準(zhǔn)化,并且被認(rèn)為是一種關(guān)鍵的語義網(wǎng)絡(luò)技術(shù)。SPARQL允許由三元組模式、與運(yùn)算、或運(yùn)算和可選模式組成的查詢。三元組通過將圖形數(shù)據(jù)表征為多個(gè)主謂賓表達(dá)式來進(jìn)行圖形數(shù)據(jù)的編碼。在該情況下,主語和賓語是圖形數(shù)據(jù)的圖形節(jié)點(diǎn),如實(shí)體、對(duì)象、實(shí)例或概念,并且謂語是主語與賓語之間的關(guān)系的表示。謂語通過提供與賓語的特定類型的聯(lián)系來斷言與主語有關(guān)的事情。例如,主語可以指示網(wǎng)絡(luò)資源(例如,通過URI),謂語指示資源的特定特性、特征或方面,賓語指定該特性、特征或方面的實(shí)例。換言之,三元組語句的集合固有地表示有向圖形數(shù)據(jù)。RDF標(biāo)準(zhǔn)提供這樣的三元組的正式化結(jié)構(gòu)。存儲(chǔ)節(jié)點(diǎn)的分布式網(wǎng)絡(luò)包括由彼此進(jìn)行通信的不止一個(gè)不同存儲(chǔ)單元組成的系統(tǒng)。示例性通信范例是對(duì)等型(P2P),因此存儲(chǔ)節(jié)點(diǎn)的分布式網(wǎng)絡(luò)可以是存儲(chǔ)節(jié)點(diǎn)的對(duì)等網(wǎng)絡(luò)。P2P是在對(duì)等體(peer)之間劃分任務(wù)或工作量的分布式結(jié)構(gòu)。對(duì)等體(各個(gè)存儲(chǔ)節(jié)點(diǎn)或處理)是應(yīng)用中等同地被特許的同等參與者。每個(gè)對(duì)等體被配置成使得其資源(如處理能力、磁盤存儲(chǔ)器或網(wǎng)絡(luò)帶寬)的一部分直接可用于其他網(wǎng)絡(luò)參與者,而不需要服務(wù)器或穩(wěn)定主機(jī)的中心協(xié)調(diào)。相比服務(wù)器提供以及客戶端消耗的傳統(tǒng)的客戶端-服務(wù)器模型,對(duì)等體可以認(rèn)為是資源的提供者和消耗者兩者。有利地,P2P系統(tǒng)能夠以對(duì)數(shù)通信成本來維護(hù)交換消息的大批存儲(chǔ)節(jié)點(diǎn)。在實(shí)施例中,例如在三元組的賓語很復(fù)雜的那些實(shí)施例中,存儲(chǔ)在有序數(shù)據(jù)項(xiàng)中的賓語可以是針對(duì)該賓語生成的通用唯一ID(UUID)。該選項(xiàng)在用于以下實(shí)現(xiàn)場景中的實(shí)施例中是很有用的,在所述實(shí)現(xiàn)場景中賓語很大,因此它們的大小降低了范圍查詢過程的效率。在本發(fā)明的實(shí)施例中,三元組存儲(chǔ)在有序數(shù)據(jù)項(xiàng)中,所以返回?cái)?shù)據(jù)項(xiàng)的查詢使得三元組的表示能夠被檢索。如果同一三元組的不同版本存儲(chǔ)在不止一個(gè)不同存儲(chǔ)節(jié)點(diǎn)上,則出于有效的范圍查詢目的對(duì)上述不同版本進(jìn)行的存儲(chǔ)還可以有益于數(shù)據(jù)恢復(fù)。因此,本發(fā)明的實(shí)施例中冗余模塊的提供消除了以下需要:復(fù)制每個(gè)數(shù)據(jù)項(xiàng)以提供數(shù)據(jù)冗余,使得能夠當(dāng)存儲(chǔ)節(jié)點(diǎn)出現(xiàn)故障時(shí)進(jìn)行恢復(fù)??蛇x地,數(shù)據(jù)項(xiàng)生成模塊被配置成生成三個(gè)數(shù)據(jù)項(xiàng),每個(gè)數(shù)據(jù)項(xiàng)具有三元組的第一版本、第二版本和第三版本中的不同版本。有利地,使數(shù)據(jù)項(xiàng)具有三元組的三個(gè)不同版本使得能夠通過三元組的三個(gè)元素中的任一元素來進(jìn)行有效的范圍查詢。也就是說,可以指定主語、賓語或謂語的范圍,并且以有效的方式返回存儲(chǔ)包括在該范圍內(nèi)的三元組的數(shù)據(jù)項(xiàng)。可以將冗余模塊配置成確保指示至少兩個(gè)不同存儲(chǔ)節(jié)點(diǎn)中的每一個(gè)節(jié)點(diǎn)存儲(chǔ)包括該三元組的不同版本的數(shù)據(jù)項(xiàng)。例如,在所述多個(gè)存儲(chǔ)節(jié)點(diǎn)中有三個(gè)或更多個(gè)存儲(chǔ)節(jié)點(diǎn)的實(shí)施例中,可以將冗余模塊配置成確保指示所述多個(gè)存儲(chǔ)節(jié)點(diǎn)中的三個(gè)不同存儲(chǔ)節(jié)點(diǎn)中的每一個(gè)存儲(chǔ)節(jié)點(diǎn)存儲(chǔ)包括該三元組的不同版本的數(shù)據(jù)項(xiàng)。在該特定的實(shí)現(xiàn)中,存儲(chǔ)三元組的三個(gè)不同版本的數(shù)據(jù)項(xiàng)自身分布在網(wǎng)絡(luò)中的三個(gè)不同的存儲(chǔ)節(jié)點(diǎn)上(每存儲(chǔ)節(jié)點(diǎn)分布一個(gè)數(shù)據(jù)項(xiàng))。這是有利的,這是因?yàn)閼?yīng)用三元組的三個(gè)不同版本的優(yōu)點(diǎn),另外,如果存儲(chǔ)那些版本中的任何一個(gè)的存儲(chǔ)節(jié)點(diǎn)出現(xiàn)故障,則有兩個(gè)其他存儲(chǔ)節(jié)點(diǎn)還存儲(chǔ)著該三元組的版本,所以存儲(chǔ)在故障存儲(chǔ)節(jié)點(diǎn)上的版本可以以有效的方式重新生成。可替代地,可以將冗余模塊配置成確保三個(gè)不同存儲(chǔ)節(jié)點(diǎn)中的每個(gè)存儲(chǔ)節(jié)點(diǎn)都存儲(chǔ)三元組的版本,但是它們不必是不同的版本。例如,如果指令分配器所執(zhí)行的映射過程導(dǎo)致同一三元組的兩個(gè)不同版本在一個(gè)存儲(chǔ)節(jié)點(diǎn)上而另一個(gè)不同版本在另一個(gè)節(jié)點(diǎn)上,則冗余模塊可以簡單地生成該三元組的特定版本(例如,SPO)的副本以存儲(chǔ)在第三個(gè)存儲(chǔ)節(jié)點(diǎn)上,而不管在所述一個(gè)存儲(chǔ)節(jié)點(diǎn)和所述另一個(gè)存儲(chǔ)節(jié)點(diǎn)中的每一個(gè)存儲(chǔ)節(jié)點(diǎn)上存儲(chǔ)的是該三元組的哪一個(gè)現(xiàn)有版本。在本發(fā)明的實(shí)施例中,可以按照表示三元組的元素的字符串對(duì)象的詞典順序來對(duì)數(shù)據(jù)項(xiàng)進(jìn)行排序,字符串對(duì)象是數(shù)據(jù)項(xiàng)或包括在數(shù)據(jù)項(xiàng)中。例如,詞典順序可以是字母順序。在本發(fā)明的實(shí)施例的實(shí)現(xiàn)中,可以期望通過選定數(shù)據(jù)項(xiàng)的主語、謂語或賓語(或賓語的UUID)來查詢數(shù)據(jù)項(xiàng)的集合。為了有效地返回這樣的查詢的結(jié)果,在數(shù)據(jù)項(xiàng)中將三元組的兩個(gè)或更多個(gè)元素存儲(chǔ)為第一元素是有利的。排序的數(shù)據(jù)項(xiàng)使得能夠做出數(shù)據(jù)項(xiàng)之間的比較并且執(zhí)行范圍查詢。D1與D2(其中D1<D2)之間的范圍查詢是以下查詢:該查詢根據(jù)數(shù)據(jù)項(xiàng)的某種預(yù)定排序標(biāo)準(zhǔn)來返回包含在大于D1而小于D2的數(shù)據(jù)項(xiàng)的經(jīng)排序的集合中的數(shù)據(jù)項(xiàng)。當(dāng)然,該數(shù)據(jù)項(xiàng)集合被劃分到節(jié)點(diǎn)的分布式網(wǎng)絡(luò)的節(jié)點(diǎn)(其中節(jié)點(diǎn)是如服務(wù)器或運(yùn)行在那些服務(wù)器上的處理等資源)中。在示例性實(shí)施例中,由如代表應(yīng)用程序的RDF處理器等處理器通過向節(jié)點(diǎn)之一發(fā)送查詢來發(fā)起范圍查詢。節(jié)點(diǎn)被配置成例如通過對(duì)D1和D2應(yīng)用數(shù)據(jù)項(xiàng)的邏輯表示并且對(duì)這些節(jié)點(diǎn)執(zhí)行子范圍查詢來計(jì)算哪些其他節(jié)點(diǎn)具有查詢所尋找的數(shù)據(jù)項(xiàng)。節(jié)點(diǎn)則被配置成收集結(jié)果(保持?jǐn)?shù)據(jù)項(xiàng)的順序)并且將結(jié)果返回給發(fā)起該查詢的處理器。從三元組在數(shù)據(jù)項(xiàng)內(nèi)的存儲(chǔ)形式來講,每個(gè)數(shù)據(jù)項(xiàng)可以包括字符串對(duì)象,所述字符串對(duì)象包括對(duì)應(yīng)三元組的主語、謂語和賓語。有利地,字符串對(duì)象是普遍可讀的并且建立了用于其比較的例程,并且存在其他處理需求。數(shù)據(jù)庫自身和訪問數(shù)據(jù)庫的應(yīng)用程序可以具有良好建立了的例程以用于處理字符串對(duì)象。此外,字符串對(duì)象易于快速搜索和比較(順序)。在這樣的實(shí)施例中,可以根據(jù)字符串對(duì)象的字母順序比較來對(duì)數(shù)據(jù)項(xiàng)進(jìn)行排序。有利地,如搜索、測距和其他比較功能等數(shù)據(jù)庫功能是可用的,這些數(shù)據(jù)庫功能在比較字符串?dāng)?shù)據(jù)對(duì)象的字母順序內(nèi)容的計(jì)算效率方面被優(yōu)化。因此,以此方式對(duì)數(shù)據(jù)項(xiàng)進(jìn)行排序的實(shí)施例在計(jì)算效率方面特別有效。在這樣的實(shí)施例中,可以根據(jù)數(shù)據(jù)項(xiàng)的字符串對(duì)象的字母順序來對(duì)數(shù)據(jù)項(xiàng)進(jìn)行排序。數(shù)據(jù)項(xiàng)可以僅僅是字符串對(duì)象,或它們可以包括其他對(duì)象或數(shù)據(jù)。字符串是字母數(shù)字符號(hào)的序列。可選地,可以將指令分配器配置成通過使用有序哈希表來從所述多個(gè)存儲(chǔ)節(jié)點(diǎn)中選擇存儲(chǔ)節(jié)點(diǎn)以指示存儲(chǔ)數(shù)據(jù)項(xiàng)。有利地,哈希表提供了將數(shù)據(jù)項(xiàng)映射(其中映射從含義上等同于從所述多個(gè)存儲(chǔ)節(jié)點(diǎn)中選擇存儲(chǔ)節(jié)點(diǎn)以指示存儲(chǔ)數(shù)據(jù)項(xiàng))至節(jié)點(diǎn)的計(jì)算效率高的方法。有序哈希表使用哈希函數(shù)來基于數(shù)據(jù)項(xiàng)的內(nèi)容將數(shù)據(jù)項(xiàng)分配至節(jié)點(diǎn)。在鍵值系統(tǒng)中,哈希表或哈希圖是使用哈希函數(shù)將標(biāo)識(shí)已知為鍵的值映射至它們相關(guān)聯(lián)的值的數(shù)據(jù)結(jié)構(gòu)。因此,可以說哈希表實(shí)現(xiàn)了關(guān)聯(lián)數(shù)組。哈希函數(shù)用于將鍵變換成其中對(duì)應(yīng)的值要被尋找的數(shù)組元素(存儲(chǔ)位置,也稱為縫或槽)的索引(哈希)??蛇x地,有序哈希表可以使用一致性哈希函數(shù)。一致性哈希處理規(guī)定了需要響應(yīng)于存儲(chǔ)數(shù)據(jù)項(xiàng)的存儲(chǔ)節(jié)點(diǎn)的數(shù)量變化來重新映射的有序數(shù)據(jù)項(xiàng)的數(shù)量。例如,考慮D個(gè)數(shù)據(jù)項(xiàng)分布在對(duì)等系統(tǒng)中的n-1個(gè)“對(duì)等體”中的系統(tǒng)。如果新的對(duì)等體加入到該系統(tǒng)中,則僅需要重新映射D/n個(gè)鍵。在一致性哈希處理中,如果有新的對(duì)等體添加至該系統(tǒng)中,則該對(duì)等體從其他對(duì)等體取得所存儲(chǔ)數(shù)據(jù)項(xiàng)的近似相等的份額,并且當(dāng)移除對(duì)等體時(shí),其數(shù)據(jù)項(xiàng)在剩余的對(duì)等體之間分配。由指令分配器用來選擇存儲(chǔ)節(jié)點(diǎn)以指示存儲(chǔ)具體數(shù)據(jù)項(xiàng)的技術(shù),無論是哈希函數(shù)還是其他技術(shù),該技術(shù)都應(yīng)該是確定性的。也就是說,從多個(gè)存儲(chǔ)節(jié)點(diǎn)中選擇存儲(chǔ)節(jié)點(diǎn)以指示存儲(chǔ)數(shù)據(jù)項(xiàng)是確定性選擇。因此,該選擇的結(jié)果可以由網(wǎng)絡(luò)中的另一個(gè)數(shù)據(jù)庫控制器或在后后續(xù)操作中由同一數(shù)據(jù)庫控制器來確定。在具有不止一個(gè)數(shù)據(jù)庫控制器的實(shí)施例中,每個(gè)數(shù)據(jù)庫控制器使用相同的確定性選擇過程由,所以在給出相同的輸入變量的情況下,會(huì)產(chǎn)生相同的結(jié)果。關(guān)于KVS布置的值中的附加信息或是關(guān)于以三元組存儲(chǔ)在數(shù)據(jù)項(xiàng)中的數(shù)據(jù),在本發(fā)明的實(shí)施例中,存儲(chǔ)同一三元組的不同版本的兩個(gè)或更多個(gè)數(shù)據(jù)項(xiàng)中的每一個(gè)數(shù)據(jù)項(xiàng)還可以包括用于標(biāo)識(shí)存有該三元組的不同版本的其他數(shù)據(jù)項(xiàng)中的每一個(gè)數(shù)據(jù)項(xiàng)所存儲(chǔ)于的存儲(chǔ)節(jié)點(diǎn)的數(shù)據(jù)。有利地,包括標(biāo)識(shí)存有同一三元組的不同版本的其他數(shù)據(jù)項(xiàng)中的每一個(gè)數(shù)據(jù)項(xiàng)所存儲(chǔ)于的存儲(chǔ)節(jié)點(diǎn)的數(shù)據(jù)使得存儲(chǔ)在還沒有出現(xiàn)故障的節(jié)點(diǎn)上的數(shù)據(jù)項(xiàng)能夠用于識(shí)別存儲(chǔ)在故障節(jié)點(diǎn)上的數(shù)據(jù)項(xiàng),因此需要被恢復(fù)或重新生成。存儲(chǔ)節(jié)點(diǎn)可由ID來標(biāo)識(shí),并且可以對(duì)ID進(jìn)行重新排序,以使得當(dāng)數(shù)據(jù)項(xiàng)分布在存儲(chǔ)節(jié)點(diǎn)的網(wǎng)絡(luò)中并且被存儲(chǔ)時(shí),數(shù)據(jù)項(xiàng)的經(jīng)排序的集合的順序被保持。例如,可以通過對(duì)存儲(chǔ)節(jié)點(diǎn)在該網(wǎng)絡(luò)中的地址應(yīng)用哈希函數(shù)來獲得ID。用于實(shí)施本發(fā)明的數(shù)據(jù)庫控制器還可以包括故障檢測器,該故障檢測器被配置成檢測存儲(chǔ)節(jié)點(diǎn)的分布式網(wǎng)絡(luò)中的存儲(chǔ)節(jié)點(diǎn)何時(shí)出現(xiàn)了故障并且識(shí)別存儲(chǔ)在故障存儲(chǔ)節(jié)點(diǎn)上的數(shù)據(jù)項(xiàng)項(xiàng)內(nèi)的三元組,其中數(shù)據(jù)庫控制器被配置成針對(duì)每個(gè)所識(shí)別的三元組在數(shù)據(jù)項(xiàng)生成模塊處執(zhí)行生成處理以及在指令分配器處執(zhí)行選擇處理,其中故障節(jié)點(diǎn)被從在其中選擇存儲(chǔ)節(jié)點(diǎn)的多個(gè)存儲(chǔ)節(jié)點(diǎn)中排除。所述指令分配器被配置成指示所選擇的存儲(chǔ)節(jié)點(diǎn)存儲(chǔ)具有所識(shí)別的三元組的版本的數(shù)據(jù)項(xiàng),并且被配置成指示將現(xiàn)在沒有被選擇的存儲(chǔ)節(jié)點(diǎn)在故障之前存儲(chǔ)的具有所識(shí)別的三元組的版本的任何數(shù)據(jù)項(xiàng)移除。有利地,故障檢測器和數(shù)據(jù)庫控制器的關(guān)聯(lián)功能在存儲(chǔ)節(jié)點(diǎn)故障的情況下提供有效的數(shù)據(jù)恢復(fù)處理,同時(shí)最小化與單純出于數(shù)據(jù)恢復(fù)目的而存儲(chǔ)拷貝有關(guān)的系統(tǒng)成本??蛇x地,在實(shí)施本發(fā)明的數(shù)據(jù)庫控制器中,冗余模塊可以被配置成:在針對(duì)所述兩個(gè)或更多個(gè)數(shù)據(jù)項(xiàng)而進(jìn)行存儲(chǔ)節(jié)點(diǎn)選擇之后,獲得所選的用于存儲(chǔ)所述兩個(gè)或更多個(gè)數(shù)據(jù)項(xiàng)的存儲(chǔ)節(jié)點(diǎn)中的不同存儲(chǔ)節(jié)點(diǎn)的數(shù)量的計(jì)數(shù),并且如果該計(jì)數(shù)小于冗余模塊被配置成確保其被指示存儲(chǔ)包括該三元組的版本的數(shù)據(jù)項(xiàng)的不同存儲(chǔ)節(jié)點(diǎn)的數(shù)量,則將冗余模塊配置成指示所述多個(gè)存儲(chǔ)節(jié)點(diǎn)中的特定數(shù)量的附加存儲(chǔ)節(jié)點(diǎn)存儲(chǔ)包括該三元組的版本的數(shù)據(jù)項(xiàng),該特定數(shù)量等于所述計(jì)數(shù)與冗余模塊被配置成確保其被指示存儲(chǔ)包括該三元組的版本的數(shù)據(jù)項(xiàng)的不同存儲(chǔ)節(jié)點(diǎn)的數(shù)量之間的差。在指令分配器所使用的選擇過程是確定性的情況下,這樣的冗余模塊是特別有用的,因?yàn)樗沟媚軌蛟诓粩_亂數(shù)據(jù)項(xiàng)與存儲(chǔ)數(shù)據(jù)項(xiàng)的存儲(chǔ)節(jié)點(diǎn)之間的關(guān)系的確定性屬性的情況下存儲(chǔ)數(shù)據(jù)項(xiàng)的副本以進(jìn)行數(shù)據(jù)恢復(fù)。冗余模塊被配置成確保其被指示存儲(chǔ)包括三元組的版本的數(shù)據(jù)項(xiàng)的不同存儲(chǔ)節(jié)點(diǎn)的數(shù)量為兩個(gè)或更多個(gè)并且是特定于實(shí)現(xiàn)的,但是在優(yōu)選的實(shí)施例中是3個(gè)。因此,被指示存儲(chǔ)包括三元組的版本的不同存儲(chǔ)節(jié)點(diǎn)的數(shù)量是3減去該計(jì)數(shù)。包括三元組的特定版本(例如,SPO)的數(shù)據(jù)項(xiàng)的副本可以被做出并且可以存儲(chǔ)在附加存儲(chǔ)節(jié)點(diǎn)上。此外,附加存儲(chǔ)節(jié)點(diǎn)所存儲(chǔ)的數(shù)據(jù)項(xiàng)可以存儲(chǔ)在數(shù)據(jù)項(xiàng)的經(jīng)排序的集合之外。有利地,這確保數(shù)據(jù)項(xiàng)的經(jīng)排序的集合的順序被保持,并且數(shù)據(jù)項(xiàng)與存儲(chǔ)數(shù)據(jù)項(xiàng)的存儲(chǔ)節(jié)點(diǎn)之間的關(guān)系的確定性屬性也被保持。在替代實(shí)施例中,冗余模塊被引入至指令分配器所使用的哈希算法中以從所述多個(gè)存儲(chǔ)節(jié)點(diǎn)中選擇待存儲(chǔ)數(shù)據(jù)項(xiàng)的存儲(chǔ)節(jié)點(diǎn)。本發(fā)明的實(shí)施例還包括計(jì)算設(shè)備如服務(wù)器,該計(jì)算設(shè)備用作實(shí)施本發(fā)明的數(shù)據(jù)庫控制器。例如,所述計(jì)算設(shè)備可以是分布式網(wǎng)絡(luò)中的存儲(chǔ)節(jié)點(diǎn)之一。此外,所述計(jì)算設(shè)備可以是多個(gè)這樣的計(jì)算設(shè)備之一,以使得在存儲(chǔ)節(jié)點(diǎn)的分布式網(wǎng)絡(luò)中,所述多個(gè)存儲(chǔ)節(jié)點(diǎn)中的不止一個(gè)(例如,全部)存儲(chǔ)節(jié)點(diǎn)具有實(shí)施本發(fā)明的數(shù)據(jù)庫控制器的功能。本發(fā)明的實(shí)施例包括計(jì)算機(jī)程序或存儲(chǔ)計(jì)算程序的非瞬態(tài)存儲(chǔ)介質(zhì),當(dāng)由計(jì)算設(shè)備執(zhí)行該計(jì)算機(jī)程序時(shí),該計(jì)算機(jī)程序使得該計(jì)算設(shè)備用作實(shí)施本發(fā)明的數(shù)據(jù)庫控制器。本發(fā)明還可以由用于將編碼為三元組的圖形數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)庫中的方法來實(shí)施,每個(gè)三元組包括主語、謂語和賓語,并且每個(gè)三元組存儲(chǔ)在數(shù)據(jù)項(xiàng)集合中的數(shù)據(jù)項(xiàng)內(nèi),該數(shù)據(jù)項(xiàng)集合是根據(jù)存儲(chǔ)在數(shù)據(jù)項(xiàng)內(nèi)的三元組來排序的,其中每個(gè)數(shù)據(jù)項(xiàng)存儲(chǔ)在分布于網(wǎng)絡(luò)中的多個(gè)存儲(chǔ)節(jié)點(diǎn)中的存儲(chǔ)節(jié)點(diǎn)上。所述方法包括:接收在數(shù)據(jù)庫中存儲(chǔ)三元組的請(qǐng)求;生成具有三元組的以下版本中的不同版本的兩個(gè)或更多個(gè)數(shù)據(jù)項(xiàng):第一版本,其中在數(shù)據(jù)項(xiàng)中主語在謂語和賓語之前;第二版本,其中在數(shù)據(jù)項(xiàng)中謂語在主語和賓語之前;以及第三版本,其中在數(shù)據(jù)項(xiàng)中賓語在主語和謂語之前。這樣的方法還包括:針對(duì)所述兩個(gè)或更多個(gè)數(shù)據(jù)項(xiàng)中的每一個(gè)數(shù)據(jù)項(xiàng),從所述多個(gè)數(shù)據(jù)節(jié)點(diǎn)中選擇存儲(chǔ)節(jié)點(diǎn)以指示存儲(chǔ)數(shù)據(jù)項(xiàng),所述選擇是依靠該數(shù)據(jù)項(xiàng)在所述經(jīng)排序的集合內(nèi)的位置來做出的;以及,確保指示所述多個(gè)存儲(chǔ)節(jié)點(diǎn)的至少兩個(gè)不同存儲(chǔ)節(jié)點(diǎn)來存儲(chǔ)包括該三元組的版本的數(shù)據(jù)項(xiàng)。在本文獻(xiàn)中所討論的數(shù)據(jù)項(xiàng)可以是在表中按行或表項(xiàng)存儲(chǔ)的獨(dú)立的信息。但是,發(fā)明實(shí)施例包括其中每個(gè)數(shù)據(jù)項(xiàng)都是鍵值系統(tǒng)(KVS)內(nèi)的鍵值對(duì)的鍵的實(shí)現(xiàn)。有利地,在鍵值系統(tǒng)的鍵內(nèi)存儲(chǔ)包括完整三元組的鍵使得能夠?qū)Ψ祷卦撏暾M的鍵集合執(zhí)行功能,而不是僅僅對(duì)可能發(fā)現(xiàn)三元組的地點(diǎn)的鏈接或標(biāo)識(shí)執(zhí)行功能。存儲(chǔ)在鍵值對(duì)的鍵中包括將三元組的元素表示為自身是該鍵值對(duì)的鍵的字符串對(duì)象。鍵值系統(tǒng)(KVS)或鍵值存儲(chǔ)是多個(gè)所存儲(chǔ)的鍵和值,其中每個(gè)鍵具有關(guān)聯(lián)值,通過邏輯函數(shù)或邏輯樹例如哈希表或哈希圖來將該鍵映射至該關(guān)聯(lián)值。哈希表或哈希圖是使用哈希函數(shù)將各個(gè)鍵(標(biāo)識(shí)值)映射至它們的關(guān)聯(lián)值的數(shù)據(jù)結(jié)構(gòu)。在本發(fā)明的實(shí)施例中,可以使用哈希函數(shù)來將鍵變換為用于形成存儲(chǔ)節(jié)點(diǎn)的分布式網(wǎng)絡(luò)的所述多個(gè)存儲(chǔ)節(jié)點(diǎn)中的存儲(chǔ)節(jié)點(diǎn)(存儲(chǔ)資源)的標(biāo)識(shí)??梢蕴峁┮韵聦?shí)施例:在所述實(shí)施例中,所述多個(gè)鍵值對(duì)中的每一個(gè)鍵的值包括與該鍵內(nèi)存儲(chǔ)的三元組有關(guān)的附加信息。例如,關(guān)于三元組的元數(shù)據(jù)存儲(chǔ)在該值中。在此上下文中,元數(shù)據(jù)是關(guān)于三元組中的信息項(xiàng)的描述性數(shù)據(jù)。該鍵存儲(chǔ)三元組并且該值存儲(chǔ)關(guān)于該三元組的信息??蛇x地,在這樣的實(shí)施例中,附加信息是依靠其身份來訪問數(shù)據(jù)庫的應(yīng)用程序可獲得的數(shù)據(jù)。有利地,這樣的實(shí)施例通過使能在數(shù)據(jù)庫中讀取和/或?qū)懭霐?shù)據(jù)的依賴于應(yīng)用程序的方面來擴(kuò)展數(shù)據(jù)庫的功能。該數(shù)據(jù)是依賴于應(yīng)用程序的數(shù)據(jù),并且可以作為模糊對(duì)象在KVS中被查看和處理。值容器還可以包括設(shè)置和檢索依賴于應(yīng)用程序的數(shù)據(jù)的API??蛇x地,在上述KVS實(shí)現(xiàn)中,附加信息包括被注冊(cè)用于當(dāng)對(duì)存儲(chǔ)在鍵值對(duì)內(nèi)的RDF三元組進(jìn)行讀和/或?qū)懺L問時(shí)接收通知的應(yīng)用程序列表。此外,該附加信息可以包括用于由存儲(chǔ)該容器的節(jié)點(diǎn)執(zhí)行的軟件代碼。例如,可以響應(yīng)于特定事件來存儲(chǔ)和調(diào)用該軟件代碼,該軟件代碼的變?cè)泊鎯?chǔ)在該容器中。例如,值可以將軟件代碼塊存儲(chǔ)為更新函數(shù)。當(dāng)更新所關(guān)聯(lián)的三元組時(shí),調(diào)用更新函數(shù),其中將其他三元組的列表以及它們的位置作為變?cè)T撈渌M的列表可以由客戶端應(yīng)用程序通過將三元組添加至與特定事件相關(guān)聯(lián)的容器中的列表來產(chǎn)生。有利地,在對(duì)三元組數(shù)據(jù)進(jìn)行讀或?qū)懺L問時(shí)通知應(yīng)用程序增強(qiáng)了數(shù)據(jù)庫與使用存儲(chǔ)在該數(shù)據(jù)庫中的數(shù)據(jù)的應(yīng)用程序之間的交互水平。對(duì)注冊(cè)為接收通知的應(yīng)用程序列表的維護(hù)提供了能夠管理通知的機(jī)制。附圖說明僅作為示例,現(xiàn)在將參考附圖來描述本發(fā)明的優(yōu)選特征,其中:圖1是實(shí)施本發(fā)明的數(shù)據(jù)庫控制器的示意圖;圖2是實(shí)施本發(fā)明的系統(tǒng)的示意圖;以及圖3示出了圖1的數(shù)據(jù)庫控制器的組件與圖2的軟件層對(duì)應(yīng)的示例。具體實(shí)施方式圖1示意性地示出了實(shí)施本發(fā)明的數(shù)據(jù)庫控制器。數(shù)據(jù)庫控制器10包括多個(gè)組件:存儲(chǔ)請(qǐng)求接收器12、數(shù)據(jù)項(xiàng)生成模塊14和自身包括冗余模塊18的指令分配器16。這些組件本身可以由專用硬件例如處理器、內(nèi)存、存儲(chǔ)器以及網(wǎng)絡(luò)接口來實(shí)現(xiàn),在適當(dāng)?shù)那闆r下,所有這些硬件被配置成以下述方式來工作??商娲?,數(shù)據(jù)庫控制器可以是由運(yùn)行在計(jì)算設(shè)備上的計(jì)算程序(或由協(xié)作地運(yùn)行在不止一個(gè)計(jì)算設(shè)備上的一組計(jì)算機(jī)程序)提供的功能,所述計(jì)算設(shè)備比如是自身可以是節(jié)點(diǎn)20的分布式網(wǎng)絡(luò)中的存儲(chǔ)節(jié)點(diǎn)的服務(wù)器。在這樣的實(shí)施例中,上述組件是功能單元或模塊,這些功能單元或模塊中的每一個(gè)利用作為計(jì)算設(shè)備自身的一部分的硬件來實(shí)現(xiàn)其所述功能。數(shù)據(jù)庫控制器10可以實(shí)現(xiàn)為單個(gè)存儲(chǔ)節(jié)點(diǎn)上的集中控制器,由協(xié)作的多個(gè)存儲(chǔ)節(jié)點(diǎn)實(shí)現(xiàn)的集中控制器,或者實(shí)現(xiàn)為其中每個(gè)都位于相應(yīng)的存儲(chǔ)節(jié)點(diǎn)上的多個(gè)等同控制器中的控制器。例如,可以由運(yùn)行在由節(jié)點(diǎn)組成的分布式網(wǎng)絡(luò)中的存儲(chǔ)節(jié)點(diǎn)上的程序來提供數(shù)據(jù)控制器10,并且一個(gè)或更多個(gè)其他存儲(chǔ)節(jié)點(diǎn)也可以運(yùn)行等同的程序以使得能夠通過多個(gè)數(shù)據(jù)庫控制器10來訪問數(shù)據(jù)庫。數(shù)據(jù)庫控制器10被示出為連接至由存儲(chǔ)節(jié)點(diǎn)20組成的分布式網(wǎng)絡(luò)。始于指令分配器16并且止于存儲(chǔ)節(jié)點(diǎn)的箭頭被示出為具有方向性以表示存儲(chǔ)正在分發(fā)的數(shù)據(jù)項(xiàng)的指令。但是,數(shù)據(jù)庫控制器與分布式存儲(chǔ)節(jié)點(diǎn)的網(wǎng)絡(luò)之間的數(shù)據(jù)連接可以是雙向的。實(shí)際上,在本發(fā)明的實(shí)施例中,每個(gè)存儲(chǔ)節(jié)點(diǎn)和數(shù)據(jù)庫控制器可以通過網(wǎng)絡(luò)來彼此進(jìn)行通信,而不管該網(wǎng)絡(luò)是有線的、無線的或兩者的組合。節(jié)點(diǎn)20的分布式網(wǎng)絡(luò)中的每個(gè)存儲(chǔ)節(jié)點(diǎn)可以具有如數(shù)據(jù)庫控制器10的數(shù)據(jù)庫控制器。存儲(chǔ)請(qǐng)求接收器12被配置成接收在數(shù)據(jù)庫中存儲(chǔ)三元組的請(qǐng)求。該請(qǐng)求可以來自例如運(yùn)行希望向數(shù)據(jù)庫添加新的三元組的應(yīng)用程序的客戶端設(shè)備。存儲(chǔ)請(qǐng)求接收器12可以例如是RDF層或RDF層的一部分,并且處理以下請(qǐng)求:向數(shù)據(jù)庫添加三元組的請(qǐng)求,還可能從數(shù)據(jù)庫移除三元組的請(qǐng)求,以及讀取或查詢數(shù)據(jù)庫的請(qǐng)求。希望訪問數(shù)據(jù)庫的應(yīng)用程序與數(shù)據(jù)庫自身之間的交互是通過存儲(chǔ)請(qǐng)求接收器12來實(shí)現(xiàn)的,并且可以是以由應(yīng)用程序編程接口(API)指定的形式,應(yīng)用程序編程接口由數(shù)據(jù)庫控制器10和/或節(jié)點(diǎn)20的分布式網(wǎng)絡(luò)中的一個(gè)或更多個(gè)存儲(chǔ)節(jié)點(diǎn)輸出。存儲(chǔ)請(qǐng)求接收器12可以被配置成執(zhí)行以下處理:解釋來自應(yīng)用程序的請(qǐng)求并且基于該請(qǐng)求來生成針對(duì)數(shù)據(jù)庫控制器10的其他組件的指令。例如,存儲(chǔ)請(qǐng)求接收器12可以提取表示形成三元組存儲(chǔ)請(qǐng)求的基礎(chǔ)的三元組的字符串,并且將所提取的字符串(或三元組的其他數(shù)據(jù)表示)傳遞至數(shù)據(jù)項(xiàng)生成模塊14。數(shù)據(jù)項(xiàng)生成模塊14被配置成生成兩個(gè)或更多個(gè)數(shù)據(jù)項(xiàng),其中每個(gè)數(shù)據(jù)項(xiàng)具有三元組的以下不同版本:第一版本,其中在數(shù)據(jù)項(xiàng)中主語在謂語和賓語之前;第二版本,其中在數(shù)據(jù)項(xiàng)中謂語在主語和賓語之前;以及第三版本,其中在數(shù)據(jù)項(xiàng)中賓語在主語和謂語之前。還可以預(yù)先確定三元組的剩余元素在每個(gè)版本中出現(xiàn)的順序。數(shù)據(jù)項(xiàng)生成模塊14可以被配置成生成三個(gè)數(shù)據(jù)項(xiàng),其中每個(gè)數(shù)據(jù)項(xiàng)具有上面列出的三個(gè)版本中的不同版本。數(shù)據(jù)項(xiàng)生成模塊14可以是RDF層、RDF層的一部分、或RDF層的一部分和存儲(chǔ)層的一部分的組合。數(shù)據(jù)項(xiàng)生成模塊14被配置成執(zhí)行從存儲(chǔ)請(qǐng)求接收器12接收三元組或表示三元組的數(shù)據(jù)所需要的處理,以及產(chǎn)生所需的三元組的不同版本,并且還可能將三元組的那些不同版本封裝到具有或不具有附加數(shù)據(jù)的特定格式的數(shù)據(jù)項(xiàng)中。數(shù)據(jù)項(xiàng)生成模塊14被配置成將所生成的數(shù)據(jù)項(xiàng)傳遞至指令分配器16。指令分配器16被配置成:針對(duì)上述兩個(gè)或更多個(gè)數(shù)據(jù)項(xiàng)中的每一個(gè),從多個(gè)存儲(chǔ)節(jié)點(diǎn)20中選擇存儲(chǔ)節(jié)點(diǎn)以指示存儲(chǔ)數(shù)據(jù)項(xiàng),該選擇是依靠該數(shù)據(jù)項(xiàng)在經(jīng)排序的集合內(nèi)的位置做出的。包括冗余模塊18的指令分配器16被配置成確保多個(gè)存儲(chǔ)節(jié)點(diǎn)20中的至少兩個(gè)不同存儲(chǔ)節(jié)點(diǎn)被指示為存儲(chǔ)包括該三元組的版本的數(shù)據(jù)項(xiàng)。指令分配器16可以是存儲(chǔ)層的一部分,并且被配置成執(zhí)行指示存儲(chǔ)節(jié)點(diǎn)存儲(chǔ)特定數(shù)據(jù)項(xiàng)所需要的處理,例如,將包括數(shù)據(jù)項(xiàng)的請(qǐng)求經(jīng)由網(wǎng)絡(luò)發(fā)送至存儲(chǔ)節(jié)點(diǎn),或促使發(fā)送這樣的請(qǐng)求。例如,指令分配器16(通過冗余模塊18)可以配置成以確定性方式以及以確保沒有同一三元組的兩個(gè)版本存儲(chǔ)在同一存儲(chǔ)節(jié)點(diǎn)的方式來將數(shù)據(jù)項(xiàng)映射至存儲(chǔ)節(jié)點(diǎn)??商娲?,指令分配器可以負(fù)責(zé)將數(shù)據(jù)項(xiàng)映射至存儲(chǔ)節(jié)點(diǎn)(例如,使用確定性哈希函數(shù)),并且冗余模塊被配置成對(duì)具有特定三元組的兩個(gè)或更多個(gè)不同版本的數(shù)據(jù)項(xiàng)的映射進(jìn)行檢查,其中該映射不導(dǎo)致:多于一個(gè)的存儲(chǔ)節(jié)點(diǎn)存儲(chǔ)該三元組的一個(gè)版本,生成具有該三元組的數(shù)據(jù)項(xiàng)的副本,以及指示除了被指示存儲(chǔ)所檢查的數(shù)據(jù)項(xiàng)的存儲(chǔ)節(jié)點(diǎn)以外的存儲(chǔ)節(jié)點(diǎn)存儲(chǔ)該附加的副本。節(jié)點(diǎn)20的分布式網(wǎng)絡(luò)可以是例如分布式對(duì)等網(wǎng)絡(luò)。這樣的網(wǎng)絡(luò)是可擴(kuò)展的并且可以包括大量的服務(wù)器。實(shí)際上,數(shù)據(jù)項(xiàng)的有序集的分布水平越高,冗余模塊就越容易確保需要數(shù)量的存儲(chǔ)節(jié)點(diǎn)被指示為存儲(chǔ)包括三元組的版本的數(shù)據(jù)項(xiàng)。圖2示出了實(shí)施本發(fā)明的系統(tǒng)。在圖2中,各個(gè)服務(wù)器1-N和應(yīng)用程序30都在計(jì)算機(jī)中執(zhí)行。所有的計(jì)算機(jī)通過網(wǎng)絡(luò)來可通信地連接。不同模塊之間的箭頭表示網(wǎng)絡(luò)通信,盡管這些箭頭意在強(qiáng)調(diào)下文所討論的通信,但是不對(duì)在這樣的系統(tǒng)架構(gòu)中的模塊之間的可能的通信構(gòu)成限制。應(yīng)用程序30使用明確定義的API來與服務(wù)器之一進(jìn)行交互,上述API由所有的服務(wù)器1-N輸出。每個(gè)服務(wù)器具有由3個(gè)軟件組件構(gòu)成的數(shù)據(jù)庫控制器:RDF層11,RDF層11處理來自應(yīng)用程序的以下請(qǐng)求:添加和移除數(shù)據(jù),或?qū)ΜF(xiàn)有數(shù)據(jù)進(jìn)行高水平查詢。所述應(yīng)用程序請(qǐng)求被轉(zhuǎn)換為低水平請(qǐng)求并且被轉(zhuǎn)發(fā)至存儲(chǔ)層。RDF層11負(fù)責(zé)將RDF數(shù)據(jù)轉(zhuǎn)換成三元組的簡單和統(tǒng)一表示。高水平查詢還必須被轉(zhuǎn)換成一組范圍查詢(rangequery)。RDF層11是存儲(chǔ)請(qǐng)求接收器12的示例;存儲(chǔ)層15,存儲(chǔ)層15負(fù)責(zé)數(shù)據(jù)項(xiàng)的生成與分配,并且負(fù)責(zé)范圍查詢的執(zhí)行。存儲(chǔ)層15是數(shù)據(jù)項(xiàng)生成模塊14、指令分配器16和冗余模塊18的示例;故障檢測器19,故障檢測器19負(fù)責(zé)看門狗的執(zhí)行,看門狗可以檢測服務(wù)器故障并且向存儲(chǔ)層15通知剩余(未出現(xiàn)故障)的服務(wù)器。存儲(chǔ)層15和故障檢測器19使用通信網(wǎng)絡(luò)與位于不同服務(wù)器上的類似組件進(jìn)行通信。本實(shí)施例的數(shù)據(jù)庫是由存儲(chǔ)系統(tǒng)提供的,該存儲(chǔ)系統(tǒng)由通過網(wǎng)絡(luò)進(jìn)行通信的服務(wù)器(存儲(chǔ)節(jié)點(diǎn))20的分布式集合組成的。組成該系統(tǒng)的服務(wù)器20的該集合還實(shí)現(xiàn)分布式有序哈希映射。應(yīng)用程序30(例如運(yùn)行在可以通過網(wǎng)絡(luò)連接至一個(gè)或更多個(gè)服務(wù)器20的客戶端機(jī)器上的應(yīng)用程序)通過連接至上述服務(wù)器之一來與該系統(tǒng)進(jìn)行交互??蛻舳藨?yīng)用程序30具有例如通過添加新的三元組、移除三元組以及執(zhí)行范圍查詢來實(shí)現(xiàn)的添加、移除和查詢RDF數(shù)據(jù)的接口。服務(wù)器20通過網(wǎng)絡(luò)彼此進(jìn)行通信,并且通過每個(gè)服務(wù)器都運(yùn)行作為它們各自數(shù)據(jù)庫控制器10的組件的故障檢測模塊19來運(yùn)行分布式故障檢測器。當(dāng)處理P出現(xiàn)故障時(shí)(其中處理P用于指代由服務(wù)器20的分布式集合中的服務(wù)器實(shí)現(xiàn)的存儲(chǔ)處理),最終,其他處理會(huì)從指示P出現(xiàn)故障的故障檢測器接收通知。該實(shí)施例的數(shù)據(jù)庫中的數(shù)據(jù)被存儲(chǔ)為三元組,例如RDF三元組。RDF三元組是[主語,謂語,賓語]或簡單地為SPO形式的RDF數(shù)據(jù)。該數(shù)據(jù)以以下方式來存儲(chǔ):能夠使用以不同的順序如POS或OSP等存儲(chǔ)同一三元組的副本來有效地執(zhí)行范圍查詢。在本發(fā)明的實(shí)施例中,副本還用于數(shù)據(jù)恢復(fù)處理。根據(jù)每個(gè)數(shù)據(jù)項(xiàng)中的三元組數(shù)據(jù)來對(duì)存儲(chǔ)在數(shù)據(jù)庫中的數(shù)據(jù)集合進(jìn)行排序。數(shù)據(jù)集合的范圍被分成N段,其中N是將用作存儲(chǔ)器的服務(wù)器的數(shù)量。每個(gè)服務(wù)器負(fù)責(zé)一個(gè)數(shù)據(jù)段。當(dāng)將數(shù)據(jù)添加至系統(tǒng)時(shí),生成每個(gè)三元組的至少兩個(gè)(優(yōu)選地為三個(gè))版本并且將這些版本存儲(chǔ)在至少兩個(gè)(優(yōu)選地為三個(gè))不同的服務(wù)器中。由存儲(chǔ)層15(指令分配器16)使用如一致性哈希算法等確定性技術(shù)來針對(duì)每個(gè)三元組版本計(jì)算段(及其對(duì)應(yīng)的服務(wù)器地址或ID)。每個(gè)三元組版本自然可以存儲(chǔ)在不同的服務(wù)器上,但是一致性哈希算法不能總是保證該屬性。在各個(gè)三元組版本沒有存儲(chǔ)在不同服務(wù)器上(或上述版本沒有分布在至少兩個(gè)不同的服務(wù)器上)的情況下,將三元組的附加拷貝存儲(chǔ)在不同服務(wù)器上的數(shù)據(jù)項(xiàng)中。可以使用確定性過程來本地地(例如,在每個(gè)數(shù)據(jù)庫控制器10處)計(jì)算其中存儲(chǔ)了具有特定三元組的數(shù)據(jù)項(xiàng)的所有服務(wù)器。由于范圍查詢是對(duì)已經(jīng)存儲(chǔ)在有序集合中的數(shù)據(jù)來執(zhí)行的,所以發(fā)起范圍查詢的服務(wù)器還可以計(jì)算需要被本地查詢的服務(wù)器的列表。以不同的版本存儲(chǔ)的三元組的至少兩個(gè)(優(yōu)選地為三個(gè))版本用于兩個(gè)目的:有效地執(zhí)行范圍查詢,而不管在范圍查詢中指定的前綴如何(即,可由主語、謂語或賓語來指定范圍并且仍然可以有效地處理該范圍);以及從故障中恢復(fù)數(shù)據(jù)。當(dāng)包含SPO形式的三元組的服務(wù)器出現(xiàn)故障時(shí),在系統(tǒng)中存在一個(gè)或更多個(gè)附加拷貝:POS和OSP。這些三元組包含完全相同的但是以不同的順序來表示的數(shù)據(jù)。使用該信息,實(shí)施本發(fā)明的系統(tǒng)提供了從三元組的不同表示中檢索丟失數(shù)據(jù)的機(jī)制?;謴?fù)丟失數(shù)據(jù)并且重新計(jì)算每個(gè)三元組的新位置。當(dāng)有服務(wù)器(或處理)出現(xiàn)故障時(shí),幸存服務(wù)器具有足夠的信息去了解哪些三元組需要被恢復(fù)和改組。不僅期望該恢復(fù)處理保持確保容錯(cuò)性所需的副本的數(shù)量,而且還期望該恢復(fù)處理確保數(shù)據(jù)位于系統(tǒng)中的所有服務(wù)器可確定性地達(dá)到的服務(wù)器中。如前面所概述的,一致性哈希算法是將數(shù)據(jù)段映射至服務(wù)器的非常有效的方式,并且在本發(fā)明的實(shí)施例中可以由存儲(chǔ)層15(指令分配器16)使用以選擇指示哪個(gè)存儲(chǔ)節(jié)點(diǎn)(服務(wù)器)來存儲(chǔ)包括三元組的版本的數(shù)據(jù)項(xiàng)。這種哈希方法可以針對(duì)存儲(chǔ)同一三元組的每個(gè)數(shù)據(jù)項(xiàng)選擇不同的服務(wù)器,但是取決于數(shù)據(jù)項(xiàng)、服務(wù)器的相對(duì)數(shù)量和哈希算法(例如,其要求保持?jǐn)?shù)據(jù)項(xiàng)之間的相對(duì)順序),也不是必需是該情況。因此,本發(fā)明的實(shí)施例提供有以下機(jī)制:確保存儲(chǔ)同一三元組的不同版本的數(shù)據(jù)項(xiàng)被存儲(chǔ)在至少兩個(gè)(優(yōu)選地為三個(gè))不同服務(wù)器中。更具體地,存儲(chǔ)層15(指令分配器16)提供有以下功能(冗余模塊18):處理三種不同的場景以確保系統(tǒng)總是在例如三個(gè)不同的服務(wù)器中具有三元組的至少一份拷貝:在第一場景中:三元組的三個(gè)版本(SPO、POS和OSP)自然地存儲(chǔ)在不同的服務(wù)器中。例如,SPO存儲(chǔ)在服務(wù)器1中,POS存儲(chǔ)在服務(wù)器2中,以及OSP存儲(chǔ)在服務(wù)器3中。在該情況下,不需要采取另外的動(dòng)作。在第二場景中:三元組的兩個(gè)版本存儲(chǔ)在同一服務(wù)器中,并且一個(gè)版本存儲(chǔ)在另一個(gè)服務(wù)器中。例如,SPO和POS存儲(chǔ)在服務(wù)器1中,并且OSP存儲(chǔ)在服務(wù)器2中。在該情況下,僅兩個(gè)服務(wù)器會(huì)具有該三元組的版本,系統(tǒng)對(duì)于該特定數(shù)據(jù)項(xiàng)會(huì)有更低的容錯(cuò)性。為避免這種情況,數(shù)據(jù)庫控制器10(例如,通過冗余模塊18)執(zhí)行為將額外的拷貝存儲(chǔ)在第三服務(wù)器中所需要的處理。在第三場景中:三元組的所有三個(gè)版本SPO、POS和OSP存儲(chǔ)在同一服務(wù)器中(例如,服務(wù)器1)。在該情況下,如果服務(wù)器1出現(xiàn)故障,則系統(tǒng)會(huì)丟失該數(shù)據(jù)項(xiàng)。為了確保相同水平的容錯(cuò)性,數(shù)據(jù)庫控制器10(例如,通過冗余模塊18)執(zhí)行將額外拷貝存儲(chǔ)在兩個(gè)不同服務(wù)器(不同于已經(jīng)存儲(chǔ)現(xiàn)有三個(gè)版本的服務(wù)器,并且彼此不同)中所需要的處理。通過以上面提出的方式來處理以上三個(gè)場景,系統(tǒng)確保針對(duì)數(shù)據(jù)庫中的每個(gè)三元組都有包括所存儲(chǔ)的該三元組的版本的至少三個(gè)數(shù)據(jù)項(xiàng)。在存儲(chǔ)該三元組的不同版本的數(shù)據(jù)項(xiàng)沒有映射至三個(gè)不同服務(wù)器(場景2和場景3)的情況下,添加上述數(shù)據(jù)項(xiàng)之一的更多副本或添加具有該三元組的版本的新數(shù)據(jù)項(xiàng)。在場景2中,系統(tǒng)將不得不存儲(chǔ)具有該三元組的版本的4個(gè)數(shù)據(jù)項(xiàng)。在場景3中,系統(tǒng)將不得不存儲(chǔ)具有該三元組的版本的5個(gè)數(shù)據(jù)項(xiàng)。這是必需的,這是因?yàn)樵谠撎囟ǖ膶?shí)現(xiàn)中,原始數(shù)據(jù)項(xiàng)(或三元組)不能從其在數(shù)據(jù)項(xiàng)的有序集合中的位置被移走。相比場景1,場景和場景3的出現(xiàn)頻率可能相對(duì)低,但是這取決于要存儲(chǔ)的數(shù)據(jù)的量和可用服務(wù)器的量。盡管用于存儲(chǔ)三元組的本方法可以用于任何網(wǎng)絡(luò)配置,但是使用具有許多服務(wù)器的可擴(kuò)展對(duì)等網(wǎng)絡(luò)會(huì)增加場景1出現(xiàn)的概率,從而減小系統(tǒng)中三元組的版本的副本的數(shù)量。此外,該特定的系統(tǒng)包括故障檢測器19。故障檢測器的簡易版本是被配置成使用超時(shí)和“ping”消息的檢測器。每個(gè)服務(wù)器的故障檢測器19被配置成周期性地發(fā)送“ping”消息至每個(gè)其他服務(wù)器。例如,如果服務(wù)器1在指定量的時(shí)間后沒有從服務(wù)器2接收到“ping”消息(或其他類型的預(yù)定響應(yīng)),服務(wù)器1會(huì)懷疑服務(wù)器2出現(xiàn)了故障,并且與剩余服務(wù)器一起執(zhí)行協(xié)定過程以將服務(wù)器2從可用服務(wù)器列表中排除,并執(zhí)行數(shù)據(jù)恢復(fù)處理。用于實(shí)現(xiàn)故障檢測器的該特定方法已知為“最終完美故障檢測器(eventuallyperfectfailuredetector)”,并且在網(wǎng)絡(luò)消息未丟失并且消息延遲有(未知)上界的系統(tǒng)中尤其有用??蛇x地,可以將“ping”消息捎帶在常規(guī)的服務(wù)器消息中以節(jié)省網(wǎng)絡(luò)帶寬。實(shí)現(xiàn)故障檢測器的更多細(xì)節(jié)以及方法可以在論文“TusharDeepakChandraandSamToueg.1996.Unreliablefailuredetectorsforreliabledistributedsystems.J.ACM43,2(March1996),225-267.DOI=10.1145/226643.226647”中找到。在圖2所示的系統(tǒng)中,每個(gè)服務(wù)器具有執(zhí)行等同任務(wù)的其自己的數(shù)據(jù)庫控制器。每個(gè)服務(wù)器運(yùn)行具有以下數(shù)據(jù)結(jié)構(gòu)的處理:存儲(chǔ)表。每個(gè)處理存儲(chǔ)由以下字段組成的表:triple_data:三元組triple_order:Enum{SOP,POS,OSP}spo_node_ID:整數(shù)pos_node_ID:整數(shù)osp_node_ID:整數(shù)在存儲(chǔ)表中,表項(xiàng)按照第一個(gè)字段(triple_data)排序以使得能夠?qū)γ總€(gè)處理進(jìn)行本地范圍查詢(例如,基于表示三元組的字符串的字母順序排序)。triple_order是表示三元組的編碼順序的數(shù)字,因此,例如基于存儲(chǔ)在“triple_order”中的數(shù)字,可導(dǎo)出該三元組的哪個(gè)元素是由例如第二元素表示的。在該特定的實(shí)現(xiàn)中,存儲(chǔ)同一三元組的三個(gè)版本中的每一個(gè)版本的節(jié)點(diǎn)的ID也與該三元組一起存儲(chǔ)在存儲(chǔ)表中。在替選實(shí)現(xiàn)中,存儲(chǔ)表和下面討論的副本表可以利用有序搜索樹(Trie)結(jié)合在一起,以使得能夠具有兩個(gè)有序三元組并且可搜索的索引可用于數(shù)據(jù)控制器。處理/服務(wù)器可以存儲(chǔ)的附加數(shù)據(jù)結(jié)構(gòu)包括以下數(shù)據(jù)結(jié)構(gòu):索引,該索引將node_ID映射至指向存儲(chǔ)表上的行的指示符,例如,在特定服務(wù)器出現(xiàn)故障的情況下,可以確定該服務(wù)器的node_ID,并且該索引使得能夠有效地識(shí)別故障服務(wù)器上的數(shù)據(jù)恢復(fù)所需的行;副本表,用于存儲(chǔ)所生成的三元組版本的副本以滿足以下要求:例如,三個(gè)不同的服務(wù)器中每一個(gè)服務(wù)器都存儲(chǔ)同一三元組的版本。為了保持三元組的現(xiàn)有版本的排序,可以將這樣的副本存儲(chǔ)在主存儲(chǔ)表之外,因而該副本表可以僅存儲(chǔ)SPO形式的三元組并且可以由以下字段組成(其中replica1_ID是表示在其上可以找到該三元組的SPO版本的第一副本的節(jié)點(diǎn)的ID的整數(shù),并且如果存在第二副本,則replica2_ID是表示在其上可以找到該三元組的SPO版本的第二副本的節(jié)點(diǎn)的ID的整數(shù)):triple_data:三元組spo_node_ID:整數(shù)pos_node_ID:整數(shù)osp_node_ID:整數(shù)replica1_ID:整數(shù)replica2_ID:整數(shù)索引,該索引將node_ID映射至指向副本表上的行的指示符,同樣,這樣的索引方便數(shù)據(jù)恢復(fù)目的。在本實(shí)施例中,每個(gè)三元組在分布式存儲(chǔ)系統(tǒng)中被存儲(chǔ)3次:按照SPO順序,按照OSP順序以及按照POS順序。這確保了每個(gè)三元組的三個(gè)版本存儲(chǔ)在數(shù)據(jù)項(xiàng)中并且確保了可以有效地執(zhí)行范圍查詢,而不管搜索類型(按主語,按謂語或按賓語)如何。以下段落描述如何存儲(chǔ)三元組以及當(dāng)處理失敗時(shí)如何恢復(fù)信息。數(shù)據(jù)是由通過線性數(shù)據(jù)空間排序的三元組集合來組成的。該數(shù)據(jù)空間按段劃分。為了有效地檢索特定數(shù)據(jù)項(xiàng)應(yīng)該位于的段,可以使用如Trie(一種分類樹)等機(jī)制,其中該Trie的每個(gè)葉子對(duì)應(yīng)于一個(gè)段。在系統(tǒng)的每個(gè)存儲(chǔ)節(jié)點(diǎn)中復(fù)制這樣的數(shù)據(jù)結(jié)構(gòu)并且將數(shù)據(jù)項(xiàng)映射至段ID。因?yàn)閿?shù)據(jù)項(xiàng)總是被排序的,所以可以檢索執(zhí)行范圍查詢所需的段ID。范圍查詢檢索t1與t2之間的所有數(shù)據(jù),其中t1和t2是數(shù)據(jù)項(xiàng)(或三元組)。因此,需要查詢的段(其中將段理解為存儲(chǔ)在特定存儲(chǔ)節(jié)點(diǎn)/服務(wù)器/機(jī)器上的數(shù)據(jù)的總集合中的一部分)是:t1所位于的段、t2所位于的段以及這兩個(gè)段之間的所有段(當(dāng)存儲(chǔ)節(jié)點(diǎn)是根據(jù)每個(gè)存儲(chǔ)節(jié)點(diǎn)存儲(chǔ)的數(shù)據(jù)項(xiàng)的有序集合組成的段的順序排序時(shí),就存儲(chǔ)節(jié)點(diǎn)的順序而言的之間)。在檢索段ID之后,使用如一致性哈希等機(jī)制作為工具將段映射至機(jī)器。利用該功能提供了本地地將數(shù)據(jù)項(xiàng)(三元組)映射至特定機(jī)器ID的函數(shù)/方法:機(jī)器IDgetMachineID(對(duì)象三元組)該方法使用Trie結(jié)構(gòu)(或有序數(shù)據(jù)項(xiàng)至段ID的其他映射)將數(shù)據(jù)項(xiàng)映射至段ID,然后使用一致性哈希算法將段ID映射至機(jī)器ID(但是在該第二步驟中,將段ID映射至機(jī)器ID的任何機(jī)制都符合目的)。通過具有作為變?cè)峁┑娜M的表示的指令“getMachineID”來調(diào)用該方法。返回例如可以是整數(shù)的機(jī)器ID(MachineID)。存儲(chǔ)層15(指令分配器16)可以使用該方法來選擇存儲(chǔ)三元組的每個(gè)版本的存儲(chǔ)節(jié)點(diǎn)。機(jī)器ID標(biāo)識(shí)特定的存儲(chǔ)節(jié)點(diǎn)。例如可以通過對(duì)其地址進(jìn)行哈希處理并根據(jù)其在數(shù)據(jù)的線性空間中的相對(duì)位置來確定存儲(chǔ)節(jié)點(diǎn)(其中存儲(chǔ)節(jié)點(diǎn)是機(jī)器或服務(wù)器)的ID。這些ID還可以以循環(huán)的方式來限定彼此之間的順序。這意味著:例如如果在系統(tǒng)中具有3個(gè)機(jī)器,則將順序關(guān)系“A<B”(A小于B)限定如下:機(jī)器1<機(jī)器2<機(jī)器3<機(jī)器1。在數(shù)據(jù)插入方法的描述中,運(yùn)算“機(jī)器ID+1”對(duì)應(yīng)于線性空間的下一個(gè)機(jī)器。例如:機(jī)器1+1與機(jī)器2相同機(jī)器3+1與機(jī)器1相同最終,由兩個(gè)附加的方法:store(對(duì)象三元組,機(jī)器IDspoID,機(jī)器IDposID,機(jī)器IDospID)storeReplica(對(duì)象三元組,機(jī)器IDspoID,機(jī)器IDposID,機(jī)器IDospID,機(jī)器IDreplica1,機(jī)器IDreplica2)所有的存儲(chǔ)服務(wù)器通過它們的數(shù)據(jù)庫控制器來提供這些方法。例如,可以由指令分配器在向存儲(chǔ)節(jié)點(diǎn)分發(fā)指令時(shí)調(diào)用這些方法。該“store()”方法指示三元組在特定服務(wù)器的存儲(chǔ)表中的存儲(chǔ)。從上可以看出,在該實(shí)施例中,當(dāng)調(diào)用該方法時(shí)所包括的變?cè)窃撊M自身、存儲(chǔ)該三元組的存儲(chǔ)節(jié)點(diǎn)的ID和存儲(chǔ)該三元組的每個(gè)版本的存儲(chǔ)節(jié)點(diǎn)的ID。該storeReplica()方法在三元組的版本例如由冗余模塊18復(fù)制時(shí)在特定服務(wù)器的副本表中存儲(chǔ)該三元組,以確保所需數(shù)量的存儲(chǔ)節(jié)點(diǎn)具有特定三元組的版本。作為對(duì)發(fā)明實(shí)施例的核心功能的可選擴(kuò)展,這些方法還存儲(chǔ)三元組的其他版本的ID并且更新先前描述的索引。存儲(chǔ)三元組的三個(gè)版本(以及如果需要還有副本)的機(jī)制(方法addTriple)按如下方式工作,以三元組的表示作為變?cè)?,并且是由接收到在?shù)據(jù)庫中存儲(chǔ)三元組的請(qǐng)求的數(shù)據(jù)庫控制器10執(zhí)行的方法的示例:方法addTriple(三元組三元組):機(jī)器IDm1,m2,m3m1=getMachineID(triple.asSPO())m2=getMachineID(triple.asPOS())m3=getMachineID(triple.asPOS())在m1中store(triple.asSPO(),m1,m2,m3)在m2中store(triple.asPOS(),m1,m2,m3)在m3中store(triple.asOSP(),m1,m2,m3)這些過程確保三元組的每個(gè)版本SPO、POS和OSP被存儲(chǔ)在系統(tǒng)中以使得能夠使用三元組數(shù)據(jù)的子集的任意組合作為前綴來進(jìn)行范圍查詢。針對(duì)作為SPO、POS和OSP的三元組在“getmachineID”中使用的哈希函數(shù)針對(duì)三元組的所有三個(gè)版本返回不同的機(jī)器ID,因此,所述三個(gè)版本將存儲(chǔ)在不同的服務(wù)器中。在已經(jīng)檢查了這是否發(fā)生之后,確定所需的副本的數(shù)量并且生成副本并指示所述副本的存儲(chǔ)。僅當(dāng)這沒有發(fā)生時(shí),才存儲(chǔ)一個(gè)或兩個(gè)額外的副本。這些副本僅在恢復(fù)處理中使用而不用于執(zhí)行范圍查詢。額外的拷貝僅是一個(gè)回退過程以確保系統(tǒng)總是具有每個(gè)過程的至少三份拷貝。在某些情況下,系統(tǒng)可以存儲(chǔ)某些數(shù)據(jù)的4個(gè)或甚至5個(gè)版本,但是一致性哈希算法確保這僅發(fā)生在極少數(shù)的情況下,并且僅當(dāng)出于數(shù)據(jù)冗余目的而請(qǐng)求時(shí)。在本發(fā)明的操作實(shí)現(xiàn)中,很有可能僅在非常小百分比的情況下才會(huì)需要副本。最后,以完全相同的方式進(jìn)行刪除操作,但是是通過在服務(wù)器中執(zhí)行“delete()”和“deleteReplica()”方法,而不是分別執(zhí)行“store()”和“storeReplica()”。這些方法刪除每個(gè)表中與要?jiǎng)h除的三元組對(duì)應(yīng)的行。如果需要,“delete()”和“deleteReplica()”還更新各個(gè)索引。當(dāng)服務(wù)器出現(xiàn)故障時(shí),故障檢測器最終會(huì)檢測到該事件。例如,特定服務(wù)器的故障檢測器可以通過與網(wǎng)絡(luò)中的其他數(shù)據(jù)庫控制器的故障檢測器或故障檢測模塊進(jìn)行協(xié)作來檢測該事件。因此,可以考慮將故障檢測器分布在網(wǎng)絡(luò)中的每個(gè)服務(wù)器(數(shù)據(jù)庫控制器)中。一旦檢測到服務(wù)器故障,則會(huì)觸發(fā)響應(yīng)。例如,故障服務(wù)器的檢測可以在幸存服務(wù)器上(例如,在它們的數(shù)據(jù)庫控制器上)觸發(fā)“故障(onFailed)”事件。一旦服務(wù)器例如通過接收“故障”事件通知而被通知另一個(gè)服務(wù)器出現(xiàn)故障,則服務(wù)器通過其數(shù)據(jù)庫控制器執(zhí)行恢復(fù)操作。假設(shè)FID是故障處理的ID,則數(shù)據(jù)恢復(fù)操作可以由每個(gè)非故障存儲(chǔ)節(jié)點(diǎn)的數(shù)據(jù)庫控制器的以下步驟組成:1.如果(在非故障存儲(chǔ)節(jié)點(diǎn)上)存在從FID至表行的任何映射,則登記存儲(chǔ)索引。2.對(duì)于該索引所標(biāo)識(shí)的每個(gè)三元組:a.使用新成員配置來計(jì)算用于該三元組(即,用于存儲(chǔ)該三元組的版本的每個(gè)數(shù)據(jù)項(xiàng))的新機(jī)器ID,例如可以通過使用以具有三種配置SPO、POS、OSP中的每一種配置的三元組作為變?cè)膅etmachineID方法在存儲(chǔ)層15(在指令分配器16中)執(zhí)行這樣的操作;b.如果有存儲(chǔ)了三元組的版本并且不會(huì)以新的配置來存儲(chǔ)的服務(wù)器,則從該機(jī)器移除該三元組,例如,該移除可以由存儲(chǔ)層15(指令分配器16)使用“delete()”方法來指示;c.如果有將存儲(chǔ)三元組但沒有以先前的配置來存儲(chǔ)的服務(wù)器,則向該服務(wù)器添加該三元組,例如,該添加可以由存儲(chǔ)層15(指令分配器16)使用具有特定實(shí)現(xiàn)所需的變?cè)摹皊tore()”方法來指示,但是所述變?cè)辽侔ㄒ鎯?chǔ)的三元組的版本;d.如果有以先前配置存儲(chǔ)了三元組并且繼續(xù)以新配置來存儲(chǔ)的服務(wù)器,則簡單地更新該服務(wù)器的表上的三元組的ID,這樣的更新可以通過向適當(dāng)?shù)姆?wù)器發(fā)布更新指令來執(zhí)行。3.如果存在從FID至表行的任何映射,則登記副本索引,并且針對(duì)這些三元組重復(fù)步驟2。最終,為了避免該過程針對(duì)同一三元組被執(zhí)行多次,本發(fā)明的實(shí)施例可以包括以下機(jī)制:確保包含三元組的副本(或版本)服務(wù)器中的僅僅一個(gè)服務(wù)器會(huì)執(zhí)行數(shù)據(jù)恢復(fù)操作。例如,這可以通過計(jì)算存儲(chǔ)三元組的版本(不管其是副本或是其他)的(非故障)服務(wù)器的最低機(jī)器ID來實(shí)現(xiàn)。如果使用存儲(chǔ)同一三元組的版本或副本的其他節(jié)點(diǎn)的機(jī)器ID來存儲(chǔ)三元組,則僅通過參考存儲(chǔ)表和副本表來獲得該值。否則,可以根據(jù)在通過指令分配器選擇指示哪個(gè)節(jié)點(diǎn)存儲(chǔ)三元組的版本時(shí)所使用的映射函數(shù)來確定存儲(chǔ)同一三元組的版本或副本的其他存儲(chǔ)節(jié)點(diǎn)的ID。如果正在執(zhí)行恢復(fù)程序的服務(wù)器對(duì)于該三元組具有最低的ID,則該服務(wù)器會(huì)針對(duì)該三元組執(zhí)行恢復(fù)程序。否則,這被簡單地忽略,因?yàn)榱硪环?wù)器會(huì)處理該三元組。圖3示出了圖2的“層”如何與圖1的組件相聯(lián)系的示例。即,RDF層11包括存儲(chǔ)請(qǐng)求接收器12,存儲(chǔ)層15包括數(shù)據(jù)項(xiàng)生成模塊14、指令分配器16和冗余模塊18。故障檢測器19不屬于任一層,而是可以根據(jù)需要與任一或兩個(gè)層/組件交換數(shù)據(jù)并向所述任一或兩個(gè)層/組件發(fā)布指令的部件。在上述方面中的任一方面中,各種特征可以用硬件實(shí)現(xiàn)或?qū)崿F(xiàn)為運(yùn)行在一個(gè)或更多個(gè)處理器上的軟件模塊。一個(gè)方面的特征可以應(yīng)用至其他方面中的任何一個(gè)。本發(fā)明還提供了用于執(zhí)行本文所述方法中的任意一種方法的計(jì)算機(jī)程序或計(jì)算機(jī)程序產(chǎn)品,以及在其上存儲(chǔ)有用于執(zhí)行本文所述方法中的任意一種方法的程序的計(jì)算機(jī)可讀介質(zhì)。實(shí)施本發(fā)明的計(jì)算機(jī)程序可以存儲(chǔ)在計(jì)算機(jī)可讀介質(zhì)上,或者,所述計(jì)算機(jī)程序例如可以是以信號(hào)的形式如由互聯(lián)網(wǎng)網(wǎng)站提供的可下載的數(shù)據(jù)信號(hào),或者可以是以任何其他形式。
當(dāng)前第1頁1 2 3 
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1