前言
以下是一份 Cypher 基础教程,适合图数据库(尤其是 Neo4j)的初学者快速掌握 Cypher 查询语言的核心语法和用法。
Operating System: Ubuntu 22.04.4 LTS
Cypher 简介
Cypher 是专为图数据库设计的声明式查询语言,语法直观,类似自然语言。它专注于描述“如何在图中查找数据”,而非“如何操作数据”(如 SQL 的 JOIN)。核心思想是通过模式匹配(Pattern Matching)描述图结构。
基本概念
- 节点(Node):表示实体(如人、商品),用
()
表示。 - 关系(Relationship):连接节点的边(如“购买”“朋友”),用
-->
或<--
表示。 - 标签(Label):节点的分类(如
:Person
、:Product
)。 - 关系类型(Type):关系的分类(如
:FRIEND
、:BOUGHT
)。 - 属性(Property):节点或关系的键值对数据(如
{name: "Alice"}
)。
节点与关系语法
节点
- 基础节点:
()
(匿名节点) - 带标签的节点:
(:Label)
- 带标签和属性的节点:
(:Label {key: "value"})
关系
- 基础关系:
-->
或<--
- 带类型的关系:
-[:TYPE]->
- 带属性和类型的关系:
-[:TYPE {key: "value"}]->
常用操作
创建数据
-- 创建节点
CREATE (:Person {name: "Alice", age: 30});
-- 创建关系(需先匹配节点)
MATCH (a:Person), (b:Person)
WHERE a.name = "Alice" AND b.name = "Bob"
CREATE (a)-[:FRIEND]->(b);
查询数据
-- 返回所有 Person 节点
MATCH (p:Person) RETURN p;
-- 返回特定属性的节点
MATCH (p:Person {name: "Alice"}) RETURN p.age;
-- 查询关系
MATCH (a:Person)-[:FRIEND]->(b:Person)
RETURN a.name, b.name;
更新数据
-- 修改属性
MATCH (p:Person {name: "Alice"})
SET p.age = 31;
-- 添加新属性
MATCH (p:Person {name: "Alice"})
SET p.city = "New York";
删除数据
-- 删除节点(需先删除其关系)
MATCH (p:Person {name: "Alice"})
DETACH DELETE p;
-- 删除所有数据(慎用!)
MATCH (n) DETACH DELETE n;
模式匹配
Cypher 的核心是通过模式匹配描述图结构:
-- 查找 Alice 的所有朋友
MATCH (alice:Person {name: "Alice"})-[:FRIEND]->(friend:Person)
RETURN friend.name;
-- 查找两跳关系
MATCH (a:Person)-[:FRIEND*2]->(c:Person)
RETURN a.name, c.name;
高级查询
聚合函数
-- 统计 Person 数量
MATCH (p:Person)
RETURN COUNT(p) AS total;
-- 按城市分组统计
MATCH (p:Person)
RETURN p.city, AVG(p.age) AS avg_age;
路径查询
-- 查找最短路径
MATCH (a:Person {name: "Alice"}),(b:Person {name: "Bob"}),
path = shortestPath((a)-[*]-(b))
RETURN path;
索引与约束
-- 创建索引(加速查询)
CREATE INDEX FOR (p:Person) ON (p.name);
-- 唯一性约束
CREATE CONSTRAINT FOR (p:Person) REQUIRE p.email IS UNIQUE;
总结
- Cypher 核心:通过模式匹配描述图结构。
- 关键语法:
MATCH
(查询)、CREATE
(创建)、SET
(更新)、DELETE
(删除)。 - 优势:直观表达复杂关系查询(如社交网络、推荐系统)。
练习建议:
- 使用 Neo4j Sandbox 在线环境实践。
- 尝试构建一个“社交网络”或“电影推荐”模型。
进一步学习:
- 官方文档:Neo4j Cypher Manual
结语
第二百八十七篇博文写完,开心!!!!
今天,也是充满希望的一天。