clojure - 从 Datomic 检索最近的实体

标签 clojure datomic

我对实体及其时间戳感兴趣。本质上,我想要一个按时间排序的实体列表。

为此,我编写了以下函数:

(defn return-posts
  "grabs all posts from Datomic"
  []
  (d/q '[:find ?title ?body ?slug
         :where
         [?e :post/title ?title]
         [?e :post/slug ?slug]
         [?e :post/body ?body]] (d/db connection)))

(defn get-postid-from-slug
  [slug]
  (d/q '[:find ?e
         :in $ ?slug
         :where [?e :post/slug ?slug]] (d/db connection) slug))

(defn get-post-timestamp
  "given an entid, returns the most recent timestamp"
  [entid]
  (->
   (d/q '[:find ?ts
          :in $ ?e
          :where
          [?e _ _ _]
          [?e :db/txInstant ?ts]] (d/db connection) entid)
   (sort)
   (reverse)
   (first)))

我觉得这一定是源于无知的黑客行为。

是否有更精通 Datomic 惯用用法的人插话并升级我的范例?

最佳答案

我对向数据库添加额外时间戳的想法感到困扰,该数据库名义上将时间理解为一流原则,因此(经过一夜的思考 Ulrik Sandberg 概述的方法)发展了以下功能:

(defn return-posts
  "grabs all posts from Datomic"
  [uri]
  (d/q '[:find ?title ?body ?slug ?ts
         :where
         [?e :post/title ?title ?tx]
         [?e :post/slug ?slug]
         [?e :post/body ?body]
         [?tx :db/txInstant ?ts]] (d/db (d/connect uri))))

在 Datalog 中,省略与事务 ID 本身的绑定(bind)是惯用的,因为我们通常不关心。在这种情况下,我们非常关心,用 August Lileaas 的话说,希望“遍历交易”(在某些情况下,我们需要帖子创建时间,但对于此应用程序,交易时间足以满足订购实体的需要) )。

此方法的一个显着缺点是最近编辑的条目将在列表中增加。为此,我稍后必须做一些事情,以便让他们在 Datomic 中“首次出现”以获取博客标准帖子历史记录。

总结一下: 我已经为每个“post”实体ID绑定(bind)了交易实体ID,然后使用此函数查找交易时间戳以供以后排序。

关于clojure - 从 Datomic 检索最近的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19071694/

相关文章:

clojure - 在 Datomic 中需要通用比较和交换语义的情况如何设计?

scalability - 数据原子和写入可扩展性

datomic - DataLog 等同于 SQL 吗?

clojure - Datomic 中的访问控制

c++ - 我可以从 C++ 调用 clojure 代码吗?

clojure - leiningen run 在调用 future 后一分钟内不返回

python-3.x - 首先解构/解包,然后在 Clojure 中休息

clojure - Datomic 和 HornetQException "unable to validate user"

仅用于测试的 Clojure 依赖项

clojure - 如何在 Clojure 和 ClojureScript 之间共享协议(protocol)