Neo4j常用语法-path

在 Neo4j 中,Path(路径) 是连接两个或多个节点的关系序列,是图查询的核心概念之一。理解 Path 的用法对于复杂图分析至关重要

关键特性:

有向性:路径中的关系具有方向

可变长度:路径可以包含 0 个或多个关系

类型约束:关系可以指定类型(如 :ACTED_IN)

属性过滤:节点和关系可以通过属性过滤

(1)简单路径匹配

bash 复制代码
MATCH p = (a:Person)-[:FRIEND]->(b:Person)
RETURN p

(2)可变长度路径

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

(3)任意关系类型

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

(4)特定关系类型组合

bash 复制代码
MATCH p = (a:Person)-[:ACTED_IN|DIRECTED*]->(m:Movie)
RETURN p

(5)Path 的函数与操作

bash 复制代码
MATCH p = (a:User)-[:FRIEND*]->(b:User)
RETURN p


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

(6)提取路径节点和关系

bash 复制代码
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 开始)

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

结果如下图所示

图展示形式

Text展示形式

bash 复制代码
//只查询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):匹配任意类型的节点

bash 复制代码
//关系类型的路径查询
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 函数

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

如图所示:

关键参数:

\*\]:表示任意类型和长度的关系 shortestPath:返回单条最短路径 如果存在多条相同长度的最短路径,仅返回其中一条 ```bash //指定关系类型的最短路径 //如果只关心特定关系类型(如 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 ``` ```bash //限制路径深度:如果图很大,可设置最大深度(但可能错过真实最短路径) MATCH path = shortestPath((p)-[*..10]-(m)) // 最大深度10 ``` Path 的典型应用场景 (7)社交网络分析 ```bash // 查找共同好友(查找Alice和Bob的共同朋友) MATCH (a:Person {name: "Alice"})-[:FRIEND]-(f:Person)-[:FRIEND]-(b:Person {name: "Bob"}) RETURN f.name AS mutualFriend ``` (8)推荐系统 ```bash // 基于共同兴趣推荐 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)知识图谱路径分析 ```bash // 查找药物与疾病的关系路径 MATCH p = (d:Drug)-[:TREATS|INTERACTS|METABOLIZED_BY*]->(dis:Disease) WHERE d.name = "阿司匹林" AND dis.name = "心脏病" RETURN p ```

相关推荐
码云数智-大飞5 小时前
基于语义内核(Semantic Kernel)与 Neo4j 构建轻量级知识问答系统
neo4j
执携3 天前
Neo4j的安装与配置
neo4j
matlabgoodboy5 天前
知识图谱neo4j项目构建代制做python可视化问答系统推荐实体抽取
python·知识图谱·neo4j
麦麦大数据5 天前
F076 中医中药知识智能问答与图谱构建研究系统 Vue+Flask+Neo4j
vue.js·flask·知识图谱·neo4j·智能问答·推荐算法·中医中药
攻城狮凌霄6 天前
PHP接单涨薪系列(七十一):如何用Neo4j构建借贷关系图谱?解析资金流水时空矩阵揪出“砍头息“和“循环贷“
矩阵·php·neo4j
速易达网络9 天前
Flask实现Neo4j知识图谱Web应用
flask·知识图谱·neo4j
KG_LLM图谱增强大模型9 天前
[290页电子书]打造企业级知识图谱的实战手册,Neo4j 首席科学家力作!从图数据库基础到图原生机器学习
人工智能·知识图谱·neo4j
Psycho_MrZhang10 天前
Neo4j Python SDK手册
开发语言·python·neo4j
坠金10 天前
图数据库neo4j自建及使用
数据库·neo4j
阿也在北京10 天前
基于Neo4j和TuGraph的知识图谱与问答系统搭建——胡歌的导演演员人际圈
python·阿里云·知识图谱·neo4j