可以通过Datomic pull语法获取枚举值吗?

时间:2015-08-05 00:58:44

标签: clojure datomic datalog

mbrainz示例数据中,:artist / type是枚举。是否可以将枚举的值拉出:db / ident并使用pull语法将其作为:artist / type键的值关联?

这是我能得到的尽可能接近:

[:find (pull ?e [:artist/name {:artist/type [:db/ident]}])
 :where
 [?e :artist/name "Ray Charles"]
]

;;=> [[{:artist/name "Ray Charles", :artist/type {:db/ident :artist.type/person}}]]

是否可以使用pull语法将结果重塑为类似的内容?

;;=> [[{:artist/name "Ray Charles", :artist/type :artist.type/person}]]

3 个答案:

答案 0 :(得分:1)

我不认为你可以按照你想要的方式使用Pull API。您可能会发现使用Tupelo Datomic库更容易:

(require '[tupelo.datomic :as td]
         '[tupelo.core :refer [spyx]] )
(let [x1      (td/query-scalar  :let     [$ db-val]
                                :find    [ ?e ]
                                :where   [ [?e :artist/name "Ray Charles"] ] )
      x2      (td/entity-map db-val x1)
     ]
  (spyx x1)
  (spyx x2)
)

给出了结果:

  

x1 => 17592186049074

     

x2 => {:artist / sortName" Charles,Ray",:artist / name" Ray Charles",   :artist / type:artist.type / person,:artist / country:country / US,   :artist / gid #uuid" 2ce02909-598b-44ef-a456-151ba0a3bd70",   :artist / startDay 23,:artist / endDay 10,:artist / startYear 1930,   :artist / endMonth 6,:artist / endYear 2004,:artist / startMonth 9,   :艺术家/性别:artist.gender / male}

所以:artist / type已经转换为:db / ident值,你可以将它从地图中拉出来。

答案 1 :(得分:1)

您可以对pull表达式返回的结果使用spectre:

(->> pull-result                                                                                     
     (sp/transform (sp/walker :db/ident) :db/ident))

为每个具有该键的地图提取键:db/ident的值。

答案 2 :(得分:0)

很容易用 postwalk

对于任何拉取的 :db/ident,您都可以使用此功能进行转换

(defn flatten-ident [coll]
  (clojure.walk/postwalk
   (fn [item] (get item :db/ident item)) coll))