iT邦幫忙

2021 iThome 鐵人賽

DAY 23
0
Software Development

Obsidian 雙向鏈結型筆記工具研究與應用,打造屬於個人的專業知識圖譜系列 第 23

Day 23 : 插件篇 02 — 如何在 Obsidian 中自動彙整筆記?使用 Dataview 查詢與呈現符合條件的筆記

  • 分享至 

  • xImage
  •  

一、介紹

這是 Obsidian 使用教學 — 插件篇的第 2 篇文章。

上一篇文章 中,我介紹了 Note Refactor 插件,可以快速幫我們拆分筆記。你可以在下方的文章複習內容:

這篇文章想介紹另一款 Obsidian 中的神器 — Dataview,一款類似 SQL 語法 (資料庫的結構化查詢語言, Structured Query Language) 的查詢語言。

Dataview 可以快速查詢特定條件的筆記,並且用 table (表格), list (清單), task (待辦事項) 呈現這些筆記條目。

二、如何使用 Obsidian Dataview 插件?

1. Dataview 簡介

參考 Dataview 插件文件 ,目前 Dataview 提供 2 種查詢方式:預設語法 和 Dataview Javascript 語法。由於後者需要一定的技術知識,因此本篇只會介紹前者。

查詢結果範例如下:

備註:若想要了解 Dataview Javascript 的應用,可參考 這篇文章

2. 在筆記中建立查詢欄位

(1) 自行建立

Dataview 能夠查詢的欄位是由我們自己建立的,因此在使用 Dataview 之前,我們必須在每一則筆記中建立需要的資料欄位,以利未來查詢。

目前建立欄位的方法有 2 種:

▶︎ 在 YAML 區加入欄位

YAML 是一種描述設定的文字格式,通常使用人性化的語言來撰寫,以便讓閱讀者可以直接明白它要表達的意思。

在 Obsidian 中,我們可以用上下 --- 包住一段文字,這段文字就稱為 YAML。而在 YAML 區中,我們會用 <欄位名稱> : <值> 來格式來定義欄位的值。

例如下方的 YAML 區域包含了 date 和 aliases (筆記別名)。

如果 YAML 文字寫得正確,在切換成 Preview Mode 時就會看到 Metadata 的文字。

如果寫的不正確,就會出現 INVALID YAML 的文字。

在 YAML 區域定義的欄位都可以在後續被 Dataview 當作欄位搜尋到。想要了解更 YAML 格式如何寫,可以參考 Obsidian 的官方文件

▶︎ 使用 inline field 加入欄位

另外一種在筆記中建立欄位的方式,稱為 inline field。它是由 Dataview 開發者自行定義的格式,必須寫在 YAML 區塊 (即 --- 外面),並且用 <欄位名稱>  <值> 的格式。

inline filed 相較於 YAML,在欄位值的定義上更有彈性。因為在 YAML 區中,合法欄位值是不能包含 [[]] 的 (雖然你硬要寫 obsidian 也不會報錯,但在程式世界中這樣定義 YAML 欄位是不正確的觀念)。

我建議如果要建立的筆記欄位值需要寫 [[]] ,一律使用 inline field 的格式較好。範例如下圖:

你可能會好奇說:「那我到底需要建立哪些欄位呢?」

這個答案完全依據你個人需求而定,如果你參考我的 Metadata 格式,基本上會有以下欄位:

在剛使用 Obsidian 初期,你不需要一次增加這麼多欄位,可以依照自己的筆記需求慢慢增加就好。

(2) Dataview 內建欄位

除了自行建立欄位,Dataview 也提供許多內建的欄位可以使用。參考 官方文件 如下,由於解釋已經蠻淺白的我就不翻譯了:

  • file.name: The file title (a string).
  • file.folder: The path of the folder this file belongs to.
  • file.path: The full file path (a string).
  • file.link: A link to the file (a link).
  • file.size: The size (in bytes) of the file (a number).
  • file.ctime: The date that the file was created (a date + time).
  • file.cday: The date that the file was created (just a date).
  • file.mtime: The date that the file was last modified (a date + time).
  • file.mday: The date that the file was last modified (just a date).
  • file.tags: An array of all tags in the note. Subtags are broken down by each level, so #Tag/1/A will be stored in the array as [#Tag, #Tag/1, #Tag/1/A].
  • file.etags: An array of all explicit tags in the note; unlike file.tags, does not include subtags.
  • file.inlinks: An array of all incoming links to this file.
  • file.outlinks: An array of all outgoing links from this file.
  • file.aliases: An array of all aliases for the note.
  • file.day: An explicit date associated with the file

這裡的 file 指的是筆記檔案 (.md) 的意思。

3. 基本查詢格式

Dataview 的基本查詢格式如下:

[TABLE|LIST|TASK] field1, field2, ..., fieldN FROM #tag or "folder" or [[link]]
WHERE somefield = somevalue
COMMAND argument

用 ```dataview 當作開頭,最後用 ``` 將指令包住。

這樣看可能太複雜了,我們換另一種比較好理解的格式:

輸出格式(Table/List/Task) 欄位名稱    
from [ #tag 或 資料夾 或 [[筆記]] ]   
where 條件   
sort 欄位 [排序]   

下面我們逐行拆解說明。

▶︎ 決定呈現樣式 — Table, List, Task

Dataview 支援 3 種形式呈現查詢結果:

  • Table : 表格
  • List : 清單
  • Task : 待辦任務

其中 Table 和 List 是我最常使用的,Task 幾乎沒有用到。

下方是範例。請留意表格、清單、待辦事項的呈現都是依據內建的主題樣式 CSS 決定。

▶︎ 要查詢哪裡

決定了樣式之後,接下來我們要告訴 Dataview 資料來源是什麼。目前 Dataview 支援 3 種形式的資料來源:

  • tag : 可指定 #tag 當作資料來源
  • folder : 可指定特定資料夾中的筆記
  • [[筆記]] : 可指定連結到「筆記」的其他筆記當作來源

20211008-CleanShot 2021-10-08 at 16.06.50@2x

例如指定 [[product strategy MOC]],抓出連結到 product strategy MOC 的筆記。

▶︎ 加入篩選條件

Where 的意思代表篩選資料,也就是將資料源的資料依據特定條件呈現。

我常用的篩選條件有:

1. 24 小時內修改的筆記

where file.mtime \>= date(today) - dur(1 day)

2. 筆記檔案名稱不包含特定文字 (如果要包含把 ! 拿掉即可)

where !contains(file.name,"不包含的文字")

如果要看更多範例,可以看 官方文件的這一頁

▶︎ 決定如何排序資料

最後我們可依據個人需求調整查詢結果的排列順序,使用的是 sort 這個關鍵字。

你可以依據日期 (date)、檔案修改時間 (file.mtime)、檔案建立時間 (file.ctime)…來做排序。如果要正序就用 asc 這個關鍵字,倒序就用 desc 這個關鍵字。

例如依據檔案建立日期倒序排列 (即最新到最舊),可以寫成

sort file.ctime desc

三、實戰案例 — 看看 Obsidian Dataview 可以用在哪裡

1. 寫作靈感提示

我在《如何透過寫筆記幫助自己深度思考 ? 使用 HQ&A 筆記法,結合「費曼學習法」與「間隔重複」幫自己學得更好》介紹了 HQ&A 的筆記格式,其中 Question 和 Answer 非常適合當作寫作靈感的提示。

例如今天我的寫作主題是「產品策略」,我可以搜尋「product strategy MOC (即產品策略主題)」筆記,利用 Dataview 將所有連結到此主題的 HQ&A Note 用表格呈現出來。

▶︎ 欄位設計

我在每一則筆記中,都有加入 QuestionAnswer 兩個欄位。

▶︎ Dataview 語法

table question, answerfrom [[product strategy MOC]]
where !contains(file.name,"daily note")
sort status desc, file.mtime desc

▶︎ 呈現結果

2. 每日復盤

在每一天傍晚,我會用 Dataview 查詢今天有對哪些筆記做修改,當作今日個人筆記的復盤。

▶︎ Dataview 語法

list from ""WHERE file.ctime >= date(today) - dur(1 day)

▶︎呈現結果

3. 自動化彙整名詞的相關文章

我在 Obsidian 中會別針對「名詞」做筆記,紀錄我對每一個新名詞的理解,並且用 Dataview 彙整所有使用到此名詞 (有連結) 的筆記。

例如 PARA 分類系統 筆記中,目前有 2 篇筆記都有使用 PARA 這個名詞。這個用法特別適合拿來整理某則筆記的參考文獻。

▶︎ Dataview 語法

table parent-link as "父連結", file.mtime as "更新時間", file.ctime as "建立時間", status as "筆記狀態", file.inlinks as "相關連結"
from [[PARA system]]
sort status desc, file.mtime desc

▶︎ 呈現結果

4. 自動化彙整書籍筆記

閱讀完一本書籍後,我會利用 Note Refactor 這款插件將書籍中的筆記全部拆分出去,並且透過 Dataview 將這本書籍的相關筆記自動彙整。

這個案例的 Dataview 語法跟「自動化彙整名詞的相關文章」其實是一樣的,只是是用在書籍筆記中。例如下方是《讀懂一本書》的筆記整理。

▶︎ Dataview 語法

table parent-link as "父連結", file.mtime as "更新時間", file.ctime as "建立時間", status as "筆記狀態", file.inlinks as "相關連結"
from [[{讀懂一本書]]
where !contains(file.name, "MOC")
sort status desc, file.mtime desc

▶︎ 呈現結果

四、使用 Obsidian Dataview 的建議

Dataview 相對於其他 Obsidian 插件是比較難上手的,在踩過無數雷坑後我有以下 3 點建議。

1. 注意 Emoji Tag 的使用

如果你要像我一樣使用 Emoji 當作 Tag,請注意不要使用 Obsidian Community Plugin — Emoji Toolbar 來插入。

Emoji Toolbar 插件

使用 Emoji Toolbar 插入的 Emoji 是無法被 Dataview 讀取的,這點要特別注意。

2. 學會自己查詢文件

目前網路上關於 Dataview 的學習資源還沒有很多,加上每個人筆記欄位設計的格式都不相同,可能你遭遇的問題是別人從來沒碰過的,因此未必都能獲得解答。

此時官方文件會是你最好的幫手,雖然文件的詳細程度還有待加強…但搜尋一遍官方文件後幾乎都可以想得的查詢語法。

如果不幸地你還是無法自己排除問題,以下有 2 個管道可以碰碰運氣 (不保證有人回應):

  • Obsidian Forum : Obsidian 官方論壇,使用 Dataview 當作關鍵字查詢是否有類似問題貼文
  • Obsidian Discord : Obsidian 官方 Discord 討論頻道,有非常多大神常駐,可以在 #plugin-general, #plugin-advanced, #中文…等頻道發問。

3. 結合模板快速插入指令

當你學會 Dataview 的基本操作後,可以嘗試和 Template 搭配一起使用。

例如實戰案例中的「自動化彙整筆記」功能,都可以用以下模板快速插入。因為我們的需求都是找到「連結到目前這則筆記」的其他筆記,因此可以用 [[{title}]] 當作變數快速插入筆記中。

table parent-link as "父連結", file.mtime as "更新時間", file.ctime as "建立時間", status as "筆記狀態"
from [[{{title}}]]
sort status desc, file.mtime desc

五、結論

這篇文章介紹了 Obsidian 神器 — Dataview 的使用方式,包含:

  • 基礎的查詢語法
  • 實戰應用
  • 使用建議

希望大家閱讀完畢後都可以試用看看這款插件。若有不清楚的地方,歡迎在下方留言與我討論。


上一篇
Day 22 : 插件篇 01 — 如何在 Obsidian 中快速拆分筆記?使用 Note Refactor 讓你彈指之間完成
下一篇
Day 24 : 插件篇 03 — 如何讓 Obsidian 自動推薦關聯筆記 (上)?使用 Breadcrumbs 查看有哪些相關筆記可以連結
系列文
Obsidian 雙向鏈結型筆記工具研究與應用,打造屬於個人的專業知識圖譜30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言