Skip to content

高级查询

路径查询

基本语法

cypher
MATCH path = (起点)-[关系路径]->(终点)
RETURN path

示例

  1. 基本路径查询

    cypher
    // 查询两个节点之间的路径
    MATCH path = (a:Person {name: 'John'})-[*]->(b:Person {name: 'Alice'})
    RETURN path
  2. 指定路径长度

    cypher
    // 查询长度为 2 的路径
    MATCH path = (a:Person {name: 'John'})-[*2]->(b:Person)
    RETURN path
    
    // 查询长度在 1-3 之间的路径
    MATCH path = (a:Person {name: 'John'})-[*1..3]->(b:Person)
    RETURN path
  3. 指定关系类型

    cypher
    // 查询通过 FRIENDS_WITH 关系的路径
    MATCH path = (a:Person {name: 'John'})-[:FRIENDS_WITH*]->(b:Person)
    RETURN path
    
    // 查询通过多种关系的路径
    MATCH path = (a:Person {name: 'John'})-[:FRIENDS_WITH|WORKS_AT*]->(b)
    RETURN path
  4. 路径变量

    cypher
    // 使用路径变量
    MATCH path = (a:Person {name: 'John'})-[r*]->(b:Person {name: 'Alice'})
    RETURN path, length(path) AS path_length

最短路径

基本语法

cypher
// 使用 shortestPath 函数
MATCH (起点), (终点)
WHERE 条件
WITH start, end
MATCH p = shortestPath((start)-[*]->(end))
RETURN p

// 使用 allShortestPaths 函数
MATCH (起点), (终点)
WHERE 条件
WITH start, end
MATCH p = allShortestPaths((start)-[*]->(end))
RETURN p

示例

  1. 查找最短路径

    cypher
    MATCH (a:Person {name: 'John'}), (b:Person {name: 'Bob'})
    WITH a, b
    MATCH p = shortestPath((a)-[*]->(b))
    RETURN p, length(p) AS path_length
  2. 查找所有最短路径

    cypher
    MATCH (a:Person {name: 'John'}), (b:Person {name: 'Bob'})
    WITH a, b
    MATCH p = allShortestPaths((a)-[*]->(b))
    RETURN p
  3. 带关系类型的最短路径

    cypher
    MATCH (a:Person {name: 'John'}), (b:Company {name: 'Neo4j'})
    WITH a, b
    MATCH p = shortestPath((a)-[:FRIENDS_WITH|WORKS_AT*]->(b))
    RETURN p
  4. 限制路径长度

    cypher
    MATCH (a:Person {name: 'John'}), (b:Person {name: 'Bob'})
    WITH a, b
    MATCH p = shortestPath((a)-[*1..10]->(b))
    RETURN p

全路径搜索

基本语法

cypher
MATCH (起点)-[*]->(终点)
RETURN 路径

示例

  1. 搜索所有路径

    cypher
    MATCH (a:Person {name: 'John'})-[*]->(b:Person)
    RETURN a, b, length(path) AS path_length
  2. 搜索特定类型的路径

    cypher
    MATCH (a:Person {name: 'John'})-[:FRIENDS_WITH*]->(b:Person)
    RETURN a, b, length(path) AS path_length
  3. 使用过滤条件

    cypher
    MATCH path = (a:Person {name: 'John'})-[*]->(b:Person)
    WHERE length(path) < 5
    RETURN path

模式匹配高级技巧

1. 命名模式

cypher
// 定义命名模式
MATCH (a:Person)-[r:FRIENDS_WITH]->(b:Person)
WITH a, b, r
MATCH (b)-[r2:WORKS_AT]->(c:Company)
RETURN a, b, c

2. 可选匹配

cypher
// 使用 OPTIONAL MATCH
MATCH (a:Person {name: 'John'})
OPTIONAL MATCH (a)-[r:FRIENDS_WITH]->(b:Person)
RETURN a, b

3. 模式组合

cypher
// 组合多个模式
MATCH (
  a:Person {name: 'John'}
)-[:FRIENDS_WITH]->(
  b:Person
)-[:WORKS_AT]->(
  c:Company
)
RETURN a, b, c

4. 使用 EXISTS

cypher
// 检查关系是否存在
MATCH (a:Person {name: 'John'})
WHERE EXISTS((a)-[:FRIENDS_WITH]->(:Person))
RETURN a

子查询

基本语法

cypher
MATCH (节点变量:标签)
WHERE 条件
WITH 变量
MATCH (变量)-[关系]->(其他节点)
RETURN 结果

示例

  1. 基本子查询

    cypher
    // 查找有朋友的人
    MATCH (a:Person)
    WHERE EXISTS((a)-[:FRIENDS_WITH]->(:Person))
    WITH a
    // 查找这些人的工作公司
    MATCH (a)-[:WORKS_AT]->(c:Company)
    RETURN a.name, c.name
  2. 使用聚合的子查询

    cypher
    // 计算每个人的朋友数量
    MATCH (a:Person)-[:FRIENDS_WITH]->(b:Person)
    WITH a, count(b) AS friend_count
    WHERE friend_count > 2
    RETURN a.name, friend_count
  3. 多层子查询

    cypher
    // 查找朋友在大公司工作的人
    MATCH (a:Person)-[:FRIENDS_WITH]->(b:Person)
    WITH a, b
    MATCH (b)-[:WORKS_AT]->(c:Company)
    WHERE c.employees > 1000
    WITH a, count(DISTINCT c) AS company_count
    WHERE company_count > 1
    RETURN a.name, company_count

小结

高级查询是 Neo4j 的强大功能之一,通过路径查询、最短路径、全路径搜索、模式匹配高级技巧和子查询等功能,可以实现复杂的图数据分析。这些高级查询技巧将帮助您更深入地挖掘图数据库中的价值。

在接下来的章节中,我们将介绍索引与约束,这是优化 Neo4j 查询性能的重要手段。