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 )はクエリを繰り返し利用できるようにしたものでルールとよばれます。定数とか、マクロとか、そんなイメージでわたしは理解しています。
https://docs.logseq.com/#/page/queries
https://scrapbox.io/logseq-ja/%E3%82%AF%E3%82%A8%E3%83%AA%EF%BC%88Query%EF%BC%89
本題:Advaced Queriesの資料まとめ
さて、ここからが本題なのですが、用意されているルールでは書けないクエリを書きたくなってきます。再帰的にページを取得したいとか。公式ドキュメントではかるく説明があるのですが不十分でじぶんで書けるようにまでなれませんでした。
https://docs.logseq.com/#/page/advanced%20queries
公式ドキュメントにある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表記の場合があります。
https://qwxlea.github.io/#/page/datalog%2Fintro%20to%20datalog
Advanced queriesのサンプル集
https://siferiax.github.io/#/page/logseq%2Fadvanced%20queries
データの表示関連の:viewについてのサンプル。デバッグ方法など初心者は知らないtipsがあるのもよい。
https://qwxlea.github.io/#/page/datalog%2Fquery%20views
Clojureのチュートリアル。Clojureの文法もたまに必要でした。
https://clojure.org/guides/learn/clojure
Logseqで定義されているルール。これは一部だと思います。ルールを自作するときに役立ちます。
Datascriptのリポジトリ。よく使われるSQLとちがい、クエリが宣言的であることや、データベースの不変性が特徴的なんだと書かれておりdatascriptのコンセプトをつかむのによかったです。
https://github.com/tonsky/datascript
Logseqのフォーラムもひたすら探るのもあり。
https://discuss.logseq.com/tag/queries
再帰的にルールを定義している例。このリンクもフォーラムで見つけました。
https://github.com/Datomic/mbrainz-sample/blob/master/src/clj/datomic/samples/mbrainz/rules.clj
おわりに
ほんとシンプルにですが資料のまとめでした。Logseqでクエリ書いてやるぜ〜という人の助けになるとうれしいです。