【问题标题】:Inconsistent query result查询结果不一致
【发布时间】:2021-01-14 20:56:35
【问题描述】:

这是关于 datomic on-prem 版本 1.0.6202 的问题

当我这样做时:

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

(这是正确的结果)

为什么 = 运算符在这里不起作用?

【问题讨论】:

    标签: clojure datomic


    【解决方案1】:

    我不知道 datomic,我也不是 java 大师,但请考虑一下

    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)
    

    这是假的

    【讨论】:

      【解决方案2】:

      您必须将恒定绑定设置为“地面”。在 datomic 中,它类似于 [(ground true) ?val]。但是,如果您将常量保留在元组中(例如在第二种情况下),则默认情况下,datomic 会将其视为“接地”。

      【讨论】:

        猜你喜欢
        • 2014-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-12
        • 2016-06-10
        • 1970-01-01
        相关资源
        最近更新 更多