2024 Clojure状态调查!中分享你的想法。

欢迎!请参阅关于页面以获取更多关于如何运作的信息。

0 投票

我四处看了看,但没有看到什么明显的方法。但是我相对较新 Clojure和core.logic。只是想知道是否有简单的将逻辑数据库保存到文件中的方法。我希望在逻辑数据库中存储/撤回事实,并且偶尔为了恢复目的将整个数据库保存到文件中。然后,有时可能会将数据库恢复到内存中。

感谢提前的帮助。

1 答案

0 投票

看起来nippy可以与标准序列化一起工作,因为逻辑事实数据库是用已经可以序列化的Clojure类型实现的。

(ns logos.serial
  (:require [taoensso.nippy :as nippy]
            [clojure.core.logic.pldb :as pldb]
            [clojure.core.logic :as log]
            [clojure.java.io]))

(defn freeze-to! [o target & {:keys [compressor] :or {compressor nippy/lz4hc-compressor}}]
  (with-open [buff (clojure.java.io/output-stream target)
              dos (java.io.DataOutputStream. buff)]
    (nippy/freeze-to-out! dos  o)))

(defn thaw-from! [target & {:keys [compressor] :or {compressor nippy/lz4hc-compressor}}]
  (with-open [fis (clojure.java.io/input-stream target)
              dis (java.io.DataInputStream. fis)]
    (nippy/thaw-from-in! dis )))

(pldb/db-rel man p)
(pldb/db-rel woman p)
(pldb/db-rel likes p1 p2)
(pldb/db-rel fun p)

(def facts0
  (pldb/db
   [man 'Bob]
   [man 'John]
   [man 'Ricky]

   [woman 'Mary]
   [woman 'Martha]
   [woman 'Lucy]

   [likes 'Bob 'Mary]
   [likes 'John 'Martha]
   [likes 'Ricky 'Lucy]))


(def facts1 (-> facts0 (pldb/db-fact fun 'Lucy)))

查询和测试

(defn simple-query [db]
  (pldb/with-db db
    (log/run* [q]
      (log/fresh [x y]
        (fun y)
        (likes x y)
        (log/== q [x y])))))

;;logos.serial>(simple-query facts1)
;;([Ricky Lucy])

(freeze-to! facts1 "facts.lz4")
(def facts-thawed (thaw-from! "facts.lz4"))

;;logos.serial>(= facts1 facts-thawed)
;;logos.serial> (simple-query facts-thawed)
;;([Ricky Lucy])
谢谢。  我之前没有看过。  这应该没问题。  

我还用spit/slurp命令使它运行。 所以,我不知道我之前在做什么。 可能是做了些愚蠢的事情。

再次感谢您的回答。  现在要去检查一下nippy...
由于实现细节是基于map/record的,并且有可读的表示形式,所以spit/slurp将工作。 根据你序列化东西的大小、冻融的频率以及其他如压缩等问题,我认为nippy几乎在所有情况下都占据主导地位(只有spit/slurp是内建的 :))。 尽管如此,使用spit/slurp进行穷人序列化竟然非常有用。
欢迎来到Clojure问答社区,您可以在此提问,并从Clojure社区成员那里获得答案。
...