国产精品1024永久观看,大尺度欧美暖暖视频在线观看,亚洲宅男精品一区在线观看,欧美日韩一区二区三区视频,2021中文字幕在线观看

  • <option id="fbvk0"></option>
    1. <rt id="fbvk0"><tr id="fbvk0"></tr></rt>
      <center id="fbvk0"><optgroup id="fbvk0"></optgroup></center>
      <center id="fbvk0"></center>

      <li id="fbvk0"><abbr id="fbvk0"><dl id="fbvk0"></dl></abbr></li>

      數(shù)據(jù)庫中的圖處理的制作方法

      文檔序號:11450475閱讀:212來源:國知局

      背景技術(shù)
      ::圖(graph)數(shù)據(jù)正變得無所不在。如已知的,圖可以具有兩個或更多個節(jié)點(或?qū)嶓w),每個節(jié)點具有一個或多個局部屬性。此外,圖中的節(jié)點可以與圖中的一個或多個其他節(jié)點具有關(guān)聯(lián)或關(guān)系。兩個節(jié)點之間的關(guān)聯(lián)可以被稱為“邊”。邊可以是有向的或無向的。對于由邊連接的兩個節(jié)點,一個節(jié)點稱為另一節(jié)點的“相鄰節(jié)點”或“鄰居節(jié)點”。在各種應(yīng)用中,有必要在數(shù)據(jù)庫中存儲和查詢這些圖數(shù)據(jù)。諸如關(guān)系數(shù)據(jù)庫等很多傳統(tǒng)的數(shù)據(jù)庫已經(jīng)在匯總數(shù)據(jù)方面取得成功。然而,這些傳統(tǒng)的數(shù)據(jù)庫在處理圖方面存在困難,因為圖數(shù)據(jù)的性質(zhì)與列表數(shù)據(jù)的性質(zhì)完全不同。例如,圖遍歷是圖處理中的常見和基本操作。給定源節(jié)點,圖遍歷返回與源節(jié)點相鄰的一個或多個節(jié)點的數(shù)據(jù)。在關(guān)系數(shù)據(jù)庫中,數(shù)據(jù)通常被規(guī)范化以避免冗余和更新異常。然而,圖中的節(jié)點是高度連接的,并且通常呈現(xiàn)多對多關(guān)系。在數(shù)據(jù)規(guī)范化的情況下,必須使用聯(lián)接表來表示兩個節(jié)點之間的多對多關(guān)系,其中兩個列分別引用兩個節(jié)點。這樣的組織意味著節(jié)點的局部屬性與圖拓?fù)浞蛛x。也就是說,邊信息必須與節(jié)點信息分開存儲。因此,對于從節(jié)點到其鄰居的每次遍歷,數(shù)據(jù)庫的查詢引擎必須執(zhí)行附加聯(lián)接以查找聯(lián)接表從而獲得與節(jié)點相關(guān)聯(lián)的拓?fù)湫畔?,這將對高速緩存局部性(locality)產(chǎn)生負(fù)面影響并且降低系統(tǒng)性能。技術(shù)實現(xiàn)要素:可以在一個物理記錄中將節(jié)點的鄰接列表和屬性共同定位,以獲得用于圖遍歷的高速緩存局部性。然而,這由于與節(jié)點相關(guān)聯(lián)的所有屬性都將被復(fù)制而不能通過解規(guī)范化來在傳統(tǒng)的表中實現(xiàn),這不僅會導(dǎo)致嚴(yán)重的空間消耗,而且將每個鄰居引用放在單獨的記錄中。如果節(jié)點具有多個鄰接列表,每個鄰接列表描述一個鄰居類別,則情況會更糟。在本文中描述的主題的實現(xiàn)中,提供底層數(shù)據(jù)庫和圖之間的中間件層,以使數(shù)據(jù)庫(諸如關(guān)系數(shù)據(jù)庫)能夠?qū)崿F(xiàn)有效和高效的圖處理。在一個實現(xiàn)中,節(jié)點的鄰接列表可以被表示并且存儲在關(guān)系表中用于該節(jié)點的記錄的特殊字段中。取決于底層數(shù)據(jù)庫,內(nèi)建的或用戶定義的數(shù)據(jù)類型可以用于表示鄰接列表。以這種方式,圖數(shù)據(jù)可以作為包含節(jié)點的局部屬性和圖拓?fù)涠叩奶厥獗砀裥问奖淮鎯Γ恍枰郊游锢砺?lián)接表。在查詢階段,中間件可以將圖查詢轉(zhuǎn)換成諸如對相關(guān)的物理表的結(jié)構(gòu)化查詢語言(“sql”)查詢等表查詢。對這些表的查詢語義可以與sql完全兼容,從而提供互操作性。具體地,作為基本運算符,可以通過動態(tài)地檢索和解釋源節(jié)點的鄰接列表并且創(chuàng)建表示拓?fù)湫畔⒌呐R時聯(lián)接表來完成圖遍歷。通過利用高速緩存局部性的優(yōu)點,可以有效地實現(xiàn)臨時聯(lián)接表與匯聚表之間的連接。以這種方式,可以有效地執(zhí)行圖查詢。此外,在一個實現(xiàn)中,可以通過考慮忽略關(guān)系數(shù)據(jù)庫的查詢引擎或優(yōu)化器的拓?fù)渲R來進(jìn)一步優(yōu)化轉(zhuǎn)換后的表查詢。本
      發(fā)明內(nèi)容被提供以便以簡化的形式介紹一些概念的選擇,這些概念在下面的詳細(xì)描述中進(jìn)一步描述。本
      發(fā)明內(nèi)容不旨在標(biāo)識所要求保護(hù)的主題的主要特征或基本特征,也不旨在用于限制所要求保護(hù)的主題的范圍。附圖說明圖1示出了其中可以實現(xiàn)本文中描述的主題的一個或多個實現(xiàn)的計算環(huán)境的框圖;圖2示出了在本文中描述的主題的一個實現(xiàn)中的用于數(shù)據(jù)庫圖處理的系統(tǒng)的框圖;圖3示出了在本文中描述的主題的一個實現(xiàn)中的用于將圖數(shù)據(jù)存儲到數(shù)據(jù)庫中的方法的流程圖;圖4示出了在本文中描述的主題的一個實現(xiàn)中的用于圖查詢的方法的流程圖;圖5示出了在本文中描述的主題的一個實現(xiàn)中由用戶定義的函數(shù)創(chuàng)建的臨時聯(lián)接表的示意圖;圖6示出了在本文中描述的主題的一個實現(xiàn)中的用于分解圖模式的方法的流程圖;圖7示出了在本文中描述的主題的一個實現(xiàn)中的圖模式分解的示意圖;圖8示出了在本文中描述的主題的一個實現(xiàn)中的子模式的連接的示意圖;圖9示出了在本文中描述的主題的一個實現(xiàn)中的圖映射器的框圖;以及圖10示出了在本文中描述的主題的一個實現(xiàn)中的查詢轉(zhuǎn)換器的框圖。具體實施方式現(xiàn)在將參考若干示例實現(xiàn)來討論本文中描述的主題。應(yīng)當(dāng)理解,這些實現(xiàn)僅是為了使本領(lǐng)域技術(shù)人員能夠更好地理解并且從而實現(xiàn)本文中描述的主題,而不是暗示對主題范圍的任何限制。如本文中使用的,術(shù)語“包括”及其變體將被視為開放術(shù)語,意思是“包括但不限于”。術(shù)語“或”應(yīng)當(dāng)被視為“和/或”,除非上下文清楚地另外表示。術(shù)語“基于”將被視為“至少部分基于”。術(shù)語“一個實現(xiàn)”和“實現(xiàn)”將被視為“至少一個實現(xiàn)”。術(shù)語“另一實現(xiàn)”將被視為“至少一個其他實現(xiàn)”。術(shù)語“第一”、“第二”、“第三”等可以用于指代不同或相同的對象。下面可以包括其他明確和隱含的定義。圖1示出了其中可以實現(xiàn)本文中描述的主題的一個或多個實現(xiàn)的計算環(huán)境100的示例。計算環(huán)境100不旨在對本文中描述的主題的使用范圍或功能提出任何限制,因為各種實現(xiàn)可以在多種通用或?qū)S糜嬎悱h(huán)境中實現(xiàn)。參考圖1,計算環(huán)境100包括至少一個處理單元(或處理器)110和存儲器120。處理單元110執(zhí)行計算機(jī)可執(zhí)行指令,并且可以是真實或虛擬處理器。在多處理系統(tǒng)中,多個處理單元執(zhí)行計算機(jī)可執(zhí)行指令以增加處理能力。存儲器120可以是易失性存儲器(例如,寄存器、高速緩存、ram)、非易失性存儲器(例如,rom、eeprom、閃存)、或這兩者的某種組合。存儲器120存儲被稱為“圖轉(zhuǎn)換器”170的系統(tǒng)或模塊的至少一部分,用于使得數(shù)據(jù)庫(例如,關(guān)系數(shù)據(jù)庫)能夠支持高效的圖處理。在一個實現(xiàn)中,圖轉(zhuǎn)換器170可以被實現(xiàn)為例如圖和底層數(shù)據(jù)庫表之間的中間件。這僅是說明性的,而不暗示對本文中描述的主題的范圍的任何限制。例如,在另一實現(xiàn)中,圖轉(zhuǎn)換器170可以至少部分地被實現(xiàn)為硬件和/或固件模塊。在一個實現(xiàn)中,例如,可以在底層數(shù)據(jù)庫的內(nèi)核中實現(xiàn)圖轉(zhuǎn)換器170。計算環(huán)境100可以具有附加的部件或特征。在圖1所示的示例中,計算環(huán)境100包括存儲裝置130、一個或多個輸入設(shè)備140、一個或多個輸出設(shè)備150、以及一個或多個通信連接160。諸如總線、控制器、或網(wǎng)絡(luò)等互連機(jī)構(gòu)(未示出)互連計算環(huán)境100的部件。通常,操作系統(tǒng)軟件(未示出)為在計算環(huán)境100中執(zhí)行的其他軟件提供操作環(huán)境,并且協(xié)調(diào)計算環(huán)境100的部件的活動。存儲裝置130可以是可移除的或不可移除的,并且可以包括計算機(jī)可讀存儲介質(zhì),諸如閃存驅(qū)動器、磁盤、磁帶或盒式磁帶、cd-rom、cd-rw、dvd、或者可以用于存儲信息并且可以在計算環(huán)境100內(nèi)訪問的任何其它介質(zhì)。存儲裝置130可以存儲用于圖轉(zhuǎn)換器170的指令的至少一部分。輸入設(shè)備140可以是各種不同輸入設(shè)備中的一個或多個。例如,輸入設(shè)備140可以包括用戶設(shè)備,諸如鼠標(biāo)、鍵盤、軌跡球等。輸入設(shè)備140可以實現(xiàn)一個或多個自然用戶界面技術(shù),諸如語音識別、觸摸和觸筆識別、與輸入設(shè)備140接觸以及與輸入設(shè)備140相鄰的手勢的識別、空氣手勢的識別、頭部和眼睛跟蹤、聲音和語音識別、感測用戶大腦活動、以及機(jī)器智能。作為其他示例,輸入設(shè)備140可以包括掃描設(shè)備;網(wǎng)絡(luò)適配器;cd/dvd讀取器;或向計算環(huán)境100提供輸入的另一設(shè)備。輸出設(shè)備150可以是顯示器、打印機(jī)、揚聲器、cd/dvd寫入器、網(wǎng)絡(luò)適配器、或者從計算環(huán)境100提供輸出的另一設(shè)備。輸入設(shè)備140和輸出設(shè)備150可以并入單個系統(tǒng)或設(shè)備中,諸如觸摸屏或虛擬現(xiàn)實系統(tǒng)。通信連接160使得能夠通過通信介質(zhì)與另一計算實體通信。此外,計算環(huán)境100的部件的功能可以在能夠通過有線或無線連接進(jìn)行通信的單個計算設(shè)備或多個計算設(shè)備中實現(xiàn)。因此,計算環(huán)境100可以使用與一個或多個遠(yuǎn)程計算設(shè)備(諸如手持式計算設(shè)備、個人計算機(jī)、服務(wù)器、路由器、網(wǎng)絡(luò)pc、對等設(shè)備或另一公共網(wǎng)絡(luò)節(jié)點)的邏輯連接在網(wǎng)絡(luò)環(huán)境中操作。通信介質(zhì)在調(diào)制數(shù)據(jù)信號中傳送信息(諸如數(shù)據(jù)或計算機(jī)可執(zhí)行指令或請求)。調(diào)制數(shù)據(jù)信號是以編碼在信號中的信息的方式設(shè)置或改變其特征中的一個或多個的信號。作為示例而非限制,通信介質(zhì)可以包括用電、光、rf、紅外、聲學(xué)或其他載體實現(xiàn)的有線或無線技術(shù)。可以在計算機(jī)可讀介質(zhì)的一般上下文中描述主題的實現(xiàn),該計算機(jī)可讀介質(zhì)可以是存儲介質(zhì)或通信介質(zhì)。計算機(jī)可讀存儲介質(zhì)是可以在計算環(huán)境內(nèi)訪問的任何可用存儲介質(zhì),但是術(shù)語計算機(jī)可讀存儲介質(zhì)本身不涉及被傳播的信號。作為示例而非限制,利用計算環(huán)境100,計算機(jī)可讀存儲介質(zhì)包括存儲器120、存儲裝置130及其組合??梢栽谀繕?biāo)真實處理器或虛擬處理器上的計算環(huán)境中執(zhí)行的計算機(jī)可執(zhí)行指令(諸如被包括在程序模塊中的那些)的一般上下文中描述主題的實現(xiàn)。通常,程序模塊包括執(zhí)行特定任務(wù)或?qū)崿F(xiàn)特定抽象數(shù)據(jù)類型的例程、程序、庫、對象、類、部件、數(shù)據(jù)結(jié)構(gòu)等。程序模塊的功能可以在各種實現(xiàn)中根據(jù)需要在程序模塊之間組合或分開。程序模塊的計算機(jī)可執(zhí)行指令可以在本地或分布式計算環(huán)境中執(zhí)行。在分布式計算環(huán)境中,程序模塊可以位于本地和遠(yuǎn)程計算機(jī)存儲介質(zhì)二者中。圖2示出了在本文中描述的主題的一個實現(xiàn)中的圖轉(zhuǎn)換器170的示例。圖轉(zhuǎn)換器170可以由如上所述的計算機(jī)100來實現(xiàn),例如,在當(dāng)前已知或?qū)硪_發(fā)的任何數(shù)據(jù)庫之上。如本文中使用的,“數(shù)據(jù)庫”是指由于數(shù)據(jù)規(guī)范化要求而不能直接實現(xiàn)有效圖處理的任何數(shù)據(jù)庫。這些數(shù)據(jù)庫的示例包括但不限于諸如sql數(shù)據(jù)庫等關(guān)系數(shù)據(jù)庫。下面,將結(jié)合sql數(shù)據(jù)庫討論一些實現(xiàn)。這僅是為了說明的目的,而沒有對本文中描述的主題的范圍的任何限制的建議。本文中描述的主題可以用不能直接支持高效的圖數(shù)據(jù)的任何數(shù)據(jù)庫來實施。參考圖2,通常,圖轉(zhuǎn)換器170包括兩個模塊,即圖映射器210和查詢轉(zhuǎn)換器220。在一個實現(xiàn)中,圖映射器210被配置為接收存儲圖數(shù)據(jù)并且將圖數(shù)據(jù)存儲到在底層數(shù)據(jù)庫中的表230中的請求。在本公開的上下文中,術(shù)語“圖數(shù)據(jù)”是指表示包括多個節(jié)點和連接相應(yīng)節(jié)點的一個或多個邊的圖的數(shù)據(jù)。節(jié)點可以具有一個或多個局部屬性。可以為每個屬性分配相應(yīng)數(shù)據(jù)類型的值。圖中的節(jié)點可以具有相同或不同的類型。作為示例,在一個應(yīng)用中,可以有代表客戶和雇員的兩種類型的節(jié)點。雇員節(jié)點可以具有一個或多個局部屬性,諸如姓名、年齡、經(jīng)理等。同樣,客戶可以具有局部屬性。具體地,在表230中的每個記錄中,局部屬性可以在相應(yīng)字段中僅具有單個值,并且因此可以被稱為“單值屬性”。除了局部或單值屬性之外,節(jié)點可以具有與相同或不同類型的一個或多個其他節(jié)點的關(guān)聯(lián)或關(guān)系。例如,如果一個雇員和另一雇員在組織中的同一部門工作,則表示這兩個雇員的節(jié)點可以連接,從而創(chuàng)建指示同事關(guān)系的邊。作為另一示例,雇員可以與一個或多個客戶具有業(yè)務(wù)關(guān)系。因此,表示雇員的節(jié)點可以連接到相關(guān)客戶節(jié)點。應(yīng)當(dāng)理解,一個節(jié)點可以與其他節(jié)點具有多個邊。因此,圖的邊或拓?fù)湫畔⒖梢员徽J(rèn)為是節(jié)點的多值屬性。應(yīng)當(dāng)理解,在一些情況下,取決于底層數(shù)據(jù)庫的配置,多值屬性可以是局部屬性。換言之,雖然包含對于相鄰節(jié)點的引用的鄰接列表可以被實現(xiàn)為多值非局部屬性,但是可以具有多個可能值的局部屬性也可以被處理為多值屬性。圖映射器210被配置為將圖數(shù)據(jù)存儲在底層數(shù)據(jù)庫中的一個或多個表230(其可以被稱為“節(jié)點表”)中。在節(jié)點表230中,每個記錄對應(yīng)于圖中的一個節(jié)點。例如,在一個實現(xiàn)中,記錄可以包括用于存儲相應(yīng)節(jié)點的唯一標(biāo)識符的、作為主鍵的字段。在一個實現(xiàn)中,標(biāo)識符可以是數(shù)字。可替代地或另外地,標(biāo)識符可以是任何參考字符、符號或其組合特別地,在本文中描述的主題的實現(xiàn)中,節(jié)點的單值和多值屬性存儲在單個表中。為此,在一個實現(xiàn)中,表230中的每個記錄(例如,行)對應(yīng)于圖中的節(jié)點。記錄可以包括一個或多個單值字段,每個單值字段用于存儲單值屬性。記錄還可以具有一個或多個多值字段,每個多值字段用于存儲多值屬性。以這種方式,局部節(jié)點信息和拓?fù)湫畔⒃诠?jié)點表230中共同定位。結(jié)果,不需要創(chuàng)建物理聯(lián)接表,這有助于更快速和更有效率地進(jìn)行圖查詢。下面將參考圖3詳細(xì)描述圖映射器210的功能。查詢轉(zhuǎn)換器220被配置為接收和處理關(guān)于圖數(shù)據(jù)的圖查詢。除了其他的以外,圖查詢可以涉及圖遍歷操作。給定源節(jié)點,圖遍歷操作檢索并且返回圖中一個或多個相鄰節(jié)點的數(shù)據(jù)。作為示例,圖查詢可以包括但不限于模式匹配、迭代圖處理(諸如查找兩個節(jié)點之間的最短路徑和計算圖節(jié)點的頁面排序算法(pagerank)分?jǐn)?shù))等。在一個實現(xiàn)中,查詢轉(zhuǎn)換器220可以支持用戶或用戶應(yīng)用可以用來表達(dá)圖查詢的任何合適的圖查詢語言。通常,圖查詢語言可以被認(rèn)為是擴(kuò)展的sql語言,以便在節(jié)點表上明確表達(dá)圖模式。下面將討論查詢語言的示例。應(yīng)當(dāng)理解,底層數(shù)據(jù)庫的查詢引擎和/或優(yōu)化器可以不直接識別和支持圖查詢語言。在操作中,具有查詢語言的知識的查詢轉(zhuǎn)換器220將圖查詢轉(zhuǎn)換成對相關(guān)表230的表查詢(例如,sql查詢)。查詢語言的知識包括但不限于關(guān)于查詢語言的規(guī)則、約束、語法和/或句法的信息。之后,表查詢可以由數(shù)據(jù)庫的查詢引擎來執(zhí)行。此外,在一個實現(xiàn)中,查詢轉(zhuǎn)換器230可以利用圖的拓?fù)渲R(其忽略底層數(shù)據(jù)庫的查詢引擎和/或優(yōu)化器)來優(yōu)化轉(zhuǎn)換后的查詢。下面將例如參考圖4詳細(xì)描述查詢轉(zhuǎn)換器220的功能?,F(xiàn)在參考圖3,圖3示出了用于將圖數(shù)據(jù)存儲到諸如sql數(shù)據(jù)庫等底層數(shù)據(jù)庫中的方法300的流程圖。方法300可以由如上所述的圖轉(zhuǎn)換器170中的圖映射器210來實現(xiàn)。特別地,為了討論起見,在下面的描述中可以可互換地使用表達(dá)“屬性值”和“屬性”。如圖所示,方法300在步驟310進(jìn)入,在步驟310接收存儲圖數(shù)據(jù)的請求。如上所述,圖包括多個節(jié)點。每個節(jié)點具有至少一個單值屬性和至少一個多值屬性。單值屬性指示節(jié)點的局部屬性。多值屬性可以是指示與節(jié)點相關(guān)的拓?fù)湫畔⒌姆蔷植繉傩?。更具體地,在一個實現(xiàn)中,多值屬性可以用于指示圖中與當(dāng)前節(jié)點相鄰的一個或多個其他節(jié)點。如上所述,如果它們在圖中直接連接或相關(guān)聯(lián),則一個節(jié)點與另一節(jié)點相鄰。具體地,如上所述,圖中的節(jié)點可以具有或可以不具有一個或多個多值局部屬性。也就是說,多值屬性不一定是非局部屬性。在本文中描述的主題的實現(xiàn)中,節(jié)點的單值和多值屬性分別在步驟320和330存儲到表節(jié)點表230中。具體地,在步驟320,將每個單值屬性的值存儲到節(jié)點表230中的相應(yīng)單值字段中。在步驟330,將每個多值屬性的值存儲到相應(yīng)的多值字段中。在一個實現(xiàn)中,可以將多值非局部屬性的值實現(xiàn)為包含到相鄰節(jié)點的引用的鄰接列表。例如,引用可以是相鄰節(jié)點的標(biāo)識符。在一個實現(xiàn)中,相鄰節(jié)點的標(biāo)識符用作節(jié)點表中用于存儲該相鄰節(jié)點的主鍵。作為示例,假定標(biāo)識符為“1”的雇員與標(biāo)識符為“11”和“13”的雇員相鄰。因此,表示雇員“1”的同事關(guān)系的多值屬性可以實現(xiàn)為鄰接列表{11,13}。標(biāo)識符“11”和“13”是鄰接列表的原子值。除了或代替標(biāo)識符,對于相鄰節(jié)點的引用可以被實現(xiàn)為指針等。在一個實現(xiàn)中,鄰接列表可以被格式化為由底層數(shù)據(jù)庫支持的內(nèi)建數(shù)據(jù)類型。例如,在某個sql數(shù)據(jù)庫中,支持?jǐn)?shù)組類型。在這種情況下,節(jié)點的鄰接列表可以作為數(shù)組存儲在多值字段中。然而,在其他情況下,多值屬性不能由底層數(shù)據(jù)庫直接支持。此時,圖映射器210可以生成鄰接列表中的多個原子值的表示,其中表示具有由數(shù)據(jù)庫支持的數(shù)據(jù)類型并且因此可以存儲到表230中。例如,在一個實現(xiàn)中,圖映射器210可以生成鄰接列表中的標(biāo)識符的字符串表示。例如,標(biāo)識符由字符串中的預(yù)定義的分隔符或占位符分隔。在一些實現(xiàn)中,字符串表示可以是純文本字符串??商娲模谝恍崿F(xiàn)中,可以使用二進(jìn)制表示來存儲鄰接列表。如果多值屬性中的相鄰節(jié)點的類型與另一多值屬性中的相鄰節(jié)點的類型不同,則這兩個多值屬性具有不同的類型。在一個實現(xiàn)中,不同類型的多值屬性可以存儲在單獨的多值字段中。也就是說,節(jié)點的記錄可以具有多于一個多值字段。仍然考慮上面討論的示例,對于每個雇員,節(jié)點表230中的相應(yīng)記錄至少具有兩個多值字段,一個多值字段用于存儲多值屬性“同事”(雇員-雇員),而另一多值字段用于存儲多值屬性“客戶”(雇員-客戶),其中多值屬性“同事”和“客戶”彼此具有不同的類型。此外應(yīng)當(dāng)理解,給定節(jié)點,其相鄰節(jié)點可以存儲在相同的節(jié)點表中,或者在不同的節(jié)點表中。例如,對于多值屬性“同事”,源節(jié)點和匯聚節(jié)點都存儲在用于雇員節(jié)點的同一表中。對于多值屬性“客戶”,源節(jié)點是雇員節(jié)點,而匯聚節(jié)點是客戶節(jié)點。在這種情況下,由鄰接列表標(biāo)識的源節(jié)點及其相鄰節(jié)點存儲在不同的節(jié)點表中。具體地,應(yīng)當(dāng)理解,在一些情況下,一些節(jié)點可以與其他節(jié)點沒有關(guān)系或邊。在這種情況下,例如,多值屬性的值可以設(shè)置為“空(null)”。在一個實現(xiàn)中,在步驟330,圖映射器210可以為一個或多個多值字段創(chuàng)建注釋。注釋可以包含可以由查詢轉(zhuǎn)換器220在處理圖查詢時獲得和解釋的信息。例如,在一個實現(xiàn)中,圖映射器210可以接收指示一個或多個多值屬性的用戶輸入作為非局部屬性。這樣的用戶輸入可以被包括在圖查詢中。在該實現(xiàn)中,可以基于用戶輸入來創(chuàng)建注釋以指示多值字段的使用。也就是說,注釋規(guī)定相關(guān)聯(lián)的字段是用于存儲多值非局部屬性的多值字段。注釋還可以規(guī)定相關(guān)聯(lián)的字段是用于存儲節(jié)點的多值局部屬性的多值字段。在一個實現(xiàn)中,可以通過在相關(guān)聯(lián)的注釋中包括預(yù)定義的關(guān)鍵字來指示字段的使用。作為示例,可以在注釋中使用關(guān)鍵字“邊”或任何其他合適的關(guān)鍵字。另外地或可替代地,在一個實現(xiàn)中,注釋可以指定其中存儲有在鄰接列表中指示的節(jié)點的匯聚節(jié)點表。例如,在上面討論的示例中,存儲多值屬性“同事”的多值字段的注釋可以指示相鄰節(jié)點(雇員節(jié)點)存儲在用于雇員節(jié)點的表中,而存儲多值屬性“客戶”的多值字段的注釋可以指示相鄰節(jié)點(客戶節(jié)點)存儲在用于客戶節(jié)點的表中。以上注釋被描述僅用于說明的目的,而不暗示對本文中描述的主題的范圍的任何限制。在一個實現(xiàn)中,注釋可以規(guī)定任何其他合適的信息。此外,在一個實現(xiàn)中,還可以生成用于單值字段的注釋。應(yīng)當(dāng)理解,盡管步驟320在圖3中被示出為在步驟330之前執(zhí)行,但是這僅是為了說明的目的,而沒有暗示對本文中描述的主題的范圍的任何限制。單值和多值屬性可以以任何合適的順序或并行地存儲。例如,在一個實現(xiàn)中,可以使用以下sql語句來創(chuàng)建用于存儲雇員節(jié)點的節(jié)點表,其中單值和多值屬性可以一次存儲到表中。在本示例中,名為“雇員節(jié)點”的所創(chuàng)建的表有五個字段。字段“節(jié)點id”用于存儲用作主鍵的雇員節(jié)點的標(biāo)識符。字段“姓名”是用于存儲作為雇員姓名的單值屬性的單值字段。字段“客戶”、“同事”和“經(jīng)理”是用于存儲相應(yīng)多值屬性的多值字段。如上所述,多值屬性的值可以被實現(xiàn)為可以由底層數(shù)據(jù)庫的內(nèi)建類型(如果有的話)或用戶定義的表示(例如,二進(jìn)制表示)來表示的鄰接列表。在本示例中,為每個字段創(chuàng)建在括號中指示的注釋。例如,用于多值字段“客戶”的注釋“[columnrole:edge,reference:clientnode]”規(guī)定當(dāng)前字段用于存儲多值屬性。注釋還規(guī)定,鄰接列表中的節(jié)點存儲在名為“客戶節(jié)點”的表中。在上面的示例中,值為“邊”或“屬性”的關(guān)鍵字“columnrole”用于指示字段的作用。如上所述,任何其它預(yù)定義的關(guān)鍵字和/或值也是可能的。此外,在本示例中,單值字段也與注釋相關(guān)聯(lián)。在替代實現(xiàn)中,可以僅為多值屬性創(chuàng)建注釋。這些注釋將被數(shù)據(jù)庫引擎忽略,但是由圖映射器210存儲和處理作為元數(shù)據(jù)。注釋可以由查詢轉(zhuǎn)換器220在查詢轉(zhuǎn)換中訪問和解釋,這將在稍后討論。作為示例,可以由以上示例語句創(chuàng)建的表如下所示。節(jié)點id姓名客戶同事經(jīng)理1johnsmith[11,13][2,3,4,5,6][1]2janedoe[9,11,12][1,3,4,5][1,5]3boballen[45,12][1][1]……………在一個實現(xiàn)中,方法300可以進(jìn)行到步驟340,在步驟340可以創(chuàng)建用于一個或多個節(jié)點表230的視圖。當(dāng)應(yīng)用需要不同的表示以適應(yīng)其業(yè)務(wù)邏輯時,視圖很有用。例如,在圖轉(zhuǎn)換器170中,通常存在多個節(jié)點表,每個節(jié)點表表示不同的節(jié)點類型。在每個節(jié)點表中,可以存在用于存儲鄰接列表的多個多值字段,每個多值字段表示不同類型的多值屬性。此外,一些應(yīng)用可以僅關(guān)注圖拓?fù)洳⑶液雎赃@些類型。例如,原始的頁面排序算法分析圖拓?fù)?,并且僅查看節(jié)點和邊。為了促進(jìn)這樣的應(yīng)用,在一個實施例中,可以在步驟340創(chuàng)建視圖,以將所有節(jié)點聯(lián)合為一個節(jié)點表,并且將節(jié)點的所有鄰接列表聯(lián)合成一個列表。也就是說,在視圖中,存在一個聯(lián)合多值字段,其包含關(guān)于所有多值屬性的信息,例如,以鄰接列表的形式。在該實現(xiàn)中,用戶應(yīng)用可以在視圖上執(zhí)行圖查詢。因此,查詢轉(zhuǎn)換器220可以例如將圖查詢轉(zhuǎn)換成對一個或多個相關(guān)的關(guān)系表的sql查詢?,F(xiàn)在將討論圖查詢的處理。圖4示出了在本文中描述的主題的一個實現(xiàn)中的用于圖查詢的方法400的流程圖。在一個實現(xiàn)中,方法400可以由圖2所示的圖轉(zhuǎn)換器170中的查詢轉(zhuǎn)換器230來實現(xiàn)。方法400在步驟410進(jìn)入,在步驟410接收關(guān)于圖數(shù)據(jù)的圖查詢。如上所述,圖包括多個節(jié)點,并且圖中的至少一些節(jié)點可以具有單值屬性和多值屬性。對于每個這樣的節(jié)點,單值和多值屬性存儲在單個節(jié)點表230中的不同字段中。在步驟410接收到的圖查詢可以涉及圖遍歷。例如,在一個實現(xiàn)中,圖查詢本身可以是從源節(jié)點到匯聚節(jié)點的遍歷。源和匯聚節(jié)點在圖中彼此相鄰。如上所述,源節(jié)點和匯聚節(jié)點可以具有或可以不具有相同類型?;蛘撸瑘D查詢可以是復(fù)雜的圖操作,包括但不限于模式匹配、迭代圖處理等。本領(lǐng)域技術(shù)人員將理解,復(fù)雜的圖操作可以分解成一系列圖遍歷。因此,在下面的討論中,為了說明的目的將描述圖遍歷。下面將參考圖6討論高級圖操作的分解和處理。查詢轉(zhuǎn)換器220可以使得用戶或用戶應(yīng)用能夠使用圖查詢語言來表達(dá)圖查詢。例如,在一個實現(xiàn)中,圖查詢語言可以是擴(kuò)展的sql語言,使得用戶可以通過節(jié)點表明確地表達(dá)圖模式。作為示例,圖遍歷可以如下表示:nodetable1-[e1]->...-[ek-1]->nodetablek其中“nodetablei”(i=1,...,k)表示節(jié)點表的別名。節(jié)點表的別名通過命名的邊連接,例如以“-[ei]”->“的形式,其中”ei“是表示指向匯聚節(jié)點表的鄰接列表的源節(jié)點表的字段。應(yīng)當(dāng)理解,以上示例被描述僅用于說明的目的,而沒有對本文中描述的主題的范圍提出任何限制??梢越Y(jié)合本文中描述的主題的實現(xiàn)來開發(fā)和使用任何其他合適的圖查詢語言。響應(yīng)于圖查詢的接收,查詢轉(zhuǎn)換器220將圖查詢轉(zhuǎn)換成表查詢,諸如由一個或多個sql語句組成的sql查詢,以定位匯聚節(jié)點并且獲得匯聚節(jié)點的數(shù)據(jù)。具體地,在步驟420,查詢轉(zhuǎn)換器220可以使用轉(zhuǎn)換后的sql查詢訪問存儲源節(jié)點的節(jié)點表230(稱為“源表”),以檢索對應(yīng)于源節(jié)點的記錄。所檢索的記錄至少包含存儲源節(jié)點的多值屬性的多值字段。在一個實現(xiàn)中,多值屬性可以被實現(xiàn)為包含對于相鄰節(jié)點的引用的鄰接列表,如上所述。特別地,在步驟420檢索的鄰接列表中的節(jié)點與匯聚節(jié)點具有相同的類型。在一個實現(xiàn)中,查詢轉(zhuǎn)換器220可以基于相關(guān)聯(lián)的注釋來定位相關(guān)的多值字段,如上所述。在步驟430,匯聚節(jié)點位于存儲匯聚節(jié)點的數(shù)據(jù)的匯聚表中,從而獲得匯聚節(jié)點的數(shù)據(jù)。檢索至少部分地基于多值非局部屬性來進(jìn)行,例如以在步驟420檢索的源節(jié)點的鄰接列表的形式。在一個實現(xiàn)中,可以使用用戶定義的函數(shù)(udf)或者系統(tǒng)提供的函數(shù)來實現(xiàn)。以下僅為了說明的目的來討論udf。具體地,查詢轉(zhuǎn)換器220操作以對在步驟420獲得的多值屬性應(yīng)用udf從而提取鄰接列表中的原子值。在一個實現(xiàn)中,可以調(diào)用udf以基于源節(jié)點的檢索到的多值屬性來創(chuàng)建使源節(jié)點與其相鄰節(jié)點相關(guān)聯(lián)的聯(lián)接表。作為示例,在一個實現(xiàn)中,可以使用以下示例代碼片段來定義名為“transpose”的udf:該代碼片段將udf定義為枚舉器,查詢引擎重復(fù)地調(diào)用枚舉器以迭代整個列表并且將來自列表的每個元素插入到一列表中。由transpose返回的表具有例如名為“sink”的單個列。圖5圖示示出了udf如何工作的示意圖。在本示例中,交叉應(yīng)用(crossapply)運算符與udf結(jié)合使用,以將所有檢索到的節(jié)點記錄轉(zhuǎn)換成使檢索到的節(jié)點與其相鄰節(jié)點相關(guān)聯(lián)的兩列表。具體地,在調(diào)用500中,crossapply運算符用作嵌套循環(huán)聯(lián)接,并且從外部表employeenode510為每個記錄或行調(diào)用一次udftranspose(clients)。如上所述,“客戶”列中的每個字段可以存儲鄰接列表的二進(jìn)制表示。由crossapply運算符對udf進(jìn)行的每次調(diào)用將導(dǎo)致使源節(jié)點與鄰接列表中的相鄰節(jié)點之一相關(guān)聯(lián)的記錄。由多個這樣的調(diào)用產(chǎn)生的記錄可以被級聯(lián)為聯(lián)接表520。如圖5所示,由udf和crossapply運算符創(chuàng)建的聯(lián)接表520具有來自源節(jié)點表的列“employeenode”和包含匯聚表中的相鄰節(jié)點的主鍵的“sink”列。在所示示例中,僅投影兩個列。在其他實現(xiàn)中,可以通過udf投影多個多值字段以創(chuàng)建具有更多列的聯(lián)接表。在一個實現(xiàn)中,可以通過使用轉(zhuǎn)換后的sql查詢中的聯(lián)接表520和匯聚表(圖中未示出)之間的聯(lián)接從匯聚表中檢索匯聚節(jié)點的數(shù)據(jù)。使用udftranspose從雇員節(jié)點到客戶節(jié)點的示例性完整查詢遍歷如下所示:由crossapply運算符返回的<nodeid,sink>對使雇員節(jié)點與其相鄰節(jié)點相關(guān)聯(lián)。然后,通過使用名為“clientnode”的匯聚節(jié)點表和聯(lián)接表之間的聯(lián)接,檢索匯聚節(jié)點的記錄。在上述sql語句的物理執(zhí)行中,滿足條件enode.name=“johndoe”的來自表employeenode的雇員節(jié)點可以通過表掃描或索引查找來檢索,這取決于數(shù)據(jù)庫查詢優(yōu)化器所做的決定。然后,執(zhí)行crossapply運算符的執(zhí)行。crossapply運算符為來自表employeenode的每個滿足的節(jié)點/行調(diào)用udftranspose。最后,匯聚表clientnode和transpose之間的聯(lián)接使用來自鄰接列表的客戶節(jié)點的標(biāo)識符來定位他們的記錄。應(yīng)當(dāng)理解,在本文中描述的主題的實現(xiàn)中,節(jié)點記錄通常不超過幾個磁盤頁或存儲器頁。此外,當(dāng)從源表檢索到時,節(jié)點記錄將其加載到片上高速緩存中。因此,評估udf通常只消耗處理器計算。與傳統(tǒng)的物理聯(lián)接表相比,這樣的高速緩存局部性確保了高效率。此外,在圖查詢被轉(zhuǎn)換成對關(guān)系表的sql查詢的那些實現(xiàn)中,sql查詢優(yōu)化器可以產(chǎn)生執(zhí)行高效的計劃。例如,可以使用散列聯(lián)接或嵌套循環(huán)聯(lián)接來執(zhí)行檢索客戶節(jié)點的以上轉(zhuǎn)換后的sql查詢中的最終聯(lián)接。散列聯(lián)接是有效的,特別是當(dāng)需要檢索大量客戶節(jié)點以及掃描表和構(gòu)建散列表的分?jǐn)偝杀拘∮陔S機(jī)查找的成本時。具體地,在一個實現(xiàn)中,由udf創(chuàng)建的聯(lián)接表520可以是在查詢運行時的臨時聯(lián)接表。也就是說,聯(lián)接表520不會在底層存儲器中持續(xù)保存。實際上,在一個實現(xiàn)中,聯(lián)接表520可以在執(zhí)行中被流水線化。也就是說,可以在聯(lián)接表520和匯聚表之間的聯(lián)接中使用之后,將聯(lián)接表520中的每個記錄去除。以這種方式,可以進(jìn)一步提高查詢效率,而不會浪費資源。本文中描述的主題的實現(xiàn)可應(yīng)用于各種類型的圖查詢?,F(xiàn)在將描述圖模式匹配作為示例。圖中的模式是由圖中的一個或多個路徑組成的子圖。例如,路徑是通過邊連接的節(jié)點表的序列。在操作中,用戶應(yīng)用可以輸入模式,并且圖轉(zhuǎn)換器170返回圖中匹配輸入模式的一個或多個模式。為此,查詢轉(zhuǎn)換器220可以將模式分解為一系列子模式,并且然后將每個子模式轉(zhuǎn)換成crossapply運算符的序列,并進(jìn)行聯(lián)接,如以上參考圖4所述。在一個實現(xiàn)中,匹配子句可以以簡單的方式轉(zhuǎn)換成一系列常規(guī)表聯(lián)接。例如,如上所述,可以通過將存儲鄰接列表的每個多值列規(guī)范化為兩列表來完成轉(zhuǎn)換。但是,這種簡單的轉(zhuǎn)換可能不會導(dǎo)致優(yōu)化的sql查詢。為了利用高速緩存局部性,在一個實現(xiàn)中,查詢轉(zhuǎn)換器220在轉(zhuǎn)換中搜索模式的最佳分解。圖6示出了在本文中描述的主題的一個實現(xiàn)中的用于圖模式的最佳分解的方法600的流程圖。方法600在步驟610進(jìn)入,在步驟610接收對圖模式匹配的請求。在一個實現(xiàn)中,用戶可以使用由查詢轉(zhuǎn)換器220支持的圖查詢語言來輸入模式匹配查詢。作為示例,在一個實現(xiàn)中,圖匹配可以表達(dá)為具有指定的圖模式的添加的match子句的select-from-where查詢塊。路徑可以表達(dá)為-[edgename]->,其中edgename是表示指向匯聚節(jié)點表的鄰接列表的源節(jié)點表的列。作為示例,圖5所示的節(jié)點表上的示例查詢?nèi)缦拢涸诒臼纠校琭rom子句照常處理節(jié)點表和常規(guī)表,并且為每個表分配別名。在match子句中使用節(jié)點表的別名來指定模式。在本示例中,模式是連接兩個雇員節(jié)點和一個客戶節(jié)點的三角形,其在圖7中被描繪模式700。應(yīng)當(dāng)理解,上述示例被討論僅為了說明的目的,而沒有對本文中描述的主題的范圍提出任何限制。圖模式匹配可以以其他合適的方式來表達(dá)。方法600進(jìn)行到步驟620,在步驟620將規(guī)定的模式分解為一個或多個子模式,從而獲得候選分解方案。通常,可以根據(jù)要求和應(yīng)用來選擇子模式。在一個實現(xiàn)中,可以使用一高度樹(one-heighttree)作為基本分解子模式來確保高速緩存局部性。如上所述,節(jié)點的鄰接列表和局部屬性在節(jié)點表中共同定位。當(dāng)節(jié)點記錄被加載到片上高速緩存中時,其相鄰節(jié)點的標(biāo)識符可以由crossapply運算符來重構(gòu),這主要涉及處理器計算。因此,如果選擇一高度樹作為基本分解子模式,則可以通過根節(jié)點表的單次掃描或查找來對子模式進(jìn)行評估,而不需進(jìn)行其他數(shù)據(jù)訪問。也就是說,通過使用一高度樹來覆蓋整個圖模式,與其他分解方案相比,查詢的執(zhí)行可以利用高速緩存局部性并且有效地避免了不必要的連接。當(dāng)然,沒有必要使用一高度樹作為基本分解子模式??梢允褂萌魏纹渌线m的結(jié)構(gòu)(諸如單個邊)作為子模式。作為示例,圖7示出了模式分解的示例。在上述示例圖模式匹配中指示的模式700被分解成兩個子模式710和720。子模式710和720中的每個是一高度樹。分解后的子模式710和720的轉(zhuǎn)換后的sql查詢?nèi)缦拢喝匀粎⒖紙D6,方法600進(jìn)行到步驟630以確定在步驟620確定的候選分解方案的成本。在一個實現(xiàn)中,成本包括與候選分解產(chǎn)生的各個子模式相關(guān)聯(lián)的子模式成本。在一個實現(xiàn)中,圖中的子模式的基數(shù)可以用于測量與該子模式相關(guān)聯(lián)的各個成本。該基數(shù)定義為通過匹配圖中的子模式所返回的結(jié)果的數(shù)目。如上所述,在一個實現(xiàn)中,子模式可以是一高度樹。在這個實現(xiàn)中,根實例的數(shù)目是滿足謂詞(如果有的話)的相應(yīng)節(jié)點表中的行數(shù)。與根實例相關(guān)聯(lián)的葉子實例的數(shù)目可以由根和葉子之間的平均程度來確定。具體地,如果一高度樹子模式中有多個葉子,則來自不同分支的葉子實例將導(dǎo)致結(jié)果表中的笛卡爾乘積。為了討論,一高度樹子模式被表示為<[l1,...,ln]>,其中r表示根,而li表示葉子。一高度樹模式的輸出表的大小是:其中rr表示根r的節(jié)點表,p1,...,pm表示與根r相關(guān)聯(lián)的或者聯(lián)接的或者分離的謂詞,,d(r→li)表示從圖中的根r到葉子li的平均程度。在一個實現(xiàn)中,|σp1,...,pm(rr)|可以由估計節(jié)點表大小和謂詞選擇性的底層數(shù)據(jù)庫來給出。兩種類型的節(jié)點之間的平均程度d(r→li)是可以由圖轉(zhuǎn)換器170維持的圖統(tǒng)計量。它可以通過對圖計算一次以及周期性地重新計算,例如,響應(yīng)于數(shù)據(jù)分布的動態(tài)變化。除了子模式成本之外,要在步驟630確定的成本可以包括與兩個或多個子模式的連接相關(guān)聯(lián)的連接成本。為了便于討論,將描述兩個子模式的連接,其中一高度樹用作子模式??梢酝ㄟ^兩種類型的聯(lián)接來連接兩個子模式,如圖8所示。第一類型的聯(lián)接(如圖8中的810所示)將子模式710的葉子連接到另一子模式720的根。在物理上,它是存儲一個節(jié)點表的多值屬性(相鄰列表)的列與存儲另一節(jié)點表的主鍵的列之間的聯(lián)接。子模式710的基數(shù)可以是已知的,如上所述。聯(lián)接之后的結(jié)果大小由以下各項來確定:(1)鄰接列表中有多少個元素在聯(lián)接中幸存,以及(2)從這些幸存的節(jié)點開始,有多少個新節(jié)點可以在子模式720的分支之后達(dá)到。假定每個鄰接列表中的每個元素都指向目標(biāo)類型的有效節(jié)點。則來自鄰接列表的節(jié)點只能在不滿足子模式720的根上的謂詞的情況下才能被消除。消除率由謂詞的選擇性給出,其可以通過底層數(shù)據(jù)庫的查詢優(yōu)化器來獲得。另外,新的可訪問節(jié)點的數(shù)目由子模式720的分支的平均程度確定。這些參數(shù)是圖統(tǒng)計量,并且可以由圖轉(zhuǎn)換器170收集。第一類型聯(lián)接的結(jié)果基數(shù)可以正式地描述如下。令是在和r2上聯(lián)接的兩個一高度樹子模式。連接成本可以如下測量:第二類型的聯(lián)接連接來自兩個子模式的兩個葉子,如圖8中的連接820所示。它可以被認(rèn)為是兩個鄰接列表的交叉點。估計交叉點的基數(shù)需要兩個列表的數(shù)據(jù)分布。然而,這種知識在底層數(shù)據(jù)庫中不能立即可用,例如,如果鄰接表以二進(jìn)制格式編碼。在一個實現(xiàn)中,信息可以由圖轉(zhuǎn)換器170明確地維護(hù)。為此,可以使用采樣來構(gòu)建節(jié)點表的鄰接列表列的直方圖。更具體地,可以從節(jié)點表采樣小部分的節(jié)點,并且將它們的目標(biāo)鄰接列表轉(zhuǎn)換成兩列表(例如,圖5中的表520),邊的源和匯聚節(jié)點之間的關(guān)系的表格表示。然后可以利用底層數(shù)據(jù)庫的查詢優(yōu)化器來計算第二類型的聯(lián)接的基數(shù)作為連接成本。返回圖6,在步驟640,查詢轉(zhuǎn)換器220檢查是否考慮了所有可能的候選分解方案。應(yīng)當(dāng)理解,在實踐中,通常有多種方式將圖模式分解為子模式。方法600例如通過搜索算法來列舉各種分解方案,以便選擇最優(yōu)分解方案,使得相應(yīng)的表查詢能夠被查詢引擎有效率地執(zhí)行。具體地,在一個實現(xiàn)中,圖的拓?fù)渲R可以用于確定在步驟640有多少候選分解方案可用。如上所述,match子句中的圖模式可以由圖中的一個或多個路徑定義。這與sql中的表連接圖類似。但是,與在搜索最優(yōu)執(zhí)行計劃時可以由數(shù)據(jù)庫查詢優(yōu)化器分解為不同子表達(dá)式的表連接圖不同,數(shù)據(jù)庫優(yōu)化器無法更改轉(zhuǎn)換后的crossapply序列,因為圖的語義將被查詢引擎忽略。圖的拓?fù)渲R可以用于優(yōu)化表查詢。作為示例,這種知識包括反向邊。已知,圖節(jié)點通常是高度連接的。在某些情況下,通常兩個節(jié)點通過有向邊相互指向彼此。在這種情況下,當(dāng)需要檢索兩個節(jié)點時,從源節(jié)點到匯聚節(jié)點的遍歷等效于從匯聚節(jié)點到源節(jié)點的通過后向邊的遍歷。作為示例,圖遍歷nodetable1-[edge1]->nodetable2可以由查詢轉(zhuǎn)換器220轉(zhuǎn)換成以下sql查詢語句:nodetablelasn1crossapplytranspose(n1.edge1)ase1joinnodetable2asn2one1.sink=n2.nodeid假定表nodetable2包含指向表nodetable1中的節(jié)點的多值字段edge2。則遍歷圖nodetab1e2-[edge2]->nodetable1可以轉(zhuǎn)換成以下sql查詢:nodetable2asn2crossapplytranspose(n2.edge2)ase2joinnodetablelasn1one2.sink=n1.nodeid可以理解,上述兩個sql查詢語義上彼此相當(dāng)。然而,底層數(shù)據(jù)庫(例如,sql數(shù)據(jù)庫)的查詢優(yōu)化器并不知道這樣的等價性,并且在sql查詢優(yōu)化階段無法將查詢從一種形式重寫為另一種形式,從而限制候選執(zhí)行計劃的空間。當(dāng)轉(zhuǎn)換成表查詢時,圖轉(zhuǎn)換器170(更具體地,查詢轉(zhuǎn)換器220)可以考慮這樣的等同性。特別地,可以基于模式中的邊的反向邊來獲得至少一個分解方案。為了討論的目的,參考圖7所示的示例。如果確定從節(jié)點702到節(jié)點704的遍歷在語義上等同于從節(jié)點704到節(jié)點702的遍歷,則可以通過反轉(zhuǎn)從節(jié)點702到704的有向邊來使得更多的候選分解方案可用。以這種方式,可以獲得更好的分解方案,使得可以由查詢引擎有效地處理對關(guān)系表的結(jié)果查詢。仍然參考圖6,如果在步驟640確定存在尚未被考慮的剩余候選分解方案,則方法600返回到步驟620以獲得其中之一并且在步驟630計算相關(guān)聯(lián)的成本。另一方面,如果考慮了所有可能的候選分解方案,則方法600進(jìn)行到步驟650,在步驟650基于成本來選擇候選分解方案之一。例如,在一個實現(xiàn)中,可以選擇具有足夠低的成本(例如,低于門限)的候選分解方案。具體地,在一個實現(xiàn)中,可以在步驟650選擇最小化成本的候選分解方案。然后在步驟660,根據(jù)在步驟650選擇的分解方案來分解模式,從而獲得子模式的集合。除了模式分解以外,或代替模式分解,拓?fù)渲R可以用于促進(jìn)其他圖查詢的優(yōu)化。例如,除了作為圖處理的結(jié)構(gòu)單元的圖模式匹配之外,另一種類型的常見圖處理是迭代圖處理。迭代圖處理是圖計算模型,它為每個節(jié)點分配狀態(tài)并且使用節(jié)點鄰居的狀態(tài)持續(xù)更新它。計算在固定次數(shù)的迭代之后或一些參數(shù)收斂之后終止。迭代圖處理的示例包括但不限于最短路徑、頁面排序等。作為示例,最短路徑算法旨在找到兩個節(jié)點之間的最短路徑。在一個實現(xiàn)中,查詢轉(zhuǎn)換器220可以使用兩個表來優(yōu)化最短路徑查詢。特別地,查詢轉(zhuǎn)換器220可以維護(hù)用于從節(jié)點@start開始的路徑的名為fromsource(sink,dist)的表、以及用于在以節(jié)點@end結(jié)尾的路徑的名為tosink(source,dist)的表。在每一輪迭代中,擴(kuò)展來自其中一個的路徑。在迭代中選擇表取決于諸如表大小等參數(shù)。當(dāng)然,在另一實現(xiàn)中,可以使用更復(fù)雜的參數(shù)(諸如鄰域統(tǒng)計)用于決策。查詢轉(zhuǎn)換器220可以操作以選擇發(fā)現(xiàn)較少路徑的遍歷方向。一旦選擇了方向,擴(kuò)展查詢、即fromsource(或tosink)和allnodes之間的聯(lián)接可以與min聚合相結(jié)合以適應(yīng)預(yù)聚合優(yōu)化。在一輪迭代結(jié)束時,將fromsource和tosink聯(lián)接。一旦該聯(lián)接產(chǎn)生某個(某些)結(jié)果,則迭代終止。以這種方式,代替填充所有路徑,該執(zhí)行僅填充從@start開始或以@end結(jié)尾的路徑。此外,與上述的模式分解類似,尋找最短路徑可以從@start向前追蹤或從@end向后追蹤。通過表fromsource(sink,dist)和tosink(source,dist),可以選擇導(dǎo)致稀疏區(qū)域的方向,以便執(zhí)行可以訪問更少的節(jié)點。從查詢處理的角度來看,它相當(dāng)于選擇導(dǎo)致更少聯(lián)接選擇性的聯(lián)接順序。圖9示出了在本文中描述的主題的一個實現(xiàn)中的圖映射器210的框圖。如圖所示,在一個實現(xiàn)中,圖映射器210包括請求接收單元910,被配置為接收存儲表示包括多個節(jié)點的圖的數(shù)據(jù)的請求,節(jié)點中的至少一個具有單值屬性和多值屬性。多值屬性可以是非局部屬性,并且包括對于至少一個相鄰節(jié)點的引用。數(shù)據(jù)存儲在數(shù)據(jù)庫中的表中,其中表中的每個記錄對應(yīng)于一個節(jié)點。為此,圖映射器210可以包括被配置為將單值屬性存儲在單值字段中的單值屬性存儲單元920和被配置為將多值屬性存儲在多值字段中的多值屬性存儲單元930。在一個實現(xiàn)中,多值屬性存儲單元930被配置為在不同的多值字段中存儲不同類型的多值屬性。在一個實現(xiàn)中,圖映射器210包括注釋生成單元,被配置為生成用于多值字段的注釋,注釋指示多值字段用于存儲多值屬性??梢曰谥甘疽粋€或多個多值屬性是非局部屬性的用戶輸入來創(chuàng)建注釋。例如,用戶輸入可以被包括在圖查詢中。在一個實現(xiàn)中,注釋還指示存儲至少一個相鄰節(jié)點的匯聚表。在一個實現(xiàn)中,多值屬性包括多個原子值。圖映射器210可以包括被配置為生成由數(shù)據(jù)庫支持的數(shù)據(jù)類型中的多個原子值的表示的表示生成單元。在該實現(xiàn)中,多值屬性存儲單元930被配置為將所生成的表示存儲在多值字段中。在一個實現(xiàn)中,多值屬性存儲單元930被配置為在不同的多值字段中存儲不同類型的多值屬性。在一個實現(xiàn)中,圖映射器210包括被配置為生成用于圖的至少一個視圖的視圖生成單元,視圖包括包含第一和第二多值屬性的聯(lián)合多值字段。圖10示出了在本文中描述的主題的一個實現(xiàn)中的查詢轉(zhuǎn)換器220的框圖。查詢轉(zhuǎn)換器220包括圖查詢接收單元1010,被配置為接收關(guān)于表示包括多個節(jié)點的圖的數(shù)據(jù)的圖查詢,圖查詢涉及從源節(jié)點到與源節(jié)點相鄰的匯聚節(jié)點的遍歷;被配置為從關(guān)系數(shù)據(jù)庫中的源表檢索與源節(jié)點相對應(yīng)的記錄的屬性檢索單元1020,記錄包含存儲源節(jié)點的多值非局部屬性的多值字段,多值非局部屬性包括對源節(jié)點的至少一個相鄰節(jié)點的引用;以及被配置為基于源節(jié)點的多值非局部屬性來從匯聚表獲得匯聚節(jié)點的數(shù)據(jù)的數(shù)據(jù)獲取單元1030。在一個實現(xiàn)中,數(shù)據(jù)獲取單元1030包括被配置為創(chuàng)建使源節(jié)點和對至少一個相鄰節(jié)點的引用相關(guān)聯(lián)的聯(lián)接表的聯(lián)接表創(chuàng)建單元。在該實現(xiàn)中,可以生成具有聯(lián)接表和匯聚表之間的聯(lián)接的表查詢。在一個實現(xiàn)中,數(shù)據(jù)獲取單元1030被配置為根據(jù)多值字段的注釋識別多值字段用于存儲多值非局部屬性,并且被配置為通過關(guān)于源節(jié)點的多值非局部屬性調(diào)用預(yù)定義的函數(shù)(諸如udf或系統(tǒng)定義的函數(shù))來創(chuàng)建聯(lián)接表。另外地或可替代地,在一個實現(xiàn)中,數(shù)據(jù)獲取單元1030被配置為通過在記錄被用于聯(lián)接表和匯聚表之間的聯(lián)接中之后,去除聯(lián)接表中的記錄來流水線聯(lián)接表。當(dāng)然,永久聯(lián)接表也是可能的。具體地,在一個實現(xiàn)中,圖查詢被轉(zhuǎn)換成對源表和匯聚表的表查詢。然后,轉(zhuǎn)換后的表查詢執(zhí)行源節(jié)點的多值非局部屬性的檢索和匯聚節(jié)點的數(shù)據(jù)的獲取。在一個實現(xiàn)中,圖查詢涉及要在圖中匹配的模式。查詢轉(zhuǎn)換器220可以包括:被配置為獲得模式的多個候選分解方案的候選獲取單元,候選分解方案中的每個導(dǎo)致多個子模式;被配置為確定每個候選分解方案的成本的成本確定單元,成本包括與候選分解方案產(chǎn)生的子模式相關(guān)聯(lián)的子模式成本以及與子模式的連接相關(guān)聯(lián)的連接成本;被配置為選擇成本低于預(yù)定門限的候選分解方案之一(例如,具有最低成本的候選分解方案)的分解方案選擇單元;以及被配置為根據(jù)所選擇的候選分解方案來分解模式的分解單元。在一個實現(xiàn)中,成本確定單元被配置為通過確定圖中的子模式的基數(shù)來確定與子模式相關(guān)聯(lián)的子模式成本。在一個實現(xiàn)中,候選獲取單元被配置為基于模式中的邊的反向邊來獲得候選分解方案中的至少一個。在一個實現(xiàn)中,圖查詢涉及對于圖的迭代處理。查詢轉(zhuǎn)換器220可以包括:被配置為獲得關(guān)于圖的拓?fù)渲R的拓?fù)渲R獲取單元,拓?fù)渲R對于數(shù)據(jù)庫是不可用的;以及被配置為至少部分地基于拓?fù)渲R來優(yōu)化迭代處理的查詢優(yōu)化單元。本文中描述的功能至少部分地由一個或多個硬件邏輯部件來執(zhí)行。例如但不限于,可以使用的說明性類型的硬件邏輯部件包括現(xiàn)場可編程門陣列(fpga)、專用集成電路(asic)、專用標(biāo)準(zhǔn)產(chǎn)品(assp)、片上系統(tǒng)系統(tǒng)(soc)、復(fù)雜可編程邏輯器件(cpld)等。本文中描述的主題的各種實現(xiàn)可以在硬件或?qū)S秒娐贰④浖?、邏輯或其任何組合中實現(xiàn)。一些方面可以在硬件中實現(xiàn),而其他方面可以在可以由控制器、微處理器或其他計算設(shè)備執(zhí)行的固件或軟件中實現(xiàn)。雖然本文中描述的主題的實現(xiàn)的各個方面被示出和描述為框圖、流程圖或使用某種其他圖形表示來示出和描述,但是應(yīng)當(dāng)理解,作為非限制性示例,本文中描述的框、裝置、系統(tǒng)、技術(shù)或方法可以在硬件、軟件、固件、專用電路或邏輯、通用硬件或控制器或其他計算設(shè)備、或者其某種組合中實現(xiàn)。作為示例,可以在目標(biāo)真實或虛擬處理器上的設(shè)備中執(zhí)行的機(jī)器可執(zhí)行指令(諸如被包括在程序模塊中的那些)的一般上下文中描述主題的實現(xiàn)。通常,程序模塊包括執(zhí)行特定任務(wù)或?qū)崿F(xiàn)特定抽象數(shù)據(jù)類型的例程、程序、庫、對象、類、部件、數(shù)據(jù)結(jié)構(gòu)等。程序模塊的功能可以在各種實現(xiàn)中根據(jù)需要在程序模塊之間組合或分開。程序模塊的機(jī)器可執(zhí)行指令可以在本地或分布式設(shè)備中執(zhí)行。在分布式設(shè)備中,程序模塊可以位于本地和遠(yuǎn)程存儲介質(zhì)中。用于執(zhí)行本文中描述的主題的方法的程序代碼可以以一種或多種編程語言的任何組合來編寫。這些程序代碼可以被提供給通用計算機(jī)、專用計算機(jī)或其它可編程數(shù)據(jù)處理裝置的處理器或控制器,使得程序代碼在由處理器或控制器執(zhí)行引起在流程圖和/或框圖中規(guī)定的功能/操作被實現(xiàn)。程序代碼可以完全在機(jī)器上執(zhí)行,部分地在機(jī)器上執(zhí)行,作為獨立的軟件包執(zhí)行,部分地在機(jī)器上并且部分地在遠(yuǎn)程機(jī)器上執(zhí)行,或者完全在遠(yuǎn)程機(jī)器或服務(wù)器上執(zhí)行。在本公開的上下文中,機(jī)器可讀介質(zhì)可以是可以包含或存儲由或結(jié)合指令執(zhí)行系統(tǒng)、裝置或設(shè)備使用的程序的任何有形介質(zhì)。機(jī)器可讀介質(zhì)可以是機(jī)器可讀信號介質(zhì)或機(jī)器可讀存儲介質(zhì)。機(jī)器可讀介質(zhì)可以包括但不限于電子、磁性、光學(xué)、電磁、紅外或半導(dǎo)體系統(tǒng)、設(shè)備或裝置、或者上述的任何合適的組合。機(jī)器可讀存儲介質(zhì)的更具體的示例將包括具有一條或多條電線的電連接、便攜式計算機(jī)磁盤、硬盤、隨機(jī)存取存儲器(ram)、只讀存儲器(rom)、可擦除可編程讀取(eprom或閃速存儲器)、光纖、便攜式光盤只讀存儲器(cd-rom)、光存儲器件、磁存儲器件、或者上述的任何合適的組合。此外,雖然以特定順序描繪操作,但是這不應(yīng)當(dāng)被理解為要求以所示的特定順序或按順序執(zhí)行此類操作,也不應(yīng)當(dāng)被理解為執(zhí)行所有所示的操作以獲得期望的結(jié)果。在某些情況下,多任務(wù)和并行處理可能是有利的。同樣地,雖然上述討論中包含若干具體的實現(xiàn)細(xì)節(jié),但是這些不應(yīng)當(dāng)被解釋為對本文中描述的主題的范圍的限制,而是作為對可以特定于特定實現(xiàn)的特征的描述。在單獨實現(xiàn)的上下文中描述的某些特征也可以在單個實現(xiàn)中以組合方式實現(xiàn)。相反,在單個實現(xiàn)的上下文中描述的各種特征也可以分開地或以任何合適的子組合在多個實現(xiàn)中實現(xiàn)。雖然已經(jīng)以特定于結(jié)構(gòu)特征和/或方法動作的語言描述了主題,但是應(yīng)當(dāng)理解,所附權(quán)利要求中限定的主題不一定限于上述具體特征或動作。相反,上述具體特征和動作被公開作為實現(xiàn)權(quán)利要求的示例形式。當(dāng)前第1頁12當(dāng)前第1頁12
      當(dāng)前第1頁1 2 
      網(wǎng)友詢問留言 已有0條留言
      • 還沒有人留言評論。精彩留言會獲得點贊!
      1