路径查询 #
一、路径概述 #
1.1 什么是路径 #
路径是图中连接两个节点的一系列节点和关系的序列。
text
路径示例:
(Tom)-[:KNOWS]->(Jerry)-[:KNOWS]->(Mike)-[:KNOWS]->(Alice)
路径组成:
├── 起始节点:Tom
├── 中间节点:Jerry, Mike
├── 结束节点:Alice
├── 关系:KNOWS, KNOWS, KNOWS
└── 路径长度:3(关系数量)
1.2 路径特点 #
text
路径特点:
├── 由节点和关系交替组成
├── 路径长度是关系的数量
├── 可以是简单路径或复杂路径
├── 可以捕获为变量
└── 可以使用路径函数操作
二、路径变量 #
2.1 定义路径变量 #
cypher
MATCH p = (a)-[:KNOWS]->(b)
RETURN p
2.2 返回路径信息 #
cypher
MATCH p = (a)-[:KNOWS]->(b)
RETURN
p AS path,
length(p) AS path_length
2.3 多段路径 #
cypher
MATCH p = (a)-[:KNOWS]->(b)-[:KNOWS]->(c)
RETURN p, length(p)
2.4 变长路径 #
cypher
MATCH p = (a)-[:KNOWS*1..3]->(b)
RETURN p, length(p)
三、路径函数 #
3.1 length函数 #
返回路径长度(关系数量):
cypher
MATCH p = (a)-[:KNOWS*1..5]->(b)
RETURN p, length(p) AS path_length
3.2 nodes函数 #
返回路径中的所有节点:
cypher
MATCH p = (a)-[:KNOWS*1..3]->(b)
RETURN nodes(p) AS path_nodes
3.3 relationships函数 #
返回路径中的所有关系:
cypher
MATCH p = (a)-[:KNOWS*1..3]->(b)
RETURN relationships(p) AS path_rels
3.4 综合使用 #
cypher
MATCH p = (a)-[:KNOWS*1..3]->(b)
RETURN
p AS path,
length(p) AS path_length,
nodes(p) AS path_nodes,
relationships(p) AS path_rels
3.5 提取节点属性 #
cypher
MATCH p = (a)-[:KNOWS*1..3]->(b)
RETURN [n IN nodes(p) | n.name] AS names
3.6 提取关系属性 #
cypher
MATCH p = (a)-[r:KNOWS*1..3]->(b)
RETURN [rel IN r | rel.since] AS years
四、路径过滤 #
4.1 按长度过滤 #
cypher
MATCH p = (a)-[:KNOWS*1..5]->(b)
WHERE length(p) = 3
RETURN p
4.2 按节点属性过滤 #
cypher
MATCH p = (a)-[:KNOWS*1..5]->(b)
WHERE ALL(n IN nodes(p) WHERE n.status = 'active')
RETURN p
4.3 按关系属性过滤 #
cypher
MATCH p = (a)-[r:KNOWS*1..5]->(b)
WHERE ALL(rel IN r WHERE rel.since > 2020)
RETURN p
4.4 排除特定节点 #
cypher
MATCH p = (a)-[:KNOWS*1..5]->(b)
WHERE NONE(n IN nodes(p) WHERE n.name = 'Jerry')
RETURN p
4.5 包含特定节点 #
cypher
MATCH p = (a)-[:KNOWS*1..5]->(b)
WHERE ANY(n IN nodes(p) WHERE n.name = 'Jerry')
RETURN p
五、路径模式 #
5.1 简单路径 #
cypher
MATCH p = (a)-[:KNOWS]->(b)
RETURN p
5.2 链式路径 #
cypher
MATCH p = (a)-[:KNOWS]->(b)-[:WORKS_AT]->(c)
RETURN p
5.3 分支路径 #
cypher
MATCH p1 = (a)-[:KNOWS]->(b),
p2 = (a)-[:WORKS_AT]->(c)
RETURN p1, p2
5.4 循环路径 #
cypher
MATCH p = (a)-[:KNOWS*]->(a)
RETURN p
六、路径与RETURN #
6.1 返回完整路径 #
cypher
MATCH p = (a)-[:KNOWS*1..3]->(b)
RETURN p
6.2 返回路径信息 #
cypher
MATCH p = (a)-[:KNOWS*1..3]->(b)
RETURN
a.name AS start,
b.name AS end,
length(p) AS hops,
[n IN nodes(p) | n.name] AS path_names
6.3 返回路径对象 #
cypher
MATCH p = (a)-[:KNOWS*1..3]->(b)
RETURN {
start: a.name,
end: b.name,
length: length(p),
nodes: [n IN nodes(p) | n.name],
relationships: [r IN relationships(p) | type(r)]
} AS path_info
七、路径与WITH #
7.1 路径中间处理 #
cypher
MATCH p = (a)-[:KNOWS*1..3]->(b)
WITH p, length(p) AS len
WHERE len > 1
RETURN p
7.2 路径排序 #
cypher
MATCH p = (a)-[:KNOWS*1..5]->(b)
WHERE a.name = 'Tom'
RETURN p
ORDER BY length(p)
LIMIT 10
7.3 路径聚合 #
cypher
MATCH p = (a)-[:KNOWS*1..3]->(b)
RETURN a.name, count(p) AS path_count
ORDER BY path_count DESC
八、路径与OPTIONAL MATCH #
8.1 可选路径 #
cypher
MATCH (a:Person {name: 'Tom'})
OPTIONAL MATCH p = (a)-[:KNOWS*1..3]->(b:Person)
RETURN a.name, b.name, p
8.2 处理NULL路径 #
cypher
MATCH (a:Person {name: 'Tom'})
OPTIONAL MATCH p = (a)-[:KNOWS*1..3]->(b:Person)
RETURN a.name, coalesce(b.name, 'No connection')
九、路径应用场景 #
9.1 社交网络分析 #
cypher
MATCH p = (a:Person {name: 'Tom'})-[:KNOWS*1..4]->(b:Person)
RETURN
b.name,
length(p) AS distance,
[n IN nodes(p) | n.name] AS path
ORDER BY distance
LIMIT 10
9.2 影响力传播 #
cypher
MATCH p = (a:Person)-[:INFLUENCES*1..5]->(b:Person)
WHERE a.name = 'Tom'
RETURN
b.name,
length(p) AS influence_level,
p
ORDER BY influence_level
9.3 组织层级 #
cypher
MATCH p = (ceo:Employee {title: 'CEO'})-[:MANAGES*]->(emp:Employee)
RETURN
emp.name,
length(p) AS level,
[n IN nodes(p) | n.title] AS hierarchy
ORDER BY level
9.4 供应链追踪 #
cypher
MATCH p = (product:Product)-[:SUPPLIED_BY*]->(supplier:Supplier)
RETURN
product.name,
supplier.name,
length(p) AS supply_chain_length,
[n IN nodes(p) | n.name] AS supply_chain
十、路径性能优化 #
10.1 限制路径长度 #
cypher
MATCH p = (a)-[:KNOWS*1..3]->(b)
RETURN p
10.2 使用索引 #
cypher
CREATE INDEX FOR (p:Person) ON (p.name)
MATCH p = (a:Person {name: 'Tom'})-[:KNOWS*1..3]->(b)
RETURN p
10.3 使用PROFILE分析 #
cypher
PROFILE MATCH p = (a)-[:KNOWS*1..5]->(b)
WHERE a.name = 'Tom'
RETURN p
10.4 性能建议 #
text
建议:
├── 限制最大路径长度
├── 使用索引加速起始节点查找
├── 使用WHERE过滤减少结果
├── 使用LIMIT限制返回数量
└── 避免全图遍历
十一、实际应用示例 #
11.1 查找所有路径 #
cypher
MATCH p = (a:Person {name: 'Tom'})-[:KNOWS*1..4]->(b:Person {name: 'Jerry'})
RETURN
[n IN nodes(p) | n.name] AS path,
length(p) AS distance
ORDER BY distance
11.2 查找特定长度的路径 #
cypher
MATCH p = (a:Person {name: 'Tom'})-[:KNOWS*2..2]->(b:Person)
WHERE NOT (a)-[:KNOWS]->(b)
RETURN b.name, count(p) AS connection_count
ORDER BY connection_count DESC
11.3 路径分析 #
cypher
MATCH p = (a:Person {name: 'Tom'})-[:KNOWS*1..3]->(b:Person)
RETURN
length(p) AS distance,
count(DISTINCT b) AS reachable_people
ORDER BY distance
11.4 路径可视化数据 #
cypher
MATCH p = (a:Person {name: 'Tom'})-[:KNOWS*1..3]->(b:Person)
RETURN {
source: a.name,
target: b.name,
distance: length(p),
path: [n IN nodes(p) | {id: id(n), name: n.name}]
} AS path_data
LIMIT 50
十二、总结 #
路径查询要点:
| 函数 | 用途 | 示例 |
|---|---|---|
| length(p) | 路径长度 | length(p) |
| nodes(p) | 路径节点 | nodes(p) |
| relationships(p) | 路径关系 | relationships(p) |
最佳实践:
- 使用路径变量捕获完整路径
- 使用路径函数提取信息
- 限制路径长度避免性能问题
- 使用过滤条件减少结果
- 使用索引加速起始节点查找
下一步,让我们学习变长路径!
最后更新:2026-03-27