neo4j实现Louvain算法
文章目錄
- 例子一:創(chuàng)建一個(gè)屬性圖(無(wú)權(quán))
- 一、屬性圖如下
- 二、實(shí)現(xiàn)算法
- 1.stream模式執(zhí)行Louvain算法(匿名圖)
- 2.結(jié)果如下
- 總結(jié)一:
- 例子二:創(chuàng)建一個(gè)屬性圖(有權(quán))
- 一、屬性圖如下
- 二、算法實(shí)現(xiàn)
- 1.stream模式執(zhí)行Louvain算法(命名圖)
- 2.結(jié)果如下
- 3.帶權(quán)值計(jì)算
- 4.結(jié)果如下
- 5.含原始社區(qū)屬性計(jì)算
- 6.結(jié)果如下
- 總結(jié)二:
例子一:創(chuàng)建一個(gè)屬性圖(無(wú)權(quán))
這次用的方法是本地load導(dǎo)入的,兩個(gè)代碼塊分別導(dǎo)入節(jié)點(diǎn)、節(jié)點(diǎn)間關(guān)系。
load csv with headers from "file:///sw-nodes.csv" as rowmerge (place:Place{id:row.id}) load csv with headers from "file:///sw-relationships.csv" as rowmatch (origin:Place{id:row.src})match (destination:Place{id:row.dst})merge (origin) - [r:DEPENDS_ON]->(destination)一、屬性圖如下
二、實(shí)現(xiàn)算法
1.stream模式執(zhí)行Louvain算法(匿名圖)
CALL gds.louvain.stream({nodeProjection: 'Place',relationshipProjection: {TYPE: {type: 'DEPENDS_ON',orientation: 'undirected',aggregation: 'NONE'}},includeIntermediateCommunities:True }) YIELD nodeId, communityId RETURN gds.util.asNode(nodeId).id AS name, communityId ORDER BY name ASC參數(shù)<>includeIntermediateCommunities:True,為真的時(shí)候,顯示劃分時(shí)出現(xiàn)的中間社團(tuán),結(jié)果最后一列表示該節(jié)點(diǎn)都曾被劃分到哪個(gè)社團(tuán)。中間一列表示節(jié)點(diǎn)最后所在社團(tuán)。
2.結(jié)果如下
總結(jié)一:
如果你熟悉其他算法,會(huì)發(fā)現(xiàn)這個(gè)結(jié)果和連通分量算法(Connected components algorithm)結(jié)果一樣,因?yàn)檫@是屬性圖中只包含了三個(gè)獨(dú)立的社團(tuán),很容易區(qū)分開(kāi)來(lái)。而且這個(gè)屬性圖本身是無(wú)權(quán)的。
例子二:創(chuàng)建一個(gè)屬性圖(有權(quán))
CREATE(nAlice:User {name: 'Alice', seed: 42}),(nBridget:User {name: 'Bridget', seed: 42}),(nCharles:User {name: 'Charles', seed: 42}),(nDoug:User {name: 'Doug'}),(nMark:User {name: 'Mark'}),(nMichael:User {name: 'Michael'}),(nAlice)-[:LINK {weight: 1}]->(nBridget),(nAlice)-[:LINK {weight: 1}]->(nCharles),(nCharles)-[:LINK {weight: 1}]->(nBridget),(nAlice)-[:LINK {weight: 5}]->(nDoug),(nMark)-[:LINK {weight: 1}]->(nDoug),(nMark)-[:LINK {weight: 1}]->(nMichael),(nMichael)-[:LINK {weight: 1}]->(nMark);一、屬性圖如下
二、算法實(shí)現(xiàn)
1.stream模式執(zhí)行Louvain算法(命名圖)
圖命名:myGraph
CALL gds.graph.create('myGraph','User',{LINK: {orientation: 'UNDIRECTED'}},{nodeProperties: 'seed',relationshipProperties: 'weight'} )結(jié)果如下:
執(zhí)行算法:
CALL gds.louvain.stream('myGraph',{includeIntermediateCommunities: true} ) YIELD nodeId, communityId, intermediateCommunityIds RETURN gds.util.asNode(nodeId).name AS name, communityId, intermediateCommunityIds ORDER BY name ASC2.結(jié)果如下
這里劃分兩個(gè)社團(tuán)
3.帶權(quán)值計(jì)算
CALL gds.louvain.stream('myGraph',{ relationshipWeightProperty: 'weight' ,includeIntermediateCommunities: true} ) YIELD nodeId, communityId, intermediateCommunityIds RETURN gds.util.asNode(nodeId).name AS name, communityId, intermediateCommunityIds ORDER BY name ASC4.結(jié)果如下
帶權(quán)值之后,劃分了三個(gè)社團(tuán)
5.含原始社區(qū)屬性計(jì)算
參數(shù)<>seedProperty:Used to set the initial community for a node. The property value needs to be a number.
用于設(shè)置節(jié)點(diǎn)的初始社區(qū)。屬性值必須是數(shù)字。
6.結(jié)果如下
其實(shí)僅帶有seedProperty屬性,去掉關(guān)系權(quán)重“relationshipWeightProperty: ‘weight’ ,”這句話,該屬性圖可以直接劃分為兩個(gè)社區(qū),結(jié)果和本例子初次執(zhí)行結(jié)果一致,社團(tuán)【2】【5】。因?yàn)橛袡?quán)重的影響Alice被劃分出去,最終三個(gè)社團(tuán),這更加符合現(xiàn)實(shí)情況。
總結(jié)二:
這個(gè)算法的最優(yōu)解還是需要考慮權(quán)重、迭代次數(shù)等等因素,從而符合最終預(yù)期目標(biāo),如果有需要可以參考文檔(有需要請(qǐng)留言)。
總結(jié)
以上是生活随笔為你收集整理的neo4j实现Louvain算法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: web 三联发票针式打印_打印机共享操作
- 下一篇: HashMap深度解析:一文让你彻底了解