Neo4j入门
Neo4j 图数据库将数据存储为节点、关系和属性,而不是以表格或文档形式。
对比: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. 创建节点
1
| CREATE (:Person {name: "王五", city: "北京"});
|
2. 创建带关系的结构
1 2 3 4
| CREATE (a:Person {name: "张三"}), (b:Person {name: "李四"}), (a)-[:FRIEND {since: 2020}]->(b);
|
3. 查询某人
1 2
| MATCH (p:Person {name: "张三"}) RETURN p.name, p.city;
|
4. 查询朋友的朋友(2跳)
1 2
| MATCH (me:Person {name: "张三"})-[:FRIEND*2]->(friendOfFriend) RETURN friendOfFriend.name;
|
*2 表示 2 跳关系,*1..3 表示 1 到 3 跳
5. 忽略方向查询
1 2
| MATCH (a)-[r:FRIEND]-(b) // 无箭头 = 双向 RETURN a.name, b.name;
|
6. 更新节点
1 2 3
| MATCH (p:Person {name: "张三"}) SET p.age = 31 RETURN p;
|
7. 删除关系(先匹配再删除)
1 2 3
| MATCH (a:Person)-[r:FRIEND]->(b:Person) WHERE a.name = "张三" AND b.name = "李四" DELETE r;
|
8. 通过标签查询
1 2 3 4 5 6 7 8 9 10
| // 找出所有带 :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;
|