当前位置: 首页 > 知识库问答 >
问题:

Apache Spark GraphX连通分支

商骞仕
2023-03-14

如何使用子图函数来获得仅包含来自特定连接组件的顶点和边的图形?假设我知道连接的组件 ID,最终目标是基于连接的组件创建一个新图形。我想保留原始图形中的顶点属性。

共有2个答案

咸亦
2023-03-14

我认为你的问题是,给定源图中的VertexId,创建一个新图,其中节点和边从源图连接到此VertexId。

有鉴于此,我将做以下事情:

val targetVertexId = ...
val graph = Graph(..., ...)
val newGraph = Graph(
  graph.vertices.filter{case (vid,attr) => vid == targetVertexId} ++
  graph.collectNeighbors(EdgeDirection.Either)
    .filter{ case (vid,arr) => vid == targetVertexId}
    .flatMap{ case (vid,arr) => arr},
  graph.edges
).subgraph(vpred = { case (vid,attr) => attr != null})

需要注意的几件事:

您可以根据需要将“边缘方向”更改为“EdgeDirection.In”或“边缘方向”

末尾的 .subgraph 将删除属性设置为 null 的所有顶点。如果原始 val 图的顶点属性设置为 null,则这不起作用。否则,这有效,而无需事先知道顶点属性类型。

施默
2023-03-14

您必须将具有组件ID的图连接到原始图,根据组件ID过滤(获取子图),然后丢弃组件ID。

import scala.reflect._
import org.apache.spark.graphx._
import org.apache.spark.graphx.lib.ConnectedComponents

def getComponent[VD: ClassTag, ED: ClassTag](
    g: Graph[VD, ED], component: VertexId): Graph[VD, ED] = {
  val cc: Graph[VertexId, ED] = ConnectedComponents.run(g)
  // Join component ID to the original graph.
  val joined = g.outerJoinVertices(cc.vertices) {
    (vid, vd, cc) => (vd, cc)
  }
  // Filter by component ID.
  val filtered = joined.subgraph(vpred = {
    (vid, vdcc) => vdcc._2 == Some(component)
  })
  // Discard component IDs.
  filtered.mapVertices {
    (vid, vdcc) => vdcc._1
  }
}
 类似资料:
  • 主要内容:重连通图的实际应用,判断重连通图的方法在无向图中,如果任意两个顶点之间含有不止一条通路,这个图就被称为 重连通图。在重连通图中,在删除某个顶点及该顶点相关的边后,图中各顶点之间的连通性也不会被破坏。 在一个无向图中,如果删除某个顶点及其相关联的边后,原来的图被分割为两个及以上的连通分量,则称该顶点为无向图中的一个 关节点(或者 “割点”)。 图 1 连通图   图 1 是连通图但不是重连通图,图中有4个关节点,分别是:A、B、D 和

  • 输出应该如下所示: 我甚至不知道为什么会有这样的错误。我将代码从https://www.geeksforgeeks.org/tarjan-algorithm-find-strong-connected-components/改为我的代码,并添加了input机会。我问过这个问题,一个朋友说:“这是addEdge方法中添加w后的两个代码的输出,在您的代码中w添加到所有元素中,而在原始代码中只添加到图V

  • 在本章的剩余部分,我们将把注意力转向一些非常大的图。我们将用来研究一些附加算法的图,由互联网上的主机之间的连接和网页之间的链接产生的图。 我们将从网页开始。 像 Google 和 Bing 这样的搜索引擎利用了网页上的页面形成非常大的有向图。 为了将万维网变换为图,我们将把一个页面视为一个顶点,并将页面上的超链接作为将一个顶点连接到另一个顶点的边缘。 Figure 30 展示了从 Luther C

  • 如果您不知道SCC算法是如何工作的,请阅读本文:https://www.hackerearth.com/practice/algorithms/graphs/strong-connected-components/tutorial/(这是我能找到的最好的文章)。 在找到每个节点的完成时间后,将原图反转,从时间最高的节点开始运行DFS。如果我们从原始图中最小的节点开始运行DFS呢?为什么不管用?

  • 主要内容:src/runoob/graph/Components.java 文件代码:深度优先遍历(Depth First Search)的主要思想是首先以一个未被访问过的顶点作为起始顶点,沿当前顶点的边走到未访问过的顶点。当没有未访问过的顶点时,则回到上一个顶点,继续试探别的顶点,直至所有的顶点都被访问过。 下图示例的图从 0 开始遍历顺序如右图所示: 无向图 G 的一个极大连通子图称为 G 的一个连通分量(或连通分支)。连通图只有一个连通分量,即其自身;非连通的无向图有多个连通

  • 我在读关于BFS和DFS的图算法。当我在分析用DFS寻找图中强连通分量的算法时,我产生了一个疑问。为了寻找强连通分量,book(Coremen)首先在图上运行DFS,以得到顶点的完成时间,然后在图的转置上按照第一个DFS得到的完成时间的递减顺序运行DFS。但是我不能理解为什么第二个DFS必须按照完成时间运行。我的意思是,即使我们直接在图的转置上运行DFS(忽略完成时间),它也会给我们连接的组件吗?