我创建了一个具有一个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
上失败,而不是100N
和111111111111111111111111111111111111N
。然而,下面的方法似乎总是有效的:
(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,我假设你有多个例子)。