当前位置: 首页 > news >正文

Neo4j常用语法-path

在 Neo4j 中,Path(路径) 是连接两个或多个节点的关系序列,是图查询的核心概念之一。理解 Path 的用法对于复杂图分析至关重要
关键特性:
有向性:路径中的关系具有方向
可变长度:路径可以包含 0 个或多个关系
类型约束:关系可以指定类型(如 :ACTED_IN)
属性过滤:节点和关系可以通过属性过滤

(1)简单路径匹配

MATCH p = (a:Person)-[:FRIEND]->(b:Person)
RETURN p

(2)可变长度路径

MATCH p = (a:Person)-[:FRIEND*2..5]->(b:Person)  // 2到5跳的路径
RETURN p

(3)任意关系类型

MATCH p = (a:Person)-[*]->(b:Person)  // 任意类型和长度的关系
RETURN p

(4)特定关系类型组合

MATCH p = (a:Person)-[:ACTED_IN|DIRECTED*]->(m:Movie)
RETURN p

(5)Path 的函数与操作

MATCH p = (a:User)-[:FRIEND*]->(b:User)
RETURN p

在这里插入图片描述
在这里插入图片描述

// 返回关系数量
MATCH p = (a:User)-[:FRIEND*]->(b:User)
RETURN length(p) AS pathLength  

在这里插入图片描述
(6)提取路径节点和关系

MATCH p = (a:User)-[:FRIEND*]->(b:User)
RETURN nodes(p) AS pathNodes,      // 返回节点列表relationships(p) AS rels    // 返回关系列表

在 Neo4j 的路径匹配中,*…3 表示 ** 路径长度(关系数量)** 的范围,不包含节点自身。具体规则如下:
路径深度的含义:
*n…m:表示路径中关系的数量范围(n 到 m 跳)
不包含节点自身:即使 n=0,也需要至少一个关系才能构成路径
示例:
*0…3:允许 0 到 3 跳的路径(但 0 跳路径无实际意义,因为至少需要一个关系)
*1…3:允许 1 到 3 跳的路径(最常见的用法)
*…3:等价于 *1…3(默认从 1 开始)

//只查询Tom Cruise 的person节点指向任一节点,关系边的长度为1或者2的数据
MATCH path = (p:Person {name: "Tom Cruise"})-[*..2]-(other)
RETURN path
LIMIT 100  // 限制结果数量,避免返回过多路径

结果如下图所示
图展示形式
在这里插入图片描述
Text展示形式
在这里插入图片描述

//只查询Tom Cruise 的person节点指向任一节点,关系边的长度只为3的数据
MATCH path = (p:Person {name: "Tom Cruise"})-[*3..3]-(other)
RETURN path
LIMIT 100  // 限制结果数量,避免返回过多路径

关键参数:
*…2:表示路径最大深度为 2 跳 (查询Tom Cruise到任一节点,任一关系路径为1或者2的数据)
(p:Person {name: “Tom Cruise”}):起始节点
(other):匹配任意类型的节点

//关系类型的路径查询
MATCH path = (p:Person {name: "Tom Cruise"})-[r:ACTED_IN|REVIEWED|FOLLOWS*..3]-(other)
RETURN path
LIMIT 100

在这里插入图片描述
如上图所示,p-m,有两个路径,一个长度是5,一个长度3,我现在想获取最短路径

基本最短路径查询
在 Neo4j 中,查找两个节点之间的最短路径可以使用 shortestPath 或 allShortestPaths 函数

MATCH (p:Person {name: "Tom Cruise"}), (m:Movie {title: "One Flew Over the Cuckoo's Nest"})
MATCH path = shortestPath((p)-[*]-(m))  // 查找最短路径
RETURN path

如图所示:
在这里插入图片描述

关键参数:
[*]:表示任意类型和长度的关系
shortestPath:返回单条最短路径
如果存在多条相同长度的最短路径,仅返回其中一条

//指定关系类型的最短路径
//如果只关心特定关系类型(如 ACTED_IN、DIRECTED 等):
MATCH (p:Person {name: "Tom Cruise"}), (m:Movie {title: "One Flew Over the Cuckoo's Nest"})
MATCH path = shortestPath((p)-[:ACTED_IN|DIRECTED|REVIEWED|FOLLOWS*]-(m))
RETURN path
//限制路径深度:如果图很大,可设置最大深度(但可能错过真实最短路径)
MATCH path = shortestPath((p)-[*..10]-(m))  // 最大深度10

Path 的典型应用场景
(7)社交网络分析

// 查找共同好友(查找Alice和Bob的共同朋友)
MATCH (a:Person {name: "Alice"})-[:FRIEND]-(f:Person)-[:FRIEND]-(b:Person {name: "Bob"})
RETURN f.name AS mutualFriend

(8)推荐系统

// 基于共同兴趣推荐
MATCH (u:User {id: 123})-[:LIKES]->(p:Product)<-[:LIKES]-(other:User)
MATCH path = (other)-[:LIKES]->(reco:Product)
WHERE NOT EXISTS((u)-[:LIKES]->(reco))
RETURN reco.name AS recommendation, COUNT(path) AS score
ORDER BY score DESC//该语句分析
1. 从用户123出发,找到他喜欢的产品集合P
2. 找到所有喜欢P中产品的其他用户集合U
3. 收集U中用户喜欢的所有产品集合R
4. 从R中排除用户123已经喜欢的产品
5. 统计每个剩余产品被多少个U中的用户喜欢
6. 按统计结果排序,生成推荐列表

(9)知识图谱路径分析

// 查找药物与疾病的关系路径
MATCH p = (d:Drug)-[:TREATS|INTERACTS|METABOLIZED_BY*]->(dis:Disease)
WHERE d.name = "阿司匹林" AND dis.name = "心脏病"
RETURN p
http://www.lryc.cn/news/572431.html

相关文章:

  • JS红宝书笔记 8.3 继承
  • 煤矿井下Modbus转Profibus网关的传感器与PLC互联解决方案
  • 机器学习×第十二卷:回归树与剪枝策略——她剪去多余的分支,只保留想靠近你的那一层
  • 运维人员常用网站列表
  • 【unitrix】 3.2 位取反运算(not.rs)
  • 【数字人开发】Unity+百度智能云平台实现长短文本个性化语音生成功能
  • 吃透 Golang 基础:Goroutine
  • golang excel导出时需要显示刷新
  • Set_path_margin 命令介绍
  • C++中所有数据类型
  • Jenkins通过Pipeline流水线方式编译Java项目
  • Docker+Jenkins+git实现Golang项目自动部署
  • springboot 打的可执行jar包单独更新某个jar包
  • JMeter 高阶玩法:分布式压测的技术核心技术要点
  • 【K8S】详解NodePort 和 ClusterIP
  • 大数据复习HDFS
  • 11.0592MHz晶振:电脑主板的“心脏”
  • 通过Docker挂载nginx并修改页面
  • ros中相机话题在web页面上的显示,尝试js解析sensor_msgs/Image数据
  • 嵌入式开发之freeRTOS移植
  • Kafka性能调优全攻略:从JVM参数到系统优化
  • Java的SpringAI+Deepseek大模型实战
  • 基于keepalived、vip实现高可用nginx (centos)
  • mongodb单节点改副本集模式
  • Python 开发环境全栈隔离架构:从 Anaconda 到 PyCharm 的四级防护体系
  • NetworkManager介绍与用法
  • 【单片机】51单片机练习代码
  • GRBL_UNO R3编译下载
  • Spring Boot 虚拟线程 vs WebFlux:谁更胜一筹?
  • Spring-创建第一个SpringBoot项目