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