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.pswp.cn/news/530869.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/530869.shtml
英文地址,請注明出處:http://en.pswp.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…