路径查询 #

一、路径概述 #

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)

最佳实践:

  1. 使用路径变量捕获完整路径
  2. 使用路径函数提取信息
  3. 限制路径长度避免性能问题
  4. 使用过滤条件减少结果
  5. 使用索引加速起始节点查找

下一步,让我们学习变长路径!

最后更新:2026-03-27