我有一个二分图,我想投影到2个新图表(例如,使用演员和电影的互联网电影数据库中的网络,投影演员网络和电影网络,其权重对应于电影的数量(共同演员)
在常规矩阵表示法中,只需要对邻接矩阵求平方并忽略对角线(它等于原始图形的outdegree)。据推测,对于大型稀疏图,有更快的基于边缘的算法,这就是我开始对使用Spark / GraphX和Hadoop以及Map Reduce框架感兴趣的原因。
那么,我如何在Spark GraphX中进行A ^ 2计算?
假设我从这段代码开始:
import org.apache.spark.graphx._
val orig_graph = GraphLoader.edgeListFile(sc, "bipartite_network.dat")
我看到的所有函数都是顶点上的连接,边上的连接或顶点属性或边属性的映射。如何双重遍历所有边缘并使用基于顶点id的EDGES创建新图形?
这是一些伪代码:
for i = 1 to orig_graph.edges.count
for j = i to orig_graph.edges.count
var edge1 = orig_graph.edges.[i]
var edge2 = orig_graph.edges.[j]
if edge1.1 == edge2.1 then add new edge = (edge1.2, edge2.2)
if edge1.1 == edge2.2 then add new edge = (edge1.2, edge2.1)
if edge1.2 == edge2.1 then add new edge = (edge1.1, edge2.2)
if edge1.2 == edge2.2 then add new edge = (edge1.1, edge2.1)
这样的事情。
我是否需要使用Pregel和消息传递,或者只使用各种graph.join函数?