neo4j社区发现算法(Community detection algorithms)-1.The Louvain algorithm

一.算法介绍
   Louvain algorithm 是基于模块度的社区发现算法,该算法相比较于普通的模块度算法,在效率和效果上都表现的比较好,并且能够发现层次性的社区结构,其优化的目标是最大化整个图结构的模块度。
   
   模块度 :模块度值的大小主要取决于网络中结点的社区分配C,即网络的社区划分情况,可以用来定量的衡量网络社区划分质量,其值越接近1,表示网络划分出的社区结构的强度越强,也就是划分质量越好。因此可以通过最大化模块度Q来获得最优的网络社区划分。

二.算法步骤
   1)将图中的每个节点看作为一个社区
   2)对个每个节点,依次尝试把节点分配到其每个邻居所在的社区,计算分配前与分配后的模块度变化,并记录分配后模块度最大的那个点。选择对应模块度最大的点,加入其所在社区。
   3)重复过程2,直至每个节点的社区归属不再变化。
   4)压缩每个社区,将其压缩成一个新的节点,这时,边的 权重为两个节点内所有原始节点的边权重之和。
   5)迭代上述步骤,直至图中模块度不再变化。
三.neo4j算法调用:

CALL algo.louvain(label:String, relationship:String,{weightProperty:'weight', defaultValue:1.0, write: true,writeProperty:'community', concurrency:4})
YIELD nodes, communityCount, iterations, loadMillis, computeMillis, writeMillis

实例:

MERGE (nAlice:User {id:'Alice'})
MERGE (nBridget:User {id:'Bridget'})
MERGE (nCharles:User {id:'Charles'})
MERGE (nDoug:User {id:'Doug'})
MERGE (nMark:User {id:'Mark'})
MERGE (nMichael:User {id:'Michael'})
MERGE (nAlice)-[:FRIEND]->(nBridget)
MERGE (nAlice)-[:FRIEND]->(nCharles)
MERGE (nMark)-[:FRIEND]->(nDoug)
MERGE (nBridget)-[:FRIEND]->(nMichael)
MERGE (nCharles)-[:FRIEND]->(nMark)
MERGE (nAlice)-[:FRIEND]->(nMichael)
MERGE (nCharles)-[:FRIEND]->(nDoug);

neo4j社区发现算法(Community detection algorithms)-1.The Louvain algorithm_第1张图片

call algo.louvain.stream('User','FRIEND')
YIELD nodeId,community
return algo.getNodeById(nodeId).id as name ,community

结果:
neo4j社区发现算法(Community detection algorithms)-1.The Louvain algorithm_第2张图片
通过查询发现两个社区,其中Alice,Bridget,Charles为一个好友团体,Doug,Mark,Michael为另一个好友团体。

你可能感兴趣的:(neo4j-图数据库)