用途:本技能把 Obsidian Bases 的 .base 文件(YAML,含过滤器、公式、视图)翻译成 sense SQL,使查询返回与 Bases 相同的行。一个视图对应一条查询:base 级过滤 AND 视图过滤,视图的顺序、排序、限制映射为 SELECT 列表、ORDER BY 和 LIMIT。多视图 base 就生成多条查询,存入 sense.config.json 的 queries 块后可用 sense <name> 运行。
主要能力:
- 字段映射:note.field / 裸字段映射为 f.<field>;file.name 为 basename(f.path, '.md');file.folder 用 f.path LIKE;file.tags 对应 tags 表;file.links / embeds / backlinks 对应 links 表的不同条件。
- 谓词映射:比较运算符、AND/OR/NOT 直接对应;isEmpty() 需判断 NULL、''、'[]'、'[null]' 四种情况;hasTag、hasLink、list.contains、string.contains、isType 等有对应 SQL 写法。
- 公式:if、now/today、date、日期差值、round、格式化、toString、list.length 等映射到 SQLite 函数;公式引用另一公式时用 CTE 分层。
- 视图:sort 映射 ORDER BY,limit 映射 LIMIT;groupBy 不折叠行,应使用窗口函数而非 GROUP BY。
- this:由调用者提供路径作为绑定参数,可用 WITH me AS (SELECT ? AS p) 保持单次绑定。
限制:
- 展示层(columnSize、卡片/表格/列表/地图外观)无法翻译,但不影响行数据。
- 无 SQLite 正则,需用 LIKE/GLOB 覆盖锚定与通配形式。
- Obsidian 对未知属性返回空,SQL 会报 no such column;需先查 pragma_table_info('frontmatter')。
- ctime 是文件系统创建时间,git clone 或复制会重置它,导致年龄公式在作者归属上出错。
- 没有活动窗格,this 由路径参数解决;CLI 查询默认增量准备,--no-build 读取上次完成结果,不会自动重渲染。
使用方式:用 sense sql "..." <path> 执行单次查询,或把翻译结果保存为 sense.config.json 中的查询,用 sense <name> <path> 运行。详细示例见 EXAMPLES.md。