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

Java代码样式运算符换行格式

上周&#xff0c;我发现了什么决定了我长期以来苦苦挣扎的决定&#xff1a;是否放置&& &#xff0c; ||之类的运算符。 或在同一行或下一行。 在构造布尔表达式或隐含字符串时&#xff0c;我们可能需要中断长行。 根据《 Google Java样式指南》 &#xff0c;该中断应出…

在一个由小写英文字母(a-z)组成的字符串中,查找最长子串,其头尾字母相同,且中间不包含该头尾字母,并输出最左边的该类子串

输入&#xff1a; ①adfasjdoiasldhlfa ②a ③aa ④abcd 输出&#xff1a; ①fasjdoiasldhlf ②a ③aa ④a import java.util.Scanner; public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);String str scanner.next();Str…

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

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

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

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

在一个小写英文字母(a-z)组成的字符串的最短子串,其包含这个字符串中出现过的所有字母,输出最左边的该类子串

import java.util.Scanner; public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);String str scanner.next();String subStr str;//两层循环使得各种字串情况可以详尽for (int i 0; i < str.length(); i) {for (int j …

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这篇…

Lambda运行时内部:窥视无服务器巢穴

有没有想过lambda里面是什么样的&#xff1f; 不要怀疑了 让我们找出答案。 自从2014年问世以来&#xff0c;AWS的lambda函数就成为了一个热门话题&#xff0c;在无服务器计算领域开辟了全新的历史。 无状态&#xff0c;零维护&#xff0c;按次执行的好东西实际上正在改变&…

基于(7, 5)归零非删余Turbo码的参数识别与分析

关注公众号【逆向通信猿】试读更多内容!!! 本文主要来源于复现文献的部分内容,有一定的参考价值: [1] 钟兆根, 吴昭军, 刘杰, 张立民. 高误码率下归零Turbo帧结构识别[J]. 电子学报. 2019(10). 文末有代码和参考文献网盘下载地址,有问题欢迎留言交流! 1 引言 随着现代…

给出一个正整数 nnn,请你计算从 111 到 nnn 的所有正整数中,有多少个数字的各位数和是 999,Java

题目描述&#xff1a; 给出一个正整数 nnn&#xff0c;请你计算从 111 到 nnn 的所有正整数中&#xff0c;有多少个数字的各位数和是 999&#xff1f; 输入格式&#xff1a; 输入一个不超过 100000010000001000000 的正整数 nnn。 输出格式&#xff1a; 输出一个整数表示答案…

【2020.12.30更新】信号处理常用公式(一)

积化和差 cos⁡αcos⁡β12[cos⁡(αβ)cos⁡(α−β)]\cos \alpha \cos \beta \frac{1}{2}[\cos (\alpha \beta ) \cos (\alpha - \beta )]cosαcosβ21​[cos(αβ)cos(α−β)]sin⁡αcos⁡β12[sin⁡(αβ)sin⁡(α−β)]\sin \alpha \cos \beta \frac{1}{2}[\sin (\al…

一个直角三角形的两个直角边是 a,b(a≤b),其斜边是 c,且 a,b,c都是正整数。现在我们已经知道了斜边长度c,请问这个直角三角形的两个直角边的长度是什么?Java

题目描述&#xff1a;一个直角三角形的两个直角边是 a,b(a≤b&#xff09;&#xff0c;其斜边是 c&#xff0c;且 a,b,c都是正整数。现在我们已经知道了斜边长度c&#xff0c;请问这个直角三角形的两个直角边的长度是什么&#xff1f; 输入格式&#xff1a;输入一个整数 c(1≤…

矩阵可逆的一种刻画方式

问题 若矩阵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;一…

eclipselink_EclipseLink MOXy和用于JSON处理的Java API –对象模型API

eclipselink用于JSON处理的Java API&#xff08;JSR-353&#xff09;是作为Java EE 7的一部分引入的用于生成和使用JSON的Java标准。JSR-353包括对象&#xff08;类似于DOM&#xff09;和流&#xff08;类似于StAX&#xff09;API。 在本文中&#xff0c;我将演示我们在Eclipse…

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

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