这个查询
[:find ?p ?af
:where [?p :person/age ?pa]
[?p :person/father ?f]
[?f :person/age ?fa]
[(/ ?pa ?fa) ?af]]
只返回四舍五入(到小数点后 0 位)的值?af
,所以我不能添加 sth。像
[(< 0.25 ?af)]
[(< ?af 0.5)]
到 :where 子句。
我已经尝试在查询中强制转换为各种类型,例如
[(double ?pa) ?pa2]
但这只会影响结果类型,而不会删除舍入。
如果你知道一些事情并且有经验,那么我在 Datomic 方面还有很多(尤其是与类型相关的)问题。但是我还没有找到解决这个除法查询问题的解决方法(除了查询后除法),我真的希望它不是由于 Datomic 的早期开发阶段造成的。我猜是因为 Datomic 不支持 Ratio 类型,它们是四舍五入的,但小数点后几位会非常好。
我正在将 Datomic 与 Clojure 一起使用。
编辑我找到了一个解决方法,但是我仍然想知道为什么它是必要的。
解决方法:
采用
clojure.core//
[:find ?p ?af :where [?p :person/age ?pa] [?p :person/father ?f] [?f :person/age ?fa] [(clojure.core// ?pa ?fa) ?af]]
但我当然想知道哪个 / 被调用(在没有完全限定的命名空间的情况下调用)以及在哪里可以找到它的文档,以便我可以了解其他运算符的其他可能问题。
EDIT2:通过设计一个除以零的查询来调用异常,我发现clojure.lang.Numbers/quotient
调用了静态方法。我怎么会知道这个?看起来 Datomic 不是开源的,至少我在 jar 文件中找不到源代码。使用clojure.tools.trace
on datomic.datalog
,我发现调用是通过解析/
from发生的datomic.extensions
。在datomic.extions
中,/
定义为clojure.core/quot
,它调用clojure.lang.Numbers/quotient
。
就我而言,所有这些都没有记录。