Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 不一致的查询结果_Clojure_Datomic - Fatal编程技术网

Clojure 不一致的查询结果

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]

这是关于prem 1.0.6202版上的datomic的问题

当我这样做时:

(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将默认将其视为“固定”