在无向图中的一个集团,G =(V,E)是顶点的子集,C⊆V,使得每两个不同的顶点是相邻的。这相当于C引起的G子图完成的条件。在某些情况下,术语clique也可以直接引用子图。
所以,我正在使用GraphX和Apache-Spark。我阅读了它的文档指南,它们提供了一种在图表中查找连接组件的方法,但没有提供派系/强连接组件。我怎么能用Scala做到这一点?谢谢!
编辑:正如评论中所建议的那样,我在R中为执行相同任务而编写的一段代码如下:(与Spark一起使用此代码的问题是最近发布的SparkR,通过它我可以使用R Spark在库方面的支持有限(例如,igraph)。因此,我开始使用GraphX和Scala),我现在需要算法。
library(igraph)
files <- paste0("NP",1:10,".txt") // Files which represent graphs
func.clique <- function(file)
{
w <- read.table(file)
g <- graph.edgelist(cbind(as.character(w$V1),as.character(w$V2)))
plot(g)
cli <- cliques(g)
return (cli)
}
cliquevalues <- sapply(files,func.clique)
答案 0 :(得分:2)
我们最近使用了jgrapht,与上面@marios在评论中提到的相同。关于如何使用它的示例代码,此处Vertex是自定义Vertex类,cliques为您提供图表中存在的所有派系的列表:
import org.jgrapht._
import org.jgrapht.graph._
import org.jgrapht.alg._
import scala.collection.JavaConverters._
import Util._
import Constants._
import Implicits._
class CliqueGraph(vertices:List[Vertex],xyEdges:List[(Vertex,Vertex)]){
val graph = new SimpleGraph[Vertex, DefaultEdge](classOf[DefaultEdge])
vertices.foreach(v=>graph.addVertex(v))
xyEdges.foreach{ case(v1,v2) =>
graphg.addEdge(v1,v2)
}
lazy val cliques= {
val c = new BronKerboschCliqueFinder(graph)
val setVertices = c.getAllMaximalCliques().asScala
setVertices.toList
}
}
在build.sbt文件中,您需要导入库:
libraryDependencies += "org.jgrapht" % "jgrapht-dist" % "0.9.0"