CQL(Cypher Query Language)和 SQL(Structured Query Language)都是用于查询数据库的声明式语言,但它们的设计目标、数据模型和语法细节有很大区别。下面从多个维度对比:
1. 数据模型:图 vs 关系表
特性 |
CQL |
SQL |
数据模型 |
图模型(节点、关系、属性) |
关系模型(表、行、列) |
核心结构 |
节点(Node)、关系(Relationship)、标签(Label)、属性(Property) |
表(Table)、行(Row)、列(Column) |
连接方式 |
通过关系直接连接节点,无需 JOIN |
通过外键和 JOIN 语句连接表 |
2. 查询语法:模式匹配 vs 表连接
示例 |
CQL |
SQL |
查询某人的朋友 |
MATCH (p:Person {name:"张三"})-[:FRIEND]->(f) RETURN f.name |
SELECT f.name FROM Person p JOIN Friend f ON p.id = f.person_id WHERE p.name = "张三" |
插入数据 |
CREATE (p:Person {name:"张三", age:30}) |
INSERT INTO Person (name, age) VALUES ("张三", 30) |
删除关系 |
MATCH (a)-[r:FRIEND]->(b) DELETE r |
DELETE FROM Friend WHERE person_id = 1 AND friend_id = 2 |
3. 关键差异总结
维度 |
CQL |
SQL |
连接操作 |
无需 JOIN,通过模式匹配直接遍历关系(如 (a)-[:KNOWS]->(b) ) |
必须显式使用 JOIN(如 INNER JOIN 、LEFT JOIN ) |
递归查询 |
原生支持可变深度路径(如 (a)-[:KNOWS*1..3]->(b) 表示 1~3 跳的朋友) |
需使用 CTE(公共表表达式,如 WITH RECURSIVE ),语法复杂 |
模式匹配 |
核心功能(如 MATCH (a)-[:FRIEND]->(b)<-[:FRIEND]-(c) ) |
无原生模式匹配,需多表 JOIN |
索引 |
基于标签和属性(如 CREATE INDEX ON :Person(name) ) |
基于表和列(如 CREATE INDEX idx_name ON Person(name) ) |
事务 |
支持 ACID 事务(与 Neo4j 版本相关) |
支持 ACID 事务(标准 SQL) |
聚合函数 |
COUNT , SUM , AVG , COLLECT (返回列表) |
COUNT , SUM , AVG , GROUP_CONCAT (MySQL) |
4. 适用场景
场景 |
CQL(Neo4j) |
SQL(MySQL/PostgreSQL) |
社交网络 |
天然适合(如好友推荐、最短路径) |
需要复杂 JOIN,性能下降 |
金融欺诈检测 |
高效(如追踪多层转账关系) |
难以处理多层关联 |
传统业务系统 |
不适合(如订单、库存) |
首选(表结构清晰) |
实时推荐 |
高效(基于图遍历) |
需预计算或复杂查询 |
5. 直观对比:查询“张三的朋友的朋友”
- CQL(1 行代码):
复制代码 隐藏代码
MATCH (p:Person {name:"张三"})-[:FRIEND*2]->(fof) RETURN DISTINCT fof.name
- SQL(需多层 JOIN 或递归 CTE):
复制代码 隐藏代码
WITH RECURSIVE friend_paths AS (
SELECT person_id, friend_id, 1 AS depth FROM Friend WHERE person_id = 1
UNION ALL
SELECT fp.person_id, f.friend_id, fp.depth + 1
FROM friend_paths fp JOIN Friend f ON fp.friend_id = f.person_id
WHERE fp.depth < 2
)
SELECT DISTINCT p.name FROM friend_paths fp JOIN Person p ON fp.friend_id = p.id WHERE fp.depth = 2;
总结
选择依据 |
用 CQL |
用 SQL |
数据高度关联(图结构) |
✅ |
❌ |
事务型业务(表结构) |
❌ |
✅ |
复杂多跳查询(如路径、子图) |
✅ |
❌ |
大规模聚合统计(如报表) |
❌ |
✅ |
一句话总结:
SQL 是“表格的王者”,CQL 是“关系的专家”。
|