发布日期:2022-08-09 VIP内容

构建子图

GraphFrames提供了通过对边和顶点进行过滤来构建子图的API。这些过滤器可以组合在一起来使用。例如,构建只包含年龄在30岁以上的朋友的子图,代码如下:

// 选择用户年龄超过30岁,并且边的类型是"friend"的子图
val g2 = g
      .filterEdges("relationship = 'friend'")
      .filterVertices("age > 30")
      .dropIsolatedVertices()

g2.vertices.show()
g2.edges.show()

输出结果如下:

+---+------+---+--------+----------+
| id|  name|age|     cash|      fruit|
+---+------+---+--------+----------+
|  a| Alice| 34|      234|     Apples|
|  b|   Bob| 36| 23232323|   Bananas|
|  e|Esther| 32|         1|Watermelon|
+---+------+---+--------+----------+

+---+---+------------+
|src|dst|relationship|
+---+---+------------+
|  a|   b|       friend|
|  a|   e|       friend|
+---+---+------------+

这个例子中,分别使用filterVertices()方法和filterEdges()方法过滤顶点和边用来创建子图。在最后对子图调用dropIsolatedVertices()方法,删除孤立的没有连接的点。

基于motif查找和DataFrame过滤器的组合,GraphFrames提供了一种强大的方式来选择子图。例如,基于在边及其src和dst顶点上操作的三重过滤器来选择子图,代码如下:

// 根据类型"follow"的边"e"来选择子图
// 从年轻的用户"a"指向较年长的用户"b"
val paths = g.find("(a)-[e]->(b)")
      .filter("e.relationship = 'follow'")
      .filter("a.age < b.age")

// "paths"包含顶点信息。提取边
val e2 = paths.select("e.src", "e.dst", "e.relationship")
// 在Spark 1.5+, 用户可以简化这个调用:
//  val e2 = paths.select("e.*")

// 构造子图
val g2 = GraphFrame(g.vertices, e2)

g2.vertices.show()
g2.edges.show()

执行上面的代码,输出结果如下:

+---+-------+---+--------+----------+
| id|   name|age|     cash|      fruit|
+---+-------+---+--------+----------+
|  a|  Alice| 34|      234|     Apples|
|  b|    Bob| 36| 23232323|   Bananas|
|  c|Charlie| 30|     2123|Grapefruit|
|  d|  David| 29| 2321111|    Bananas|
|  e| Esther| 32|        1|Watermelon|
|  f|  Fanny| 36|      333|     Apples|
|  g|  Gabby| 60|    23433|   Oranges|
+---+-------+---+--------+----------+

+---+---+------------+
|src|dst|relationship|
+---+---+------------+
|  c|   b|       follow|
|  e|   f|       follow|
+---+---+------------+

在上述示例的执行过程为:

  • (1) 首先用(a)-[e]->(b)过滤出所有连接的顶点,得到顶点数据集。
  • (2) 使用条件过滤指定关系follow和节点年龄的大小关系,得到一个边的数据集。
  • (3) 将顶点和边的数据集传入GraphFrame可以得到一个子图。

通过使用更复杂的motif将这个例子扩展到三重之外是很简单的。