名称: surrealdb-python 描述: 使用Python掌握SurrealDB 2.3.x,进行多模型数据库操作,包括CRUD、图关系、向量搜索和实时查询。适用于处理SurrealDB数据库、实现图遍历、基于嵌入的语义搜索或构建RAG应用程序的场景。
SurrealDB Python
概述
SurrealDB是一个多模型数据库,在单一系统中集成了文档、图和向量搜索能力。本技能提供了使用Python SDK处理SurrealDB 2.3.x的全面指导,涵盖了标准数据库操作、图关系、向量相似性搜索和实时数据订阅。
何时使用此技能
在以下场景应用此技能:
- 建立SurrealDB连接并执行CRUD操作
- 使用RELATE语句和遍历查询实现图数据库
- 利用向量嵌入构建语义搜索或RAG(检索增强生成)应用程序
- 通过实时查询创建实时应用程序
- 设计结合文档、图和向量的多模型架构
核心能力
1. 连接与认证
使用Python SDK建立与SurrealDB的连接并进行身份验证:
from surrealdb import AsyncSurreal
async with AsyncSurreal("ws://localhost:8000/rpc") as db:
await db.signin({"user": "root", "pass": "root"})
await db.use("namespace", "database")
# 执行操作
2. CRUD操作
使用直观的Python方法执行标准数据库操作:
- create() - 使用特定ID或自动生成的ID插入新记录
- select() - 检索单个记录或整个表
- update() - 替换整个记录内容
- merge() - 通过合并新字段来部分更新记录
- patch() - 应用JSON Patch操作进行精确修改
- upsert() - 不存在则创建,存在则更新
- delete() - 删除记录或整个表
- query() - 执行原始SurrealQL进行复杂操作
示例工作流:
# 创建
user = await db.create("user", {
"name": "Alice",
"email": "alice@example.com"
})
# 更新特定字段
await db.merge("user:alice", {"age": 30})
# 使用参数查询
results = await db.query(
"SELECT * FROM user WHERE age > $min_age",
{"min_age": 25}
)
3. 图数据库操作
利用SurrealDB的原生图能力,无需JOIN即可建模和遍历关系:
创建关系:
# 创建实体
await db.create("person:alice", {"name": "Alice"})
await db.create("person:bob", {"name": "Bob"})
# 创建带元数据的关系
await db.query("""
RELATE person:alice->knows->person:bob
SET since = "2024-01-01", strength = "close"
""")
遍历图:
# 查找朋友的朋友
result = await db.query("""
SELECT ->knows->person->knows->person AS friends_of_friends
FROM person:alice
""")
# 双向遍历
result = await db.query("""
SELECT <->connected_to<->city AS connected_cities
FROM city:nyc
""")
# 递归查询(可变深度)
result = await db.query("""
SELECT @.{1,5}->manages->person AS management_chain
FROM person:ceo
""")
关键图特性:
- RELATE语句用于在节点之间创建边
- 箭头语法(
->、<->)用于直观遍历 - 使用
@.{depth}表示法的递归模式 - 用于在遍历期间过滤的图子句
- 存储关系元数据的边表
有关全面的图模式、架构定义和最佳实践,请参阅references/graph_operations.md。
4. 向量搜索与嵌入
使用向量嵌入实现语义搜索和基于相似性的检索:
存储向量:
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("all-MiniLM-L6-v2")
# 生成并存储嵌入
text = "SurrealDB是一个多模型数据库"
embedding = model.encode(text).tolist()
await db.create("documents", {
"content": text,
"embedding": embedding,
"metadata": {"source": "docs"}
})
使用KNN进行语义搜索:
# 生成查询嵌入
query_text = "数据库特性"
query_embedding = model.encode(query_text).tolist()
# 查找5个最相似的文档
result = await db.query("""
SELECT content,
vector::similarity::cosine(embedding, $query_vector) AS similarity
FROM documents
WHERE embedding <|5|> $query_vector
ORDER BY similarity DESC
""", {"query_vector": query_embedding})
关键向量特性:
- KNN运算符
<|k|>用于k近邻搜索 - 多种距离度量(余弦、欧几里得、曼哈顿)
- 结合向量和全文搜索的混合搜索
- 与流行嵌入模型(OpenAI、HuggingFace、Sentence Transformers)集成
有关完整的RAG实现、嵌入模型比较和优化技术,请参考references/vector_search.md。
5. 实时查询
订阅实时数据更改以用于实时应用程序:
# 启动实时查询
live_id = await db.live("user")
# 订阅更改
async for notification in db.subscribe_live(live_id):
action = notification['action'] # 'CREATE', 'UPDATE', 'DELETE'
data = notification['result']
print(f"检测到更改:{action} - {data}")
# 完成后停止实时查询
await db.kill(live_id)
工作流模式
构建RAG应用程序
-
定义架构:
await db.query(""" DEFINE TABLE documents SCHEMAFULL; DEFINE FIELD content ON TABLE documents TYPE string; DEFINE FIELD embedding ON TABLE documents TYPE array; DEFINE FIELD metadata ON TABLE documents TYPE object; """) -
索引文档:
for doc in documents: embedding = model.encode(doc["content"]).tolist() await db.create("documents", { "content": doc["content"], "embedding": embedding, "metadata": doc.get("metadata", {}) }) -
语义搜索:
query_embedding = model.encode("用户查询").tolist() results = await db.query(""" SELECT content, metadata, vector::similarity::cosine(embedding, $query_vector) AS score FROM documents WHERE embedding <|5|> $query_vector ORDER BY score DESC """, {"query_vector": query_embedding}) -
传递给LLM: 使用检索到的上下文与语言模型进行生成
实现知识图谱
-
创建实体:
await db.create("concept:ai", {"name": "人工智能"}) await db.create("concept:ml", {"name": "机器学习"}) -
定义关系:
await db.query(""" RELATE concept:ml->is_subset_of->concept:ai SET confidence = 0.95 """) -
遍历和查询:
# 递归查找所有父概念 result = await db.query(""" SELECT @.{1,}->is_subset_of->concept AS parents FROM concept:ml """)
结合图和向量搜索
利用图关系和语义相似性:
# 通过图关系查找语义相似的文档
result = await db.query("""
SELECT *,
vector::similarity::cosine(embedding, $query_vector) AS vec_score
FROM documents
WHERE embedding <|10|> $query_vector
AND ->cited_by->document<-authored_by<-person = $author_id
ORDER BY vec_score DESC
""", {
"query_vector": query_embedding,
"author_id": "person:researcher1"
})
最佳实践
连接管理
- 使用上下文管理器(
async with)进行自动清理 - 处理
SurrealException以进行适当的错误处理 - 为长时间运行的查询设置适当的超时
架构设计
- 使用
SCHEMAFULL定义架构以确保数据完整性 - 在频繁查询的字段上创建索引
- 使用断言进行验证和引用完整性
图操作
- 在边表上定义唯一索引以防止重复关系
- 为递归查询添加超时(
TIMEOUT 5s) - 使用
FETCH优化需要相关数据的查询 - 当关系具有属性时,将元数据存储在边表中
向量搜索
- 选择适合您领域和延迟要求的嵌入模型
- 使用余弦相似度时对嵌入进行归一化
- 为生产工作负载在向量字段上创建索引
- 对长文档(500-1000个标记)进行分块并重叠以获得更好的检索效果
- 结合向量搜索和元数据过滤以提高精度
查询优化
- 参数化查询以防止注入攻击
- 插入多条记录时进行批量操作
- 为KNN使用适当的k值(精度用3-5,召回用10-20)
- 利用混合搜索(向量+全文)以获得最佳结果
常见用例
语义搜索与RAG: 存储文档嵌入并执行相似性搜索,以为语言模型检索相关上下文。
知识图谱: 使用带类型边和元数据的实体建模复杂关系,实现复杂的图遍历查询。
社交网络: 表示用户及其连接,遍历朋友关系,并查找共同连接或推荐。
推荐系统: 结合协同过滤(图关系)和基于内容的过滤(向量相似性)进行混合推荐。
实时应用程序: 订阅数据更改以用于实时仪表板、聊天应用程序或通知系统。
参考文档
本技能包含全面的参考文档:
references/graph_operations.md- 图数据库操作、RELATE语法、遍历模式和架构设计的深入指南references/vector_search.md- 向量搜索实现细节、嵌入模型比较、RAG模式和LangChain集成
在实现特定功能或排除故障时加载这些参考文档。
其他资源
- 仓库: github.com/surrealdb/surrealdb.py
- PyPI包: pypi.org/project/surrealdb
- 官方文档: surrealdb.com/docs
- SurrealQL参考: surrealdb.com/docs/surrealql