8

サブグラフ関数を使用して、特定の接続コンポーネントから頂点とエッジのみを含むグラフを取得する方法は? 連結成分 ID を知っているとしましょう。最終的な目標は、連結成分に基づいて新しいグラフを作成することです。元のグラフの頂点属性を保持したいと思います。

4

2 に答える 2

6

コンポーネント 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
  }
}
于 2015-05-26T15:11:34.107 に答える
3

ソース グラフの 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.Either必要に応じてEdgeDirection.Inまたはに変更できEdgeDirection.Outます。

最後の.subgraphは、アトリビュートが に設定されているすべての頂点を削除しますnull。オリジナルval graphに属性が設定された頂点がある場合、nullこれは機能しません。それ以外の場合は、Vertex アトリビュート タイプを事前に知らなくても機能します。

于 2015-05-27T03:18:11.593 に答える