0%

Neo4j入门

Neo4j入门

Neo4j 图数据库将数据存储为节点、关系和属性,而不是以表格或文档形式。

  • 节点 表示图数据模型中的实体或离散对象。节点可以通过关系连接,在属性中存储数据,并按标签分类

    一个节点可以有多个标签 (:User:Customer)

    如:

    1
    2
    3
    4
    (:Person {name: "张三", age: 30})

    # Person 是 标签(Label)
    # {name: "张三", age: 30} 是 属性
  • 关系 表示图数据模型中节点之间的连接。关系将源节点连接到目标节点,在属性中存储数据,并按类型分类

    • 关系是有方向的 (A → B ≠ B → A)
    • 有类型(Type)(必须大写,如 KNOWS, BOUGHT
    • 也可以有属性
    1
    (: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. 创建节点
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;

欢迎关注我的其它发布渠道