GraphX-基礎知識-圖術語解釋

五元雜貨鋪發表於2020-10-14

【導讀】

Spark GraphX是一個分散式圖處理框架,它是基於Spark平臺提供對圖計算和圖挖掘簡潔易用的而豐富的介面,極大的方便了對分散式圖處理的需求。但如果我們想熟練的開發Spark GraphX的應用程式還有很長的路要走,本系列文章是GraphX的從入門到精通,會持續更新,如果你對圖計算感興趣就關注起來吧。

【前言】

思考一個問題:現實生活中我們有哪些可用的圖?以及這些可用的圖都是什麼樣的圖?

有向圖和無向圖

用圖可以對事物以及事物之間的聯絡建模。首先來弄清楚【圖3.9】中的有向圖和無向圖的不同。在一個有向圖中,聯絡是從源頂點到目標頂點全球資訊網中的一個頁面到另一個頁面的連結,學術論文中的引用,都是比較典型的例子。在有向圖中,一條邊的兩個頂點般扮演著不同的角色,如父子關係,頁面A連結向頁面B。
【圖3.9】 GraphX中的圖都繼承了有向圖,同時在一些內建演算法中也支援忽略方向的無向固。如果需要無向圖,可以通過忽略方向來實現。

【圖3.9】 GraphX中的圖都繼承了有向圖,同時在一些內建演算法中也支援忽略方向的無向固。如果需要無向圖,可以通過忽略方向來實現。

在一個無向圖中,邊是沒有方向;關係都是對稱的。社交網路中一個典型的聯絡是,通常A如果是B的朋友,我們很可能認為B也是A的朋友。更進一步,如果我們到Kevin Bacon是六度關係,那麼Kevin Bacon到我們也是六度關係。GraphX中的一個很重要的概念是,所有的邊都有一個方向,那麼圖就是有向圖;如果忽略邊的方向,就是無向圖。

有環圖和無環圖

有環圖是包含迴圈的一系列頂點連線成一個環(參見【圖3.10】)。一個無環圖沒有環。需要了解有環圖和無環圖的區別的原因是,如果你有個演算法,通過連線的頂點,沿著連線的邊有向圖就會造成這樣的風險:不恰當的演算法實現會卡住,在環上永遠迴圈下去。

【圖3.10】 一個有環圖是在圖中存在一個環在有環圖中如果不關心止條件,演算法可能會永遠在環上執行,無法退出。

【圖3.10】 一個有環圖是在圖中存在一個環在有環圖中如果不關心止條件,演算法可能會永遠在環上執行,無法退出。

有環圖的一個有趣的特徵是,其形成一個三角形關係,即每個頂點都與其他兩個頂點相連。三角形關係的用途之一是作為一個預測特徵來區分垃圾郵件和非垃圾郵件。

有標籤的圖和無標籤的圖

有標籤圖是頂點或邊除了有唯一標示,還有與之關聯的資料(標籤)(參見【圖3.11】)。對頂點做了標籤稱為頂點標籤圖,對邊做了標籤的稱為邊標籤圖。
在這裡插入圖片描述

【圖3.11】一個完全無標籤的圖通常用處不大,一般至少是頂點有標籤。Graph的基本工具類GraphloaderedgelistFile支援有標籤的固和無標籤的圖。

上面講到了GraphXGraphLoader.edgeListFile()建立邊,它同時會對邊的兩個頂點(源頂點目標頂點)建立一個預設屬性值1。一個確定了邊標籤型別的圖就是大家熟知的權重圖。權重圖一般會用作計算比如城鎮之間的最短路徑。這裡提到的權重是對邊打標籤,表示兩個頂點(城鎮〉之間的距離。

平行邊和環

平行邊和環區別在於是否許在同一對頂點上同存在多條邊,還是邊的起點和終點都是同個頂點,如【圖3.12】所示的兩種可能性。GrapbX是偽圖,會存在平行邊和自環,所以需要通過groupEdges()和subgrap()來排除這兩種情況。
在這裡插入圖片描述

【圖3.12】 簡單圖是無向圖,沒有平行邊和環;多重圖有平行邊;偽圖有環和平行邊。

二分圖

二分圖有一個如【圖3.13】所示的特定的結構,整個圖的頂點被分成兩個不同的集合,所有的源頂點是一個集合(所有源頂點之間沒有聯絡),所有的目標頂點是一個集合(目標頂點之間沒有聯絡),在兩個集合內都不存在相連的邊。
在這裡插入圖片描述

【圖3.13】二分圖常出現在社交網路分析中,要麼如圖所示的分組關係,要麼是獨立的分組關係,如男性和女性群體在異性交往網站的資料分析一個二分圖中所有的邊從一個集合指向另一個集合。非二分圖不會這樣劃分,只要有一條邊僅僅出現在其中一個集合中,就不是二分圖。

可以用二分圖對兩個不同型別實體之間的關係建模,例如,對申請上大學的學生,吧每個學生劃分到一個頂點集合,把要申請的大學劃分到另一個頂點集合。另一個例子就是推薦系統,把使用者劃分在一個集合中,使用者所購買的產品劃分在另一個集合中。


RDF圖和屬性圖

資源描述框架(RDF)是由全球資訊網聯盟(W3C)在1997年首次提出的針對語義WEB的圖示準。它實現了一部分2004年開始更新的RDFa標準。舊的圖資料庫、圖處理系統只支援RDF三元組(主體、謂語、物件),而新的圖資料庫、圖處理系統(包括GraphX)支援屬性圖(參見【圖3.14】)。
在這裡插入圖片描述

【圖3.14】如果沒有屬性,RDF圖就會變得很笨重,特別是涉及邊屬性的時候GraphX支援屬性圖,可以同時擁有頂點屬性和邊屬性而不需要新增一堆額外的頂點到基礎圖中。

由於其自身的侷限性,RDF元組必須擴充套件到四元組(包括某種身份〉甚至五元組(包括一些所謂的上下文)。這些都是RDF圖的問題。但儘管其有侷限性,RDF圖由於圖資料的原因還是很重要的,例如來自維基百科、WordNet岱如和地理名稱的YAG02資料庫。屬性圖很容易滿足新的圖資料的需要。


鄰接矩陣

另一種表示圖論的方式是鄰接矩陣(參見【圖3.15】),這不是GraphX表示圖的方式。拋開GraphX,Spark的MLlib機器學習庫已經支援鄰接矩陣,還有更通用的稀疏矩陣。如果你不需要邊屬性,可以在MLlib找到比GraphX效能更好的演算法。例如,推薦系統,從效能的角度來看,mllib.recommendation.ALS會是比graphx.lib.SVDPlusPlus更好的選擇,雖然不同場景適用不同演算法。
在這裡插入圖片描述

【圖3.15】 一個固和它等價的鄰接矩陣注意,鄰接矩陳無法儲存邊屬性。

圖查詢系統

有幾十種圖查詢語言,這裡挑出三個最常用的來跟Saprk進行比較。

這裡統一使用這個查詢示例:“請告訴我小名的朋友的朋友”

SPARKQL

SPARKQL是一個類SQL的語言,由W3C為了查詢RDF圖而推出:

SELECT ?p
{
"xiaoming" foaf:knows{2} ?p
}

Cypher

Cypher是屬性圖資料庫Neo4j使用的查詢語言:

MATCH  (ann {ann.name: 'xiaoming'})-[:knows*2..2]-(p)
RETURN p

Tinkerpop Gremlin

Tinkeop努力建立個圖資料庫和圖處理系統的介面標準,就像JDBC一樣,只不過比JDBC更復雜。Tinkerpop多個元件構成,而Gremlin是查詢系統。有一個把Gremlin整合到GraphX嘗試,即Spark-Gremlin工程,可https://github.com/kellrott/spark-gremlin上檢視,截止到2015月1月,這個工程的最新狀態:是沒什麼要做的了。

g.V("name","ann").out('knows').aggregate(x).out('knows').except(x)

GraphX

截止到Spark1.6, GraphX還沒有查詢語言。GraphXAPI更適合在一個大圖上執行一些演算法,而不是查詢一些特定頂點和一些直接的邊和頂點。雖然如此,但也可以實現類似的查詢功能,雖然不太好看:

val g2 = g .outerJoinVertices (g .aggregateMessages [Int] ( ctx => if (ctx.srcAttr ==”Ann”&& ctx.attr ==”knows") ctx.sendToDst(l), math.max(, ))) ((vid, vname, d) => (vname, d.getOrElse(O))) 
g2.outerJoinVertices(g2.aggregateMessages[Int] ( ctx => if (ctx.srcAttr. 2 == 1 && ctx.attr ==”knows”) ctx. sendToDst ( 2) , math.max(, )))((vid, vname, d) => (vname, d.getOrElse(O))). vertices. map( . 2) .filter( . 2 == 2) .map( . 1. 1) .collect

參考文獻:

《GraphX實戰》


作者簡介:大飛
演算法工程師、知識搬運工、乾貨拾荒機
| 公眾號 | 知乎 | CSND | 簡書 | 頭條 |

大飛原創不易,如轉載請註明出處,學習是一生的事業。

PS:投稿請新增微信
wuyuanzahuopu(五元雜貨鋪)

相關文章