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

neo4j图形界面

上周, 我写了关于中间性中心算法以及我尝试使用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

neo4j图形界面

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/347457.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

打开服务器文件提示内存不够,打开服务器文件提示内存不够

打开服务器文件提示内存不够 内容精选换一换本节操作指导您完成Windows操作系统云服务器磁盘空间清理。弹性云服务器匀出一部分磁盘空间来充当内存使用&#xff0c;当内存耗尽时&#xff0c;云服务器可以使用虚拟内存来缓解内存的紧张。但当内存使用率已经非常高时&#xff0c;…

【自适应(盲)均衡1】LMMSE、Godard、CMA常模、Sato等算法在信道均衡中的应用理论与MATLAB仿真(代码见CSDN同名资源)

1.实验背景 考虑如图所示的基带等效数据传输系统,发送符号经过ISI失真信道传输,叠加高斯加性白噪声。 设发送信号采用QPSK调制,即 x k = ( 1 j ) / 2 {x_k} = ( \pm 1 \pm j)/\sqrt 2 x

无线打印机与手机连接到服务器,图文详解手机通过无线Wifi连接打印机的方法...

打印机是我们在办公过程中经常会用到的打印设备&#xff0c;特别是当需要大量的文件资料时&#xff0c;打印机可以帮助我们快速的打印和记录。随着打印机使用的不断广泛&#xff0c;打印机的种类也在不断的增多&#xff0c;为了能够适应现在这个网络智能时代的发展&#xff0c;…

卷积码Viterbi译码算法基本原理及C语言实现

配套代码:https://download.csdn.net/download/wlwdecs_dn/14463620 界面 (3, 1, 3)卷积码状态转移框图 源文件 编码文件: 译码文件:

Win32编程之基于MATLAB与VC交互的幻方阵(魔方阵)输出

运行环境 Matlab R2018b x64 or x32 Visual Studio 2017 企业版 程序下载 配套代码下载地址 程序预览 程序功能描述 矩阵运算是大多数科学运算的必要工具。通常情况下,Matlab是实现矩阵运算的最佳工具,但是大多数Matlab运算都是基于double类型,占据空间很大,遇到大型数…

java中使用es的dsl_基于DSL的基于图论的Java程序中输入图数据的方法

java中使用es的dsl我们大多数人已经编写了一些处理图论算法的程序&#xff0c;例如找到两个顶点之间的最短路径&#xff0c;找到给定图的最小生成树等等。 在这些算法的每一种中&#xff0c;表示图形的编程方式是使用邻接矩阵或邻接列表 。 两者都不是定义图形输入的非常直观的…

leetcode 495. 提莫攻击(esay)(优质解法)

链接&#xff1a;495. 提莫攻击 代码&#xff1a; class Solution {public int findPoisonedDuration(int[] timeSeries, int duration) {int time0;for(int i1;i<timeSeries.length;i){if(timeSeries[i]-timeSeries[i-1]<duration){timetimeSeries[i]-timeSeries[i-1];…

基于高阶累积量的数字调制信号分类(Hierarchical Digital Modulation Classification Using Cumulants例1复现)

本文主要来源于2000年Swami经典文献Hierarchical Digital Modulation Classification Using Cumulants中例1的复现(文献共有15个实例,后续例子与例1实现方法类似,有问题欢迎留言),该论文是高阶累积量作信号调制识别分类的开篇之作,后续该方向的文献几乎都引用了Swami这篇…

矩阵可逆的一种刻画方式

问题 若矩阵A满足AATIAA^{\rm{T}}IAATI&#xff0c;则A可逆。 证明一 反证法。假设A不可逆&#xff0c;则 ∃x0≠0\exists{x_0}\ne0∃x0​​0&#xff0c;使得Ax00A{x_0}0Ax0​0&#xff0c;则 x0AT(Ax0)T0T{x_0}{A^{\rm{T}}} {(A{x_0})^{\rm{T}}} {0^{\rm{T}}}x0​AT(A…

我们知道计算机的大小单位有 B, KB, MB 等,现在请你编写一个计算器进行大小单位换算。Java洛谷传智杯

题目描述&#xff1a; 我们知道计算机的大小单位有 B, KB, MB 等&#xff0c;现在请你编写一个计算器进行大小单位换算。 输入格式&#xff1a;输入一个字符串&#xff0c;由一个 0 到 1023 之间的整数&#xff0c;一个单位名称&#xff08;大写字母&#xff09;&#xff0c;一…

传智杯Java志愿者传智专修学院总共召集了n位志愿者来负责打扫活动,现在需要你负责帮忙统计每位志愿者的工作情况,用来制作光荣榜,给他们发小花花

Java实现思路&#xff1a;创建一个志愿者内部类&#xff0c;包括编号、服务时长、难度、贡献度属性。使用ArrayList将多个志愿者对象联系在一起。使用Collection的sort方法&#xff0c;重写compare方法进行按规则比较。 Java代码&#xff1a; import java.util.ArrayList; im…

高斯白噪声下基于EM的多径时延估计

本文主要来源于复现文献的部分内容&#xff0c;有一定的参考价值&#xff1a; [1] 刘波. 基于EM的突发通信参数估计技术研究[D]. 2009. 文末有代码和参考文献网盘下载地址&#xff0c;有问题欢迎留言交流&#xff01; 1 引言 对于多径传播&#xff0c;接收信号是由源信号与它…

传智杯Java终端有一天您厌烦了电脑上又丑又没用的终端,打算自己实现一个 Terminal

Java思路&#xff1a;使用String的字符串处理以及ArrayList的列表处理。 Java代码&#xff1a; import java.util.ArrayList; import java.util.Scanner; public class Main{public static ArrayList<String> list new ArrayList<>();public static void main(S…

新年迈出Java后台服务器与数据库交互第一步2022最新通用Java8jdbc8连接mysql8数据库进行增删改查等基本操作详解(IDEA),jar包导入,图片等文件流,批量操作

文章目录一、JDBC下载与导入二、获取连接三、PreparedStatement类操作数据库四、操作BLOB类型字段&#xff08;图片视频等&#xff09;五、Batch批量插入&#x1f646;&#x1f3fb;‍♀️&#x1f646;&#x1f3fb;‍♀️文末最新版jdbc jar包下载 &#x1f646;&#x1f3fb…

最优化理论与算法笔记

最优化理论与算法笔记

Win32编程之基于MATLAB与VC交互的多项式回归

运行环境 Matlab R2018b x64 or x32 Visual Studio 2017 企业版 程序预览 文末有完整程序代码下载地址,有任何问题欢迎留言,谢谢点赞哟! 程序功能描述 矩阵运算是大多数科学运算的必要工具。通常情况下,Matlab是实现矩阵运算的最佳工具,但是大多数Matlab运算都是基于d…

隔离区别对待?如何捆绑?Java中的jdbc数据库事务及其隔离级别

文章目录一、数据库事务简介二、JDBC事务处理三、事务的ACID属性四、数据库的隔离级别五、设置隔离级别一、数据库事务简介 事务&#xff1a;一组逻辑操作单元&#xff0c;使数据从一种状态变换到另一种状态。 事务处理&#xff08;事务操作&#xff09;&#xff1a;保证所有…

基于VS的连连看小游戏

运行环境 Matlab R2018b x64 or x32 Visual Studio 2017 企业版 程序预览 目前功能只开发了基本模式,也即是基本的连连看功能和帮助功能,文末有完整程序代码下载地址,有任何问题欢迎留言,谢谢点赞哟! 重要设计步骤和思路以及实现如下所示。 设计思路 类设计

idea使用c3p0数据库连接池无法加载配置文件xml,配置文件放置的位置

注意&#xff1a;要把c3p0-config.xml文件放在输出的文件夹里面&#xff0c;即放在out里面&#xff0c;而不是放在src里面。&#xff08;如下图&#xff09; 至于配置文件怎么写&#xff0c;可以参考其他经验教程&#xff0c;这里不再赘述。