Clojure Datomic:如何在查询中跨任意数量的数据库进行查询?

Clojure Datomic:如何在查询中跨任意数量的数据库进行查询?,clojure,jvm,datomic,datalog,Clojure,Jvm,Datomic,Datalog,我正在使用Datomic,并希望根据我的查询从任意数量的时间点提取整个实体。Datomic文档中有一些不错的示例,说明了如果在执行查询之前知道两个不同的数据库实例,如何执行查询。但是,我希望我的查询确定我需要的“as-of”类型数据库实例的数量,然后在提取实体时使用这些实例。以下是我目前掌握的情况: (defn pull-entities-at-change-points [entity-id] (->> (d/q '[:find ?tx (pull ?dbs

我正在使用Datomic,并希望根据我的查询从任意数量的时间点提取整个实体。Datomic文档中有一些不错的示例,说明了如果在执行查询之前知道两个不同的数据库实例,如何执行查询。但是,我希望我的查询确定我需要的“as-of”类型数据库实例的数量,然后在提取实体时使用这些实例。以下是我目前掌握的情况:

(defn pull-entities-at-change-points [entity-id]
  (->>
    (d/q
      '[:find ?tx (pull ?dbs ?client [*])
        :in $ [?dbs ...] ?client
        :where
        [?client ?attr-id ?value ?tx true]
        [(datomic.api/ident $ ?attr-id) ?attr]
        [(contains? #{:client/attr1 :client/attr2 :client/attr3} ?attr)]
        [(datomic.api/tx->t ?tx) ?t]
        [?tx :db/txInstant ?inst]]
      (d/history (d/db db/conn))
      (map #(d/as-of (d/db db/conn) %) [1009 1018])
      entity-id)
    (sort-by first)))
我试图找到
:client
实体上某些属性发生更改的所有事务,然后在这些时间点提取实体。行:
(map#(d/as of(d/db db/conn)%)[1009 1018])
是我尝试在两个特定事务中创建一系列数据库实例,我知道客户端的属性已更改。理想情况下,我希望在一个查询中完成所有这些,但我不确定这是否可行


希望这是有意义的,但是如果您需要更多详细信息,请告诉我。

我会将pull调用拆分为单独的API调用,而不是在查询中使用它们。我会将查询本身局限于获取感兴趣的交易。实现这一点的一个示例解决方案是:

(defn pull-entities-at-change-points
  [db eid]
  (let 
    [hdb (d/history db)
     txs (d/q '[:find [?tx ...]
                :in $ [?attr ...] ?eid
                :where
                [?eid ?attr _ ?tx true]]
              hdb
              [:person/firstName :person/friends]
              eid)
      as-of-dbs (map #(d/as-of db %) txs)
     pull-w-t (fn [as-of-db]
                [(d/as-of-t as-of-db)
                 (d/pull as-of-db '[*] eid)])]
    (map pull-w-t as-of-dbs)))
针对使用toy模式构建的db I,此函数将返回如下结果:

([1010
  {:db/id 17592186045418
   :person/firstName "Gerry"
   :person/friends [{:db/id 17592186045419} {:db/id 17592186045420}]}]
 [1001
  {:db/id 17592186045418
   :person/firstName "Jerry"
   :person/friends [{:db/id 17592186045419} {:db/id 17592186045420}]}])
我将评论以下几点:

  • 上述函数不从环境/全局连接获取数据库,而是从环境/全局连接获取数据库
  • 我们绘制了每个时间t的拉力图
  • 作为入口点而不是查询,适用于我们手头有实体和其他信息,只需要属性或遍历引用的情况
  • 在一个大查询中完成所有事情的动力在Datomic中并不真正存在,因为相关的片段将在对等缓存中实现。您并没有这样做,也就是说,使用一个查询可以节省往返时间
  • 上的集合绑定表单包含

感谢您的回复。那很有帮助!