【导读】

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实战》


作者简介:大飞
算法工程师、知识搬运工、干货拾荒机
| 公众号 | 知乎 | CSND | 简书 | 头条 |

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

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

GraphX-基础知识-图术语解释相关推荐

  1. E71软件测试工资,诺基亚手机软件测试基础知识、术语和流程

    类型:塞班平台应用大小:1.4M语言:中文 评分:5.0 标签: 立即下载 第 2 页 1 手机知识 1.1 手机的主要功能 1.1.1 通话功能  对拨入拨出电话的管理  对通话记录的管理  ...

  2. 光电传感器基础知识及术语

    光电传感器是一种小型电子设备,它可以检测出其接收到的光强的变化.早期的用来检测 物体有无的光电传感器是一种小的金属圆柱形设备,发射器带一个校准镜头,将光聚焦射向接收器,接收器出电缆将这套装置接到一个真 ...

  3. 【Pytorch神经网络理论篇】 25 基于谱域图神经网络GNN:基础知识+GNN功能+矩阵基础+图卷积神经网络+拉普拉斯矩阵

    图神经网络(Graph Neural Network,GNN)是一类能够从图结构数据中学习特征规律的神经网络,是解决图结构数据(非欧氏空间数据)机器学习问题的最重要的技术. 1 图神经网络的基础知识 ...

  4. python基础知识思维导图-总结 Python 知识点思维导图

    本文主要涵盖了 Python 编程的核心知识(暂不包括标准库及第三方库). 按顺序依次展示了以下内容的一系列思维导图:基础知识,数据类型(数字,字符串,列表,元组,字典,集合),条件&循环,文 ...

  5. 视频格式基础知识:让你了解MKV、MP4、H.265、码率、色深等等.

    http://www.4k123.com/thread-8194-1-1.html 本教程意在讲述一些视频音频的基础知识和术语.它可以比较详细的回答以下常见的问题: . MP4/MKV这些格式有什么区 ...

  6. GNN教程:GNN 涉及到的基础知识

    转载 目录 系列规划 基础知识 欧几里得结构化数据 1. 欧几里得空间 2. 常见的欧几里得结构化数据 非欧几里得结构化数据 1. 非欧几里得空间 2. 非常见的欧几里得结构化数据 图(Graph) ...

  7. C语言基础知识入门【2022】

    一.C语言基础知识入门前言 C语言一经出现就以其特点迅速在全世界普及和推广.C语言不但执行效率高而且可移植性好,可以用来开发应用软件.驱动.操作系统等,也是其它众多高级编程语言的鼻祖语言,所以说学习C ...

  8. RabbitMQ基础知识介绍、RabbitMQ的安装

    RabbitMQ基础知识介绍 官方解释:MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.应用程序通过                   读写出入队列的消息 ...

  9. IP地址相关的基础知识以及IP相关术语的解释

    一.基础知识了解 IP地址:计算机之间的唯一标识 mac:计算机网卡之间的标识 (每台计算机之间都不同全球唯一[硬件]) 同样不仅仅只有计算机有mac地址 ,现在手机,路由器,交换机等都有mac地址( ...

最新文章

  1. 2 datax mysql 和 mysql之间相互导入
  2. hardfault常见原因_XMC实验分享之四十八: Cortex M0的Hard Fault发生原因
  3. 开源云计算平台 abiCloud
  4. ​用c语言打印自定义的乘法口诀表。例如:输入9,输出9*9口诀表,输入12,输出12*12的乘法口诀表。...
  5. xv6解析-- 多处理器操作
  6. Bugfree实用心得_转
  7. Leetcode--279. 完全平方数
  8. Promise进阶——如何实现一个Promise库
  9. Java朝花夕拾の实现Comparable接口
  10. Vue extend 学习
  11. HTML+CSS网页设计期末课程大作业:个人网站设计——个人介绍(7页) web前端开发技术 web课程设计 网页规划与设计
  12. unity3d 取锚点位置_加热炉传输点
  13. 银河帝国----基地与地球
  14. uni-app 动态获取元素wight/height/left/right/top/bottom/id
  15. UTC和东八区时间转换(python)
  16. 如何设置UEFI的系统启动顺序
  17. 拿到别人提供的虚拟机需要做的几件事情
  18. 视频直播APP源码,通过css控制div内容展开更多/收起效果
  19. 无人驾驶:从轻絮飞扬到落地为安
  20. Unity3D中使用easyroad3d插件 删除道路

热门文章

  1. Python水仙花数,鸡兔同笼问题,百钱买百鸡问题,斐波那契数列,模拟发微信红包
  2. wwid、uuid、lun、multipath、hba、udev总结
  3. js实现公告自动滚动
  4. 中国首届敏捷大会纪行
  5. 060202体积弧长-定积分在几何学上的应用-定积分的应用
  6. QQSG 的配置备份方法
  7. 获取手机屏幕大小 DisplayMetrics
  8. 论文报告中如何优雅的粘贴代码(表格版)
  9. 《操作系统》——计算机系统概述
  10. PSD模版如何变成网页模版