2015-09-09 2 views
1

Я новичок в Apache GraphX, и я хочу посмотреть, могу ли я сделать слияние графа/объединить в graphX. То, что я хочу сделать, это сказать, что я 2 график, как показано нижеapache graphx merge/объединить несколько графиков

 
graph1:  A —1—> B —1—> C —1—> D 
      | 
      —1—> E —1—> F 

graph2: A —1—> B —1—> C 
      | 
      —1—> G 

и я хочу, чтобы объединить/комбинирование результат как

 

merge result: A —2—> B —2—> C —1—> D 
       | 
       —1—> E —1—> F 
       | 
       —1—> G 

Я могу сделать это в Neo4j встроенный graphDB с объектом Путь к сравнить путь, скопировать счетчик графов и присоединиться к отсутствующему пути.

Есть ли в любом случае или пример, который может помочь мне сделать то же самое в GraphX?

благодарит

ответ

2

Вам нужно создать новый граф на основе объединения вершин и ребер, а затем использовать groupEdges():

import org.apache.spark.graphx._ 
import org.apache.spark.graphx.PartitionStrategy.RandomVertexCut 

val verts1 = sc.parallelize(Seq(
    (1L,"A"), 
    (2L,"B"), 
    (3L,"C"), 
    (4L,"D"), 
    (5L,"E"), 
    (6L,"F"))) 

val edges1 = sc.parallelize(Seq(
    Edge(1L,2L,1), 
    Edge(2L,3L,1), 
    Edge(3L,4L,1), 
    Edge(1L,5L,1), 
    Edge(5L,6L,1))) 

val graph1 = Graph(verts1, edges1) 

val verts2 = sc.parallelize(Seq(
    (1L,"A"), 
    (2L,"B"), 
    (3L,"C"), 
    (7L,"G"))) 

val edges2 = sc.parallelize(Seq(
    Edge(1L,2L,1), 
    Edge(2L,3L,1), 
    Edge(1L,7L,1))) 

val graph2 = Graph(verts2, edges2) 

val graph: Graph[String,Int] = Graph(
    graph1.vertices.union(graph2.vertices), 
    graph1.edges.union(graph2.edges) 
).partitionBy(RandomVertexCut). 
    groupEdges((attr1, attr2) => attr1 + attr2) 

Если вы сейчас смотрите на краях этого нового графика вы можете увидеть результаты слияния:

scala> graph.edges.collect 
res0: Array[org.apache.spark.graphx.Edge[Int]] = 
     Array(Edge(1,2,2), Edge(2,3,2), Edge(1,5,1), 
      Edge(5,6,1), Edge(1,7,1), Edge(3,4,1)) 
+0

Привет, Спасибо за ваш ответ. Возможно ли объединение на основе значения свойства вершин, а не идентификатора вершины? Потому что иногда трудно сделать тот же идентификатор вершин точно таким же свойством и наоборот – chihhsiw

+0

Кстати, этот ответ помогает решить часть моей проблемы. Но у меня есть более открытый вопрос, размещенный в http://stackoverflow.com/questions/33221099/apache-graphx-merge-combine-multiple-graphs-according-to-vertex-property-of-rela. Ценю вашу помощь – chihhsiw

Смежные вопросы