由于公司業(yè)務(wù)需要做圖形計算桌硫,所以最近一直在找很多關(guān)于graphFrame和neo4j的資料
graphFrame:
1.graphFrame是基于DataFrame的圖計算
2.graphFrame主要由vertice(頂點)和edge(邊)組成
vertice:主要是描述一個個體,比如XX公司健蕊,其中包含它的屬性;vertice有一個屬性ID必須要設(shè)置
edge:主要是描述關(guān)系,即各個頂點(節(jié)點)之間的關(guān)系,由三個屬性設(shè)置,src(source)起始節(jié)點ID恬吕,dst(distinct)目的節(jié)點ID,relation關(guān)系
3.然后通過創(chuàng)建GraphFrame(vertices,edges)圖對象须床,可以想象一下铐料,兩個點由一條線相連,點代表節(jié)點豺旬,線代表節(jié)點之間的關(guān)系钠惩,記住這個關(guān)系是有方向的,即src->dst
4.graphFrame里面還有一個很重要的概念:連接組件族阅。即Components
運行連接組件算法需要預(yù)先提供一個checkpoint目錄(這個必須設(shè)置篓跛,不設(shè)置程序運行直接報錯),并使用setCheckpointDir方法來實現(xiàn)坦刀。
spark.sparkContext().setCheckpointDir("./temp/check_path");
代碼實現(xiàn):GraphFrame g=new GraphFrame(vertices,deges);
connectedComponents com=g.connectedComponents愧沟;
DataSet<Row> conDS=com.run();
5.每一個連通組件都自動會生成一個component號,即可以通過字段component進(jìn)行g(shù)roupby,這之后就是同一個連通組件中的節(jié)點都被分配到了一組鲤遥。
換種理解方式沐寺,有關(guān)聯(lián)的一組點構(gòu)成一個連接組件,該組件有一個固定的component號盖奈。
如果對一個圖對象直接show的話混坞,你會發(fā)現(xiàn),它包含頂點節(jié)點所有的字段外加一個component字段卜朗,但是它并不包含邊的字段。
6.網(wǎng)上關(guān)于graphFrame的資料相對來說很少了咕村,
給個中文鏈接吧:https://docs.microsoft.com/zh-cn/azure/databricks/spark/latest/graph-analysis/graphframes/user-guide-scala
7.練習(xí)理解:
(1)查找復(fù)雜關(guān)系
g.find("(a)-[e]->(b); (b)-[e2]->(a)").show()
個人理解:(src)-(關(guān)系)->(dst)场钉,所以上面的需求就是找出相互有關(guān)系的頂點,即a->b,b->c懈涛。為什么有兩組逛万,因為從b或者c開始都滿足上面的find條件
(2)關(guān)系查找過濾:
g.find("(a)-[e]->(b); (b)-[e2]->(a)").filter("b.age>30").show()
filter只能在find之后使用,這樣再過濾之后又細(xì)分了a,b的要求,即只保留了一組數(shù)據(jù)
(3)廣度優(yōu)先搜索(BFS)
g.bfs.fromExpr("name = 'Esther'").toExpr("age < 32").run().show()
從一個頂點到其他頂點宇植,滿足過濾條件的
(4)BFS加過濾條件
g.bfs.fromExpr("name = 'Esther'").toExpr("age < 32").edgeFilter("relationship != 'friend'").maxPathLength(3).run().show()
from,to滿足各自的過濾條件得封,且要滿足邊的關(guān)系條件,還要滿足3個頂點的體條件
(5)連接組件:
//設(shè)置檢查點
session.sparkContext.setCheckpointDir("/temp")
g.connectedComponents.run().show()
不設(shè)置檢查點無法使用連接組件
一組連接組件包含許多頂點指郁,一組連接組件有一個相同的component號
(6)最短路徑
最短路徑:查找每個節(jié)點到目標(biāo)節(jié)點的最短路徑忙上。
g.shortestPaths.landmarks(Seq("a","d")).run().show()
目標(biāo)節(jié)點即a,d;查找其他每個節(jié)點到a,d節(jié)點的路徑闲坎,有方向限制的
(7)三角形計數(shù)
三角計數(shù):計算每個節(jié)點都是三角形的一部分的總節(jié)點數(shù)疫粥。
val results = g.triangleCount.run()
results.select("id","count").show()
即計算構(gòu)成三角形的節(jié)點數(shù),但是這個三角形的邊是有方向限制的
neo4j:
1.neo4j是一個NoSQL圖數(shù)據(jù)庫
2.主要語法:match (node-name:label-name) return node-name
node-name(節(jié)點名稱):相當(dāng)于表中的數(shù)據(jù)
label-name(標(biāo)簽名稱):相當(dāng)于表
3.語法和關(guān)系型數(shù)據(jù)庫很相似腰懂,可以參考MySQL
4.如果自學(xué)neo4j梗逮,建議可以下載一個社區(qū)版的來進(jìn)行學(xué)習(xí)
5.學(xué)習(xí)鏈接:https://www.w3cschool.cn/neo4j/neo4j-5anu1xf7.html
6.一個不錯的Demo實例:http://www.reibang.com/p/2eab82cf2a08