クエリの詳細

以前に述べたように、datomは[eid attr val tx]の4要素からなるタプルです。これまでのところ、値とエンティティIDについてのみの質問しかしてきませんでした。属性とトランザクションについても問い合わせができることを覚えておくことは重要です。

属性

例えば、データベース内のpersonエンティティに紐付けられている属性全てを検索したいとします。:person/name属性が存在することは分かっていますが、まだ見たことのない属性が他にもあるのでしょうか?

[:find ?attr
 :where 
 [?p :person/name]
 [?p ?attr]]

上記のクエリは知りたい属性を参照しているエンティティIDのセットを返します。実際のキーワードを取得するためには、:db/ident属性を使って検索する必要があります。

[:find ?attr
 :where
 [?p :person/name]
 [?p ?a]
 [?a :db/ident ?attr]]

これができるのは、属性もデータベース内ではエンティティとして管理されているからです。

トランザクション

下記のような、トランザクションに関する情報を取得するクエリを実行することも可能です。

  • ある事実が表明されたのはいつか?
  • ある事実が撤回されたのはいつか?
  • あるトランザクションに属する事実は何か?
  • などなど

トランザクションエンティティは、datomベクタの第4要素です。標準では、トランザクションに紐付けられている属性は:db/txInstantだけです。これはデータベースにトランザクションがコミットされたタイムスタンプです。

"James Cameron"がpersonエンティティの名前としていつ設定されたのか検索するために、第4要素を用いている例がこちらです。

[:find ?timestamp
 :where
 [?p :person/name "James Cameron" ?tx]
 [?tx :db/txInstant ?timestamp]]
 

指定された映画に紐付けられている属性をリストアップせよ。

クエリ:[ 答を見る ]

入力値1:

ある映画に関連する人物(俳優と監督)を全て列挙せよ。

クエリ:[ 答を見る ]

入力値1:

入力値2:

定義されている属性と、そのタイプとカーディナリティ(グループ内の要素数)を全て見つけよ。これは実質的にデータベースのスキーマを見つける検索に等しい。登録されている全ての属性を見つけるには:db.install/attribute属性を使わなければならない。また、:db/ident:db/valueType:db/cardinalityも使う必要がある。

クエリ:[ 答を見る ]

データベースに初期値がインポートされたのはいつか?データベース内の任意のdatomから、例えば[_ :movie/title _ ?tx]を手がかりにトランザクションを取得せよ。

クエリ:[ 答を見る ]