【问题标题】:Optimizing a Cypher query to analyze topology in a network优化 Cypher 查询以分析网络中的拓扑
【发布时间】:2020-12-18 08:04:49
【问题描述】:

我有一个网络(例如水网络),我想找到拓扑结构:集群(圆形路径)、桥梁(连接集群的关系)和树(其余的)。

这里是用于创建示例网络的 Cypher 语句。(https://www.dropbox.com/s/e1gtqxlm9ngaau5/Cypher%20to%20create%20example%20network.cql?dl=0) 蓝色的关系是我正在寻找的集群,红色的关系是桥梁,绿色的关系是树木。

为了找到集群,我有两种方法,这两种方法都返回正确的结果。但两者都太慢了。

方法一: 从关系开始,查看开始节点和结束节点之间是否存在第二条路径。 这个需要大约 1000 万个 db hits

MATCH (n:WN)-[r:PIPE]->(m:WN) 
WHERE EXISTS((n)-[r]->(m)-[:PIPE*2..]-(n))
RETURN r

方法 2: 首先寻找圆形路径,忽略方向。 (大约 12000)然后提取唯一关系。 这个需要大约 20M 的 db 命中。

MATCH path=(n:WN)-[:PIPE*..]-(n)
RETURN 
     apoc.coll.subtract(
          apoc.coll.flatten(COLLECT(relationships(path))
          ),
          []
     )
    AS clusterRelationships

有没有更聪明的方法,可以更快地返回结果?

【问题讨论】:

    标签: neo4j cypher topology


    【解决方案1】:

    您可以使用 GDS 库中提供的 Strongly connected component algorithm 检测集群。我认为它符合您对集群的定义,并且也适用于您的示例。

    强连通分量 (SCC) 算法查找 有向图中的连接节点,其中每个节点都可以到达 来自同一集合中任何其他节点的两个方向。

    为了检测网桥,您可以使用Betweenness centrality algorithm 来查找潜在的网桥节点,这些网桥节点具有与其连接的网桥关系。这将限制在计算哪些边是桥时需要考虑的边数。不幸的是,这个解决方案对于一些非常小的桥来说并不完美,假设它们是一个只有一个或两个节点的桥,中介中心性不会那么高。并且图中间的一些节点会有很高的介数分数,因为理论上所有的信息都会流过它们。

    我有另一个想法可能会很快奏效。运行强连通分量算法并将结果存储回 Neo4j。然后尝试找到连接不同节点集群的边。这将包括树木和桥梁,然后您必须决定应将关系归类为两个选项中的哪一个。

    【讨论】:

    • 您好,感谢您的 cmets。 SCC 只检测每对节点连接的节点集,但事实并非如此。来自neo4j.com/docs/graph-data-science/current/algorithms/…:“SCC 算法在有向图中找到最大的连接节点集合。如果集合内的每对节点之间存在有向路径,则集合被认为是强连通分量。它通常在早期使用图形分析过程,以帮助我们了解图形的结构。”另外,我需要它是无向的。
    • 一旦有了集群,找到桥就不是问题了,如图所示(它是动态生成的)。
    猜你喜欢
    • 1970-01-01
    • 2014-10-14
    • 2011-03-31
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-13
    相关资源
    最近更新 更多