这个查询
[:find ?p ?af
:where [?p :person/age ?pa]
[?p :person/father ?f]
[?f :person/age ?fa]
[(/ ?pa ?fa) ?af]]
仅返回 ?af
的四舍五入值(小数点后 0 位),因此我无法添加某事。喜欢
[(< 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 文件中找不到源代码。
在 datomic.datalog
上使用 clojure.tools.trace
,我发现调用是通过从 datomic.extensions< 解析
。在/
发生的datomic.extions
中,/
被定义为clojure.core/quot
,它调用了clojure.lang.Numbers/quotient
.
就我而言,所有这些都没有记录在案。
最佳答案
确实,这是一个未记录的功能。 Stuart Halloway 刚刚在 Datomic group 中证实了这一点:
Documentation for the operators available in query is missing, as you discovered. We are working on that, thanks for the report. The / operator currently performs integer division only, and we are looking into ways to make that richer without exposing consumers to a type (ratio) that most JVM languages do not have.
关于正确的解决方法,我会及时更新此答案。
关于java - 如何在 Datomic 查询中使用/?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18016930/