本文共 2196 字,大约阅读时间需要 7 分钟。
图算法提供了理解、建模和预测复杂动态的手段,例如资源或信息流、传染或网络故障传播的途径,以及对群体的影响和弹性。
本博文系列旨在帮助读者更好地利用图分析和图算法,以便能够使用 Neo4j 等图数据库更快地有效创新和开发智能解决方案。
上周我们总结了对中心性(Centrality)算法的研究,还研究了亲密中心性(Closeness Centrality) 算法。
这一周,我们开始研究社区发现(Community Detection)算法,并了解强连通分量(Strongly Connected Components,SCC)算法,该算法根据关系的方向定位节点组,其中每个节点都可以从同一组中的每个其他节点到达。通常应用于深度优先搜索。
强连通分量算法在有向图找到连接节点的集合,其中每个节点可以在两个方向上从同一集合的任何其他节点到达。通常在图分析过程中的早期使用,经常用来让我们了解图的结构。
SCC 是最早的图算法之一,Tarjan 在 1972 年描述了第一个线性时间算法。将有向图分解成强连通分量是深度优先搜寻算法的经典应用。
让我们看看强连通分量算法的实际应用。以下 Cypher 语句创建了一个 Twitter 式样的图,其中包含了用户、用户之间的 FOLLOW
关系。
MERGE (nAlice:User {id:\u0026quot;Alice\u0026quot;})MERGE (nBridget:User {id:\u0026quot;Bridget\u0026quot;})MERGE (nCharles:User {id:\u0026quot;Charles\u0026quot;})MERGE (nDoug:User {id:\u0026quot;Doug\u0026quot;})MERGE (nMark:User {id:\u0026quot;Mark\u0026quot;})MERGE (nMichael:User {id:\u0026quot;Michael\u0026quot;})MERGE (nAlice)-[:FOLLOWS]-\u0026gt;(nBridget)MERGE (nAlice)-[:FOLLOWS]-\u0026gt;(nCharles)MERGE (nMark)-[:FOLLOWS]-\u0026gt;(nDoug)MERGE (nMark)-[:FOLLOWS]-\u0026gt;(nMichael)MERGE (nBridget)-[:FOLLOWS]-\u0026gt;(nMichael)MERGE (nDoug)-[:FOLLOWS]-\u0026gt;(nMark)MERGE (nMichael)-[:FOLLOWS]-\u0026gt;(nAlice)MERGE (nAlice)-[:FOLLOWS]-\u0026gt;(nMichael)MERGE (nBridget)-[:FOLLOWS]-\u0026gt;(nAlice)MERGE (nMichael)-[:FOLLOWS]-\u0026gt;(nBridget);
现在我们可以运行强连通分量来查看每个人是否相互链接,执行以下查询:
CALL algo.scc.stream(\u0026quot;User\u0026quot;,\u0026quot;FOLLOWS\u0026quot;)YIELD nodeId, partitionMATCH (u:User) WHERE id(u) = nodeIdRETURN u.id AS name, partition
我们的示例图中有三个强连通分量。
第一个也是最大的分量,有成员 Alice、Bridget 和 Michael,而第二个分量有 Doug 和 Mark。Charies 最终只在自己的分量中,因为从该节点到任何其他节点都之间都没有传出关系。
正如我们所看到的,强连通分量算法通常用于在以识别的集群上独立运行其他算法。作为有向图的预处理步骤,它有助于快速识别断开连接的组。
原文链接:
转载地址:http://lcmml.baihongyu.com/