2014-01-13 11 views
6

で不足している属性を持つエンティティを検索:私は:fredの属性:likes :pizzaと空の値を取り戻す、両方のエンティティ(:fred:sally)を照会するにはどうすればよい私は、次の<a href="http://www.datomic.com" rel="noreferrer">Datomic</a>データベースがある場合はDatomic

{ :fred :age 42 } 
{ :fred :likes :pizza } 
{ :sally :age 42 } 

:sally

[:find ?n ?a ?l 
:where [?n :age ?a] 
     [?n :likes ?l]] 

だけ:fred 42 :pizza返すクエリ。

答えて

12

Datomicは最近、Datomicクエリで利用できるいくつかの式関数で更新されました。これらの関数の1つはget-elseと呼ばれ、属性がエンティティに存在しない場合は、clojure.core/getがキーが見つからない場合にオプションの3番目のパラメータを返すように、デフォルトの戻り値を指定できます。

だからあなた自身の例を使用して、あなただけそうのようにそれを変更する必要があります:

[:find ?n ?a ?l :where [?n :age ?a] [(get-else $ ?n :likes false) ?l]

それが有効なDatomicデータ型ではありませんので、残念ながら、あなたが実際nil「デフォルト」の値を作ることができませんあなたが試してみると、Datomicはcarpしますが、falseはあなたがどこに行くのかをあなたに知らせるべきです。

6

特定の属性がアサーションされている場合とない場合があるエンティティのセットを取得することは、リレーショナルデータベースのLEFT JOINに似ています。

datomicのアプローチは2つのステップを実行することです。最初にエンティティをクエリし、そこからナビゲートして属性値を取得するか、属性が特定のエンティティに対してアサートされていない場合はnilを取得します。

メーリングリストの投稿How do you do a left join in Datomic?とそれに付随するgistを参照してください。

+2

実は、私は '取得-else'は、この場合には正しいアプローチであると考えています。これは2つのステップではなく1つのクエリです。別の同様の機能を組み込んだFYIが '欠落していますか? '。 – Psyllo

関連する問題

 関連する問題