👏

Logseqでクエリを書くための資料個人的まとめ

に公開

Logseqというアプリをご存知でしょうか。わたしは日々作業のログや日記つけるために利用しています。Logseqではクエリを作成し、条件に応じたページブロックを動的に表示することができます。最近クエリを書くのに(いい意味で)沼っていたのですが、まとまった資料が見つからなかったので個人的まとめを書きます。

Logseq とは

https://logseq.com/

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/クエリ(Query)

本題:Advaced Queriesの資料まとめ

さて、ここからが本題なのですが、用意されているルールでは書けないクエリを書きたくなってきます。再帰的にページを取得したいとか。公式ドキュメントではかるく説明があるのですが不十分でじぶんで書けるようにまでなれませんでした。

https://docs.logseq.com/#/page/advanced 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表記の場合があります。

https://qwxlea.github.io/#/page/datalog%2Fintro to datalog

Advanced queriesのサンプル集

https://siferiax.github.io/#/page/logseq%2Fadvanced queries

データの表示関連の:viewについてのサンプル。デバッグ方法など初心者は知らないtipsがあるのもよい。

https://qwxlea.github.io/#/page/datalog%2Fquery views

Clojureのチュートリアル。Clojureの文法もたまに必要でした。

https://clojure.org/guides/learn/clojure

Logseqで定義されているルール。これは一部だと思います。ルールを自作するときに役立ちます。

https://github.com/logseq/logseq/blob/fdff75cdf8ac99b3eabb09e80f3848091badea9e/deps/db/src/logseq/db/file_based/rules.cljc

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でクエリ書いてやるぜ〜という人の助けになるとうれしいです。

Discussion