这个查询

[:find ?p ?af
 :where [?p :person/age ?pa]
        [?p :person/father ?f]
        [?f :person/age ?fa]
        [(/ ?pa ?fa) ?af]]


仅返回?af的舍入(小数点后0位)值,因此我无法添加sth。喜欢

 [(< 0.25 ?af)]
 [(< ?af 0.5)]


到:where子句。

我已经尝试过对查询中的各种类型进行强制类型转换

[(double ?pa) ?pa2]


但这只会影响结果类型,而不会删除舍入。

如果您知道一些东西并且有经验,那么Datomic还有很多其他问题(尤其是与类型相关的问题)。但是,我没有找到解决该拆分查询问题的方法(查询后除拆分),我真的希望它不归因于Datomic的早期开发阶段。我猜是因为Datomic不支持Ratio类型,所以它们是四舍五入的,但是小数点后的位确实会很好。

我在Clojure中使用Datomic。

编辑我找到了解决方法,但是我仍然想知道为什么有必要。

解决方法:


使用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

就我而言,所有这些都没有记载。

最佳答案

实际上,这是一个未记录的功能。 Stuart Halloway刚刚在Datomic group中确认了这一点:


  因为您缺少查询中可用的运算符的文档
  发现。我们正在为此努力,感谢您的报告。 /
  运算子目前仅执行整数除法,我们正在寻找
  在不使消费者暴露于某种类型的情况下变富的方法
  (比率)大多数JVM语言没有的。


关于正确的解决方法,我将不断更新此答案。

关于java - 如何在Datomic查询中使用/?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18016930/

10-15 11:47