如何在Datomic查询中使用/?

时间:2013-08-02 12:30:13

标签: java clojure datomic datalog

此查询

[: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}}。

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

1 个答案:

答案 0 :(得分:0)

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

  

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

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