GraphX ​​- Как получить все связанные вершины из vertexId (а не только первые соседние)?

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

Пример графика

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

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

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

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

Спасибо!


person DaveB    schedule 04.12.2018    source источник


Ответы (1)


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

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

  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"))
person Mahmoud Hanafy    schedule 04.12.2018
comment
Подключенные компоненты, похоже, подключаются к самому низкому идентификатору вершины. Результат будет (8,2), (12,2), (5,2), (10,2), (2,2), (3,2), (7,2), потому что самая нижняя вершина 2. Как указать минимум 5 и не включать (12,2)? - person DaveB; 05.12.2018
comment
пожалуйста, проверьте мое последнее обновление, я добавил лучшую идею. - person Mahmoud Hanafy; 05.12.2018
comment
После проверки, как ни странно, это работает только для моего примера, но, похоже, не работает для сгенерированного графа, потому что результат всегда равен 100, независимо от VertexId. По логике число вершин должно быть меньше 100? - person DaveB; 09.12.2018
comment
Убедитесь, что график ориентирован. - person Mahmoud Hanafy; 09.12.2018