Clojure 不一致的查询结果
这是关于prem 1.0.6202版上的datomic的问题 当我这样做时:Clojure 不一致的查询结果,clojure,datomic,Clojure,Datomic,这是关于prem 1.0.6202版上的datomic的问题 当我这样做时: (d/q '[:find ?LDCustomer-influencer :in $ [?user ...] :where [?LDCustomer-influencer :LDCustomer/baseUser ?LDUser-influencer] [?LDCustomer-influencer :LDCustomer/isInfluencer ?val]
(d/q '[:find ?LDCustomer-influencer :in $ [?user ...]
:where [?LDCustomer-influencer :LDCustomer/baseUser ?LDUser-influencer]
[?LDCustomer-influencer :LDCustomer/isInfluencer ?val]
[(= ?val true)]]
(d/db db/conn) #{17592186248068})
(d/q '[:find ?LDCustomer-influencer :in $ [?user ...]
:where [?LDCustomer-influencer :LDCustomer/baseUser ?LDUser-influencer]
[?LDCustomer-influencer :LDCustomer/isInfluencer true]]
(d/db db/conn) #{17592186248068})
我得到:
#{}
#{[17592186093717] [17592186246464] [17592186248205] [17592186233070]}
当我这样做时:
(d/q '[:find ?LDCustomer-influencer :in $ [?user ...]
:where [?LDCustomer-influencer :LDCustomer/baseUser ?LDUser-influencer]
[?LDCustomer-influencer :LDCustomer/isInfluencer ?val]
[(= ?val true)]]
(d/db db/conn) #{17592186248068})
(d/q '[:find ?LDCustomer-influencer :in $ [?user ...]
:where [?LDCustomer-influencer :LDCustomer/baseUser ?LDUser-influencer]
[?LDCustomer-influencer :LDCustomer/isInfluencer true]]
(d/db db/conn) #{17592186248068})
我得到:
#{}
#{[17592186093717] [17592186246464] [17592186248205] [17592186233070]}
(哪个是正确的结果)
<为什么操作符不在这里工作?< /P> < P>我不知道datomic,我不是java大师,但考虑这个< /P>
user=> (= true [1])
false
user=> (= true 1)
false
(clojure.repl/source clojure.core/=)
; uses `clojure.lang.Util/equiv under the hood
; https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/Util.java#L24
static public boolean equiv(Object k1, Object k2){
if(k1 == k2) // !! this will be false
return true;
if(k1 != null) // !! neither of these will succeed
{
if(k1 instanceof Number && k2 instanceof Number)
return Numbers.equal((Number)k1, (Number)k2);
else if(k1 instanceof IPersistentCollection || k2 instanceof IPersistentCollection)
return pcequiv(k1,k2);
return k1.equals(k2);
}
return false; // !! you end up with false
}
我认为最终可以归结为以下java
(Object) Integer.valueOf(1) == (Object) Boolean.valueOf(true)
这是错误的您必须将常量绑定为“ground”。在datomic中,它类似于
[(地面真实)?val]
。但是,如果将常量保留在元组中(如第二种情况),datomic将默认将其视为“固定”