我创建了一个具有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作为存储服务
提前感谢任何建议。
答案 0 :(得分:1)
对于Clojure用户,名称:db.type/bigint
可能会产生误导,因为it actually maps到java.math.BigInteger
,而不是clojure.lang.BigInt
。
我重现了相同的步骤,但我无法告诉您为什么Datalog查询在123456789000000N
上失败,但在100N
和111111111111111111111111111111111111N
失败。但是,似乎以下情况始终有效:
(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,我假设你有多个例子)