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

时间:2016-08-12 00:13:13

标签: datomic

我创建了一个具有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}
             ])

并确认它是使用datomic控制台创建的。碰巧以下查询未按预期返回先前插入的实体:

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

也许我错过了表达价值的方式。对属性:home / area使用不同值(如100N)的另一个测试返回正确的答案:

(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]}

也适用于值111111111111111111111111111111111111N,这让我感到困惑。

  

Datomic版本:" 0.9.5390" java版" 1.8.0_05" Java(TM)SE   运行时环境(build 1.8.0_05-b13)Java HotSpot(TM)64位   服务器VM(构建25.5-b02,混合模式)MySQL作为存储服务

提前感谢任何建议。

2 个答案:

答案 0 :(得分:1)

对于Clojure用户,名称:db.type/bigint可能会产生误导,因为it actually mapsjava.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)
     )

答案 1 :(得分:1)

我运行了你的例子并得到了不同的结果(它适用于所有情况)。我不知道为什么,但也许添加我的例子会有所帮助。我所做的唯一更改是使用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,我假设你有多个例子)