Logseqでクエリを書くための資料個人的まとめ
Logseqというアプリをご存知でしょうか。わたしは日々作業のログや日記つけるために利用しています。Logseqではクエリを作成し、条件に応じたページやブロックを動的に表示することができます。最近クエリを書くのに(いい意味で)沼っていたのですが、まとまった資料が見つからなかったので個人的まとめを書きます。
Logseq とは
Notionのようなナレッジベースを構築するアプリです。Obsidianと同じようにマークダウンで記述し、ローカルで動作することが特徴です。一方Obsidianがマークダウンファイルを扱うのに対し、Logseqはブロックという単位で出来上がっている、と個人的に思います。1つのページに箇条書きのブロックが並んでいるイメージです。Logseqもマークダウン形式でエクスポートできるものの、すべてがブロックだ、と考えています。
LogseqアプリはClojureという関数型言語で書かれており、Datascriptでページやブロックをフィルタ・ソートなどできます。すべてのページやブロックがデータベースなのです。DatascriptもClojureのライブラリなので文法は同じです。*Clojure初心者なので、まちがっていたらコメントで訂正をお願いします。
Logseq Query
たくさんのルールが用意されており基本的なクエリはお手軽にできます。ブロックに{{query ...}}
と入力し、ブロックからフォーカスを外すとクエリが実行されます。
;; #タグA を含むブロックを検索
{{query #タグA}}
;; または
{{query [[タグA]]}}
;; 「タイトル」のページを検索
{{query (page [[タイトル]]}}
(page )
はクエリを繰り返し利用できるようにしたものでルールとよばれます。定数とか、マクロとか、そんなイメージでわたしは理解しています。
本題:Advaced Queriesの資料まとめ
さて、ここからが本題なのですが、用意されているルールでは書けないクエリを書きたくなってきます。再帰的にページを取得したいとか。公式ドキュメントではかるく説明があるのですが不十分でじぶんで書けるようにまでなれませんでした。
公式ドキュメントにあるAdvanced queriesの例です。
{:title [:h2 "Your query title"]
:query [:find (pull ?b [*])
:where ...]
:inputs [...]
:view (fn [query-result] [:div ...]) ;; or :keyword from config.edn
:result-transform (fn [query-result] ...) ;; or :keyword from config.edn
:collapsed? true
:group-by-page? true
:remove-block-children? true
:rules [...]}
このようなコードをブロックに書くとクエリが実行されます。ただ公式は充実しているといいづらく、以下のサイトを参考に学習しました。
わかりやすかったDatascriptの初心者用ガイド。DatascriptはDatalogともよばれているらしく、複雑な事情がありそうです。本記事ではDatascriptに統一しています。リンク先ではDatalog表記の場合があります。
Advanced queriesのサンプル集
データの表示関連の:view
についてのサンプル。デバッグ方法など初心者は知らないtipsがあるのもよい。
Clojureのチュートリアル。Clojureの文法もたまに必要でした。
Logseqで定義されているルール。これは一部だと思います。ルールを自作するときに役立ちます。
Datascriptのリポジトリ。よく使われるSQLとちがい、クエリが宣言的であることや、データベースの不変性が特徴的なんだと書かれておりdatascriptのコンセプトをつかむのによかったです。
Logseqのフォーラムもひたすら探るのもあり。
再帰的にルールを定義している例。このリンクもフォーラムで見つけました。
おわりに
ほんとシンプルにですが資料のまとめでした。Logseqでクエリ書いてやるぜ〜という人の助けになるとうれしいです。
Discussion