如何在存储在 Neo4j 中的 Web Graph 中进行社区检测

How to do community detection in a Web Graph stored in Neo4j

我已经为服务创建了一个爬虫。我想自动检测网站中的地区/社区。我制作了一个模型,在 href (:LinksTo) 的情况下,url links 到另一个 url。当有 link 返回时,我还会创建一个名为 :Connected.

的额外关系

我想了解哪些社区存在,它们有多大。问题是我总是以 1 个巨大的社区和少量的小社区结束。我有点卡在这里了。

我已经安装了这些算法:https://neo4j-contrib.github.io/neo4j-graph-algorithms/并且我尝试用三角形计数和聚类系数做一些事情,但是创建节点的漂亮分区似乎是不可能的。

有人知道吗?

我猜您已经尝试过 LPA 和 Louvain 社区检测。使用上述算法避免进入一个大社区和一些小社区的一种方法是限制迭代。

您可以做的另一件事是尝试为关系定义相似度阈值,例如两个网站必须至少有 5 个共同连接,否则它们不被视为相似(丢弃它们之间的关系)。

查看 this blog series 了解更多详细信息。

这些系列中还记录的是apoc.periodic.iterate,它可以帮助您推断出您在评论部分描述的网络,以便您轻松地使用它。在您的情况下,声明将类似于。这将推断并存储一个加权网络,以帮助您找到那些非常相似的网站。

CALL apoc.periodic.iterate(
"MATCH  (child:Url)-[:linksTo]->(deeper:Url)<-[:Linksto]-(:parent) 
where id(child) < id(parent) 
RETURN p1,p2
","
MERGE (p1)-[r:SIMILAR]-(p2) 
ON CREATE SET r.weight = 1 
ON MATCH SET r.weight = r.weight + 1"
,{batchSize:5000, parallel:false,iterateList:true})