使用bigint属性查询某些值返回空



我创建了一个具有一个bigint类型属性的最小实体,我的问题是查询某些值失败;这是模式:

  [{:db/ident :home/area,
    :db/valueType :db.type/bigint,
    :db/cardinality :db.cardinality/one,
    :db/doc "the doc",
    :db.install/_attribute :db.part/db,
    :db/id #db/id[:db.part/db -1000013]}]

我插入了一个样例值:

(d/transact (d/connect uri2)
            [{
              :db/id #db/id[:db.part/user]
              :home/area 123456789000000N}
             ])

并确认它是通过使用数据控制台创建的。下面的查询没有像预期的那样返回先前插入的实体:

(d/q '[
       :find ?e
       :in $ ?h
       :where
       [?e :home/area ?h]]
     (d/db (d/connect uri2))
     123456789000000N
     )
;;--- #{}

也许我在值的表达方式上遗漏了一些东西。另一个测试使用不同的值,如100N作为属性:home/area,返回正确的答案:

(d/transact (d/connect uri2)
            [{
              :db/id #db/id[:db.part/user]
              :home/area 100N}
             ])
(d/q '[
       :find ?e
       :in $ ?h
       :where
       [?e :home/area ?h]]
     (d/db (d/connect uri2))
     100N
     )
;;-- #{[17592186045451]}

与值111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111n也可以正常工作,这让我感到困惑。

java版本:"0.9.5390" java版本"1.8.0_05" java (TM) SE运行环境(build 1.8.0_05-b13) Java HotSpot(TM) 64位Server VM (build 25.5-b02, mixed mode) MySQL作为存储服务

提前感谢您的任何建议

对于Clojure用户来说,名称:db.type/bigint可能会产生误导,因为它实际上映射到java.math.BigInteger,而不是clojure.lang.BigInt

我复制了相同的步骤,我不能告诉你为什么Datalog查询在123456789000000N上失败,而不是100N111111111111111111111111111111111111N。然而,下面的方法似乎总是有效的:

(d/q '[
       :find ?e
       :in $ ?h
       :where
       [?e :home/area ?h]]
     (d/db (d/connect uri2))
     (.toBigInteger 100N)
     )

我运行了您的示例并得到了不同的结果(它在所有情况下都有效)。我不知道为什么,但也许添加我的例子会有所帮助。我所做的唯一更改是使用uri而不是uri2,我使用了模式,并执行了(def conn (d/connect uri))(d/create-database uri)。我假设您执行了类似的步骤,这就是为什么我不知道为什么我的示例工作:

 Clojure 1.8.0
 user=> (use '[datomic.api :only [q db] :as d])
 nil
 user=> (use 'clojure.pprint)
 nil
 user=> (def uri "datomic:mem://bigint")
 #'user/uri
 user=> (d/create-database uri)
 true
 user=> (def conn (d/connect uri))
 #'user/conn
 user=> (def schema-tx (read-string (slurp "path/to/the/schema.edn")))
 #'user/schema-tx
 user=> @(d/transact conn schema-tx)
 {:db-before datomic.db.Db@b8774875, 
        :db-after datomic.db.Db@321a2712, 
 :tx-data [#datom[13194139534312 50 #inst "2016-08-14T18:53:23.158-00:00" 13194139534312 true] 
       #datom[63 10 :home/area 13194139534312 true] #datom[63 40 60 13194139534312 true] 
       #datom[63 41 35 13194139534312 true] #datom[63 62 "the doc" 13194139534312 true] 
       #datom[0 13 63 13194139534312 true]], 
 :tempids {-9223367638809264717 63}}
(d/transact (d/connect uri)
   [{
:db/id #db/id[:db.part/user]
:home/area 123456789000000N}
    ])
 #object[datomic.promise$settable_future$reify__6480 0x5634d0f4 
    {:status :ready, :val {:db-before datomic.db.Db@321a2712, 
                                      :db-after datomic.db.Db@f6ef3cd8, 
                           :tx-data [#datom[13194139534313 50 #inst "2016-08-14T18:53:34.325-00:00" 13194139534313 true] 
                                     #datom[17592186045418 63 123456789000000N 13194139534313 true]], 
                           :tempids {-9223350046623220288 17592186045418}}}]
 (d/q '[
   :find ?e
   :in $ ?h
   :where
   [?e :home/area ?h]]
   (d/db (d/connect uri))
   123456789000000N
   )
 #{[17592186045418]}
 (d/transact (d/connect uri)
   [{
:db/id #db/id[:db.part/user]
:home/area 100N}
    ])
 #object[datomic.promise$settable_future$reify__6480 0x3b27b497 
    {:status :ready, :val {:db-before datomic.db.Db@f6ef3cd8, 
                                      :db-after datomic.db.Db@2385c058, 
                           :tx-data [#datom[13194139534315 50 #inst "2016-08-14T18:54:13.347-00:00" 13194139534315 true] 
                                     #datom[17592186045420 63 100N 13194139534315 true]], 
                           :tempids {-9223350046623220289 17592186045420}}}]
 (d/q '[
   :find ?e
   :in $ ?h
   :where
   [?e :home/area ?h]]
   (d/db (d/connect uri))
   100N
   )
 #{[17592186045420]}
  user=>

您可以在REPL行上运行(first schema-tx)来确认您的模式已被事务处理吗?我注意到你正在使用控制台,我想知道/bigint是否没有得到定义,或者你正在看第一个uri(因为我注意到你有一个2,我假设你有多个例子)。

最新更新