Neo4j入门
Neo4j入门
Neo4j 图数据库将数据存储为节点、关系和属性,而不是以表格或文档形式。
节点 表示图数据模型中的实体或离散对象。节点可以通过关系连接,在属性中存储数据,并按标签分类
一个节点可以有多个标签 (:User:Customer)
如:
(:Person {name: "张三", age: 30}) # Person 是 标签(Label) # {name: "张三", age: 30} 是 属性关系 表示图数据模型中节点之间的连接。关系将源节点连接到目标节点,在属性中存储数据,并按类型分类
- 关系是有方向的 (A → B ≠ B → A)
- 有类型(Type)(必须大写,如
KNOWS,BOUGHT) - 也可以有属性
(:Person {name: "张三"})-[:FRIEND]->(:Person {name: "李四"})属性 用于在节点和关系上存储数据的键值对
对比:MySQL vs Neo4j
| 概念 | MySQL(关系型) | Neo4j(图数据库) |
|---|---|---|
| 基本单元 | 表(Table)、行(Row) | 节点(Node)、关系(Relationship) |
| 连接方式 | 外键(JOIN) | 直接存储关系(关系是一等公民) |
| 查询语言 | SQL | Cypher(声明式、直观) |
| 性能特点 | JOIN 越多越慢 | 深度关联查询极快(O(1) 跳转) |
| 数据模型 | 表格(二维) | 图(网络结构) |
查询语言:Cypher
基础语法对比
| 操作 | MySQL | Neo4j (Cypher) |
|---|---|---|
| 插入数据 | INSERT INTO users (...) VALUES (...) |
CREATE (:Label {props}) |
| 查询 | SELECT * FROM users WHERE name='张三' |
MATCH (n:Person {name: "张三"}) RETURN n |
| 连接查询 | JOIN orders ON ... |
MATCH (p)-[r]->(o) RETURN ... |
常用 Cypher 示例
1. 创建节点
CREATE (:Person {name: "王五", city: "北京"});
2. 创建带关系的结构
CREATE
(a:Person {name: "张三"}),
(b:Person {name: "李四"}),
(a)-[:FRIEND {since: 2020}]->(b);
3. 查询某人
MATCH (p:Person {name: "张三"})
RETURN p.name, p.city;
4. 查询朋友的朋友(2跳)
MATCH (me:Person {name: "张三"})-[:FRIEND*2]->(friendOfFriend)
RETURN friendOfFriend.name;
*2表示 2 跳关系,*1..3表示 1 到 3 跳
5. 忽略方向查询
MATCH (a)-[r:FRIEND]-(b) // 无箭头 = 双向
RETURN a.name, b.name;
6. 更新节点
MATCH (p:Person {name: "张三"})
SET p.age = 31
RETURN p;
7. 删除关系(先匹配再删除)
MATCH (a:Person)-[r:FRIEND]->(b:Person)
WHERE a.name = "张三" AND b.name = "李四"
DELETE r;
8. 通过标签查询
// 找出所有带 :Person 标签的节点(不管有没有其他标签)
MATCH (p:Person) RETURN p;
// 找出同时有 :Person 和 :Customer 的节点
MATCH (p:Person:Customer) RETURN p;
// 找出有 :Person 但没有 :Admin 标签的节点(需用 WHERE)
MATCH (p:Person)
WHERE NOT p:Admin
RETURN p;