基本のクエリ

使用するデータベースに入っている情報は主に80年代の映画についてです。 映画のタイトル、公開年、監督、キャストなどの情報について検索してもらいます。 後の章で、データベースの内容と構成についてより詳しい説明があります。

Datomicで使われているデータモデルは、datomと呼ばれる原子性をもつ事実をもとに構築されています。 Datomは、下記の4要素で構成されています。

  • エンティティID (Entity ID)
  • 属性 (Attribute)
  • 値 (Value)
  • トランザクションID (Transaction ID)

データベースは下記のような、階層構造のないdatomで構成されていると考えることができます。

[<e-id>  <attribute>      <value>          <tx-id>]
...
[ 167    :person/name     "James Cameron"    102  ]
[ 234    :movie/title     "Die Hard"         102  ]
[ 234    :movie/year      1987               102  ]
[ 235    :movie/title     "Terminator"       102  ]
[ 235    :movie/director  167                102  ]
...

最後の2つのdatomは同じエンティティIDを持っていることに注目してください。 これは、同じ映画についての事実であることを示しています。 また、最後のdatomの値(value)167が最初のdatomのエンティティIDと一致しています。 これは、:movie/director属性の値がエンティティであることを示しています。 上記のdatomは全て同じトランザクションの中で追加されたので、同じ値が トランザクションIDに入っています。

クエリは、キーワード:findで始まり、?シンボルで始まる一つ以上のパターン変数(例:?title)が続くベクタとして表現されています。 find句の後には、指定されたデータパターンにマッチするdatomだけに制限する:where句が続きます。

例えば、このクエリは属性:person/nameの値が"Ridley Scott"であるエンティティIDを全て検索します。

[:find ?e
 :where
 [?e :person/name "Ridley Scott"]]

データパターンとは、一部がパターン変数に置き換えられたdatomのことです。 クエリエンジンは一つ一つのパターン変数が取りうる値を検索し、:find句で指定した変数を返すのが仕事です。

シンボル_は無視したいデータパターンのためのワイルドカードとして使用できます。 また、データパターンの後ろに続く値を省略することもできます。 上記のクエリはdatomのトランザクション部分を無視しており、下記のクエリと同等です。

[:find ?e
 :where
 [?e :person/name "Ridley Scott" _]]

1987年に制作された映画のエンティティIDを見つけなさい。

クエリ:[ 答を見る ]

データベースにある映画のエンティティIDタイトルを見つけなさい。

クエリ:[ 答を見る ]

データベース内の人名を全て見つけなさい。

クエリ:[ 答を見る ]