Clojure 将数据组ID列表映射到实体映射

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

当我查询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
  "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]]