Appearance
高级查询
路径查询
基本语法
cypher
MATCH path = (起点)-[关系路径]->(终点)
RETURN path示例
基本路径查询
cypher// 查询两个节点之间的路径 MATCH path = (a:Person {name: 'John'})-[*]->(b:Person {name: 'Alice'}) RETURN path指定路径长度
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指定关系类型
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路径变量
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示例
查找最短路径
cypherMATCH (a:Person {name: 'John'}), (b:Person {name: 'Bob'}) WITH a, b MATCH p = shortestPath((a)-[*]->(b)) RETURN p, length(p) AS path_length查找所有最短路径
cypherMATCH (a:Person {name: 'John'}), (b:Person {name: 'Bob'}) WITH a, b MATCH p = allShortestPaths((a)-[*]->(b)) RETURN p带关系类型的最短路径
cypherMATCH (a:Person {name: 'John'}), (b:Company {name: 'Neo4j'}) WITH a, b MATCH p = shortestPath((a)-[:FRIENDS_WITH|WORKS_AT*]->(b)) RETURN p限制路径长度
cypherMATCH (a:Person {name: 'John'}), (b:Person {name: 'Bob'}) WITH a, b MATCH p = shortestPath((a)-[*1..10]->(b)) RETURN p
全路径搜索
基本语法
cypher
MATCH (起点)-[*]->(终点)
RETURN 路径示例
搜索所有路径
cypherMATCH (a:Person {name: 'John'})-[*]->(b:Person) RETURN a, b, length(path) AS path_length搜索特定类型的路径
cypherMATCH (a:Person {name: 'John'})-[:FRIENDS_WITH*]->(b:Person) RETURN a, b, length(path) AS path_length使用过滤条件
cypherMATCH 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, c2. 可选匹配
cypher
// 使用 OPTIONAL MATCH
MATCH (a:Person {name: 'John'})
OPTIONAL MATCH (a)-[r:FRIENDS_WITH]->(b:Person)
RETURN a, b3. 模式组合
cypher
// 组合多个模式
MATCH (
a:Person {name: 'John'}
)-[:FRIENDS_WITH]->(
b:Person
)-[:WORKS_AT]->(
c:Company
)
RETURN a, b, c4. 使用 EXISTS
cypher
// 检查关系是否存在
MATCH (a:Person {name: 'John'})
WHERE EXISTS((a)-[:FRIENDS_WITH]->(:Person))
RETURN a子查询
基本语法
cypher
MATCH (节点变量:标签)
WHERE 条件
WITH 变量
MATCH (变量)-[关系]->(其他节点)
RETURN 结果示例
基本子查询
cypher// 查找有朋友的人 MATCH (a:Person) WHERE EXISTS((a)-[:FRIENDS_WITH]->(:Person)) WITH a // 查找这些人的工作公司 MATCH (a)-[:WORKS_AT]->(c:Company) RETURN a.name, c.name使用聚合的子查询
cypher// 计算每个人的朋友数量 MATCH (a:Person)-[:FRIENDS_WITH]->(b:Person) WITH a, count(b) AS friend_count WHERE friend_count > 2 RETURN a.name, friend_count多层子查询
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 查询性能的重要手段。