Obsidian Dataview

Obsidian 社群外掛,把 vault 裡的所有 markdown 檔當資料庫,用類 SQL 語法即時查詢。Vincent vault wiki/index.md 底部的 live view 都靠它。沒有它,wiki 只能手寫快照。

為什麼 Dataview 是 vault 必裝

Obsidian 預設只能搜尋 + 雙鏈。當 entity 數量超過 100,手寫索引會跟不上實況——這時 Dataview 就是救星。

Vincent vault 在 wiki/index.md 同時保留:

  • 上半段:手寫快照(給 LLM 讀的 single-context-window 主目錄)
  • 下半段:Dataview live block(給 Obsidian 端讀的真實狀態)

兩者不一致時相信 Dataview。

三大查詢類型

類型語法用途
TABLETABLE col1, col2 FROM ...表格列出
LISTLIST FROM ...純清單
TASKTASK FROM ...抓 todo

Vincent vault 用到的查詢範例

各 domain 條目數一覽

TABLE WITHOUT ID
  key AS "Domain",
  length(rows) AS "頁數",
  rows.file.link[0] AS "範例頁"
FROM "wiki/entities"
GROUP BY domain
SORT key ASC

→ ⚠️ GROUP BY 後,原始欄位變成隱式 key(單欄)或 rows.X[0](取 group 內第一筆)。直接寫 domain / file.link 會空白——這是常見坑。

各 domain × type 矩陣

TABLE WITHOUT ID
  rows.domain[0] AS "Domain",
  rows.type[0] AS "Type",
  length(rows) AS "頁數"
FROM "wiki/entities"
GROUP BY domain + " / " + type
SORT rows.domain[0], rows.type[0]

列某 domain 全部頁

TABLE WITHOUT ID file.link AS "頁面", type AS "類型", status
FROM "wiki/entities/claude"
SORT type, file.name

→ 這種沒 GROUP BY 的查詢可以直接用 file.link / type / status

LIST
FROM "wiki/entities"
WHERE length(file.inlinks) = 0

找 draft 待審

LIST
FROM "wiki/entities"
WHERE status = "draft"

Top 10 hubs(被引用最多)

TABLE WITHOUT ID file.link AS "頁面", domain, length(file.inlinks) AS "inlinks"
FROM "wiki/entities"
SORT length(file.inlinks) DESC
LIMIT 10

常見陷阱

1. GROUP BY 之後欄位變 key

# ❌ 錯:file.link 在 GROUP BY 後沒值
TABLE file.link, length(rows)
FROM "wiki/entities"
GROUP BY domain
 
# ✅ 對:用 key / rows.X[0]
TABLE WITHOUT ID
  key AS "Domain",
  rows.file.link[0] AS "範例",
  length(rows) AS "頁數"
FROM "wiki/entities"
GROUP BY domain

→ Vincent vault 在 2026-05-02 踩過這坑(user 看到「都空的」截圖)。

2. WITHOUT ID

預設 TABLE 第一欄是檔案連結。WITHOUT ID 可以隱藏,自己控制欄位順序。

3. 字串大小寫敏感

status = "draft"status = "Draft"。建議 vault 規範統一小寫。

4. 路徑要用引號

FROM "wiki/entities"   ✅
FROM wiki/entities     ❌(會被解析成 tag)

5. SORT 多欄位

SORT domain ASC, type ASC, file.name ASC

→ 沒寫的話順序隨機。

DataviewJS — 進階模式

如果 SQL 不夠用,Dataview 還支援 dataviewjs(用 JavaScript 寫)。例:

```dataviewjs
const pages = dv.pages('"wiki/entities"')
  .where(p => p.domain === "claude" && p.status === "draft");
dv.table(["頁面", "更新日"],
  pages.map(p => [p.file.link, p.updated]));
```

→ Vincent vault 目前沒用 dataviewjs,純 SQL 已夠。

Heptabase / Notion 的對比

工具查詢能力
Obsidian + Dataview⭐⭐⭐⭐⭐(SQL-like、live、本地)
Notion Database⭐⭐⭐⭐(filter / sort,但跨 page 弱)
Heptabase⭐⭐(tag filter 為主,沒查詢)
Roam⭐⭐⭐(query block 但語法陡)

→ Dataview 是 Obsidian 在「結構化查詢」面穩贏的優勢。Vincent 為什麼選 Obsidian 當 vault 後端,這點是關鍵之一。

安裝

Settings → Community plugins → Browse → 搜尋 “Dataview” → Install + Enable。

對 Vincent vault 的角色

  • wiki/index.md 底部 8 個 live block(domain × type 矩陣 / 各 domain 頁 / 最近更新 / 孤兒檢查 / draft 待審 / Top 10 hubs)全靠 Dataview
  • 每次 ingest 後手寫快照可能跟不上、Dataview 永遠是真相
  • 健檢時先看 Dataview 找孤兒 / draft → 跑 wiki-lint 找深層問題

反模式

  • 手動維護 index 不靠 Dataview → 累、容易過時
  • Dataview 寫法錯沒驗證 → 「都空的」(GROUP BY 坑)
  • 大量 dataviewjs → 效能 + 可讀性都差
  • Dataview 取代 wiki-lint → Dataview 不抓矛盾、god-node、語意問題

相關概念

強連結

  • Obsidian — 載體
  • wiki-lint — 互補的健檢工具(Dataview 抓表象、lint 抓深層)

推斷連結(LLM 認為相關,待確認)

深入閱讀

← 回到 wiki