Cypher 查询语言完全指南(2024最新版)------ Neo4j 图数据库实战教程
Cypher 是 Neo4j 图数据库的专用查询语言,它采用直观的模式匹配语法,让复杂关系的查询变得简单高效。本文将从零开始讲解 Cypher 的核心语法,并通过实际案例带你掌握图数据查询技巧。
一、Cypher 基础概念
1. Cypher 是什么?
- 声明式查询语言:描述"要什么"而非"怎么做"
- 图模式匹配:用 ASCII-art 方式描述图结构
- 人类可读:语法接近自然语言
2. 核心元素
元素 | 符号表示 | 示例 |
---|---|---|
节点(Node) | () |
(p:Person) |
关系(Relationship) | -[]-> |
-[r:KNOWS]-> |
属性(Property) | {} |
{name: 'Alice'} |
标签(Label) | : |
:Person:Employee |
二、基础查询语法
1. 创建数据
创建节点
cypher
CREATE (p:Person {name: 'Alice', age: 30})
CREATE (c:Company {name: 'Neo4j', founded: 2007})
创建关系
cypher
MATCH (a:Person), (b:Company)
WHERE a.name = 'Alice' AND b.name = 'Neo4j'
CREATE (a)-[r:WORKS_AT {since: 2020}]->(b)
RETURN r
2. 查询数据
基本查询
cypher
MATCH (p:Person)
RETURN p.name, p.age
带条件查询
cypher
MATCH (p:Person)
WHERE p.age > 25 AND p.name STARTS WITH 'A'
RETURN p
路径查询
cypher
MATCH path = (a:Person)-[:FRIENDS_WITH*1..3]->(b:Person)
RETURN path
三、高级查询技巧
1. 聚合函数
cypher
MATCH (p:Person)
RETURN avg(p.age) AS avgAge, count(*) AS totalPeople
2. 排序和分页
cypher
MATCH (p:Person)
RETURN p
ORDER BY p.age DESC
SKIP 10
LIMIT 5
3. 索引优化
cypher
CREATE INDEX person_name_index FOR (p:Person) ON (p.name)
4. 全文搜索
cypher
CREATE FULLTEXT INDEX namesAndTitles FOR (n:Person|Movie) ON EACH [n.title, n.name]
四、实战案例
案例1:社交网络分析
cypher
// 查找Alice的所有朋友的朋友(二度人脉)
MATCH (a:Person {name: 'Alice'})-[:FRIENDS_WITH]->(friend)-[:FRIENDS_WITH]->(fof)
RETURN a, friend, fof
案例2:推荐系统
cypher
// 基于共同朋友推荐可能认识的人
MATCH (me:Person {name: 'Bob'})-[:FRIENDS_WITH]->(friend)-[:FRIENDS_WITH]->(suggestion)
WHERE NOT (me)-[:FRIENDS_WITH]->(suggestion)
RETURN suggestion.name AS recommendation, count(*) AS strength
ORDER BY strength DESC
案例3:知识图谱查询
cypher
// 查找所有与AI相关的技术及其关联领域
MATCH (tech:Technology)-[:RELATED_TO]->(field)
WHERE tech.name CONTAINS 'AI'
RETURN tech, field
五、性能优化指南
1. 查询优化技巧
- 尽量指定标签和关系类型
- 使用
WHERE
替代WITH...WHERE
- 限制路径长度
[*1..3]
2. 执行计划分析
cypher
EXPLAIN MATCH (p:Person)-[:FRIENDS_WITH]->(f)
RETURN p, f
3. 索引使用原则
- 为高频查询字段创建索引
- 对
WHERE
条件中的属性优先索引 - 复合索引适用于多属性联合查询
六、常见问题解答
Q1:如何批量导入数据?
cypher
LOAD CSV WITH HEADERS FROM 'file:///persons.csv' AS row
CREATE (:Person {name: row.name, age: toInteger(row.age)})
Q2:如何删除所有数据?
cypher
MATCH (n)
DETACH DELETE n
Q3:如何更新节点属性?
cypher
MATCH (p:Person {name: 'Alice'})
SET p.age = 31, p.city = 'Beijing'
七、学习资源推荐
掌握 Cypher 能让你高效操作图数据,本文涵盖了从基础到进阶的核心知识点。建议在 Neo4j Browser 中实际运行这些示例,实践是学习的最好方式!如有问题欢迎留言讨论 🚀