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 ```

相关推荐
曾几何时`1 天前
Neo4j启动
数据库·neo4j
欧阳秦穆3 天前
Neo4j desktop 2.0.1版本如何安装apoc、gds等插件
neo4j
路溪非溪3 天前
Tensorflow的安装记录
人工智能·tensorflow·neo4j
一屉大大大花卷4 天前
初识Neo4j之图数据库(二)
数据库·neo4j
一屉大大大花卷6 天前
初识Neo4j之入门介绍(一)
数据库·neo4j
AustinCyy8 天前
【环境配置】Neo4j Community Windows 安装教程
windows·neo4j
萧鼎8 天前
深度探索 Py2neo:用 Python 玩转图数据库 Neo4j
数据库·python·neo4j
背太阳的牧羊人8 天前
Cypher 是 Neo4j 专用的查询语言
neo4j
lishaoan778 天前
使用tensorflow的线性回归的例子(九)
tensorflow·线性回归·neo4j
背太阳的牧羊人8 天前
Neo4j 的向量搜索(Neo4jVector)和常见的向量数据库(比如 Milvus、Qdrant)之间的区别与联系
数据库·neo4j·milvus