Clojure 将数据组ID列表映射到实体映射
当我查询Datomic实体列表时,如下面的示例:Clojure 将数据组ID列表映射到实体映射,clojure,datomic,Clojure,Datomic,当我查询Datomic实体列表时,如下面的示例: '[:find ?e :where [?e :category/name]] 通常,我想创建一个表示完整实体的映射列表,即 #{[1234] [2223]} => [{:category/name "x" :db/id 1234}, {:category/name "y" :db/id 2223}] 这是我目前的方法,以助手函数的形式 (defn- db-ids->entity-maps "Ta
'[:find ?e
:where
[?e :category/name]]
通常,我想创建一个表示完整实体的映射列表,即
#{[1234] [2223]} => [{:category/name "x" :db/id 1234}, {:category/name "y" :db/id 2223}]
这是我目前的方法,以助手函数的形式
(defn- db-ids->entity-maps
"Takes a list of datomic entity ids retrieves and returns
a list of hydrated entities in the form of a list of maps."
[db-conn db-ids]
(->>
db-ids
seq
flatten
(map #(->>
%
;; id -> lazy entity map
(d/entity (d/db db-conn))
;; realize all values, except for db/id
d/touch
(into {:db/id %})))))
有更好的方法吗?我曾经采用这种方法将查询保存到数据库,代码的可重用性可能较低,但这取决于当前场景中更重要的内容。我没有配置Datomic实例,因为我现在没有使用它,所以它可能包含语法错误,但我希望您能理解。 => =>
使用pull api,现在就很容易了
'[:find [(pull ?e [*]) ...]
:in $ [[?e] ...]
:where [?e]]
我希望自己不必详细说明查询中的每个属性,而只是返回实体。我担心,如果没有更新,这个问题已经包括在内,正如您可能已经看到的,并且您的方法已经足够好了,至少目前是这样:)Datomic的吸引力总体上是好的,除此之外,它不会像人们期望的那样处理枚举值:拉式实体具有引用,而不是我们想要的命名空间关键字。正确,如果要使用拉式api使用通配符收集枚举,则还必须显式指定枚举路径:
(pull?e[*{:enum prop[:db/ident]}])
#{["x" 1234] ["x" 2223]}
(defn- describe-values
"Adds proper keys to the given values."
[keys-vec query-result]
(vec (map #(zipmap keys-vec %) query-result))
(describe-values [:category/name :db/id] query-result)
[{:db/id 2223, :category/name "x"} {:db/id 1234, :category/name "x"}]
'[:find [(pull ?e [*]) ...]
:in $ [[?e] ...]
:where [?e]]