GraphX-基础知识-图术语解释

【导读】
Spark GraphX是一个分布式图处理框架,它是基于Spark平台提供对图计算和图挖掘简洁易用的而丰富的接口,极大的方便了对分布式图处理的需求。但如果我们想熟练的开发Spark GraphX的应用程序还有很长的路要走,本系列文章是GraphX的从入门到精通,会持续更新,如果你对图计算感兴趣就关注起来吧。

【前言】
思考一个问题:现实生活中我们有哪些可用的图?以及这些可用的图都是什么样的图?

有向图和无向图

用图可以对事物以及事物之间的联系建模。首先来弄清楚【图3.9】中的有向图和无向图的不同。在一个有向图中,联系是从源顶点到目标顶点万维网中的一个页面到另一个页面的链接,学术论文中的引用,都是比较典型的例子。在有向图中,一条边的两个顶点般扮演着不同的角色,如父子关系,页面A链接向页面B。


【图3.9】 GraphX中的图都继承了有向图,同时在一些内置算法中也支持忽略方向的无向固。如果需要无向图,可以通过忽略方向来实现。

在一个无向图中,边是没有方向;关系都是对称的。社交网络中一个典型的联系是,通常A如果是B的朋友,我们很可能认为B也是A的朋友。更进一步,如果我们到Kevin Bacon是六度关系,那么Kevin Bacon到我们也是六度关系。GraphX中的一个很重要的概念是,所有的边都有一个方向,那么图就是有向图;如果忽略边的方向,就是无向图。

有环图和无环图

有环图是包含循环的一系列顶点连接成一个环(参见【图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实战》

作者简介:大飞
算法工程师、知识搬运工、干货拾荒机

大飞原创不易,如转载请注明出处,学习是一生的事业。

PS:投稿请添加微信
wuyuanzahuopu(五元杂货铺)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350