如何在Datomic查询中使用/?

这个查询

[: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]]
    
  • 但我当然想知道哪些/被调用(当没有完全限定的名称空间时被调用)以及我可以在哪里找到它的文档,以便我可以了解其他运算符可能遇到的其他问题。

    编辑2:通过设计一个查询除以零来调用异常,我发现调用了静态方法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集团中证实了这一点:

    正如您发现的,查询中可用操作员的文档缺失。 我们正在努力,感谢报告。 /运算符目前仅执行整数除法,并且我们正在研究如何使更加丰富,而不将消费者暴露给大多数JVM语言所没有的类型(比率)。

    关于正确的解决方法,我会保持这个答案更新。

    链接地址: http://www.djcxy.com/p/65259.html

    上一篇: How to use / in a Datomic query?

    下一篇: Data modeling in Datomic