如何查询特定分区中所有数据的datomic?

时间:2016-03-22 10:02:51

标签: datomic

在Datomic查询语言中,如何编写查询以返回特定分区中的所有数据?这甚至可能吗?

1 个答案:

答案 0 :(得分:2)

你通常不能真正使用Datalog查询,因为它需要遍历数据库的所有数据,Datalog不允许你这样做。

给定任何实体ID,您可以通过调用Peer库的part函数来检索它的分区。

然后,您可以在数据库中使用filter来仅查看这些数据。这是一个Clojure的例子:

(defn part-db 
  "Given a db and a partition entity id, 
  returns a view of the db with only the datoms which entities are of this partition."
  [db part]
  (d/filter db (fn [_ ^Datom datom] 
                 (-> datom .e d/part (= part))
                 )))

要从其名称中找出分区的实体ID(例如:my.partitions/part1),您可以将其解析为实体:

(def my-part-id (:db/id (d/entity mydb :my.partitions/part1)))

从这里开始,您可以:

  1. 通过索引列出数据库的所有数据:(d/datoms (part-db mydb my-part-id) :eavt)

  2. 使用Datalog查询已过滤的数据库。

  3. ......用数据库值做的其他事情!
  4. 请注意,如果您确实希望获取所有数据,那么您可能希望在历史数据库中执行此操作。