neo4j实现Louvain算法
文章目錄
- 例子一:創建一個屬性圖(無權)
- 一、屬性圖如下
- 二、實現算法
- 1.stream模式執行Louvain算法(匿名圖)
- 2.結果如下
- 總結一:
- 例子二:創建一個屬性圖(有權)
- 一、屬性圖如下
- 二、算法實現
- 1.stream模式執行Louvain算法(命名圖)
- 2.結果如下
- 3.帶權值計算
- 4.結果如下
- 5.含原始社區屬性計算
- 6.結果如下
- 總結二:
例子一:創建一個屬性圖(無權)
這次用的方法是本地load導入的,兩個代碼塊分別導入節點、節點間關系。
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)一、屬性圖如下
二、實現算法
1.stream模式執行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參數<>includeIntermediateCommunities:True,為真的時候,顯示劃分時出現的中間社團,結果最后一列表示該節點都曾被劃分到哪個社團。中間一列表示節點最后所在社團。
2.結果如下
總結一:
如果你熟悉其他算法,會發現這個結果和連通分量算法(Connected components algorithm)結果一樣,因為這是屬性圖中只包含了三個獨立的社團,很容易區分開來。而且這個屬性圖本身是無權的。
例子二:創建一個屬性圖(有權)
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);一、屬性圖如下
二、算法實現
1.stream模式執行Louvain算法(命名圖)
圖命名:myGraph
CALL gds.graph.create('myGraph','User',{LINK: {orientation: 'UNDIRECTED'}},{nodeProperties: 'seed',relationshipProperties: 'weight'} )結果如下:
執行算法:
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.結果如下
這里劃分兩個社團
3.帶權值計算
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.結果如下
帶權值之后,劃分了三個社團
5.含原始社區屬性計算
參數<>seedProperty:Used to set the initial community for a node. The property value needs to be a number.
用于設置節點的初始社區。屬性值必須是數字。
6.結果如下
其實僅帶有seedProperty屬性,去掉關系權重“relationshipWeightProperty: ‘weight’ ,”這句話,該屬性圖可以直接劃分為兩個社區,結果和本例子初次執行結果一致,社團【2】【5】。因為有權重的影響Alice被劃分出去,最終三個社團,這更加符合現實情況。
總結二:
這個算法的最優解還是需要考慮權重、迭代次數等等因素,從而符合最終預期目標,如果有需要可以參考文檔(有需要請留言)。
總結
以上是生活随笔為你收集整理的neo4j实现Louvain算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: web 三联发票针式打印_打印机共享操作
- 下一篇: mysql tungsten_使用tun