上周, 我写了关于中间性中心性算法以及使用graphstream 理解它的尝试 ,在阅读源代码时,我意识到我可以使用neo4j的所有最短路径算法将某些东西放在一起。

概括地说,中间性中心度算法用于确定图中节点的负载和重要性。

在与Jen讨论这一点时,她指出,计算整个图上节点之间的中间性通常是没有意义的。 但是,了解在您感兴趣的较小子图中哪个节点最重要可能很有用。

在这种情况下,我有兴趣在一个非常小的有向图中确定节点的中间性:

让我们简要回顾一下算法:

[中间性中心]等于从所有顶点到经过该节点的所有其他顶点的最短路径数。

这意味着我们排除了直接在两个节点之间而不经过任何其他路径的任何路径,这是我最初没有掌握的。

如果我们手工确定适用的路径,我们将得到以下结果:

A -> B: Direct Path Exists
A -> C: B
A -> D: E
A -> E: Direct Path Exists
B -> A: No Path Exists
B -> C: Direct Path Exists
B -> D: E or C
B -> E: Direct Path Exists
C -> A: No Path Exists
C -> B: No Path Exists
C -> D: Direct Path Exists
C -> E: No Path Exists
D -> A: No Path Exists
D -> B: No Path Exists
D -> C: No Path Exists
D -> E: No Path Exists
E -> A: No Path Exists
E -> B: No Path Exists
E -> C: No Path Exists
E -> D: Direct Path Exists

给出以下中间性中心值:

A: 0
B: 1
C: 0.5
D: 0
E: 1.5

我们可以针对最新版本的graphstream (考虑方向)编写测试,以确认我们的手动算法:

@Testpublic void calculateBetweennessCentralityOfMySimpleGraph() {Graph graph = new SingleGraph("Tutorial 1");Node A = graph.addNode("A");Node B = graph.addNode("B");Node E = graph.addNode("E");Node C = graph.addNode("C");Node D = graph.addNode("D");graph.addEdge("AB", A, B, true);graph.addEdge("BE", B, E, true);graph.addEdge("BC", B, C, true);graph.addEdge("ED", E, D, true);graph.addEdge("CD", C, D, true);graph.addEdge("AE", A, E, true);BetweennessCentrality bcb = new BetweennessCentrality();bcb.computeEdgeCentrality(false);bcb.betweennessCentrality(graph);System.out.println("A="+ A.getAttribute("Cb"));System.out.println("B="+ B.getAttribute("Cb"));System.out.println("C="+ C.getAttribute("Cb"));System.out.println("D="+ D.getAttribute("Cb"));System.out.println("E="+ E.getAttribute("Cb"));}

输出是预期的:

A=0.0
B=1.0
C=0.5
D=0.0
E=1.5

我想看看是否可以使用neo4j做同样的事情,所以我使用以下cypher语句在空白数据库中创建了图形:

CREATE (A {name: "A"})
CREATE (B {name: "B"})
CREATE (C {name: "C"})
CREATE (D {name: "D"})
CREATE (E {name: "E"})CREATE A-[:TO]->E
CREATE A-[:TO]->B
CREATE B-[:TO]->C
CREATE B-[:TO]->E
CREATE C-[:TO]->D
CREATE E-[:TO]->D

然后,我编写了一个查询,该查询找到了图中所有节点集之间的最短路径:

MATCH p = allShortestPaths(source-[r:TO*]->destination)
WHERE source <> destination
RETURN NODES(p)

如果运行,它将返回以下内容:

==> +---------------------------------------------------------+
==> | NODES(p)                                                |
==> +---------------------------------------------------------+
==> | [Node[1]{name:"A"},Node[2]{name:"B"}]                   |
==> | [Node[1]{name:"A"},Node[2]{name:"B"},Node[3]{name:"C"}] |
==> | [Node[1]{name:"A"},Node[5]{name:"E"},Node[4]{name:"D"}] |
==> | [Node[1]{name:"A"},Node[5]{name:"E"}]                   |
==> | [Node[2]{name:"B"},Node[3]{name:"C"}]                   |
==> | [Node[2]{name:"B"},Node[3]{name:"C"},Node[4]{name:"D"}] |
==> | [Node[2]{name:"B"},Node[5]{name:"E"},Node[4]{name:"D"}] |
==> | [Node[2]{name:"B"},Node[5]{name:"E"}]                   |
==> | [Node[3]{name:"C"},Node[4]{name:"D"}]                   |
==> | [Node[5]{name:"E"},Node[4]{name:"D"}]                   |
==> +---------------------------------------------------------+
==> 10 rows

我们仍在返回节点之间的直接链接,但是通过基于路径中节点的数量过滤结果可以很容易地纠正这一点:

MATCH p = allShortestPaths(source-[r:TO*]->destination)
WHERE source <> destination  AND LENGTH(NODES(p)) > 2
RETURN EXTRACT(n IN NODES(p): n.name)
==> +--------------------------------+
==> | EXTRACT(n IN NODES(p): n.name) |
==> +--------------------------------+
==> | ["A","B","C"]                  |
==> | ["A","E","D"]                  |
==> | ["B","C","D"]                  |
==> | ["B","E","D"]                  |
==> +--------------------------------+
==> 4 rows

如果我们稍微调整密码查询,我们可以获得每个源/目标的最短路径的集合:

MATCH p = allShortestPaths(source-[r:TO*]->destination)
WHERE source <> destination  AND LENGTH(NODES(p)) > 2
WITH EXTRACT(n IN NODES(p): n.name) AS nodes
RETURN HEAD(nodes) AS source, HEAD(TAIL(TAIL(nodes))) AS destination, COLLECT(nodes) AS paths
==> +------------------------------------------------------+
==> | source | destination | paths                         |
==> +------------------------------------------------------+
==> | "A"    | "D"         | [["A","E","D"]]               |
==> | "A"    | "C"         | [["A","B","C"]]               |
==> | "B"    | "D"         | [["B","C","D"],["B","E","D"]] |
==> +------------------------------------------------------+
==> 3 rows

当我们有一种使用cypher来对集合进行切片的方法时,从这里获得节点间的中间性得分并不难,但是现在使用通用的编程语言要容易得多。

在这种情况下,我使用了Ruby并提出了以下代码:

require 'neography'
neo = Neography::Rest.newquery =  " MATCH p = allShortestPaths(source-[r:TO*]->destination)"
query << " WHERE source <> destination  AND LENGTH(NODES(p)) > 2"
query << " WITH EXTRACT(n IN NODES(p): n.name) AS nodes"
query << " RETURN HEAD(nodes) AS source, HEAD(TAIL(TAIL(nodes))) AS destination, COLLECT(nodes) AS paths"betweenness_centrality = { "A" => 0, "B" => 0, "C" => 0, "D" => 0, "E" => 0 }neo.execute_query(query)["data"].map { |row| row[2].map { |path| path[1..-2] } }.each do |potential_central_nodes|       number_of_central_nodes = potential_central_nodes.sizepotential_central_nodes.each do |nodes|nodes.each { |node| betweenness_centrality[node] += (1.0 / number_of_central_nodes) }end
endp betweenness_centrality

输出以下内容:

$ bundle exec ruby centrality.rb
{"A"=>0, "B"=>1.0, "C"=>0.5, "D"=>0, "E"=>1.5}

它似乎可以完成任务,但是我敢肯定,在某些情况下,它无法处理成熟的库需要处理的问题。 作为一个实验,看看有什么可能,我认为还算不错!

该图位于neo4j控制台上 ,以防有人感兴趣。

参考: 图处理:betweens中心性–来自Mark Needham博客博客上我们JCG合作伙伴 Mark Needham的neo4j密码与图流 。

翻译自: https://www.javacodegeeks.com/2013/08/graph-processing-betweeness-centrality-neo4js-cypher-vs-graphstream.html

图形处理:betweeness中心性– neo4j的密码与graphstream相关推荐

  1. neo4j图形界面_图形处理:betweeness中心性– neo4j的密码与graphstream

    neo4j图形界面 上周, 我写了关于中间性中心算法以及我尝试使用graphstream 理解它的尝试 ,在阅读源代码的同时,我意识到我可以使用neo4j的所有最短路径算法将某些东西放在一起. 概括地 ...

  2. 关系网络理论︱细讲中介中心性(Betweeness Centrality)

    关系网络在我认为都是一种很简单暴力地能挖掘人群特征关系的一种方式,特别今天去听了一场关于AI与金融领域的结合,里面提到了拓扑分析其实就是关系网络的解释.我在之前的文章( R语言︱SNA-社会关系网络- ...

  3. 节点中心性:度中心性、特征向量中心性、Katz中心性、介数中心性

    目录 一.度中心性(Degree Centrality) 二.特征向量中心性(Eigenvector Centrality) 三.Katz中心性(Katz Centrality) 四.介数中心性(Be ...

  4. 《图算法》第五章 中心性算法-1

    对图算法有兴趣的朋友可以关注微信公众号 :< Medical与AI的故事> 原文链接:<图算法>第五章-1 中心性算法 中心性算法(centrality algorithm)用 ...

  5. 如何使用netwokx进行复杂网络的中心性分析?

    如何使用netwokx进行复杂网络的中心性分析? 这是本学期在大数据哲学与社会科学实验室做的第七次分享了. 第一次分享的是: 如何利用"wordcloud+jieba"制作中文词云 ...

  6. 如何在Git中保存用户名和密码?

    本文翻译自:How to save username and password in Git? I want to use a push and pull automatically in GitEx ...

  7. 管理SharePoint中的账号的密码

    在SharePoint环境中更换密码 下图展示了在一个拥有两个WFE服务器的SharePoint服务器场中更换SharePoint场管理员密码的一个过程. 密码的更改并不要求重启系统. Windows ...

  8. GitHub https链接中输入账户和密码

    /*********************************************************************** GitHub https链接中输入账户和密码* 说明: ...

  9. SoapUI工具中的用户名和密码如何用net代码实现传入

    问题: 最近公司与陶氏SAP对接时,陶氏IT要求我们通过SoapUI调用接口时,要让SoapUI工具里面输入用户名和密码才可以调用. CSDN高分提问: 为此还在CSDN中出高分提了一个问题,如下: ...

最新文章

  1. 基于Flink SQL构建流批一体实时数仓
  2. UML静态建模之用例图
  3. MySQL调用存储过程
  4. 类的公有类型(public)和私有类型(private)
  5. 下拉导航中绝对定位与相对定位问题
  6. 别薅了别薅了!!!再薅就真的被薅秃了!!
  7. jvm系列(九):如何优化Java GC
  8. 汇顶科技2021秋招笔试
  9. 医疗健康领域的短文本解析探索 ----文本纠错
  10. 啊哈c语言第四章 pdf,啊哈!算法 PDF扫描版[73MB]
  11. 《计算机系统基础》复习——简答题 01
  12. c语言自动插桩,静态插桩的方式来实现Hook Method
  13. 【计算机组成原理——定点数原码一位乘法手算】
  14. 全网最全 ECMAScript 攻略
  15. 用u盘装linux系统黑屏,u盘启动黑屏 u盘装系统启动不了黑屏咋办
  16. 酷博社区卫生系统激活健康档案的生命活力
  17. 真杜比全景声家庭影院级投影设备,当贝做到了五千元内也支持
  18. 保存相片是什么图像格式?
  19. git和远程仓库建立连接详细过程
  20. 微软账号登陆不上_企业信息化面临的问题,看看解决方案,基于微软平台的IT架构...

热门文章

  1. tsc244标签编辑软件_能打小票的标签机,M110智能标签打印机来了!
  2. payara 创建 集群_使用Payara Micro的Easy Java EE Microservices
  3. 运动基元_发现大量Java基元集合处理
  4. java面包屑实现_在Java中实现过滤器和面包店锁
  5. junit:junit_简而言之,JUnit:另一个JUnit教程
  6. Java –缺少字体–崩溃的应用程序!
  7. Spring再次涵盖了您:继续进行消费者驱动的消息传递合同测试
  8. java反射api研究_深入研究Java 8中的可选类API
  9. js 实现轻量ps_简单轻量的池实现
  10. 使用Spring Boot和React进行Bootiful开发