別途穴埋め記事を書こうと思いますが、cruxというClojureネイティブなdatalogデータベースシステムがあります。
この記事に関連ある点だけで言うと任意のClojureマップをシリアライズして保存して後からクエリできるのですが、
ネストされたフィールドはインデックスされないためクエリの対象にできない、という特徴があります。
つまり
{:foo "bar"
:bar {:baz "quz"}}
という者が保存されていた場合、:foo
が"bar"
の値の物を返してくださいというクエリはできますが、:bar
のように値がプリミティブな値でない場合にはそれに基いたクエリができないというわけです。
ただ、何かしらの手段でネストしたフィールドをこのようにトップレベルに持ってきたマップに変換できれば:bar.baz
が "quz"のもの、という風に書けてこの弱点を克服できそうです。
{:foo "bar"
:bar.baz "quz"}
動機はcruxの特性でしたが、只のアルゴリズムでcrux以外の文脈でも使えるかも、というわけでこれをするライブラリを作って公開しました。
実装のつっこみやスターなどお待ちしております。