Datomic 不是属性的有效 :uri

Datomic not a valid :uri for attribute

我正在尝试在定义为

的属性上插入一个值
{:db/ident       :foo/uri
 :db/valueType   :db.type/uri
 :db/cardinality :db.cardinality/one
 :db/doc         "Test attribute of value type uri."}

我正在插入

{:foo/uri "scheme://host/path"}

并得到

Execution error (ExceptionInfo) at datomic.client.api.async/ares (async.clj:58).
Value scheme://host/path is not a valid :uri for attribute :foo/uri

我不知道要在此处插入什么。它应该是一个字符串,对吧?没有 reader 文字?

我在网上找到了零个这样的例子。还看了下这个对应的java class但是没有光照。或者它可能需要一个 java.net.URI 的实例,所以要将它放在 edn 中,我们需要安装我们自己的 reader 文字?

它确实需要是 java.net.URI 的一个实例。

如果它是您代码的一部分,您可以在创建它时将其包装起来:

{:foo/uri (new java.net.URI "scheme://host/path")}

如果你想从 edn 文件中读取它,那么你可以在文件中使用自定义标签,比如 #URI,并将自定义 reader 函数作为选项传递给 edn/read-string:

;;; in some file located at `path`
{:foo/uri #URI"scheme://host/path"}

;;; code to read the file at `path`
(require '[clojure.edn :as edn])
(-> path
    slurp
    (edn/read-string {:readers {'URI #(new java.net.URI %)}})

您也可以使用 clojure.tools.reader 执行此操作,它允许不安全的代码执行(因此可能不推荐):

;;; use reader tools
(require '[clojure.tools.reader :as r])
(r/read-string "{:foo/uri #=(new java.net.URI \"scheme://host/path\")}")