迁移到 Logseq DB
何时使用此技能
此技能在以下情况下自动触发:
- 用户询问从 Logseq MD 版本迁移到 DB 版本
- 将 Markdown 图转换为数据库格式
- 在 Logseq 版本之间导入/导出
- 有关迁移过程中转移内容的问题
- 迁移过程中的命名空间处理
- 标签到类的转换决策
- 导入过程中的属性类型推断
- 用户提及“迁移”、“转换”、“MD 到 DB”、“Markdown 到数据库”
您是将 Logseq 图从 MD(Markdown)格式迁移到 DB(Database)格式的专家。
迁移概览
为什么迁移?
| 功能 | MD 版本 | DB 版本 |
|---|---|---|
| 存储 | Markdown 文件 | SQLite 数据库 |
| 标签 | 页面引用 | 类与属性 |
| 属性 | 文本字符串 | 类型化值 |
| 查询 | 有限 | 完整的 Datalog |
| 同步 | 基于文件 | 实时(订阅) |
| 性能 | 文件 I/O 依赖 | 优化查询 |
当前状态(2024-2025)
重要:Logseq DB 仍在 alpha 阶段。考虑:
- 存在数据丢失风险
- 一些功能尚未可用(白板)
- 插件兼容性各异
- 需要订阅才能同步
迁移前清单
迁移前,请评估您的图:
1. 备份一切
# 创建带时间戳的备份
cp -r ~/logseq/my-graph ~/logseq/my-graph-backup-$(date +%Y%m%d)
# 或压缩
tar -czvf my-graph-backup.tar.gz ~/logseq/my-graph
2. 审核当前结构
需要审核的页面:
- [ ] 命名空间页面(a/b/c)→ 可能成为单独的页面
- [ ] 同名但不同命名空间的页面
- [ ] 模板页面
- [ ] 查询页面
需要审核的属性:
- [ ] 属性格式(key:: value)
- [ ] 多值属性
- [ ] 日期属性
- [ ] 链接属性([[page]])
需要审核的标签:
- [ ] 简单标签(#tag)
- [ ] 页面标签([[tag]])
- [ ] 嵌套标签(#parent/child)
3. 确定迁移决策
| MD 模式 | DB 选项 | 需要决策 |
|---|---|---|
#tag |
类或页面引用 | 哪些标签变成类? |
[[page]] |
节点引用 | 保持为引用 |
property:: value |
类型化属性 | 什么类型? |
namespace/page |
单独页面或层级 | 展平或嵌套? |
迁移过程
第 1 步:从 MD 版本导出
- 在 Logseq 中打开您的 MD 图
- 转到 设置 → 导出
- 选择 导出为 EDN(完整数据)
- 保存导出文件
第 2 步:准备导入设置
导入到 DB 时,您将选择:
标签处理:
- 转换为类:标签变成具有继承属性的适当类
- 保持为引用:标签保持为简单的页面链接
命名空间处理:
- 展平:
a/b/c→ 单个页面 “a/b/c” - 层级:创建页面层级
属性处理:
- 推断类型:Logseq 猜测类型(数字,日期等)
- 全部为文本:一切保持为字符串
第 3 步:创建新的 DB 图
- 在 Logseq 中创建新的基于 DB 的图
- 使用 导入 功能
- 选择您导出的数据
- 配置迁移选项
- 审核并确认
第 4 步:迁移后验证
;; 检查页面数量是否匹配
[:find (count ?p)
:where [?p :block/tags ?t]
[?t :db/ident :logseq.class/Page]]
;; 检查孤立块
[:find (pull ?b [:block/title])
:where [?b :block/title _]
(not [?b :block/page _])
(not [?b :block/tags ?t]
[?t :db/ident :logseq.class/Page])]
;; 验证属性迁移
[:find ?prop-name (count ?b)
:where [?b ?prop _]
[?p :db/ident ?prop]
[?p :block/title ?prop-name]
[(clojure.string/starts-with? (str ?prop) ":user.property")]]
常见迁移问题
问题 1:丢失属性类型
症状:数字/日期存储为字符串
解决方案:手动更新属性类型
;; 在 DB 中,更新属性类型
{:db/ident :user.property/rating
:logseq.property/type :number} ; 原来是 :default
问题 2:标签/类混淆
症状:标签没有变成适当的类
解决方案:将页面转换为类
- 打开标签页面
- 添加
#Tag使其成为类 - 在类上定义属性
问题 3:断开的引用
症状:[[page]] 链接不起作用
原因:迁移过程中页面名称更改
解决方案:使用查找/替换或查询识别断开的引用
[:find ?ref-text
:where
[?b :block/title ?title]
[(re-find #"\[\[.*?\]\]" ?title) ?ref-text]
(not [_ :block/title ?ref-text])]
问题 4:命名空间展平
症状:project/tasks 和 project/notes 合并
解决方案:迁移前重命名页面以避免冲突
问题 5:查询兼容性
症状:旧查询不起作用
原因:不同的属性名称
| MD 属性 | DB 属性 |
|---|---|
:block/content |
:block/title |
:block/name |
:block/title |
:page/tags |
:block/tags |
迁移策略
策略 1:大爆炸迁移
- 一次性迁移整个图
- 最适合:小型图,简单结构
- 风险:全有或全无
策略 2:并行操作
- 保持 MD 图活跃
- 为新内容创建 DB 图
- 逐步移动旧内容
- 最适合:大型图,活跃使用
策略 3:选择性迁移
- 导出特定页面/区域
- 导入到新的 DB 图中
- 最适合:需要清理的混乱图
最佳实践
迁移前
-
清理您的图
- 删除未使用的页面
- 标准化属性名称
- 修复断开的链接
-
记录您的结构
- 列出所有标签及其用途
- 记录属性含义
- 映射命名空间
-
规划您的类
- 哪些标签变成类?
- 它们需要什么属性?
- 定义继承层级
迁移期间
- 从小处开始 - 用子集测试
- 比较计数 - 页面,块,属性
- 检查关键页面 - 首先检查最重要的内容
- 验证查询 - 更新并测试所有查询
迁移后
- 不要删除 MD 图 - 作为备份保留
- 监控问题 - 记录问题以供反馈
- 更新工作流 - 适应新功能
- 探索新功能 - 类,类型化属性
功能比较
DB 版本中可用
- ✅ 类型化属性(数字,日期,复选框)
- ✅ 类继承
- ✅ 属性模式
- ✅ 完整的 Datalog 查询
- ✅ 实时协作(Pro)
- ✅ 图书馆视图
Alpha 版本尚未可用
- ⏳ 白板
- ⏳ 一些插件
- ⏳ 完整的导出选项
- ⏳ 高级模板
不同行为
- 📝 标签 = 类(更强大但不同)
- 📝 同步需要订阅
- 📝 文件访问有限(SQLite,不是 .md)