日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

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

發(fā)布時間:2025/3/8 javascript 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 neo4j java查找_Spring-Boot使用neo4j-java-driver-- 查找两个节点之间关系的最短路径 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、Cypher數(shù)據(jù)

create (小北:朋友圈{姓名:"小北", 喜歡的書類:"Poetry"}),

(小菲:朋友圈{姓名:"小菲", 喜歡的書類:"Science Fiction"}),

(小鵬:朋友圈{姓名:"小鵬", 喜歡的書類:"Music"}),

(小穎:朋友圈{姓名:"小穎", 喜歡的書類:"Politics"}),

(小蘭:朋友圈{姓名:"小蘭", 喜歡的書類:"Music"}),

(小峰:朋友圈{姓名:"小峰", 喜歡的書類:"Travel"}),

(小訊:朋友圈{姓名:"小訊", 喜歡的書類:"Poetry"}),

(小東:朋友圈{姓名:"小東", 喜歡的書類:"Sequential Art"}),

(小唯:朋友圈{姓名:"小唯", 喜歡的書類:"Young Adult"}),

(小竇:朋友圈{姓名:"小竇", 喜歡的書類:"Poetry"}),

(小齊:朋友圈{姓名:"小齊", 喜歡的書類:"Default"}),

(小林:朋友圈{姓名:"小林", 喜歡的書類:"Poetry"}),

(小銳:朋友圈{姓名:"小銳", 喜歡的書類:"Default"}),

(小偉:朋友圈{姓名:"小偉", 喜歡的書類:"Young Adult"}),

(小玲:朋友圈{姓名:"小玲", 喜歡的書類:"Business"}),

(小訊)-[:認(rèn)識]->(小竇),

(小訊)-[:認(rèn)識]->(小齊),

(小訊)-[:認(rèn)識]->(小林),

(小訊)-[:認(rèn)識]->(小鵬),

(小訊)-[:認(rèn)識]->(小偉),

(小訊)-[:認(rèn)識]->(小峰),

(小菲)-[:認(rèn)識]->(小鵬),

(小菲)-[:認(rèn)識]->(小峰),

(小菲)-[:認(rèn)識]->(小唯),

(小峰)-[:認(rèn)識]->(小北),

(小峰)-[:認(rèn)識]->(小蘭),

(小東)-[:認(rèn)識]->(小林),

(小東)-[:認(rèn)識]->(小銳),

(小東)-[:認(rèn)識]->(小菲),

(小鵬)-[:認(rèn)識]->(小穎),

(小北)-[:認(rèn)識]->(小蘭),

(小穎)-[:認(rèn)識]->(小東),

(小唯)-[:認(rèn)識]->(小鵬),

(小唯)-[:認(rèn)識]->(小銳),

(小偉)-[:認(rèn)識]->(小玲)

二、執(zhí)行后,neo4j browser中查詢效果如下

三、找出小訊和小銳之間的最短關(guān)系路徑

如上圖,假設(shè)給你兩個人,一個人是節(jié)點(diǎn)小訊,另一個人是節(jié)點(diǎn)小銳,問他們之間的關(guān)系最短路徑是什么? 或者換句話問,小訊怎么用最少的步驟聯(lián)系到小銳?【前提是,小訊和小銳之間不存在任何關(guān)系,否則這種問題就沒有任何意義了,你倆都有關(guān)系了,我還問個毛啊,

如果你用肉眼觀察的話,你會找到很多種小訊到達(dá)小銳的路徑,比如:

1、小訊認(rèn)識小峰,小菲認(rèn)識小峰(如果不考慮關(guān)系的反向,則認(rèn)為小峰也同樣認(rèn)識小菲),小菲又認(rèn)識小唯,小唯認(rèn)識小銳

因此這種路徑下小訊聯(lián)系小銳的步驟為: 小訊--小峰--小菲--小唯--小銳,路徑長度4

2、同上,我們還可以找出一條長度等于3的路徑:小訊--小林--小東--小銳

...... 等等,如果光靠肉眼觀察的話,像這種數(shù)據(jù)少的話,勉強(qiáng)還可以捋下來,但是數(shù)據(jù)一多,就歇菜了,我們可以用neo4j自帶的方法來算出兩個節(jié)點(diǎn)之間存在關(guān)系的前提下的最短到達(dá)路徑Path,比如:

查詢出所有小訊到小銳的關(guān)系最短路徑,語句如下:

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

查詢出的graph效果如下:

下圖標(biāo)注的序號正是上面我們提到的長度等于3的一條路徑:小訊--小林--小東--小銳

如果我們只查出最短的一條路徑,我們使用shortestPath的時候只會查出一條結(jié)果,不管結(jié)果怎么樣,反正都是最短路徑!

語句如下:

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

四、找出小訊和小銳之間的深度等于4的路徑Path

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

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

如果你查找length(path) = 8的結(jié)果會怎么樣呢?

五、demo實(shí)現(xiàn)最短路徑信息輸出

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,實(shí)現(xiàn)原生JavaAPI的節(jié)點(diǎn)、關(guān)系操作

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();

/**

* 批量創(chuàng)建

*

* @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("小訊和小銳之間的關(guān)系最短路徑長度為:" + p.length());

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

Iterable nodes = p.nodes();

for (Node node : nodes) {

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

}

/**

* 打印最短路徑里面的關(guān)系 == 關(guān)系包括起始節(jié)點(diǎn)的ID和末尾節(jié)點(diǎn)的ID,以及關(guān)系的type類型

*/

Iterable relationships = p.relationships();

for (Relationship relationship : relationships) {

Long startID = relationship.startNodeId();

Long endID = relationship.endNodeId();

String rType = relationship.type();

/**

* asMap 相當(dāng)于 節(jié)點(diǎn)的properties屬性信息

*/

System.out.println(

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

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

}

}

}

}

} catch (Exception e) {

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

}

}

}

運(yùn)行方法效果如下:

如果多條的話就:

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

執(zhí)行結(jié)果:

對比下,在neo4j中查詢的結(jié)果

總結(jié)

以上是生活随笔為你收集整理的neo4j java查找_Spring-Boot使用neo4j-java-driver-- 查找两个节点之间关系的最短路径的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。