劉寶珠 ,王 鑫,柳鵬凱,李思卓,張小旺,楊雅君
1(天津大學 智能與計算學部,天津 300354)
2(天津市認知計算與應用重點實驗室,天津 300354)
知識圖譜是人工智能的重要基石,是新一代人工智能由感知走向認知的重要基礎設施[1].RDF 圖和屬性圖是知識圖譜的兩個主流數據模型.一方面,資源描述框架(resource description framework,簡稱RDF)成為國際萬維網聯盟(W3C)表示知識圖譜的推薦標準,被以gStore[2]為代表的三元組數據庫廣泛采用;另一方面,屬性圖被以Neo4j[3],Dgraph[4]和HugeGraph[5]等為代表的圖數據庫廣泛采用為底層數據模型.
關系數據庫數十年來的發展,證實了統一的數據模型和查詢語言是數據管理技術發展的關鍵.目前,知識圖譜數據庫管理的問題是數據模型、存儲方案和查詢語言不統一.為此,我們研發了統一模型和語言的知識圖譜數據庫管理系統——KGDB(knowledge graph database)
KGDB 使用統一的存儲方案,可以支持存儲RDF 圖和屬性圖兩種不同的數據模型;根據實體的類型進行分塊存儲,同時運用基于特征集的聚類方法處理無類型實體,使之可以歸入某一語義相近的類型;分別提供RDF 圖和屬性圖上的查詢接口,可以使用SPARQL 和Cypher 查詢語言對同一知識圖譜進行操作,即允許兩種查詢語言的互操作.KGDB 遵循“統一存儲”-“兼容語法”-“統一語義”的技術路線:在底層存儲,使用相同的存儲方案處理不同的知識圖譜數據模型;在查詢表達上,兼容兩種面向不同知識圖譜數據模型的語法完全不同的查詢語言;而在查詢處理上,將兩種語法不同的查詢語言對齊到統一的語義,進而使用相同的查詢處理方法.
KGDB 的總體架構如圖1 所示,采用自底向上的系統構建方法.
(1)在用戶輸入層,用戶可輸入RDF 圖數據或者屬性圖數據;
(2)在系統處理階段,分為兩部分:①經過存儲關系轉化,依據存儲方案將數據轉化為以類型聚類的關系表,將原始的知識圖譜數據進行基于關系的存儲;②查詢處理部分,可以允許用戶使用兩種查詢語言對同一知識圖譜進行操作;
(3)在用戶界面層,用戶可以查看規范格式的圖模式查詢的結果.

Fig.1 Architecture of KGDB圖1 KGDB 總體架構圖
現有的知識圖譜數據庫管理系統因其面向的數據模型的不同,提出了不同的存儲方法.對于RDF 圖的存儲,可以分為三大類:(1)直接利用RDF 三元組的特性進行存儲,例如三元組表(triple table)、水平表(horizontal table)等;(2)根據 RDF 圖數據展現的數據類型特征進行存儲,例如屬性表(property table)、垂直劃分(vertical partitioning)[6]、六重索引(sextuple indexing)和DB2RDF[7]等;(3)依據RDF 圖數據的語義信息進行歸類存儲,例如特征集方法(characteristic sets)[8]、擴展的特征集方法(extended characteristic sets)[9]和R-Type[10]等.對于屬性圖的存儲,一般采用生存儲方案,例如Neo4j,JanusGraph[11],TigerGraph[12]等.
知識圖譜三元組數據與關系數據的最大不同是其模式的靈活性,這給傳統的存儲和查詢處理提出了新問題.為此,提出了一種基于特征集聚類的處理方法,根據實體的謂語組進行類型聚類,并將無類型實體數據依據其關系特征,歸入某類型中,從而解決知識圖譜的統一存儲問題.
在查詢語言方面,現有的知識圖譜數據庫管理系統因面向的數據模型不同,使用不同的查詢語言進行查詢處理:SPARQL 是RDF 圖上的查詢語言,Cypher 是屬性圖上的主要查詢語言.兩種查詢語言具有不同的語法,阻礙了在統一存儲方案上的查詢互操作.為此,進行SPARQL 和Cypher 語言的語義對齊,使之可以操作同一個知識圖譜,而無需區別知識圖譜的數據模型.
真實數據集和合成數據集上的大量實驗表明:KGDB 能夠高效地進行知識圖譜數據的存儲管理和查詢處理,優于現有RDF 數據庫gStore 和屬性圖數據庫Neo4j.
本文的主要貢獻如下:
(1)以關系模型為基礎,提出統一的知識圖譜存儲方案,根據數據的類型進行聚類,支持兩種知識圖譜主流數據模型(RDF 圖和屬性圖)的高效存儲;使用字典編碼方法減少數據的存儲空間,滿足知識圖譜數據的存儲和查詢負載需求;
(2)使用基于特征集的聚類方法,將無類型實體歸入謂語組相似的數據類型中,解決無類型實體數據的存儲問題,使統一存儲模型能夠應對靈活多變的半結構化數據;
(3)兼容RDF 圖數據模型的查詢語言SPARQL 和屬性圖數據模型的主流查詢語言Cypher 的查詢語法,進行兩種查詢語言的語義對齊,實現兩種查詢語言的互操作,可使用兩種語言操作同一個知識圖譜;
(4)在合成數據集和真實數據集上進行大量實驗,分別與現有的RDF 圖數據管理系統和屬性圖數據管理系統進行對比實驗,實驗結果驗證了KGDB 統一的存儲方案和統一語義的查詢處理的有效及高效性.
本文第1 節介紹相關工作.第2 節介紹預備知識.第3 節描述KGDB 使用的統一RDF 圖和屬性圖的存儲模型.第4 節闡述查詢語言互操作的方法.第5 節在真實數據集和合成數據集上進行實驗.第6 節對全文總結.
隨著知識圖譜的發展,各種知識圖譜存儲方案和查詢處理方法不斷涌現,本節將分別介紹兩種知識圖譜數據模型的現有存儲方案及查詢方法.知識圖譜數據規模的不斷增長,對存儲和查詢提出更高要求,分布式知識圖譜管理系統成為研究熱點之一[13,14].
1.1.1 RDF 圖數據存儲
(1)直接利用RDF 三元組特性
三元組表(triple table)將數據對應存儲到一個3 列結構的表中,采用三元組表存儲方案的代表是3store[15].水平表(horizontal table)在每一行存儲一個主語的所有謂語及對應的賓語,DLDB[16]系統采用了水平表存儲方案.屬性表(property table)將同類的主語在一個表中存儲,Jena[17]采用了屬性表存儲方案.垂直劃分(vertical partitioning)[6]對每一個謂語建立一個兩列的表,存儲該謂語連接的主語和相應的賓語.采用垂直劃分存儲方案的系統有SW-Store[18],TripleBit[19].六重索引(sextuple indexing)應用“空間換時間”策略,存儲三元組的全部6 種排列,并在首列上建立索引.使用六重索引的系統有RDF-3X[20]和Hexastore[21].DB2RDF[7]存儲方案不將表的列與某一謂語綁定,而是通過哈希的方式進行動態映射,并確保將相同謂語映射到同一列上,并通過額外的表處理多值謂語的問題.IBM DB2 數據庫系統采用了DB2RDF 存儲方案.
直接利用RDF 三元組特性的存儲方案最直觀簡單,但是存在著諸如稀疏性、空值等空間利用的問題.同一主語對應的謂語可能會有很多,不同主語之間關聯的謂語差異遠高于預期,即使同一類型的主語其謂語差異也不容忽視,這類存儲方案建立的關系表會有很多位置存為空值,稀疏的關系表嚴重降低存儲性能.
(2)依據RDF 數據語義信息
特征集(characteristic sets,簡稱CS)[8]存儲方法將RDF 數據按照星型結構進行劃分,具有相同謂語組的實體將會作為同一類型對待,大大減少了需要建立的表的數量.然而,特征集方法等同地對待所有謂語,很有可能導致大多數實體落入同一集合,不能很好地達到劃分目的.RDF-3X 系統實現了特征集方法[20].擴展的特征集(extended characteristic sets,簡稱ECS)[9]方法實施多層次的星型結構劃分,形成二級索引,加速查詢.但是,擴展的特征集方法也不能避免大多數實體落入同一集合的問題.R-Type[10]方法引入了本體規則,將謂語分為領域可推定的和非領域可推定的,并將包含領域可推定謂語的星型團結構中指定類型的三元組省略,不進行物理化存儲,節省存儲空間.在查詢過程中,包含領域可推定的星型結構可以直接映射到正確的團結構上,從而加速查詢.但R-Type 沒有對無類型實體提出劃分方法.SemStorm[22]系統采用了R-Type 方法.
依據RDF 數據語義信息的存儲方案雖然更加精確,能夠利用語義信息優化存儲,但是目前沒有見到基于關系的存儲方案,且大多數方案僅有原型系統,成熟度不足.關系數據庫發展至今,在事務管理、可擴展性等方面的研究基礎相對穩固,基于關系的存儲方案可以獲得更多的支持.
1.1.2 屬性圖數據存儲
(1)基于關系的存儲方案
SQLGraph[23]使用一種在關系數據庫中利用關系和JSON 鍵值存儲屬性圖的方案,將每個邊標簽散列到兩列,將邊的鄰接列表存儲在關系表中,其中一列存儲邊標簽,而另一列存儲值.AgensGraph[24]是一種底層基于關系模型的多模型圖數據庫,將屬性圖中的點和邊根據標簽分開存儲到關系表中,并將點、邊的屬性值信息以JSON 格式進行記錄.
因屬性圖的半結構化數據特征,上述基于關系的屬性圖存儲方案的靈活度不能完全滿足屬性圖的存儲要求,關系表一旦建立,修改其結構的代價巨大.而對于如今知識圖譜高達數十億點邊結構的數據規模,需要更加靈活的方案來提高其存儲效率.
(2)基于文檔的存儲方案
MongoDB[25]是一種基于文檔存儲的數據庫系統,旨在為Web 應用提供可擴展的高性能數據存儲解決方案,將數據存儲為一個文檔.數據結構由鍵值對組成,其文檔類似于JSON 對象,字段值可以進行嵌套.Neo4j[3]將所有數據存儲在節點和關系中,不需要任何額外的關系數據庫或NoSQL 數據庫來存儲數據,以圖的原生形式存儲屬性圖數據并應對各種查詢需求.
重慶市民政機關在制度建設、組織保障、人才培養和資金支持等方面大力推動婚姻家庭社會工作標準化的實施和發展。為了更好地解決居民需求,提高服務質量和水平,形成標準服務流程和體系,重慶市婚姻收養登記管理中心(以下簡稱“重慶市婚管中心”)對居民婚姻家庭進行了多次需求摸底調查,發現居民對婚姻家庭方面的需求主要集中在子女教育、婚姻家庭法律法規知識、結婚及生育法定程序、優生優育、夫妻相處技巧和家庭理財知識等方面(具體情況見圖4)。
基于文檔的屬性圖存儲方案常被應用在分布式環境下,而相對于單機環境,分布式對數據的存儲提出了更高的要求,而使用文件進行大規模數據的存儲效率不足以滿足數據規模日益增長的屬性圖的存儲和查詢要求.目前,知識圖譜的存儲方案基本都面向某一種類型的知識圖譜并且成熟度不足.為此,有必要面向知識圖譜的兩種主流數據模型開發統一的、基于關系的高效存儲方案.
1.2.1 RDF 圖數據查詢
Blazegraph[26]是一個基于RDF 三元組庫的圖數據庫管理系統,其內部實現技術是面向RDF 三元組和SPARQL 查詢語言的.Jena[17]是語義Web 領域主要的開源框架和RDF 三元組庫,較好地遵循了W3C 標準,支持SPARQL 查詢處理,具有一套基于規則的推理引擎,用以執行RDFS 和OWL 本體推理任務.gStore[2]使用RDF 圖對應的簽章圖并建立VS 樹索引,支持SPARQL 查詢處理.Virtuoso[27]是支持多種數據模型的混合數據庫管理系統,可以較為完善地支持W3C 的Linked Data 系列協議.RDF4J[28]前身是Aduna 公司開發的Sesame 框架,支持SPARQL 1.1 的查詢和更新語言,能夠進行RDF 數據的解析、存儲、推理和查詢.RDF-3X[29]為RDF 數據專門設計了壓縮物理存儲方案、查詢處理和查詢優化技術.AllegroGraph[30]系統對語義推理功能具有較為完善的支持.GraphDB[31]實現了RDF4J 框架的SAIL 層,使用內置的基于規則的“前向鏈(forward-chaining)”推理機,對RDF推理功能擁有良好的支持.
1.2.2 屬性圖數據查詢
Neo4j[3]是目前流行程度最高的圖數據庫產品,基于屬性圖模型,支持Cypher 查詢語言.AgensGraph[24]基于關系模型存儲屬性圖,在PostgreSQL 內核之上構建Cypher 語言的處理層.JanusGraph[11]是開源分布式圖數據庫,存儲后端與查詢引擎分離,具備基于MapReduce 的圖分析引擎,可將Gremlin[32]導航查詢轉化為MapReduce 任務.OrientDB[33]主要面向圖和文檔數據存儲管理的需求設計,支持擴展的SQL 和Gremlin 用于圖上的導航式查詢,支持類似Cypher 語言查詢模式的MATCH 語句.Cypher for Apache Spark[34]提供基于Spark 框架的Cypher引擎.
目前,兩種知識圖譜數據模型擁有各自的查詢語言、語法和語義,雖然在具體的系統上分別進行了優化設計,但不利于知識圖譜查詢的多樣性,故亟需研發一種既支持SPARQL 又支持Cypher、具有語義互操作能力的系統.
本節將詳細介紹相關背景知識,包括RDF 圖和屬性圖的定義.表1 給出了本文使用的主要符號及其含義.

Table 1 List of notations表1 符號列表
定義1(RDF 圖).設U是統一資源標識符的有限集合,L是字面量的有限集合,B是空結點的有限集合.元組t=(s,p,o)∈U×U×(U∪L∪B)稱為RDF 三元組(在本文中不考慮實體為空結點的情況),三元組t=(s,p,o)表示資源s和資源o有關系p,或者資源s的屬性p的值為o.其中,s,p和o分別表示主語、謂語和賓語.RDF 圖G是三元組t的有限集合.用V,E,Σ分別表示RDF 圖G的頂點、邊和標簽的集合.正式定義為:V={s|(s,p,o)∈G}∪{o|(s,p,o)∈G},E?V×V且Σ={p|(s,p,o)∈G}.函數lab:E→Σ返回圖G中邊的標簽.
例1:圖2 所示的RDF 圖示例描述了一個音樂知識圖譜,包括作曲家(Composer)Beethoven、鋼琴演奏家(Pianist)Lang Lang 和音樂(Music)Fate Symphony 等資源,這些資源上的若干屬性以及資源之間的作曲(composes)和演奏(plays)聯系.在RDF 圖示例中.使用橢圓表示資源,矩形表示字面量,連接頂點之間的有向線段表示頂點之間的關系,起點是主語,邊標簽是謂語,終點是賓語.RDF 內置謂語rdf:type 指定資源所屬類型,如三元組(Beethoven,rdf:type,Composer)表示Beethoven 的類型是作曲家.
定義2(屬性圖).屬性圖G=(V,E,η,src,tgt,λ,γ),其中:V表示頂點有限集合;E表示邊的有限集合且V∩E=?;函數η:E→(V×V)表示邊到頂點對的映射,如η(e)=(v1,v2)表示頂點v1與頂點v2之間存在一條有向邊e;函數src:E→V表示邊到起始頂點的映射,例如src(e)=v表示邊e的起始頂點為v;函數tgt:E→V表示邊到終結頂點的映射,例如tgt(e)=v表示邊e的終結頂點為v;函數λ:(V∪E)→L為頂點或邊與標簽的映射(其中,L表示標簽集合),如v∈V(或e∈E)且λ(v)=l(或λ(e)=l),則l為頂點v(或邊e)的標簽;函數γ:(V∪E)×K→Val(其中,K為屬性集合,Val是值的集合)表示頂點或邊的關聯屬性,如v∈V(或e∈E),property∈K且γ(v,property)=val(或γ(e,property)=val)表示頂點v(或邊e)上屬性property的值為val.

Fig.2 An RDF graph example圖2 RDF 圖示例
例2:圖3 給出了圖2 中音樂知識圖譜的屬性圖示例.屬性圖中每個頂點和邊都具有唯一id(如頂點v1、邊e1),頂點和邊均可具有標簽(如頂點v1上的標簽Composer),頂點和邊上均可具有屬性,每個屬性由屬性名和屬性值的鍵值對組成(如頂點v1上的屬性name=“Beethoven”).

Fig.3 A property graph example圖3 屬性圖示例
本節主要介紹統一的知識圖譜存儲方案,此方案基于關系模型實現對RDF 圖和屬性圖的兼容表示.之后,根據所提出的存儲方案,采用基于特征集的聚類算法處理無類型數據,以更好地支持知識圖譜數據存儲..
統一存儲方案按照實體的類型將其存儲到對應頂點類型表vn中(n∈[1,i]),按照關系的類型將其存儲到對應邊類型表em(m∈[1,j])中,其中,i,j分別表示頂點和邊類型的數量.不同的關系表以實體或關系的類型來命名.用于存儲實體的關系表包含2 列,分別存儲實體的唯一標識id(主鍵)和實體所擁有的屬性property(由屬性名和屬性值的鍵值對所構成).用于存儲實體間關系的關系表包含4 列,分別存儲邊的唯一標識id(主鍵)、邊的起始頂點標識start、終結頂點標識end 以及邊所擁有的屬性property(由屬性名和屬性值的鍵值對所構成).頂點類型表和邊類型表根據知識圖譜數據中實體和關系的類型進行進一步地劃分,同類型的頂點或者邊存儲在同一個關系表中,這樣避免了因單個關系表數據量過大而導致的數據訪問性能較低的問題.
3.1.1 RDF 圖到統一存儲模型的映射
RDF 圖數據中有3 種不同類型的三元組,下面給出三元組分類的定義.
定義3(三元組分類).令C={mem,prop,edge}表示三元組的類別,分別指類型成員三元組、屬性描述三元組和動作三元組.函數?:T→C是三元組到三元組類別的映射:

根據定義3 以及例1 和例2,將圖2 和圖3 中的事實以三元組的形式表示,并應用三元組分類方法,可知?((Beethoven,rdf:type,Composer))=mem,?((Beethoven,birthDate,1770-12-16))=prop且?((Lang Lang,plays,Fate Symphony))=edge.
對于RDF 三元組t=(s,p,o),需要根據RDF 圖G中頂點標簽和邊標簽創建相應的頂點類型表和邊類型表.根據三元組的不同形式,使用下面的轉換規則將其分別進行映射,將不同的實體和關系存儲到相應的頂點類型表和邊類型表中.
規則1.對于任意三元組t=(s,p,o),若?(t)=mem,則將id 為s的元組插入到表名為o的頂點類型表中.
規則2.對于任意三元組t=(s,p,o),若?(t)=prop,則將p,o以鍵值對的形式插入到頂點類型表中實體s對應的property 列中.
規則3.對于任意三元組t=(s,p,o),若?(t)=edge,則在表名為p的邊類型表中插入一條start 為s、end 為o的記錄.
3.1.2 屬性圖到統一存儲模型的映射
屬性圖因其對頂點和邊上的屬性提供內置的支持,在將其映射到統一存儲模型時相對容易,應用下列規則將屬性圖數據映射到統一存儲模型上.
規則4.對于屬性圖數據中的實體,根據其頂點標簽λ(v),為實體v賦唯一的數值id 并插入到頂點類型表λ(v)的id 列,同時將其屬性property和屬性值γ(v,property)的鍵值對插入到property 列中.
規則5.對于屬性圖數據中的關系,根據其邊標簽λ(e),為關系e賦唯一的數值id 并插入到邊類型表λ(e)的id 列中,同時將其屬性property和屬性值γ(e,property)的鍵值對插入到property 列中,將頂點v1的id 插入到start列中,將頂點v2的id 插入到end 列中(其中,η(e)=(v1,v2)∧src(e)=v1∧tgt(e)=v2).
在屬性圖中,頂點關系表中的id 值僅起到標識作用,而不具有實際意義;而RDF 圖中id 表示對應實體的URI,具有實際意義.為了進行統一的表示,將實體v的URI 值vuri作為一個新的屬性,添加到結點關系表中的property 列中,即添加γ(v,uri)=vuri.
例3:根據上述的存儲方案,將圖2、圖3 介紹的音樂知識圖譜示例進行相應轉換,得到圖4 基于關系的統一知識圖譜存儲方案.不同的實體按照其類型(作曲家、鋼琴家、音樂)存儲到頂點類型表中,不同的關系按照類型(作曲、演奏)存儲到關系類型表中.圖中箭頭表示外鍵關系.

Fig.4 Unified storage scheme for knowledge graph圖4 知識圖譜統一存儲方案
知識圖譜數據根據所提出的統一存儲方案,依據實體和關系的類型進行分別存儲.在示例的知識圖譜中未給出邊屬性,因此邊表中的property 列為空值.屬性圖和RDF 圖對實體或者關系的類型信息均提供了內置的支持,屬性圖由標簽指定,RDF 圖由內置的rdf:type 指定.這種根據類型對頂點和邊進行劃分并進行分別存儲管理的方式是相對合理的,能夠在一定程度上解決現有知識圖譜存儲方案中存在的數據冗余與數據稀疏問題.
在建立關系表之后,各種操作都將以關系表名為基本對象,給出操作關系表的函數:存儲模型建立的關系表集合是R={r1,r2,…,rn},對應的關系表的表名集合是X={x1,x2,…,xm};函數name:R→X返回某個關系表的表名;函數rel:T→R返回某個實體t所在的關系表,其中,T為實體集合且t∈T.
在知識圖譜中,兩節點之間有可能存在多種謂語關系,即多重屬性.對于多重屬性的存儲問題,KGDB 使用第3.1 節中介紹的方法,針對單個主語實體,存儲多個屬性鍵值對,其中,屬性鍵對應不同的謂語關系,屬性值對應同一個實體.大多數現有的知識圖譜數據存儲方案使用字典編碼的方法,將URI 或者字面量映射到整數標識符,即id.映射表有效地實現了字符串到id 之間的轉換,并將數據庫的空間開銷降至最低.KGDB 采用了與大多數現有知識圖譜存儲方案類似的字典編碼方法,壓縮存儲方案所需的空間資源.
上一節介紹的統一存儲模型中,利用頂點和邊的類型對知識圖譜數據進行劃分,并存儲到相應的頂點表和邊表中.但此方案并沒有考慮無類型的實體的存儲.對于無類型的實體,基本的存儲方案將所有無類型的實體等同對待,所有無類型的實體存儲在一個關系表中.這種統一存儲的方法,一方面在處理無類型實體數量較多的數據集時,將導致單個關系表過大,降低查詢的效率;另一方面,無類型的實體之間并沒有關聯,無語義信息,這與將相同或靠近語義的實體存儲在相近空間的初衷相悖.
對于未指定類型的實體,基于特征集的聚類算法,將其劃分到一個最相近的給定類別中.層次聚類算法可以根據某種距離函數給出結點之間的相似性,并按照相似度逐步將結點進行合并,當達到某一條件時,合并終止.在本節中,將給出實體的特征集、特征集的距離等定義,用于測定實體之間的相似性,從而解決無法對無類型實體進行存儲的問題.
3.2.1 實體特征集
RDF 圖中使用多個三元組來描述一個實體所擁有的特征.實體的特征集[8]可定義為RDF 圖中表示該實體的頂點所發出的邊的名稱的集合.下面給出實體特征集的形式化定義.
定義4(實體特征集).對于每個出現在知識圖譜數據集D中的實體s,定義其特征集I如下:

例4:在某個RDF 數據集中,描述《老人與海》這本書的實體s1共使用了3 個三元組,分別為(s1,title,“The Old Man and the Sea”),(s1,author,Hemingway)以及(s1,year,“1951”),則s1的特征集是IC(s1)={title,author,year}.
3.2.2 實體簇及其距離定義
實體簇C中包含多個實體,為了更好地表示一個簇中所包含實體的屬性的特征,對任意一個包含若干個實體的簇C,定義hist(C)來表示簇中實體的特征集的統計信息,記錄簇中包含的全部實體所擁有的屬性的個數為m,則hist(C)可以定義為每個屬性與它出現次數的鍵值對的集合:

其中,propertyi表示第i個屬性,counti表示第i個屬性在簇C中出現的次數.進而可以通過這一統計信息定義兩個包含若干實體的簇的距離:對于兩個簇Cj和Ck,它們之間的距離可以表示為其實體統計信息之間的距離,即:

其中,
?n是兩個簇中所含不同屬性的總個數;
?bi表示第i個屬性是否同時出現在兩個簇中:若是,則為0;否則為1;
?count(Cj,pi)和count(Ck,pi)分別表示在簇Cj和Ck中,第i個屬性pi對應的個數.
根據公式(4),兩個簇之間的距離等于不同時出現在兩個簇中的屬性所對應的出現次數之和.屬性的出現次數可以說明該屬性對簇的重要程度,如對于書籍類型的實體來說,其所在的簇中作者和標題屬性所對應的數值較高.以屬性次數的加和作為簇間距離,可以衡量兩個簇之間的相似程度.
3.2.3 基于特征集的實體聚類算法
基于實體特征集、包含多個實體的簇的特征集統計信息以及簇間距離的定義,可以對基本的統一存儲方案進行優化.基于層次聚類算法,提出一種基于實體類型的實體聚類算法,將未給定類型的實體通過聚類的方法劃分到一個已知的類型中.
對于實體s∈S,其中,S為實體集合,函數haveType:S→{TRUE,FALSE},返回實體的有無類型情況:若s為有類型實體,則返回真;否則返回假.函數getType:S→TYPE返回某個實體的類型信息,其中,TYPE為實體類型集合.
為了將兩個實體簇進行合并,需要計算兩個實體簇之間的距離,并找到距離最相近的兩個實體簇進行合并.下面給出尋找距離最近實體簇下標的函數:對于實體簇集合C={C1,C2,…,Cn},函數findMin(C)兩兩計算實體簇間距離,并給出距離最近的兩個不同實體簇的下標.
在聚類的過程中,將每個實體作為一個單獨的簇,并根據實體的特征集的相似程度自底向上進行簇的合并操作.合并過程中,需要保證不對兩個包含不同類型實體的簇進行合并.
算法1 給出了基于特征集的實體聚類算法,根據實體的特征集進行層次聚類,可以將實體按照所擁有的特征劃分到不同的簇中,每個簇內的實體屬性相似,即每個簇內的實體趨近于擁有相同的類型.算法首先將實體類型相同的實體合并到一個簇中,將每個未指定類型的實體各自作為一個單獨的簇(第2 行~第8 行),根據簇間的距離DCScluster進行自底向上地合并,在已知的實體簇集合C中找到簇間距離最小的兩個簇Ci和Cj,即令DCScluster(Ci,Cj)的值最小,且要求這兩個簇不都為已經給定類型的實體簇(第10 行~第12 行),合并兩個簇,并將合并后的簇的類型指定為其中已知類型的簇的類型Ci,同時更新合并后的簇的統計信息hist(Ci)(第14 行、第15行).重復合并簇的操作,直到沒有符合條件的兩個簇為止.經過實體聚類,包含未指定類型實體的簇將被合并到包含指定類型的實體的簇中,且每個簇中的實體的類型相同.
算法1.三元組無類型實體聚類.
輸入:實體集合S;
輸出:實體簇集合C.

例5:下面通過一個例子對聚類的過程進行說明.
在聚類開始時,rdf:type 為書籍的實體有s1和s2,合并到簇C1中,其中,
?IC(s1)={title,author,year};
?IC(s2)={author,year};
?hist(C1)={(title,1),(author,2),(year,2)}.
已知rdf:type 為電影的實體有s3和s4,合并到簇C2中,其中,
?IC(s3)={title,director,year};
?IC(s4)={director,year};
?hist(C2)={(title,1),(director,2),(year,2)}.
最后,沒有rdf:type 的實體s5作為一個簇C3:
?IC(s5)={title,director};
?hist(C3)={(director,1)}.
故簇C1和C3之間的距離DCScenter(C1,C3)=6,C2和C3之間的距離DCScenter(C2,C3)=3.
未指定類型的實體s5所在的簇C3與電影實體所在的簇C2之間的距離更近,因此將C3合并到C2中,即將實體s5根據所設計的存儲方案存儲到類型為“電影”的頂點表中.
定義5(最優實體簇集合).實體簇集合C滿足:(1)集合中的所有實體簇都包含具有明確類型的實體,且兩個實體簇不包含相同類型的實體;(2)集合中的所有實體的最近距離實體都在其所在的實體簇中.
下面給出算法1 的正確性證明及復雜度證明.
定理1.給定實體集合S,算法1 能夠給出最優的實體簇集合C.
證明:算法1 首先將根據數據集中數據本身的特點進行數據類型歸類:若實體s為有類型數據,則將其歸入實體s對應類型τ的實體簇Cτ中,并將Cτ合并到實體簇集合C中;若實體s為無類型數據,則將其分別歸入一個單獨的用于處理無類型數據的實體簇C0中,在這一步中,能夠確保定義5 中的第1 條要求,經過第一輪迭代,各個實體都將歸并到某個實體簇中.在后續的迭代過程中,每輪迭代都將會兩兩計算實體簇C1和C2之間的距離DCScluster(C1,C2),并在所有的距離中找到距離最小的兩個實體簇Ci和Cj,其中,要求i≠j.若找得到滿足條件的兩個實體簇,則進行這兩個實體簇的合并;否則聚類過程結束.在首輪迭代之后的迭代,確保了定義5 中的第2 條要求.最終找到最優的實體簇集合C.證畢.□
算法1 的時間復雜度由兩部分組成:(1)算法經過e次迭代;(2)在每次迭代中,需要兩兩對比實體簇距離,在最壞情況下,每個實體都是單獨的實體簇,此時兩兩計算實體簇距離的復雜度為O(s2).因此,算法1 的時間復雜度為O(es2).
SPARQL 是RDF 圖上的查詢語言,Cypher 是屬性圖之上的主要查詢語言.兩種不同的查詢語言在語法上有較大差異,KGDB 以第3 節所介紹的統一的存儲方案為基礎,建立在存儲方案之上的查詢過程,可以使用兩種不同的查詢語言查詢同一個知識圖譜,從而達到查詢語言互操作的目的.在文獻[35,36]給出了RDF 和Cypher 的形式語義,KGDB 系統將SPARQL 和Cypher 語言看作“統一查詢語義”的兩種不同“語法視圖”,關系模型被作為物理存儲模型,將RDF 圖和屬性圖進行統一存儲,同時對齊SPARQL 語言和Cypher 語言的查詢語義.
知識圖譜查詢處理的最基本算子即是基本圖模式匹配查詢(basic graph pattern,簡稱BGP),這類查詢可以看作子圖匹配或者子圖同構查詢.已有的各種知識圖譜查詢語言均以子圖匹配作為核心算子.雖然圖數據上的子圖匹配查詢算法已有很多,但卻缺少同時具備系統性和高效性的面向大規模知識圖譜的子圖匹配查詢處理算法.KGDB 基于SPARQL 和Cypher 語言處理子圖匹配查詢,需要建立起兩種語言的聯系,將同樣的查詢意圖轉化為不同的兩種查詢表達式,同時保障兩種查詢語言處理結果的正確性與高效性.
在本節中將會用到關系代數中的幾個經典算子,如ρ(重命名)、π(投影)、σ(選擇)、? (連接)、×(笛卡爾積)、∩(交)和∪(并)等.使用連接列表L表示抽象語義,L={r1,r2,…,rn},其中,r1,…,rn表示連接列表中的n個關系表.對關系表r,r→property表示關系表中所有元組屬性property的值.
首先,給出RDF 圖基本圖模式匹配查詢的形式化定義.
定義6(RDF 圖基本圖模式匹配).RDF 圖G上的基本圖模式查詢Q的語義定義為:
(1)μ是從V(Q)中的頂點到V中頂點的映射;
(2)(G,μ)?Q當且僅當對任意(si,pi,oi)∈Q滿足:i)si和oi可以分別匹配μ(si)和μ(oi);ii)(μ(si),μ(oi))∈E;iii)lab(μ(si),μ(oi))=pi;
(3)Ω(Q)是使(G,μ)?Q滿足的μ的集合,也就是圖G上基本圖模式查詢GQ的答案集合.
例6:圖5 是一個RDF 基本圖模式匹配查詢,查詢Q中共包含兩條三元組t1=(Beethoven,composes,?music)和t2=(Beethoven,birthDate,“1770-12-16”).兩條三元組構成一個簡單的星型結構,它所要查詢的是Beethoven 創作的所有作品.在圖2 的RDF 圖中執行這個查詢,?music 匹配到Fate Symphony 上,作為一個變量,可以在查詢的結果子句中要求將其輸出.

Fig.5 A basic graph pattern matching query example圖5 基本圖模式查詢示例
最簡單的SPARQL 查詢語句包括兩個部分:SELECT 關鍵字引導的結果子句和WHERE 關鍵字引導的約束子句.KGDB 根據SPARQL 查詢語句的語法進行語義解析,生成語義樹.根據SPARQL 查詢語句中每部分的語義,使用下面的轉換規則自底向上構建關系代數形式的查詢語義樹.
規則6.對于出現在SPARQL 查詢約束子句中的任意三元組t=(s,p,o),若?(ti)=mem,則在語義樹的底層添加一個葉子結點rs=ρs(r),其中,name(r)=o.即,把關系rs添加到連接列表L中.
規則7.對于出現在SPARQL 查詢約束子句中的任意三元組t=(s,p,o),若?(t)=prop,已知rs∈L,則將L中的rs更改為原rs與屬性約束σr→p=o(r)(其中,rel(s)=r)的交.
規則8.對于出現在SPARQL 查詢約束子句中的任意三元組t=(s,p,o),若?(t)=edge,若rs∈L,則將L中的rs更改為施加連接約束后的rs;若ro∈L,則將L中的ro更改為施加連接約束后的ro.對于主語(賓語)為URI 的情況,對謂語對應的關系表rp施加選擇約束
規則9.對于出現在SPARQL 查詢結果語句中的任意變量var,添加投影約束:πvar.id,var.property(rfinal),其中,rfinal為連接列表L中的所有關系進行笛卡爾積后得到的最終關系結果.
對應的,SPARQL 語句到查詢語義的轉化算法如下.
算法2.SPARQL 基本圖模式匹配查詢處理.
輸出:圖模式匹配查詢的結果關系rresult.


算法2 遍歷SPARQL 查詢中涉及的三元組,針對不同類型的三元組做出不同的應對措施,最終形成關系代數表示的查詢語義.與存儲方案相似,查詢處理也將三元組ti=(si,pi,oi)分為3 種類型:表明實體類型的?(ti)=mem、賓語部分為字面量的?(ti)=prop和其他形式(?(ti)=edge)的三元組.當處理mem類型的三元組時(第4 行、第5 行),在連接列表中添加表名為該條三元組賓語oi的關系表,并將這個關系表重命名為該條三元組的主語si(在SPARQL 查詢中,這種mem類型的三元組的主語部分通常是變量,且在同一條查詢中的其他的三元組中使用相同的變量代稱);當處理prop類型的三元組時(第6 行~第9 行),向約束集合中添加一條屬性約束;當處理其他類型的三元組(第10 行~第24 行),即edge類型的三元組時,添加連接約束.第25 行、第26 行處理所有投影約束,將用戶要求的查詢結果進行最終輸出.
定理2.給定SPARQL 查詢中三元組集合T和關系表集合R,算法2 輸出的結果是正確的.
證明:算法2 遍歷SPARQL 查詢中涉及的所有三元組,并根據每條三元組ti=(si,pi,oi)∈T的三元組類別,給出對應的方案.參見定義3 可知,三元組的語義類型僅有3 種,即算法2 對于所有語義的三元組,均可以找到對應的解決方案,即給出正確的關系表的連接列表L.另一方面,結果子句中出現的所有變量,都在約束子句中出現,添加投影約束僅改變最終輸出結果,不影響算法的正確性.證畢.□
算法2 的時間復雜度由兩部分組成:(1)為了生成關系表的連接列表L,算法2 需要遍歷SPARQL 查詢中所有三元組,并對應給出解決方案,其時間復雜度為O(n);(2)向關系表的連接列表L添加新的條目的時間復雜度是常數的,即O(k).因此,算法2 的時間復雜度為O(kn).
與SPARQL 查詢處理類似,首先給出屬性圖上的模式匹配查詢的形式化定義.
定義7(屬性圖模式).α=(a,Lab,Map)為一個點模式,其中:a∈A∪{nil}為點模式可選的名字,A為名字的集合,nil為空;Lab為可空的點的有限標簽集合,且Lab?L,L為屬性圖的標簽集合;Map為可空的屬性集合K到屬性值Val的映射.β=(d,Lab,a,Map)為一個邊模式,其中,d∈{←,→}表示邊模式的方向;Lab為可空的邊的有限標簽集合,且Lab?L;a∈A∪{nil}為邊模式可選的名字;Map為可空的屬性集合K到屬性值Val的映射.ω=α1β1α2β2…βn?1αn為一個路徑模式,其中,αi為點模式,βi為邊模式.
定義8(屬性圖模式匹配).屬性圖上的圖模式匹配可以遞歸定義如下[36].
(1)對點模式α=(a,Lab,Map),其在屬性圖G上的模式匹配為(v,G,μ)?α,則滿足a為nil或者μ(a)=v,Lab?λ(v)且[[γ(v,k)=Map(k)]]G,μ成立;
(2)對于長度為m=0,即只包含一個點的路徑P,在屬性圖G上的模式匹配為(v?P,G,μ)?αβω,則滿足:
a)a為nil或者μ(a)=list(?);
b)(v,G,μ)?α并且(P,G,μ)?ω;
(3)對于長度為m≥1 的路徑P,在屬性圖G上的模式匹配為(v1e1v2…emvm+1?P,G,μ)?αβω,則滿足下列條件:
a)a為nil或者μ(a)=list(e1,…,em);
b)(v1,G,μ)?α并且(P,G,μ)?ω;
c)Labβ?{λ(e1)∪λ(e2)∪…∪λ(em)};
d)[[γ(ei,k)=Map(k)]]G,μ成立;
則對于Cypher 查詢Q,其結果集為

與SPARQL 查詢語句相似,最簡單的Cypher 查詢也主要包括兩個部分:MATCH 關鍵字引導的約束子句和RETURN 關鍵字引導的結果子句.KGDB 使用下列轉換規則對Cypher 語句進行處理.
規則10.對于出現在Cypher 查詢語句中的所有點模式α=(a,Lab,Map),向關系表的連接列表L中添加n個關系表r1,…,rn,其中,Lab?{rel(r1),rel(r2),…,rel(rn)},并施加屬性約束,其中,domain(Map)指Map的定義域,range(Map)指Map的值域.
規則11.對于出現在Cypher 查詢語句中的所有邊模式β=(d,Lab,a,Map),向L中關系表施加連接約束:

規則12.對于出現在Cypher 查詢語句RETURN 子句中所有的變量var,添加投影約束:πvar.id,var.property(rfinal),其中,rfinal為連接列表L中的所有關系進行笛卡爾積后得到的最終關系結果.
可以看出:對照KGDB 統一的存儲模型,Cypher 語義的轉化相較SPARQL 更加容易,SPARQL 需要進行三元組的分類,根據具體分類來進行關系代數的映射;而Cypher 直接根據查詢中每一部分的所屬集合即可確定語義.
定理3.運用上述規則10 到規則12,可以正確地將Cypher 查詢語句轉化為關系代數表示的查詢語義.
證明:基本的Cypher 語句中的MATCH 子句的轉化在規則10 和規則11 中完成,RETURN 子句的轉化在規則12 中定義.規則10 和規則11 分別針對MATCH 子句中的點模式和邊模式進行約束轉換:(1)當遇到帶標簽的點模式α=(a,Lab,Map)時,向關系表的連接列表L中添加n個關系表r1,…,rn,其中,Lab?{rel(r1),rel(r2),…,rel(rn)},并施加屬性約束,其中,domain(Map)指Map的定義域,range(Map)指Map的值域;(2)當遇到帶標簽的邊模式β=(d,Lab,a,Map)時,添加兩條連接約束.規則12 中出現的所有變量都須在MATCH 子句中出現過,并在執行計劃中對應添加投影約束πvar.id,var.property(rfinal),其中,rfinal為連接列表L中的所有關系進行笛卡爾積后得到的最終關系結果.對于兩個子句中可能出現的所有模式匹配內容,都可以找到對應的查詢解決方案.證畢.□
例7:圖6 是一個屬性圖模式匹配查詢,它查詢的是音樂家Beethoven 創作的所有作品.在圖3 的屬性圖中執行這個查詢,可以得到虛線框標記的結果.

Fig.6 A basic pattern matching query example for Cypher圖6 Cypher 圖模式匹配查詢舉例
圖7 展示了將SPARQL 查詢語句與Cypher 查詢語句進行語義對齊的過程.兩種查詢語言可以使用完全不同的語法表達相同的語義,相同的查詢意圖可以被分別表示為兩種不同的查詢語言.兩種查詢語言應用各自的轉換規則,可以轉換成相同的關系代數表示的查詢語義,為后面的查詢執行提供了統一的語義.

Fig.7 Semantic alignment圖7 語義對齊
在統一的存儲模型之上提供兩種查詢語言接口,可以在解決具體問題時為使用者提供更多選擇,進行兩種查詢語言的語義對齊,實際上是對兩種語言的擴展.
例8:對于圖7 中的查詢語句舉例,下面給出兩種語言分別的轉化過程.
(1)SPARQL 查詢轉化
運用第4.1 節介紹的規則,轉化SPARQL 查詢語句的過程如下.
a)對三元組t1=(?x,rdf:type,Composer)和t4=(?y,rdf:type,Music),運用規則6,可知?(t1)=?(t4)=mem,則將對應的關系表Composer 和Music 加入到連接列表中,并將其重命名ρx(Composer),ρy(Music);
b)對三元組t2=(?x,birthDate,“1770-12-16”),運用規則7,可知?(t2)=prop,則向重命名后的表x添加約束條件σx→birthDate=“1770-12-16”(x);
c)對三元組t3=(?x,composes,?y),運用規則8,可知?(t3)=edge,則添加關系表之間的連接約束:

d)對結果子句中的所有變量,即x和y,運用規則9,添加投影約束πx.id,x.property,y.id,y.property(rfinal),其中,rfinal為對連接列表中所有關系表施加相應約束后做笛卡爾積的關系表.
至此,該條SPARQL 語句成功轉換為圖7 中的語義樹.
(2)Cypher 查詢轉化
運用第4.2 節介紹的規則,轉化Cypher 查詢語句的過程如下.
a)對點模式α=({x,y},{Composer,Music},birthDate→“1770-12-16”),運用規則10,向連接列表中添加關系表Composer 和Music,并進行相應重命名,將其加入到連接列表L中:ρx(Composer)和ρy(Music).并添加約束條件σx→birthDate=“1770-12-16”(x);
b)對Cypher 語句中的邊模式β=(→,{composes},nil,{?}),則根據規則11,添加相應的連接約束:

c)對RETURN 子句中的所有變量,即x和y,根據規則12,添加投影約束πx.id,x.property,y.id,y.property(rfinal),其中,rfinal為對連接列表中所有關系表施加相應約束后,做笛卡爾積的關系表.
根據本節介紹的SPARQL 和Cypher 查詢語言相應的查詢語句轉化規則,能夠將兩種查詢語言轉化為相同的使用關系代數表達的抽象語義樹(查詢語言的語義對齊方法的正確性分析在定理2 和定理3 中分別給出),使得KGDB 在兼容兩種語法完全不同的查詢語言的前提下統一了查詢的語義.這為查詢處理后面的優化過程提供了便利,并為用戶在同一個知識圖譜上的查詢提供了更多選擇.
本節在合成數據集和真實數據集上驗證統一存儲方案的高效性和和查詢語言的互操作性,并且與RDF 三元組庫gStore[2]和屬性圖數據庫Neo4j[3]進行比較.
本文使用的實驗平臺為單節點服務器,節點配置主頻為2.5GHz 的Intel(R)Xeon(R)Platinum 8255C 八核處理器,其內存大小為32GB,硬盤大小為100GB,使用Linux 64-bit CentOS 7.6 操作系統.
KGDB 以開源屬性圖數據庫AgensGraph 為后端.使用的Neo4j 版本為4.1.0 社區版,使用neosemantics 插件4.0.0.1 版本,以在Neo4j 中支持RDF 圖的存儲,使用的gStore 版本為0.7.2.本文進行三個系統的存儲效率的對比實驗,并在KGDB 和gStore 系統上進行SPARQL 基本圖模式查詢對比實驗,在KGDB 和Neo4j 上進行Cypher查詢對比實驗.從存儲空間、存儲時間和查詢效率上進行系統的全面評估.
本文使用的數據集包括LUBM[37]標準合成數據集以及DBpedia[38]真實數據集.LUBM 允許用戶定義數據集的大小,本文使用了五個不同規模的LUBM 數據集(即LUBM10,LUBM20,LUBM30,LUBM40 和LUBM50)進行實驗測試和比較;DBpedia 數據集是從維基百科中提取實體關系生成的一個真實數據集.本次實驗中,所有數據集均以N-Triple 格式表示,表2 給出了實驗數據集的具體統計信息.

Table 2 Datasets表2 數據集
在LUBM 數據集上執行的查詢來自LUBM 提供的14 個標準查詢中的8 個(即Q1~Q6,Q11 和Q14).其中,
? Q1~Q3 和Q14 為不涉及推理的SPARQL 查詢:(1)Q1 輸入數據量大,選擇度高;(2)Q2 為涉及3 個實體的三角查詢;(3)Q3 查詢涉及的類型數據量大;(4)Q14 輸入數據量大,選擇度低;
? Q4~Q6 和Q11 為涉及到推理的查詢.
gStore 并不支持RDF 圖上的推理功能,而Neo4j 也僅僅可以需要通過插件的方式支持推理功能.同樣的,KGDB 也尚未支持推理查詢,故本文僅在gStore 和KGDB 上進行推理查詢返回空結果的查詢效率對比實驗.LUBM 數據集中涉及推理的查詢可以簡單分為4 類:(1)Q4~Q9 涉及到subClassOf 層次類型;(2)Q5 包含subPropertyOf 層次關系,查詢中包含的內容需要借助本體信息才可直接執行;(3)Q6~Q10 需要進行層次類型推理,即查詢中涉及的實體層次類型關系在本體信息中也未直接給出;(4)Q11~Q13 需要進行更加復雜的關系推理,即除了subClassOf 和subPropertyOf 關系之外的關系推理.本文在LUBM 數據集上的實驗部分在4 類推理查詢中各選擇一個進行比較實驗.因為缺乏DBpedia 數據集上的查詢模板,本文設計了4 個包含不同數據量的查詢(記為Q_dbp1~Q_dbp4).Q_dbp2~Q_dbp4 的基本結構相同,不同的只是數據量的大小:Q_dbp4 數據量最大,達到數百萬條;而Q_dbp2 最小.
本節在3 個方面進行實驗結果比較,包括存儲時間、存儲空間和SPARQL 或Cypher 的查詢效率.以下實驗結果中,每個查詢測試均進行3 次取平均值,避免隨機誤差.
5.2.1 存儲時間
如圖8(a)所示:在存儲時間上,KGDB 比gStore 和Neo4j 需要的時間短,gStore 所需的存儲時間最長,并且隨著數據量的增長,各個系統之間的時間差異越來越大,KGDB 的優勢越加明顯;在數據量最大的數據集DBpedia上,KGDB 可以達到gStore 及Neo4j 存儲速度的將近10 倍,將存儲效率提高一個數量級.

Fig.8 Results for data insertion and storage space圖8 存儲時間、存儲空間實驗結果
在存儲處理過程中,KGDB 僅需要一次無類型實體聚類過程,即可多次進行數據集的存儲,在存儲過程中,不需要復雜的轉換過程.對應的,gStore 需要進行字符串與id 的轉換、VS 樹的建立等等過程,Neo4j 需要進行類型到標簽的轉化等等過程.
5.2.2 存儲空間
如圖8(b)所示:在存儲空間上,KGDB 也相較gStore 和Neo4j 優勢明顯.3 個系統中:Neo4j 所需存儲空間大于數據集本身的大小,最高可以達到數據集本身的2 倍;gStore 可以將數據集壓縮存儲,最大壓縮率達到0.8;相比之下,KGDB 最大壓縮率達到0.7,實現數據的高效存儲.隨著數據量的增長,使用字典編碼的KGDB 在存儲空間上的優勢越加明顯.需要注意的是:Neo4j 社區版僅可以使用兩個數據庫(database),而每個數據庫僅能配置一個圖(graph),這就要求用戶在需要建立多個知識圖譜數據庫時,做Neo4j 系統的全備份.雖然專業版提供了多數據庫的支持,但社區版的配置無疑限制了普通用戶的使用,也增加了存儲多個獨立知識圖譜的存儲空間要求.
在本文的實驗中,僅計算單個數據庫在裝載知識圖譜前后的空間變化.如果將系統空間要求計算在內,Neo4j 的知識圖譜存儲所需空間會更大.
5.2.3 查詢效率
查詢效率實驗分別在LUBM 合成數據集和DBpedia 真實數據集上進行.在LUBM 數據集上,采用了4 個基本查詢和4 個涉及推理的查詢.在DBpedia 上,設計了4 個查詢,其中:Q_dbp1 輸入數據量大,選擇度高;Q_dbp2~Q_dbp4 具有相同的結構,數據量依次增大.在同樣的語義下,分別構造SPARQL 和Cypher 查詢語句,并在對應系統上進行實驗.
(1)SPARQL 查詢效率實驗.
gStore 是RDF 圖數據庫,使用SPARQL 作為其查詢語言,可以支持大規模RDF 知識圖譜的數據管理任務.KGDB 與gStore 系統的SPARQL 查詢效率對比實驗結果如圖9 所示:gStore 不能支持最復雜的涉及3 個實體的三角查詢Q2,而KGDB 可以在較短時間內完成這一查詢.對于Q3,隨著數據量的增加,KGDB 與gStore 相比,其查詢時間增長幅度更小,表明KGDB 在大規模知識圖譜數據上的查詢效率優于gStore.在其他兩個查詢Q1和Q14 上,KGDB 可以達到與gStore 相同的數量級,因此具有可比性.

Fig.9 Query efficiency experimental results on LUBM by SPARQL for KGDB and gStore圖9 在LUBM 數據集上的KGDB 和gStore 的SPARQL 查詢效率實驗結果
LUBM 提供的標準查詢Q2 是選取的4 個不涉及推理的查詢中最為復雜的,在gStore 系統上將會引起系統錯誤,不能夠直接執行.為了公平比較,沒有進行查詢的改寫.對于查詢Q1 和Q3,其基本結構是一致的,區別在于涉及的實體的數據量不同,Q3 的輸入數據量更大.而相較而言,KGDB 可以在Q3 上呈現出平緩的查詢時間增長趨勢,說明KGDB 可以應對大規模知識圖譜上的查詢,數據量的增長不會導致查詢效率的降低.對于查詢時間最長的Q14,該查詢涉及的實體數量巨大,在LUBM50 上,查詢結果將需返回數十萬條數據.在這一查詢上,KGDB和gStore 的查詢時間可以達到同一數量級.
如圖10 所示,在gStore 和KGDB 上的SPARQL 推理查詢實驗結果表明:兩個系統均不支持涉及推理的查詢,但都能在較短時間內給出查詢結果,雖然因缺乏推理功能導致查詢的最終結果為空.對于相同的LUBM 標準查詢,KGDB 能夠在更短的時間內給出查詢結果,并且查詢時間隨數據集規模增長的幅度與gStore 相比更小.

Fig.10 Inference query efficiency experimental results on LUBM by SPARQL for KGDB and gStore圖10 在LUBM 數據集上的KGDB 和gStore 的SPARQL 推理查詢效率實驗結果
如圖11 所示,可以得出結論:在DBpedia 數據集上,對于查詢Q_dbp1~Q_dbp3,KGDB 可以達到比gStore 更快的查詢速度,KGDB 在最優的查詢(Q_dbp1)上,可以將查詢速度提升一個數量級.這說明在選擇算子的處理上,KGDB 擁有較大優勢.而對于最慢的查詢(Q_dbp4),KGDB 也可以達到與gStore 相同的數量級.

Fig.11 Query efficiency experimental results on DBpedia by SPARQL for KGDB and gStore圖11 在DBpedia 數據集上的KGDB 和gStore 的SPARQL 查詢效率實驗結果
(2)Cypher 查詢效率實驗.
Neo4j 是屬性圖數據庫,使用Cypher 作為查詢語言,支持完整的ACID 規則,可以更加快速地處理連接數據.下面將進行KGDB 和Neo4j 系統的Cypher 查詢效率對比實驗.
如圖12 所示:在LUBM 數據集上,KGDB 在3 個標準查詢Q1,Q3 和Q14 上都可以達到比Neo4j 更快的速度;在最優的查詢上(Q3),KGDB 比Neo4j 快近70 倍;而在最慢的查詢上(Q2),KGDB 也可以達到與Neo4j 相同的數量級.

Fig.12 Query efficiency experimental results on LUBM by SPARQL for KGDB and Neo4j圖12 在LUBM 數據集上的KGDB 和Neo4j 的SPARQL 查詢效率實驗結果
對于最復雜的三角查詢Q2,KGDB 的查詢速度慢于Neo4j.這是因為Neo4j 的存儲方式使之查詢結點之間的連接變得容易,而不需要像KGDB 這種關系數據庫,執行耗時的連接(JOIN)操作.但是,KGDB 相較于Neo4j 擁有更多優勢:(1)KGDB 不需要單獨的插件,原生的支持RDF 圖和屬性圖的統一存儲,并在存儲過程中,比Neo4j需要更短的存儲時間和更小的存儲空間,同時管理多個知識圖譜更加容易;(2)KGDB 同時支持SPARQL 和Cypher 查詢語言,允許兩個查詢語言在同一知識圖譜上的互操作.
在DBpedia 數據集上的實驗結果表明(如圖13 所示):在所有查詢上,KGDB 都可以達到比Neo4j 更快的查詢速度.對于最優的查詢(Q_dbp3),KGDB 可以比Neo4j 快2 個數量級;而最慢的查詢(Q_dbp4)上,KGDB 也可以達到14 倍于Neo4j 的查詢速度.
從LUBM 上的實驗結果隨數據量增長呈現的趨勢上來看:KGDB 在數據量不斷增長后,相較Neo4j 的優勢逐漸變小,但查詢時間仍然低于Neo4j.在最復雜的查詢上(Q2)也可以得出相似的結論,即:隨著需要遍歷的數據量增大,Neo4j 查詢時間的增長幅度相較KGDB 小,但這種增長不會帶來數量級的變化.而在DBpedia 上的實驗結果表明:因為真實數據集所表現出的半結構化和稀疏性,查詢涉及數據量的增長將會為KGDB 帶來優勢.

Fig.13 Query efficiency experimental results on DBpedia by Cypher for KGDB and Neo4j圖13 在DBpedia 數據集上的KGDB 和Neo4j 的Cypher 查詢效率實驗結果
本文研發了統一模型和語言的知識圖譜數據庫管理系統KGDB.
(1)統一存儲:支持存儲RDF 圖和屬性圖數據,使用字典編碼,提高存儲效率,節省存儲空間,使用基于特征集的聚類方法,解決無類型實體的存儲問題,使得具有相近語義的實體存儲在同一關系表中,提高查詢效率;
(2)互操作語法層:進行兩種數據模型之上的查詢語言SPARQL 和Cypher 的語義對齊,即對同一知識圖譜,使用兩種查詢語言都可以得到相同的查詢結果,達到查詢語言互操作的目的;
(3)統一語義層:SPARQL 和Cypher 兩種查詢語言可以通過轉換規則,轉化為關系代數表示的相同的抽象查詢語義樹.
真實數據集和合成數據集上的實驗驗證了KGDB 系統的存儲效率和查詢效率,實驗結果表明:KGDB 在真實數據集上普遍優于gStore 和Neo4j;而在合成數據集上,KGDB 可以與gStore 和Neo4j 達到相同數量級.
本文只討論了單機系統上的知識圖譜管理問題,隨著知識圖譜數據規模的不斷增大,分布式知識圖譜管理系統將成為研究熱點.在后續工作中,我們將會討論分布式環境下知識圖譜的統一存儲方案和查詢處理方法.
附 錄
1.LUBM數據集上的查詢
1)SPARQL 查詢
(1)Q1

(2)Q2

(3)Q3

(4)Q4

(5)Q5

(6)Q6

(7)Q11


(8)Q14

2)Cypher 查詢
(1)Q1

(2)Q2(3)Q3


(4)Q14

2.DBpedia數據集上的查詢
1)SPARQL 查詢
(1)Q_dbp1

(2)Q_dbp2

(3)Q_dbp3

(4)Q_dbp4

2)Cypher 查詢
(1)Q_dbp1

(2)Q_dbp2

(3)Q_dbp3

(4)Q_dbp4
