異步流水線式的圖查詢方法及系統的制作方法
【技術領域】
[0001]本發明涉及分布式信息處理技術領域,尤其涉及圖數據庫系統的查詢引擎。
【背景技術】
[0002]目前業界主流的圖數據庫查詢引擎大致可分為兩種:
[0003]I)以Neo4j為代表的原生單機版數據庫查詢引擎,這種引擎一般自帶某種查詢語言,要經過一次語法解析才能生成查詢計劃。代碼如下所示:
[0004]MATCH
[0005](company)<-[:W0RKS_F0R]-(me: Person)-[:HAS_SKILL]->(ski 11),
[0006](company)<-[:W0RKS_F0R]-(colleague)-[:HAS_SKILL]->(skill)
[0007]WHERE me.name = {name}
[0008]RETURN
[0009]colleague, name AS name,
[0010]count(skill)AS score,
[0011]collect(skill, name)AS skills
[0012]ORDER BY score DESC
[0013]圖9A、圖9B展現的就是Neo4j在執行這個查詢樣例時進行的工作:首先對查詢語句進行詞法分析和語法分析,生成查詢樹,然后在原圖中尋找完全匹配這個圖模式的子圖。查詢中的WHERE字句標識了查詢的起點。在實際的查詢過程中,遍歷從起點開始,再根據鄰點和關系的模式匹配出符合要求的單元,沿著查詢樹不斷匹配,當執行完所有匹配時,就找到了一個可行解
[0014]2)以TinkerPop為主的通用圖查詢框架,如圖8所示,繼承其接口后可用于滿足屬性圖模型的任意圖數據庫。執行過程主要依賴其流水線引擎Pipes。查詢語言的每一個命令都可以看作流水線中的一個Step,任意兩個命令都相互獨立,由數據流驅動整個流水線的執行。每個Step只會讀取前一個Step的輸出,處理查詢并讓后一個Step拉取自己產生的結果。為了能避免無謂計算,且使查詢可隨時中止,這一流水線引擎采用惰性求值的方式來獲取結果值。具體說來,就是當查詢語句末端出現next O,count O,hasNext O等需要后繼值的指令時,才會開始執行查詢:每一個Step從前一個Step拉取下一個取值,深度優先遍歷整個查詢空間。在獲得滿意結果后,查詢流水線即可停止,而不用獲得全部的解再返回。
[0015]單機圖數據庫查詢引擎存在的最大問題是:在大規模數據集上的表現不佳,單機存儲的局限性導致其在億級規模圖數據上的處理速度很慢,且不具有擴展性。
[0016]通用圖查詢框架把存儲層和計算層完全隔離帶來了較大的性能損失,例如Titan完全利用TinkerPop進行計算時,就沒有考慮其后端分布式存儲的高并發能力,造成單個查詢的延遲比較大,同時后端存儲層的壓力卻很輕。現有技術中該項缺陷是由查詢引擎與后端分布式存儲系統不友好導致的。在使用了高擴展性的系統存儲后端存儲圖數據后,現有的查詢引擎并沒有利用這類系統的優點,依然是按照單機的處理方式進行數據讀取和計笪并O
[0017]綜上可知,現有技術在實際使用上顯然存在不便與缺陷,所以有必要加以改進。
【發明內容】
[0018]針對上述的缺陷,本發明的目的在于提供一種異步流水線式的圖查詢方法及系統,目的是解決圖查詢引擎無法適應分布式圖存儲而帶來的查詢效率低下問題,可異步完成大規模圖查詢。
[0019]為了實現上述目的,本發明提供一種異步流水線式的圖查詢方法,應用于分布式圖數據庫,包括:
[0020]根據查詢請求創建包含多個查詢步驟的流水線;
[0021]檢測所述查詢步驟的緩存隊列,根據所述緩存隊列的剩余元素的容量喚醒多個預取線程;
[0022]創建異步化管理后端數據層的連接和查詢的線程池,為所述流水線配置所述線程池容量,所述流水線末端獲得查詢的結果。
[0023]根據本發明所述圖查詢方法,所述根據查詢請求創建包含多個查詢步驟的流水線的步驟中,每個所述查詢步驟包括預取任務和計算任務;所述流水線接收到需要后繼值的指令后逐步拉取結果;
[0024]所述創建異步化管理后端數據層的連接和查詢的線程池,為所述流水線配置所述線程池容量,所述流水線末端獲得查詢的結果的步驟中包括:
[0025]所述流水線的所有線程共享同一個所述線程池。
[0026]根據本發明所述圖查詢方法,所述檢測所述查詢步驟的緩存隊列,根據所述緩存隊列的剩余元素的容量喚醒多個預取線程的步驟中還包括:
[0027]根據前一步驟的結果數,選擇等待或建立新的所述預取線程獲得結果;和/或
[0028]當所述緩存隊列的剩余元素低于容量閾值,喚醒等待中的所述預取線程;
[0029]根據本發明所述圖查詢方法,所述檢測所述查詢步驟的所述緩存隊列,根據緩存隊列的剩余元素的容量喚醒多個預取線程的步驟中還包括:
[0030]收集到所述前一步驟返回的結果,記錄輸入數據的順序編號;
[0031]排列預取的所述結果和所述結果的路徑,按編號順序放入所述緩存隊列;
[0032]所述檢測所述查詢步驟的緩存隊列,根據所述緩存隊列的剩余元素的容量喚醒多個預取線程的步驟之后包括:
[0033]逐個獲取所述結果和路徑,更新當前路徑并向后一步驟返回所述結果;和/或
[0034]當所述預取線程結束,直至所述緩存隊列為空且所述前一步驟無結果,通知所述后一步驟結果已取完。
[0035]根據本發明所述圖查詢方法,所述創建異步化管理后端數據層的連接和查詢的線程池,為所述流水線配置所述線程池容量進一步包括:
[0036]當所述線程池無剩余容量,且所述查詢步驟添加數據預加載線程,則阻塞所述預取線程;和/或
[0037]當所述線程池有剩余容量,且收到新的查詢請求,則從后往前依次開啟所述預取線程;和/或
[0038]當所述線程池有剩余容量,啟動當前步驟的一個所述計算線程,并將計算結果放入所述緩存隊列。
[0039]本發明提供一種異步流水線式的圖查詢系統,應用于分布式圖數據庫,包括:
[0040]流水線模塊,用于根據查詢請求創建包含多個查詢步驟的流水線;
[0041]結果緩存模塊,用于檢測所述查詢步驟的緩存隊列,根據所述緩存隊列的剩余元素的容量喚醒多個預取線程;
[0042]異步管理模塊,用于創建異步化管理后端數據層的連接和查詢的線程池,為所述流水線配置所述線程池容量,所述流水線末端獲得查詢的結果。
[0043]根據本發明所述圖查詢系統,每個所述查詢步驟包括預取任務和計算任務;所述流水線接收到需要后繼值的指令后逐步拉取結果;所述流水線的所有線程共享同一個所述線程池。
[0044]根據本發明所述圖查詢系統,還包括:
[0045]數據預取模塊,用于根據前一步驟的結果數,選擇等待或建立新的所述預取線程獲得結果;<