java - 如何在 Datomic 查询中使用/?

标签 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 文件中找不到源代码。 在 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/

相关文章:

windows - 来自 USB 驱动器的 Clojure REPL

database - 如何防止事务违反 Datomic 中的应用程序不变量

Datomic:强大的设置以避免超时和内存不足错误

clojure - 在 datomic 中获取插入实体的 ID?

java - java.util.concurrent.locks.Lock 的 AutoCloseable 包装器有任何风险吗?

java - @see 标记,链接其他类方法

java - 通过Servlet动态更新JSP页面

java - Spring WebFlux 无法将阻塞操作切换到结果中的其他调度程序

Clojure 宏问题

unit-testing - Clojure - 测试 Pedestal 路线