溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

大數(shù)據(jù)中如何實(shí)現(xiàn)數(shù)據(jù)的高效追溯

發(fā)布時(shí)間:2021-12-23 10:36:38 來(lái)源:億速云 閱讀:191 作者:柒染 欄目:大數(shù)據(jù)

這篇文章給大家介紹大數(shù)據(jù)中如何實(shí)現(xiàn)數(shù)據(jù)的高效追溯,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

如何基于GES圖數(shù)據(jù)庫(kù)追溯服務(wù)的實(shí)現(xiàn)和優(yōu)化。

“一分鐘,我要這個(gè)人的全部信息”,霸道總裁拍了拍你,并提出這個(gè)要求。秘書(shū)開(kāi)始發(fā)力,找到了:姓名、年齡、聯(lián)系方式、愛(ài)好,這些信息。不太夠?那就再加上親朋好友信息,近期活動(dòng)信息,更完整展現(xiàn)這個(gè)人。雖然是個(gè)段子,但也給與我們一些啟示:對(duì)象本身的信息可能不夠“全”,周邊關(guān)聯(lián)的數(shù)據(jù)也是對(duì)象信息的重要組成,這些關(guān)聯(lián)數(shù)據(jù)對(duì)在進(jìn)行數(shù)據(jù)分析和挖掘時(shí)十分有用。

現(xiàn)實(shí)生活中關(guān)聯(lián)關(guān)系十分普遍,比如人的社交、商品生產(chǎn)和消費(fèi)行為之間都是關(guān)聯(lián)關(guān)系。數(shù)據(jù)分析時(shí),為了更好的利用關(guān)聯(lián)關(guān)系,常使用圖作為數(shù)據(jù)結(jié)構(gòu),使用圖結(jié)構(gòu)保存數(shù)據(jù)的數(shù)據(jù)庫(kù)被稱(chēng)為圖數(shù)據(jù)庫(kù)。傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù),以表格視角對(duì)數(shù)據(jù)進(jìn)行呈現(xiàn),可以方便的對(duì)數(shù)據(jù)進(jìn)行查詢(xún)管理,而圖數(shù)據(jù)庫(kù)更關(guān)注節(jié)點(diǎn)和周邊節(jié)點(diǎn)的聯(lián)系,是一種網(wǎng)狀結(jié)構(gòu),適用于追溯分析、社交網(wǎng)絡(luò)分析、異構(gòu)信息挖掘等等應(yīng)用。華為云提供的圖數(shù)據(jù)庫(kù)服務(wù)就是GES(Graph Engine Service)[1]。

基于圖數(shù)據(jù)庫(kù)可以做很多有趣的應(yīng)用,數(shù)據(jù)追溯就是一個(gè)很常見(jiàn)的應(yīng)用。數(shù)據(jù)追溯,就是把各環(huán)節(jié)產(chǎn)生的數(shù)據(jù)進(jìn)行關(guān)聯(lián)與溯源。疫情中,查看商品的流通過(guò)程,檢查商品是否有可能有接觸傳染源。測(cè)試活動(dòng)中,通過(guò)構(gòu)建測(cè)試過(guò)程網(wǎng)絡(luò),分析測(cè)試活動(dòng)的完備性,用于進(jìn)行質(zhì)量評(píng)估。這些都是追溯的典型使用場(chǎng)景。若以傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)構(gòu)建數(shù)據(jù)追溯,需要獨(dú)立構(gòu)造和維護(hù)多個(gè)關(guān)系表,并實(shí)現(xiàn)多對(duì)多的關(guān)系網(wǎng)絡(luò),不易于理解復(fù)雜的業(yè)務(wù)邏輯,與此同時(shí),也會(huì)伴隨著追溯查詢(xún)實(shí)現(xiàn)復(fù)雜和查詢(xún)緩慢的問(wèn)題。

大數(shù)據(jù)中如何實(shí)現(xiàn)數(shù)據(jù)的高效追溯

圖1 關(guān)系型數(shù)據(jù)庫(kù)和圖數(shù)據(jù)庫(kù)對(duì)比

用一個(gè)例子簡(jiǎn)單說(shuō)明圖數(shù)據(jù)庫(kù)在數(shù)據(jù)分析領(lǐng)域的優(yōu)勢(shì)。圖1是一個(gè)簡(jiǎn)單的選課系統(tǒng),記錄了學(xué)生選課以及相應(yīng)的課程信息。如右圖所示,我們根據(jù)圖數(shù)據(jù)庫(kù)的表達(dá)方式把這些信息轉(zhuǎn)化為一張圖??梢钥闯觯瑘D可以更加直觀(guān)地表達(dá)選課和班級(jí)等關(guān)系,清楚地呈現(xiàn)實(shí)體之間的關(guān)系,更方便進(jìn)行關(guān)聯(lián)分析。比如,根據(jù)圖我們可以很容易找到和小布一起上數(shù)學(xué)課的同學(xué),也可以快速找到選課興趣相同的同學(xué)。通過(guò)圖數(shù)據(jù)庫(kù)可以很方便查詢(xún)到周邊節(jié)點(diǎn)信息,非常適用于追溯實(shí)現(xiàn)。那如何基于圖數(shù)據(jù)庫(kù)如何實(shí)現(xiàn)追溯服務(wù)?接下來(lái)我們將以華為云GES為例,分析基于GES圖數(shù)據(jù)庫(kù)追溯服務(wù)的實(shí)現(xiàn)和優(yōu)化。

什么是圖

在圖數(shù)據(jù)庫(kù)中,圖由以下部分組成:

  1. 點(diǎn):圖中的實(shí)體對(duì)象,在圖中表現(xiàn)為一個(gè)節(jié)點(diǎn)。例如,社會(huì)的人,流通的商品等都可以抽象為圖中的一個(gè)節(jié)點(diǎn)。

  2. 邊:圖中節(jié)點(diǎn)與節(jié)點(diǎn)之間的關(guān)系。如人與人的社會(huì)關(guān)系,商品的購(gòu)買(mǎi)行為等。

  3. 屬性:用于描述圖中節(jié)點(diǎn)或者邊的屬性,比如編號(hào)、名稱(chēng)等。聚類(lèi)和分類(lèi)分析中,權(quán)重是常常作為關(guān)系屬性,也就是邊的屬性。

大數(shù)據(jù)中如何實(shí)現(xiàn)數(shù)據(jù)的高效追溯

圖2 有向圖與無(wú)向圖

根據(jù)邊是否有方向,可以把圖分為有向圖和無(wú)向圖。對(duì)于有向圖來(lái)說(shuō),邊的起點(diǎn)和終點(diǎn)是確定的。圖2中,城市是一個(gè)節(jié)點(diǎn),城市間的距離和城市之間交通方式為邊。城市交通就是一個(gè)有向圖,不同方向交通方式用不同的邊表示,而城市間距離是無(wú)向圖,因?yàn)榫嚯x和方向無(wú)關(guān)。GES使用時(shí),需要將點(diǎn)和邊處理成不同的對(duì)象,點(diǎn)邊都需要定義需要的屬性。點(diǎn)主要就是包含實(shí)體的信息,而邊需要指定起點(diǎn)與終點(diǎn)。

定義GES圖

GES建立圖的步驟可以參考官方文檔[1]。主要就是對(duì)節(jié)點(diǎn)和邊進(jìn)行定義,將數(shù)據(jù)處理為點(diǎn)和邊文件,最后導(dǎo)入GES中,可通過(guò)界面或API導(dǎo)入。處理無(wú)向圖時(shí),即不區(qū)分邊的起點(diǎn)和終點(diǎn),通常也會(huì)設(shè)定一個(gè)默認(rèn)方向,即指定邊的起點(diǎn)和終點(diǎn),這是為了處理和導(dǎo)入數(shù)據(jù)方便,在實(shí)際查詢(xún)中可以忽略這種方向設(shè)定。

在GES構(gòu)建圖的過(guò)程中,定義點(diǎn)和邊以及相關(guān)屬性的文件被稱(chēng)為元數(shù)據(jù)。點(diǎn)和邊的類(lèi)型被稱(chēng)為label,每個(gè)label可具有多個(gè)屬性,如上文提到的名稱(chēng)、權(quán)重等,都可以作為點(diǎn)或邊的屬性。在GES中,label一旦定義并創(chuàng)建成功將不被允許修改,如果必須要修改label定義,就需要格式化圖并重新創(chuàng)建導(dǎo)入元數(shù)據(jù)文件到圖中。

節(jié)點(diǎn)通常是由現(xiàn)實(shí)中的實(shí)體抽象而來(lái),GES節(jié)點(diǎn)屬性常用的數(shù)據(jù)結(jié)構(gòu)包含了float、int、double、long、char、char array、date、bool、enum和string等。通常來(lái)說(shuō)節(jié)點(diǎn)中,字符串類(lèi)型的屬性較多,非字符串屬性可以根據(jù)數(shù)據(jù)類(lèi)型進(jìn)行選擇。字符串類(lèi)型有兩個(gè)選擇:string和char array。char array有數(shù)據(jù)長(zhǎng)度限制,通常為256,而string類(lèi)型沒(méi)有長(zhǎng)度限制。但是在GES中使用char array更有優(yōu)勢(shì),這是因?yàn)閏har array數(shù)據(jù)存放在內(nèi)存中,string類(lèi)型數(shù)據(jù)存放在硬盤(pán)中,因此char array查詢(xún)效率更高,這也是GES元數(shù)據(jù)定義需要注意的地方。在我們項(xiàng)目的場(chǎng)景中,節(jié)點(diǎn)的名稱(chēng)和編號(hào)都是常用的查詢(xún)條件,綜合考慮屬性特征,如節(jié)點(diǎn)名稱(chēng)較長(zhǎng)而節(jié)點(diǎn)編號(hào)較短,最終名稱(chēng)使用了string類(lèi)型,而編號(hào)選擇了char array類(lèi)型。

GES查詢(xún)優(yōu)化

定義好節(jié)點(diǎn)信息后,可以在圖中進(jìn)行查詢(xún)。GES使用的是Gremlin[3]進(jìn)行查詢(xún)。Gremlin是一個(gè)開(kāi)源的流式查詢(xún)語(yǔ)言,查詢(xún)實(shí)現(xiàn)靈活,不同圖數(shù)據(jù)庫(kù)對(duì)查詢(xún)語(yǔ)句的分解以及優(yōu)化處理都不相同,因此,不同的寫(xiě)法可能查詢(xún)效率可能不同。接下來(lái)我們就一種追溯查詢(xún)場(chǎng)景進(jìn)行分析。

大數(shù)據(jù)中如何實(shí)現(xiàn)數(shù)據(jù)的高效追溯

圖4 多分支查詢(xún)場(chǎng)景分析

如圖4所示,字母代表label,也就是一種節(jié)點(diǎn)類(lèi)型??梢钥吹皆搱?chǎng)景具有較多查詢(xún)分支,按照?qǐng)D中的節(jié)點(diǎn)要求,Gremlin查詢(xún)語(yǔ)句直接實(shí)現(xiàn)如下:

g.V(id).hasLabel('A').ouE().otherV().hasLabel('B').ouE().otherV().hasLabel('C').as('c').outE().otherV().hasLabel('F').outE().otherV().hasLabel('H').select('c').outE().otherV().hasLabel('D').as('d').outE().otherV().hasLabel('G').select('d').outE().otherV().hasLabel('H')

基于當(dāng)前Gremlin,GES Gremlin server會(huì)將查詢(xún)分解為多個(gè)查詢(xún)?cè)硬僮鳎⒂蒅ES engine·執(zhí)行。對(duì)于這種多跳的復(fù)雜查詢(xún),會(huì)解析為較多的原子操作并頻繁交互,這會(huì)導(dǎo)致的查詢(xún)效率低下。對(duì)于這種場(chǎng)景,考慮使用optional語(yǔ)句進(jìn)行查詢(xún),效率會(huì)得到提升。查詢(xún)語(yǔ)句如下:

g.V(id).hasLabel('A').ouE().otherV().hasLabel('B').ouE().otherV().hasLabel('C').as('c').optional(outE().otherV().hasLabel('F').outE().otherV().hasLabel('H')).optional(select('c').outE().otherV().hasLabel('D').as('d').optional(outE().otherV().hasLabel('G')).optional(select('d').outE().otherV().hasLabel('H')))

optional在一定程度上可以降低分支的查詢(xún)范圍,從而提升查詢(xún)效率。在項(xiàng)目實(shí)際使用中,使用optional可以提升查詢(xún)性能1倍左右。但是optional不是所有場(chǎng)景都適用,Gremlin實(shí)現(xiàn)需要根據(jù)查詢(xún)場(chǎng)景、數(shù)據(jù)規(guī)模和數(shù)據(jù)特點(diǎn)進(jìn)行優(yōu)化處理,例如圖中節(jié)點(diǎn)的稀疏程度和分支的數(shù)量都是可以考慮優(yōu)化的點(diǎn)。

在對(duì)GES查詢(xún)優(yōu)化時(shí),即使對(duì)Gremlin語(yǔ)句進(jìn)行了優(yōu)化,也有可能達(dá)不到期望的查詢(xún)性能。這是因?yàn)槭褂肎remlin時(shí),處理查詢(xún)過(guò)程中Gremlin server解析后的原子操作可能會(huì)和GES engine頻繁交互,反而會(huì)降低查詢(xún)性能,而且針對(duì)Gremlin查詢(xún)優(yōu)化處理范圍也有限。雖然Gremlin是圖數(shù)據(jù)庫(kù)通用的查詢(xún)腳本定義方式,但是各個(gè)廠(chǎng)家對(duì)于Gremlin腳本優(yōu)化處理不同,因此更推薦使用GES原生API。原生API針對(duì)固定場(chǎng)景做了更多的優(yōu)化,并且減少了Gremlin解析處理過(guò)程,因此性能更優(yōu),但同時(shí)也引入了通用性和效率之間的平衡問(wèn)題,畢竟API沒(méi)有通用的定義實(shí)現(xiàn)。

下面我們將介紹幾種常見(jiàn)的追溯查詢(xún)場(chǎng)景。這些場(chǎng)景都可以通過(guò)Gremlin查詢(xún)實(shí)現(xiàn),但是如果通過(guò)使用GES系統(tǒng)API,可以獲取更好的查詢(xún)性能。

  • 場(chǎng)景(1) 追溯某個(gè)節(jié)點(diǎn)前(后)n層節(jié)點(diǎn)

該查詢(xún)較為常見(jiàn),主要用于查詢(xún)某個(gè)節(jié)點(diǎn)的父子節(jié)點(diǎn),對(duì)于圖1 的場(chǎng)景可以找到班級(jí)的所有同學(xué),該場(chǎng)景Gremlin實(shí)現(xiàn)如下:

g.V(id).repeat(out()).times(n).emit().path()

這種場(chǎng)景下,推薦使用GES算法文檔中的k-hop算法解決該問(wèn)題,需要注意,這個(gè)算法接口只會(huì)返回滿(mǎn)足查詢(xún)條件的子圖中的所有點(diǎn),但沒(méi)有節(jié)點(diǎn)詳情和邊信息,如果需要節(jié)點(diǎn)詳情可以采用batch-query批量進(jìn)行節(jié)點(diǎn)詳情查詢(xún)。如果需要邊信息,推薦場(chǎng)景(2) 使用的API。

  • 場(chǎng)景(2) 按條件追溯某個(gè)節(jié)點(diǎn)之前(后)n層節(jié)點(diǎn),節(jié)點(diǎn)篩選條件相同

g.V(id).repeat(outE().otherV().hasLabel('A')).times(n).emit().path()

這種場(chǎng)景下,推薦使用repeat-query方法。該方法可以快速實(shí)現(xiàn)某個(gè)起點(diǎn)前后n跳查詢(xún),并且可以限定節(jié)點(diǎn)查詢(xún)條件,并且所有點(diǎn)的查詢(xún)過(guò)濾條件相同。在查詢(xún)中,如果不同的點(diǎn)需要使用不同的查詢(xún)條件進(jìn)行過(guò)濾,可以先不指定點(diǎn)查詢(xún)條件,待返回查詢(xún)結(jié)果后再進(jìn)行過(guò)濾。不指定點(diǎn)的查詢(xún)場(chǎng)景可以退化為場(chǎng)景(1),并且該API可以同時(shí)返回節(jié)點(diǎn)和邊的詳情。

  • 場(chǎng)景(3) 按條件追溯某個(gè)節(jié)點(diǎn)之前(后)n層節(jié)點(diǎn),不同節(jié)點(diǎn)篩選條件不同

圖4的例子就是一個(gè)這樣的場(chǎng)景,每層的查詢(xún)label不同。這種情況下,推薦使用filtered-query進(jìn)行查詢(xún),該方法需要詳細(xì)指定每個(gè)節(jié)點(diǎn)的過(guò)濾屬性,相當(dāng)于將每個(gè)查詢(xún)條件都在參數(shù)中一一指定,實(shí)現(xiàn)完全滿(mǎn)足條件的查詢(xún)。項(xiàng)目中,相對(duì)于Gremlin 查詢(xún),filtered-query的查詢(xún)性能可以提升10倍左右。

上述三個(gè)場(chǎng)景中repeat-query和k-hop具有更好的泛化能力,可以隨意指定查詢(xún)跳數(shù)n,需要設(shè)定的參數(shù)簡(jiǎn)單。而filtered-query需要詳細(xì)指定查詢(xún)中每層節(jié)點(diǎn)的屬性,參數(shù)較為復(fù)雜,具體使用中可以根據(jù)業(yè)務(wù)需求進(jìn)行選擇。

GES還提供了很多算法,如Node2vec, subgraph3vec,GCN算法,本文只介紹了基于GES進(jìn)行節(jié)點(diǎn)快速查詢(xún)并提供追溯服務(wù),后續(xù)也會(huì)考慮如何基于建立好的圖,進(jìn)行一些數(shù)據(jù)節(jié)點(diǎn)融合,也可以進(jìn)行相似度分析、質(zhì)量評(píng)估和流程推薦等,更好地挖掘數(shù)據(jù)的價(jià)值。

關(guān)于大數(shù)據(jù)中如何實(shí)現(xiàn)數(shù)據(jù)的高效追溯就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI