此查询
[: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文件中的源代码。
在clojure.tools.trace
上使用datomic.datalog
,我发现通过从/
解析datomic.extensions
来进行调用。在datomic.extions
/
中,clojure.core/quot
定义为clojure.lang.Numbers/quotient
,会调用{{1}}。
就我而言,所有这些都没有记载。
答案 0 :(得分:0)
实际上,这是一个没有文档记录的功能。 Stuart Halloway刚刚在Datomic group中确认了这一点:
您缺少查询中可用运算符的文档 发现。我们正在努力,感谢报告。 / operator目前只执行整数除法,我们正在寻找 如何在不让消费者暴露于某种类型的情况下使其更富裕 (比率),大多数JVM语言都没有。
关于正确的解决方法,我会更新此答案。