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,一经查实,立即删除!

相关文章

java 返回两个集合_使用 java stream 获取两个集合之间的交集.差集

原始对象List hrProbationMainList new ArrayList();List hrProbationMains probationMainDao.findAll();获取交集对象stream 转换成流 (只有变成流才能操作)filter 封装判断条件(如果true 则收集到结果中,false则不收集)collect 收集结果返回到指定类型中//交集对象ListhrPro…

java重写重定向_JavaWeb请求转发与请求重定向理解

请求转发使用方法httpServletRequest.getRequestDispatcher("login.jsp").forward(httpServletRequest, servletresponse);此请求过程 完全是一次request对象 完成的。我们可以用 filter 截取用户的这次请求&#xff0c;然后利用这次请求 访问其它页面&#xff0c;当…

autojs调用java识字_autojs实现抽象类的继承

作者: 牙叔使用情景在java中, 抽象类必须继承才能使用, 那么在autojs中怎样实现继承抽象类呢?java中的实现创建一个抽象类package com.yashu;public abstract class Employee{ private String name; private String address; private int number; public abstract double com…

java wix_使用WIX升级MSI

我正在使用WIX创建一个MSI安装程序 . 一切都很好&#xff0c;我能够创建自己的产品并创造一切 .但是&#xff0c;当我想要创建升级时&#xff0c;它无法正常工作 .我使用了以下代码&#xff0c;其中$(var.ProductUpgradeCode)被定义并用作product元素中的upgrade-code .Minimum…

继承易错总结

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

flat在java中的含义_Java 9中Collectors.flatMapping()方法的重要性?

在Java 9中&#xff0c;向Collectors类添加了一个新方法&#xff1a;flatMapping()。它类似于Collectors.mapping()方法&#xff0c;其中flatMapping()方法允许我们处理嵌套的集合。 Collectors.flatMapping()方法需要的功能将被施加到输入元件和集电极积累通过功能传递的元件。…

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

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

java暂停5s_java如何实现继续/暂停按钮

匿名用户1级2016-11-24 回答很简单&#xff0c;我给你写一个Demo&#xff1a;import java.awt.event.*;import javax.swing.*;public class Demo extends Thread {private JFrame frm new JFrame("Demo");private JButton btnPause new JButton("Pause")…

c mysql数据库_C实现MySQL数据库操作

C实现MySQL数据库操作两个月前&#xff0c;也就是9月份&#xff0c;心血来潮在windows下实现了用C连接数据库&#xff0c;当时很是有把linux下一并给实现了。但是没有想得那么简单。这个任务一直推迟到了现在才完成&#xff0c;究其原因&#xff1a;1.我直接用eclipse开发工具&…

php生成不重复时间戳,PHP获取时间戳和微秒数以及生成唯一ID

microtime函数描述&#xff1a;返回当前Unix时间戳和微秒数语法&#xff1a;mixed microtime( [ bool $get_as_float ] )//直接输出echo microtime();//得到的是 如&#xff1a;0.26672100 1585622985 前面是当前微秒数&#xff0c;后面是正常时间戳&#xff0c;中间以空格分隔…

php异步处理任务工具,PHP实现异步任务分发处理利器-Gearman

通常&#xff0c;多语言多系统之间的集成是个大问题&#xff0c;一般来说&#xff0c;人们多半会采用WebService的方式来处理此类集成问题&#xff0c;但不管采用何 种风格的WebService&#xff0c;如RPC风格&#xff0c;或者REST风格&#xff0c;其本身都有一定的复杂性。相比…

java dos窗口小工具下载,maxdos 9 3-maxdos工具箱 v9.3 官方版

maxdos 9 3maxdos工具箱是一个dos工具箱&#xff0c;maxdos工具箱为安装好的电脑系统加入dos&#xff0c;方便用户维护与备份还原&#xff0c;是完全傻瓜化的工作模式&#xff0c;更是可以直接启动硬盘上的光盘ISO镜像一键启动。maxdos工具箱特色说明&#xff1a;1、支持进入DO…

java 1.7 linux rpm,linux下用rpm 安装jdk 7的jdk-7u79-linux-x64.rpm

linux下用rpm 安装jdk 7的jdk-7u79-linux-x64.rpm步骤一、下载jdk的rpm安装包步骤二、如果linux是centos的话&#xff0c;请先卸载openjdk&#xff0c;参考文档&#xff1a;使用rpm命令卸载CentOS 6.4自带的OpenJDK步骤三、安装jdk-7u79-linux-x64.rpm安装包先执行以下命令给所…

普通用户无法执行java,CentOS tomcat普通用户执行配置安装

CentOS tomcat经过长时间的发展&#xff0c;这里我发表一下个人理解&#xff0c;下面就这就来讲术CentOS tomcat。CentOS tomcat6_jdk1.6_安装配置_开启自动运行,普通用户执行 (转)秀脱linux笔记之CentOS tomcat6实战篇由于前段时间一直在外头出差&#xff0c;没有完成CentOS t…

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

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

php 魔术方法 sleep,php 魔术方法 sleep() wakeup()

__sleep() 和 __wakeup()public array __sleep ( void )void __wakeup ( void )serialize() 函数会检查类中是否存在一个魔术方法 __sleep()。如果存在&#xff0c;该方法会先被调用&#xff0c;然后才执行序列化操作。此功能可以用于清理对象&#xff0c;并返回一个包含对象中…

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

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

PHP能在Mac上运行吗,PHP Composer无法在Mac上运行

我安装了bitnami mac堆栈主要是因为我的项目需要至少PHP 5.4.7版本.但是,我遇到了作曲家的问题.这是我跑步时遇到的错误&#xff1a;php composer.phar install --dev错误&#xff1a;Richard-Knops-MacBook-Pro:my-project richardknop$php composer.phar install --devdyld: …

主机安装php网站,php支持虚拟主机(php网站空间)

php设置虚拟主机&#xff0c;主要是为了在ie输入地址栏是&#xff0c;可以输入任意的&#xff0c;而不是localhost/&#xff0c;为了方便&#xff0c;但是设置起来很不方便的。。发现不能实现每个站点使用不同的PHP版本&#xff0c;想向大家求教一下&#xff0c;有没有能让。支…

php时分获取秒数,javascript与php时/分/秒与秒数互转

javascript&#xff1a;/*时间转换成秒*/function time_to_second(time){var arr time.split(‘:‘)var hour arr[0]?arr[0]:0var minute arr[1]?arr[1]:0var second arr[2]?arr[2]:0var ret hour * 3600 minute * 60 secondreturn ret}/*秒转换成时间*/function sec…