可以通过 Datomic pull 语法获取枚举值吗?
Possible to get enum value via Datomic pull syntax?
在 mbrainz 示例数据中,:artist/type 是一个枚举。是否可以使用 pull 语法从 :db/ident 中提取枚举的值并将其关联为 :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}]]
我认为您无法按照您正在寻找的方式使用 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 :artist.gender/male}
因此 :artist/type 已经转换为 :db/ident 值,您可以将其从地图中拉出。
您可以对拉表达式 returns:
的结果使用幽灵
(->> pull-result
(sp/transform (sp/walker :db/ident) :db/ident))
为每个具有该键的地图提取键 :db/ident
的值。
用 postwalk
很容易做到
对于任何被拉动的 :db/ident 你都可以使用这个函数进行转换
(defn flatten-ident [coll]
(clojure.walk/postwalk
(fn [item] (get item :db/ident item)) coll))
在 mbrainz 示例数据中,:artist/type 是一个枚举。是否可以使用 pull 语法从 :db/ident 中提取枚举的值并将其关联为 :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}]]
我认为您无法按照您正在寻找的方式使用 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 :artist.gender/male}
因此 :artist/type 已经转换为 :db/ident 值,您可以将其从地图中拉出。
您可以对拉表达式 returns:
的结果使用幽灵(->> pull-result
(sp/transform (sp/walker :db/ident) :db/ident))
为每个具有该键的地图提取键 :db/ident
的值。
用 postwalk
对于任何被拉动的 :db/ident 你都可以使用这个函数进行转换
(defn flatten-ident [coll]
(clojure.walk/postwalk
(fn [item] (get item :db/ident item)) coll))