什么是 SurrealDB?
SurrealDB 是一款多模型数据库,使用 Rust 开发,支持文档、图、向量、时间序列、地理空间和关系模型。它通过统一的架构整合多种数据存储需求,简化开发流程。
核心功能
- 多模型支持:单一平台处理多种数据类型,减少维护多个数据库的复杂性。
- SurrealQL 查询语言:类似 SQL,支持图遍历、向量搜索和全文索引,适合复杂查询。
- 灵活部署:支持从边缘设备到云端集群,兼容 Docker、Kubernetes 和主流云平台。
- 实时性:内置事件流和 LIVE 查询,适合实时应用。
- AI 集成:支持向量搜索和 GraphRAG,适配生成式 AI 和知识图谱场景。
SurrealDB 提供统一的存储和查询接口,适合需要多种数据模型的现代应用。
SurrealDB 与 Neo4j 的对比
Neo4j 是专注于图数据库的工具,以 Cypher 语言处理复杂关系数据。SurrealDB 则通过多模型支持提供更广泛的适用性。以下是两者的对比:
维度 | SurrealDB | Neo4j |
---|---|---|
数据模型 | 文档、图、向量等多种模型 | 仅图模型 |
查询语言 | SurrealQL(SQL-like,支持多模型) | Cypher(专为图设计) |
扩展性 | 无分片,支持 PB 级扩展 | 需要分片,复杂查询可能受限 |
实时性 | 原生支持事件流和 LIVE 查询 | 需额外插件实现 |
性能 | Rust 开发,高并发低延迟 | Java 开发,资源占用较高 |
AI 支持 | 内置向量搜索和 GraphRAG | 需外部工具(如 APOC) |
优势分析
- 多功能性:SurrealDB 支持多种数据模型,减少多数据库集成成本;Neo4j 专注图场景,适合深度图遍历。
- 成本与效率:SurrealDB 的统一架构降低运维开销,Rust 实现提供高性能;Neo4j 在复杂图场景下表现稳定,但资源消耗较高。
- 适用场景:SurrealDB 适合混合数据需求(如 AI + 图 + 文档);Neo4j 更适合纯图应用,如社交网络分析。
选择 SurrealDB 可简化架构,Neo4j 则在图数据库领域有深厚积累。
SurrealDB CRUD 操作示例
以下通过 SurrealQL 展示 CRUD 操作,基于一个 person
表(包含 name、skills、company 字段)。假设 SurrealDB 已启动(surreal start --user root --pass root
)并通过 Web UI 或 SDK 连接。
CREATE:创建记录
添加新记录,支持随机或指定 ID。
sql
-- 创建随机 ID 记录
CREATE person;
-- 输出: [{"id": "person:random_id"}]
-- 指定 ID 并设置字段
CREATE person:tobie SET
name = 'Tobie',
company = 'SurrealDB',
skills = ['Rust', 'Go', 'JavaScript'];
-- 使用 CONTENT 语法
CREATE person:jaime CONTENT {
name: 'Jaime',
company = 'xAI',
skills: ['Python', 'AI']
};
READ (SELECT):查询记录
支持字段选择、过滤和图遍历。
sql
-- 查询所有记录
SELECT * FROM person;
-- 查询特定字段
SELECT name, skills FROM person:tobie;
-- 条件查询
SELECT name, array::distinct(skills) FROM person
WHERE company = 'SurrealDB';
-- 图遍历:查询朋友关系
SELECT ->knows->person.name AS friends FROM person:tobie;
UPDATE:更新记录
支持增量修改和条件更新。
sql
-- 更新特定记录
UPDATE person:tobie SET skills += 'System Design';
-- 条件更新
UPDATE person SET skills += 'AI' WHERE company != 'SurrealDB';
-- 合并对象
UPDATE person:tobie MERGE {
settings: { marketing: true }
};
DELETE:删除记录
支持条件删除和图边删除。
sql
-- 删除特定记录
DELETE person:tobie;
-- 条件删除
DELETE person WHERE company = 'xAI';
-- 删除图边
DELETE person:tobie->knows WHERE out = person:jaime;
向量数据操作示例
SurrealDB 支持向量数据,用于相似性搜索等 AI 场景。以下基于一个 embedding
表(包含 vector 字段)展示操作。向量字段存储数值数组,如嵌入。
首先,定义索引(可选,用于优化搜索):
sql
DEFINE INDEX vec_idx ON embedding FIELDS vector M-TREE DIMENSION 3 DIST EUCLIDEAN;
CREATE:创建向量记录
ini
CREATE embedding:1 SET vector = [0.1, 0.2, 0.3];
CREATE embedding:2 CONTENT {
vector: [0.4, 0.5, 0.6],
description: 'Sample vector'
};
READ (SELECT):查询向量记录,包括相似性搜索
使用向量函数进行相似度计算,如余弦相似度。
sql
-- 查询所有向量
SELECT * FROM embedding;
-- 相似性搜索
SELECT *, vector::similarity::cosine(vector, [0.1, 0.2, 0.3]) AS score
FROM embedding
ORDER BY score DESC
LIMIT 5;
其他相似度函数示例:
sql
SELECT vector::similarity::jaccard([1, 2, 3], [1, 2, 4]) AS jaccard_score;
-- 输出: 0.5
UPDATE:更新向量
sql
UPDATE embedding:1 SET vector = [0.7, 0.8, 0.9];
DELETE:删除向量记录
sql
DELETE embedding WHERE vector::magnitude(vector) > 1.0;
文档数据操作示例
SurrealDB 支持文档模型,允许存储嵌套 JSON-like 结构。以下基于 users
表展示,包含嵌套地址数组。
CREATE:创建文档
sql
CREATE users CONTENT {
name: "Alice Smith",
email: "alice@example.com",
age: 29,
addresses: [
{
type: "home",
address_line: "123 Maple St",
city: "Springfield",
country: "USA"
},
{
type: "work",
address_line: "456 Oak Ave",
city: "Metropolis",
country: "USA"
}
]
};
READ (SELECT):查询文档
sql
-- 查询所有文档
SELECT * FROM users;
-- 查询特定字段,包括嵌套
SELECT name, addresses[0].city AS home_city FROM users;
UPDATE:更新文档
sql
UPDATE users SET age = 30, addresses += { type: "vacation", address_line: "789 Beach Rd", city: "Miami", country: "USA" }
WHERE email = "alice@example.com";
DELETE:删除文档
sql
DELETE users WHERE age > 50;
总结
SurrealDB 通过多模型支持和灵活的 SurrealQL,简化了现代应用的开发流程。对比 Neo4j,其统一架构和高性能使其在混合数据场景中更具优势。