Neo4j Cypher查询语言完整指南:从基础到高级
Neo4j Cypher查询语言深度指南
作为图数据库的核心查询语言,Cypher以其直观的图形模式匹配语法而闻名。本文将系统讲解Cypher的基础语法和高级特性,帮助您高效操作图数据。
一、基本语法
1. CREATE - 创建数据
// 创建节点(带标签和属性)
CREATE (:Person {name: 'Alice', age: 30})
// 创建关系
MATCH (a:Person), (b:Person)
WHERE a.name = 'Alice' AND b.name = 'Bob'
CREATE (a)-[:FRIENDS_WITH {since: '2020'}]->(b)
实践建议:批量创建时使用UNWIND
减少事务次数:
UNWIND $people AS person
CREATE (:Person {name: person.name, age: person.age})
2. MATCH - 模式匹配
// 基本匹配
MATCH (p:Person) RETURN p
// 多跳关系查询
MATCH (a:Person)-[:FRIENDS_WITH*2..3]->(b:Person)
RETURN a, b
3. WHERE - 条件过滤
MATCH (p:Person)
WHERE p.age > 25 AND p.name STARTS WITH 'A'
RETURN p
性能提示:优先在MATCH
中使用标签缩小搜索范围
4. RETURN - 结果返回
// 返回特定属性
MATCH (p:Person) RETURN p.name, p.age
// 结果别名
MATCH (p:Person) RETURN p.name AS userName
5. DELETE/DETACH DELETE
// 删除节点(需先删除关系)
MATCH (p:Person {name: 'Alice'})
DETACH DELETE p
// 仅删除关系
MATCH (:Person {name: 'Alice'})-[r:FRIENDS_WITH]->()
DELETE r
6. SET/REMOVE - 更新属性
// 设置/更新属性
MATCH (p:Person {name: 'Alice'})
SET p.age = 31, p.city = 'Shanghai'
// 移除属性
REMOVE p.city
二、高级查询
1. 聚合函数
MATCH (p:Person)
RETURN avg(p.age) AS avgAge, count(*) AS totalPeople
2. 排序与分页
MATCH (p:Person)
RETURN p
ORDER BY p.age DESC
SKIP 10 LIMIT 5
3. 索引与约束
// 创建索引
CREATE INDEX FOR (p:Person) ON (p.name)
// 唯一性约束
CREATE CONSTRAINT FOR (p:Person) REQUIRE p.email IS UNIQUE
最佳实践:为高频查询条件创建索引
4. 模式匹配技巧
// 可选匹配(类似SQL左连接)
MATCH (p:Person)
OPTIONAL MATCH (p)-[:WORKS_AT]->(c:Company)
RETURN p, c
三、图遍历
1. 可变长度路径
// 查询2-3度好友
MATCH (a:Person {name: 'Alice'})-[:FRIENDS_WITH*2..3]->(fof)
RETURN fof
2. 最短路径
MATCH path = shortestPath((a:Person)-[*]-(b:Person))
WHERE a.name = 'Alice' AND b.name = 'David'
RETURN path
3. 所有最短路径
MATCH path = allShortestPaths((a:Person)-[*]-(b:Person))
WHERE a.name = 'Alice' AND b.name = 'David'
RETURN path
四、性能优化建议
EXPLAIN/PROFILE:分析查询执行计划
PROFILE MATCH (p:Person)-[:FRIENDS_WITH]->() RETURN p
参数化查询:避免重复解析
MATCH (p:Person {name: $name}) RETURN p
限制路径深度:避免过度遍历
MATCH path = (a)-[:REL*..5]->(b)
使用APOC扩展:复杂操作用存储过程
CALL apoc.periodic.iterate( "MATCH (p:Person) RETURN p", "SET p.lastUpdated = timestamp()", {batchSize:1000} )
五、实战案例:社交网络分析
// 查找影响力人物(被关注最多)
MATCH (p:Person)<-[f:FOLLOWS]-()
RETURN p.name, count(f) AS followers
ORDER BY followers DESC
LIMIT 10
// 共同好友推荐
MATCH (a:Person)-[:FRIENDS_WITH]->(mutual)-[:FRIENDS_WITH]->(b:Person)
WHERE a <> b AND NOT (a)-[:FRIENDS_WITH]->(b)
RETURN a.name, b.name, count(mutual) AS commonFriends
ORDER BY commonFriends DESC
掌握Cypher是发挥Neo4j威力的关键。建议从简单查询开始,逐步尝试复杂图模式,结合EXPLAIN
不断优化。对于生产环境,务必添加适当的索引和约束。