GraphX ​​- Как получить все связанные вершины из vertexId (не только первые смежные)? - PullRequest
0 голосов
/ 04 декабря 2018

Учитывая этот график:

Примерный график

Как получить все связанные вершины из vertexID?

Например, из VertexId 5, он должен вернуть 5-3-7-8-10

CollectNeighbors возвращает только первые смежные.

Я пытаюсь использовать pregel, но я нене знаю, как начать с определенной вершины.Я не хочу вычислять все узлы.

Спасибо!

1 Ответ

0 голосов
/ 04 декабря 2018

Я только что заметил, что график направлен.тогда вы можете использовать код примера кратчайшего пути здесь .если расстояние определенного узла не бесконечно, то вы можете достичь этого узла.

или есть лучшая идея, что вы можете изменить алгоритм кратчайшего пути, чтобы удовлетворить ваши потребности.

  import org.apache.spark.graphx.{Graph, VertexId}
  import org.apache.spark.graphx.util.GraphGenerators

  // A graph with edge attributes containing distances
  val graph: Graph[Long, Double] =
    GraphGenerators.logNormalGraph(sc, numVertices = 100).mapEdges(e => e.attr.toDouble)

  val sourceId: VertexId = 42 // The ultimate source
  // Initialize the graph such that all vertices except the root have canReach = false.
  val initialGraph: Graph[Boolean, Double]  = graph.mapVertices((id, _) => id == sourceId)
  val sssp = initialGraph.pregel(false)(
    (id, canReach, newCanReach) => canReach || newCanReach, // Vertex Program
    triplet => {  // Send Message
      if (triplet.srcAttr && !triplet.dstAttr) {
        Iterator((triplet.dstId, true))
      } else {
        Iterator.empty
      }
    },
    (a, b) => a || b // Merge Message
  )
  println(sssp.vertices.collect.mkString("\n"))
...