neo4j java查找_Spring-Boot使用neo4j-java-driver-- 查找两个节点之间关系的最短路径

一、Cypher数据

create (小北:朋友圈{姓名:"小北", 喜欢的书类:"Poetry"}),

(小菲:朋友圈{姓名:"小菲", 喜欢的书类:"Science Fiction"}),

(小鹏:朋友圈{姓名:"小鹏", 喜欢的书类:"Music"}),

(小颖:朋友圈{姓名:"小颖", 喜欢的书类:"Politics"}),

(小兰:朋友圈{姓名:"小兰", 喜欢的书类:"Music"}),

(小峰:朋友圈{姓名:"小峰", 喜欢的书类:"Travel"}),

(小讯:朋友圈{姓名:"小讯", 喜欢的书类:"Poetry"}),

(小东:朋友圈{姓名:"小东", 喜欢的书类:"Sequential Art"}),

(小唯:朋友圈{姓名:"小唯", 喜欢的书类:"Young Adult"}),

(小窦:朋友圈{姓名:"小窦", 喜欢的书类:"Poetry"}),

(小齐:朋友圈{姓名:"小齐", 喜欢的书类:"Default"}),

(小林:朋友圈{姓名:"小林", 喜欢的书类:"Poetry"}),

(小锐:朋友圈{姓名:"小锐", 喜欢的书类:"Default"}),

(小伟:朋友圈{姓名:"小伟", 喜欢的书类:"Young Adult"}),

(小玲:朋友圈{姓名:"小玲", 喜欢的书类:"Business"}),

(小讯)-[:认识]->(小窦),

(小讯)-[:认识]->(小齐),

(小讯)-[:认识]->(小林),

(小讯)-[:认识]->(小鹏),

(小讯)-[:认识]->(小伟),

(小讯)-[:认识]->(小峰),

(小菲)-[:认识]->(小鹏),

(小菲)-[:认识]->(小峰),

(小菲)-[:认识]->(小唯),

(小峰)-[:认识]->(小北),

(小峰)-[:认识]->(小兰),

(小东)-[:认识]->(小林),

(小东)-[:认识]->(小锐),

(小东)-[:认识]->(小菲),

(小鹏)-[:认识]->(小颖),

(小北)-[:认识]->(小兰),

(小颖)-[:认识]->(小东),

(小唯)-[:认识]->(小鹏),

(小唯)-[:认识]->(小锐),

(小伟)-[:认识]->(小玲)

二、执行后,neo4j browser中查询效果如下

8e57b18fe36fe7eae52527061cdfa176.png

三、找出小讯和小锐之间的最短关系路径

1d606159d2dde8709999b86fa973b5b0.png

如上图,假设给你两个人,一个人是节点小讯,另一个人是节点小锐,问他们之间的关系最短路径是什么? 或者换句话问,小讯怎么用最少的步骤联系到小锐?【前提是,小讯和小锐之间不存在任何关系,否则这种问题就没有任何意义了,你俩都有关系了,我还问个毛啊,

titter.gif

如果你用肉眼观察的话,你会找到很多种小讯到达小锐的路径,比如:

1、小讯认识小峰,小菲认识小峰(如果不考虑关系的反向,则认为小峰也同样认识小菲),小菲又认识小唯,小唯认识小锐

因此这种路径下小讯联系小锐的步骤为: 小讯--小峰--小菲--小唯--小锐,路径长度4

2、同上,我们还可以找出一条长度等于3的路径:小讯--小林--小东--小锐

...... 等等,如果光靠肉眼观察的话,像这种数据少的话,勉强还可以捋下来,但是数据一多,就歇菜了,我们可以用neo4j自带的方法来算出两个节点之间存在关系的前提下的最短到达路径Path,比如:

查询出所有小讯到小锐的关系最短路径,语句如下:

MATCH n=allshortestPaths((a:朋友圈{姓名:"小讯"})-[*]-(b:朋友圈{姓名:"小锐"})) return n

查询出的graph效果如下:

下图标注的序号正是上面我们提到的长度等于3的一条路径:小讯--小林--小东--小锐

0bd5be70e5acf008c76663cf6077fd97.png

如果我们只查出最短的一条路径,我们使用shortestPath的时候只会查出一条结果,不管结果怎么样,反正都是最短路径!

语句如下:

MATCH n=shortestPath((a:朋友圈{姓名:"小讯"})-[*]-(b:朋友圈{姓名:"小锐"})) return n

f680b25fdc1ce5b8b85e50733aafde12.png

四、找出小讯和小锐之间的深度等于4的路径Path

MATCH (a:朋友圈{姓名:"小讯"}),(b:朋友圈{姓名:"小锐"})

return (a)-[*4]-(b) as p

574f9d8e31b8e4ba3d83d0af52446cda.png

如果你查找length(path) = 8的结果会怎么样呢?

abc6a3317ad6ca7e67901ce39ff75038.png

五、demo实现最短路径信息输出

Spring-Boot pom依赖

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

4.0.0

com.appleyk

Spring-Boot-Neo4jAPI

0.0.1-SNAPSHOT

war

Spring-Boot 集成Neo4j,实现原生JavaAPI的节点、关系操作

org.springframework.boot

spring-boot-starter-parent

1.5.12.RELEASE

1.8

3.0.8

org.springframework.boot

spring-boot-starter-web

org.springframework.boot

spring-boot-devtools

true

org.springframework.boot

spring-boot-starter-test

test

junit

junit

org.neo4j.driver

neo4j-java-driver

1.6.1

demo演示:

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import org.junit.Test;

import org.neo4j.driver.v1.AuthTokens;

import org.neo4j.driver.v1.Driver;

import org.neo4j.driver.v1.GraphDatabase;

import org.neo4j.driver.v1.Record;

import org.neo4j.driver.v1.Session;

import org.neo4j.driver.v1.StatementResult;

import org.neo4j.driver.v1.Value;

import org.neo4j.driver.v1.types.Node;

import org.neo4j.driver.v1.types.Path;

import org.neo4j.driver.v1.types.Relationship;

public class Neo4jBatchTest{

Driver driver = GraphDatabase.driver("bolt://localhost:7687", AuthTokens.basic("neo4j", "n123"));

private Session session = driver.session();

/**

* 批量创建

*

* @throws Exception

*/

@Test

public void shortEstPath() throws Exception {

try {

String cmdSql = "MATCH n=shortestPath((a:朋友圈{姓名:'小讯'})-[*]-"

+ "(b:朋友圈{姓名:'小锐'})) return n";

StatementResult result = session.run(cmdSql);

while (result.hasNext()) {

Record record = result.next();

List values = record.values();

Map nodesMap = new HashMap<>();

for (Value value : values) {

if (value.type().name().equals("PATH")) {

Path p = value.asPath();

System.out.println("小讯和小锐之间的关系最短路径长度为:" + p.length());

System.out.println("====================================");

Iterable nodes = p.nodes();

for (Node node : nodes) {

nodesMap.put(node.id(), node);

}

/**

* 打印最短路径里面的关系 == 关系包括起始节点的ID和末尾节点的ID,以及关系的type类型

*/

Iterable relationships = p.relationships();

for (Relationship relationship : relationships) {

Long startID = relationship.startNodeId();

Long endID = relationship.endNodeId();

String rType = relationship.type();

/**

* asMap 相当于 节点的properties属性信息

*/

System.out.println(

nodesMap.get(startID).asMap() + "-" + rType + "-"

+ nodesMap.get(endID).asMap());

}

}

}

}

} catch (Exception e) {

System.err.println(e.getClass() + "," + e.getMessage());

}

}

}

运行方法效果如下:

7a1faee35e668076a0f7fc8795c94741.png

如果多条的话就:

String cmdSql = "MATCH n=allshortestPaths((a:朋友圈{姓名:'小讯'})-[*]-(b:朋友圈{姓名:'小锐'})) return n";

执行结果:

c25d576324d279a654f5210ab6400f72.png

对比下,在neo4j中查询的结果

350b91dba8412688873c5150ffba3b53.png

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

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

相关文章

继承易错总结

1.继承会将所有的成员继承下来&#xff0c;但是继承方式限定的是继承下来成员的可见类型(如果是private继承&#xff0c;那么他不论哪里都是不可见的&#xff1b;如果是protected继承在类中是可见的&#xff0c;在类外是不可见的&#xff1b;如果是public继承&#xff0c;在任何…

hhkb适合写java吗_起底这届HHKB最强新品键盘,究竟好在哪儿?

2019年12月HHKB上市了3大品类的12款新品键盘&#xff0c;今天为大家分享外设天下为HHKB Professional HYBIRD Type-S 双模静音旗舰版静电容键盘做的评测&#xff0c;起底这届HHKB新品的最强新品。近日&#xff0c;HHKB更新了旗下的在售产品系列&#xff0c;为了满足严肃、安静办…

elementui树形复选框,element-ui checkbox 组件的树形联动

前言示例版本为 Element-ui 2.13.0 Vue 2.6.11最近想弄 Element-ui checkbox 的多级联动&#xff0c;网上相关的例子大多数为二级联动&#xff0c;自己研究了一下&#xff0c;弄了一个树形菜单的多级联动&#xff0c;常用于角色管理等业务。(仅供参考&#xff0c;未考虑性能问…

java 先入先出,java_阻塞队列(FIFO先进先出)

java_阻塞队列(FIFO先进先出)ArrayBlockingQueue&#xff1a;由数组结构组成的有界阻塞队列&#xff1b;LinkedBlockingQueue&#xff1a;由链表结构组成的有界阻塞队列(但大小默认值为&#xff1a;Integer.MAX_VALUE)&#xff1b;PriorityBlockingQueue&#xff1a;支持优先级…

php 复选框全选和取消,基于JavaScript实现复选框的全选和取消全选

这篇文章主要为大家详细介绍了基于JavaScript实现复选框的全选和取消全选&#xff0c;具有一定的参考价值&#xff0c;感兴趣的小伙伴们可以参考一下本文实例为大家分享了js复选框的全选和取消全选的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下效果图&#xff1a;…

javascript date php date,JavaScript Date 知识浅析

Date函数new Date()Date 对象会自动把当前日期和时间保存为其初始值。date.getDate()从 Date 对象返回一个月中的某一天 (1 ~ 31)。date.getDay()从 Date 对象返回一周中的某一天 (0 ~ 6)。周日是0。date.getMonth()从 Date 对象返回月份 (0 ~ 11)。date.getFullYear()从 Date …

16字节 oracle md5,Oracle中的MD5加密

因为要用到MD5加密&#xff0c;所以在网上搜了一下相关资料&#xff0c;并进行仔细研究。其核心就是MD5编码的数据包函数&#xff1a;DBMS_OBFUSCATION_TOOLKIT.M因为要用到MD5加密&#xff0c;所以在网上搜了一下相关资料&#xff0c;并进行仔细研究。其核心就是MD5编码的数据…

link linux 跨设备,Linux中的两种link方式

Linux系统中包括两种链接方式&#xff1a;硬链接(hard link)和符号链接(symbolic link)&#xff0c;其中符合链接就是所谓的软链接(soft link)&#xff0c;那么两者之间到底有什么区别呢&#xff1f;inode在Linux系统中&#xff0c;内核为每一个新创建的文件分配一个inode&…

linux设置超链接,帮助-链接 - Linux Kernel Newbies

this page is outdated and needs to be fixed参考链接形式语法备注内部链接WikiNameCamelCase page name内部自由链接["Page"] or ["free link"]可配置函数内部子页面链接/SubPage or ["/Sub page"]相对于上一级页面外部链接http://example.net…

linux 文件系统cache,终于找到一篇详解Linux文件系统Cache的文章

级别&#xff1a; 初级2006 年 5 月 11 日文件 Cache 管理是 Linux 内核中一个很重要并且较难理解的组成部分。本文详细介绍了 Linux内核中文件 Cache 管理的各个方面&#xff0c;希望能够对开发者理解相关代码有所帮助。自从诞生以来&#xff0c;Linux 就被不断完善和普及&…

七桥问题c语言程序数据结构,数据结构与算法学习——图论

什么是图&#xff1f;在计算机程序设计中&#xff0c;图结构也是一种非常常见的数据结构但是图论其实是一个非常大的话题图结构是一种与树结构有些相似的数据结构图论是数学的一个分支&#xff0c;并且在数学概念上&#xff0c;树是图的一种它以图为研究对象&#xff0c;研究顶…

c语言式表白,c语言表白必备

c语言表白必备七夕情人节表白必备&#xff0c;多颜色心形展示看图#include#include#include#include #define r 10#define R 172int main(){int i;printf("我");fflush(stdout); //强制刷新缓存&#xff0c;输出显示Sleep(1000);printf("自");fflush(stdou…

android中gradle的作用,Gradle 之 Android 中的应用

在上一篇文章中 Gradle 之语言基础 Groovy 主要介绍了 Groovy 的基础语法(如果没有 Groovy 的基础&#xff0c;建议先看看上篇文章&#xff0c;如果可以动手敲一下里面的示例代码就更好不过了)&#xff0c;也是为本篇文章打基础的。本篇文章主要介绍 Gradle 在 Android 中的应用…

自己写的android apk反编译,获取Android自己写好了的apk以及反编译

今天&#xff0c;我们先说一下&#xff0c;获取Android自带的apk以及反编译它们来学习Android工程师是怎样写的&#xff0c;今天我们就以拿到Android自带的短信管理器的apk为例子你可能有疑问&#xff0c;为什么要那么麻烦&#xff0c;从系统来拿&#xff0c;还要反编译&#x…

一加7pro系统更新android10,一加OnePlus7T Pro官方安卓10.0稳定版出厂系统固件升级更新包...

咱们的这个一加OnePlus7T Pro手机的最新稳定版系统包也是在这里来分享一下了&#xff0c;这个稳定版本的系统包是安卓10稳定版的&#xff0c;也是第一个版本的&#xff0c;系统包大小是3.2G&#xff0c;系统方面主要是全新的UI设计&#xff0c;轻快流畅操作体验&#xff0c;更多…

5元素升级android6,升级你的app以支持高长宽比的新旗舰

为了呈现更好的视觉效果&#xff0c;许多安卓OEM厂商都开始采用超大屏幕。三星刚刚发布了自己的新旗舰Samsung Galaxy S8&#xff0c;长宽比达到18.5:9。今年早些时候的全球移动大会上LG也亮相了 LG G6&#xff0c;屏幕长宽比达到了18:9。(左) maximum aspect ratio为16:9的app…

CCS太阳光准直系统使用积分球均匀光源

CCS太阳光准直系统的应用范围广泛&#xff0c;包括太阳光辐射测量、光学遥感仪器研制与标定、均匀光源的推广使用等方面。通过使用CCS太阳光准直系统&#xff0c;可以准确地模拟太阳光&#xff0c;并对各种光学仪器进行校准和标定&#xff0c;从而提高测量精度和稳定性。 CCS太…

js怎么制作html的主题,用HTML和CSS以及JS制作简单的网页菜单界面的代码

写ABROAD项目用到了标签这个东东&#xff0c;其实标签在WEB上到处可见&#xff0c;图中就依次显示了DCC文章发布器、ABROAD后台添加数据、百度图片搜索、sf发布博客文章时贴标签的样式——标签就像浏览器里原生的checkbox一样&#xff0c;不过checkbox实在太丑了&#xff0c;就…

哔哩网站登录界面html代码,仿哔哩哔哩网页模板设计

【实例简介】【实例截图】【核心代码】bilibili├── Home.html├── Login.html├── Register.html├── css│ ├── bootstrap.min.css│ └── css.css├── forget the password.html├── img│ ├── 001.png│ ├── 002.png│ ├── 003.png│ …

2021高考成绩查询大连,2021年大连高考各高中成绩及本科升学率数据排名及分析...

一、大连高考各高中成绩及本科升学率数据2020年辽宁省普通高等学校招生文化课录取控制分数线普通类 文史特殊类型招生控制分数线&#xff1a;567分本科控制分数线&#xff1a;472分专科(高职、提前专科)控制分数线&#xff1a;150分普通类 理工特殊类型招生控制分数线&#x…