Cypher 是 Neo4j 专用的查询语言
Neo4j图中数据的特点,和SQL做对比学习。
1️⃣ 一个节点可以有多个标签(Label)
SQL 的一行数据只能属于一个表。
但在 Neo4j 中,一个节点可以同时拥有多个标签。
CREATE (p:Person:Doctor:Employee {name: "张三"})
这个节点既是 Person
,又是 Doctor
,还是 Employee
,这在 SQL 里是做不到的(不能一行数据同时属于三个表)。
2️⃣ Neo4j 中没有“固定字段结构”
SQL 中每张表都有定义好的字段结构:
CREATE TABLE patient (id INT PRIMARY KEY,name VARCHAR(100),dob DATE
);
但是 Neo4j 中的节点可以没有固定属性结构,每个节点都有“动态 schema”。
CREATE (a:Patient {id: 1, name: "Alice"})
CREATE (b:Patient {id: 2, blood_type: "A+"})
这两个 Patient
节点的字段可以完全不同。
🧠 所以说:
Neo4j 是 schema-less(无模式) 的,而 SQL 是强模式(schema-on-write)
3️⃣ Neo4j 有边(关系),SQL 没有这个概念
这是最大的本质区别。
- Neo4j 把“关系”当成一等公民,每个关系是可以存属性、有方向、有类型的。
- SQL 只是用“外键”这种隐式连接去表达两个表之间的关系。
📌 举例:Neo4j 的关系
(p:Patient)-[:HAS_VISIT {date: "2023-08-01"}]->(v:Visit)
这条边有属性,可以查询、有方向、可扩展,非常强大。
SQL 只能写:
SELECT * FROM patient
JOIN visit ON patient.id = visit.patient_id;
但不能表示边的属性。
✅ 更准确的类比方式(建议记法)
SQL 概念 | Neo4j 中的本质区别 | 建议记法 |
---|---|---|
表 table | 没有直接对应;一个 label 是一类实体 | Label ≈ 实体类型 |
行 row | Node(但是非结构化的) | Node ≈ 实体 |
列 column | Node/Relationship 的属性(但不统一) | Property ≈ 动态字段 |
外键 foreign key | 显式的有向边,带属性,具语义 | Relationship(有方向、有类型) |
联表 JOIN | 通过 MATCH + 关系匹配实现 | 路径匹配(MATCH) |
✅ 你可以这样理解 Neo4j 的设计哲学
Neo4j 不是表格 → 是图
它不是“表与表之间的关系”,而是:
节点与节点之间的直接连接,用关系表示。
Neo4j 里的查询是:
- 沿着边走(路径匹配)
- 不靠表联结(JOIN)
🧠 总结
类别 | SQL | Neo4j |
---|---|---|
数据单位 | 行(row) | 节点(node) |
分类方式 | 表(table) | 标签(label),且可多个 |
连接方式 | 外键 + JOIN | 显式边 + MATCH 路径 |
结构 | 固定字段 | 动态字段,灵活 |