gStore:A Graph-based SPARQL Query Engine---part2

本文由學者Lei Zou, M. Tamer Özsu, Lei Chen, Xuchuan Shen, Ruizhe Huang & Dongyan Zhao於2014/08/01在《The VLDB Journal 》聯合發表
原文下載鏈接文末自取

給定SPARQL查詢Q,先將其編碼爲查詢簽名圖Q*。然後,在G*上找到Q的匹配。最後,驗證是否每個在G*上的Q*匹配也是Q相對於G的匹配。在VS*-tree中自上而下查找匹配項,基本查詢處理算法1如下:

首先,在VS
-tree中找到G1上的Q*2匹配並插入隊列H,得出其摘要匹配並壓入隊列H。從H彈出摘要匹配並將其擴展到其子狀態(子狀態=自身做笛卡爾積運算)。從H迭代彈出摘要匹配項,重複此過程直到葉節點。最後,在VS*-tree的葉結點上找到Q*的匹配。

基本BVS-Query算法通過減少Q中每個查詢頂點的候選項,而不是改進在非葉子級別查找摘要匹配項,改進算法稱爲VS*-Query(即算法2)。給定Q中的頂點vi,節點di ∈GI)VS*-tree不能匹配vi,當且僅當下列條件之一成立:

使用了算法2優化了VS*-tree中的引入,使用算法3找到了Q*的匹配項:

T-index
T-index是實體化視圖的結構化組織,用於處理聚合的SPARQL查詢。對於RDF圖G中的每個實體頂點u,將聚合與u相鄰的所有不同屬性形成事務。頻率排序會導致插入的節點更少。如果多個維度具有相同的頻率,則順序任意定義。兩種關聯的數據結構:維度列表DL和實體化MS(O)。維度列表DL記錄事務數據庫中的所有維度。將節點引入T-index時,根據節點維度,在DL中將節點註冊相應維度。 DL中的維數按頻率降序排列。每個節點O具有一個集合集MS(O)。根據O.L可找到到達該節點的路徑部分所代表的所有事務。 MS(O)是一組三元組,基於維度上的共享值分組事務。 T-index有兩個重要結果:

  • T-index中的非葉節點O具有n個子節點Oi,如果到達至少一個Oi的路徑是A的前綴,則到達節點O的路徑也是A的前綴;
  • T-index的結構不依賴於向該結構中插入事務的順序。

根據與其子節點關聯的聚合集計算聚合集MS(O),基於後遍歷的算法實現算法7(如下)中T-index的MS(O)。
首先,掃描DB後導出DB及其頻率中所有維度的列表,並構造維度列表DL。然後,將DB的所有事務逐個插入T-index。

彙總查詢處理
將GA查詢Q分解爲多個SA查詢Si,使用星聚集查詢計算每個Si(R( Si))。 然後結合R(Si)計算Q的結果。

星聚合查詢處理
在這裏插入圖片描述
給定SA查詢S,通過算法4使用T-index應答S:

一般彙總查詢處理
計算所有R(Si),計算最終結果R(Q)= oni R(Si):

J是連接子圖,所有實體頂點通過鏈接屬性連接。 對於每個R(Si),找到頂點列表Li。Ti中的所有頂點都是vi的候選匹配頂點。要計算R(Q),需找到RDF圖上J的所有子圖匹配項,子圖匹配定義如下:

鏈接結構J具有查詢簽名圖Q*的結構,由於J中的每個星心vi對應於SPARQL查詢圖Q中的實體頂點,J中的邊是兩個實體頂點之間的邊。給定聚合查詢,將其查詢模式圖表示爲Q,將Q編碼爲簽名查詢圖Q*。對於Q*中的每個頂點vi,使用算法2中的第1-15行找到候選列表C(vi),使用算法3在RDF圖G上找到J的匹配。爲了提高性能,使用星聚合查詢結果R(Si)對子圖匹配分區,有利於減少I / O訪問。掃描T-index中的聚合集要需順序訪問。R(Si)根據與查詢Q中每個頂點vi相關的分組維對子圖匹配進行分區,再使用R(Si)查找最終分區(過程省略)。

鏈接屬性聚合
按組維度對應特徵屬性邊,允許對應於鏈接屬性邊的分組維度,如彙總查詢Q5:在這裏插入圖片描述
處理鏈接屬性聚合查詢的方案
將其設置爲維度列表DL中的最後一個元素,使其始終對應於T索引中的葉節點。
對於GA查詢,所有分組依據維度都是特徵屬性邊,通過算法5應答:

維護索引結構更新gStore的數據,所以對鄰接表的更新主要是維護G*、VS*-tree和T-index,即如下內容:

  • 簽名圖G\∗的更新
    兩種情況:插入三元組和刪除三元組。
    插入三元組:新三元組<s,p,o>插入RDF數據集。如果s在插入前存在於G*中,則將從G*中刪除頂點s及其所有相鄰邊。然後重新編碼頂點,並重新將s及鄰邊插入G*。
    刪除三元組:從RDF數據集刪除三元組<s,p,o>,s對應實體頂點或類頂點。如果o是實體或類頂點,則遵循上述方法,刪除一個三元組。如果o是一個文字,則需重新編碼,而G*結構不變。從VS*-tree中刪除s,並將重新編碼的s插入到樹;如果o是實體或類頂點,則首先重新編碼s。然後,刪除G*中s和o間的邊。刪除了VS*-tree中的s,並根據更新的G*的結構將重新編碼的s插入到樹。
  • 更新VS*-tree
    • 插入:頂點u的插入從VS*-tree的根開始,並迭代選擇一個子節點,直到可以插入u的葉節點,VS*-tree的葉結點摘要圖也會更新。如果u在另一個葉節點中的另一個端點附近有一條邊,則將超邊設爲d,或者更新與該超級邊相關的邊簽名。如果葉簽名和葉摘要圖已更改,則在VS*-tree中向上傳播。S樹中的選擇取決於u簽名與樹中節點之間的漢明距離。在VS*-tree中,修改插入規則使位置取決於節點簽名和G*結構。選擇一個節點使兩個頂點簽名的更新和新引入的超邊數量最小。插入頂點u後,葉節點和與其相鄰的超邊簽名會更新,更改必須在VS*-tree內向上傳播,還可根據G*中與u的鄰邊更新與葉節點相鄰的超邊。
    • 拆分:節點的B+1個實體被劃分爲兩個新節點。採用節點分裂方法,從B+1實體中確定兩個新節點,每次迭代從B+1中選擇兩個實體作爲子節點。每對B+1個實體,並保留導致Max(α,β)最小值的實體對。
    • 刪除:從VS*-tree中刪除頂點u,需找到存儲u的葉節點d,然後刪除u。採用自下而上更新節點的簽名和相關超邊。刪除後,如果某個節點d的條目少於b,則刪除d並將其條目重新插入VS*-tree。
  • 更新T-index:所有維度在DL中降序排列,提高SA查詢性能。根據DL中維度順序是否變化,考慮兩種情況的T-index更新。
    • 維度列表DL順序不變:考慮新三元組<s,p,o>,如果p是鏈接屬性,則不需更新T-index。如果在現有RDF數據中未出現s,則引入a將新事務插入D,將新事務插入T-index的一個路徑。
    • 維度列表DL順序改變:某些三元組刪除和插入會改變DL中維度順序。由於插入或刪除三元組<s,p,o>,需在DL中交換二維pi和pj。更新分兩階段:首先,忽略DL中的順序改變。其次,在DL中交換pi和pj,並修改T-index的結構和相關實例化集。

餘下部分是實驗評估內容,不再贅述。

原文下載鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章