【问题标题】:How to use / in a Datomic query?如何在 Datomic 查询中使用 /?
【发布时间】:2013-08-02 12:30:12
【问题描述】:

这个查询

[: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 文件中找不到源代码。 在datomic.datalog 上使用clojure.tools.trace,我发现调用是通过从datomic.extensions 解析/ 发生的。在datomic.extions中,/定义为clojure.core/quot,它调用clojure.lang.Numbers/quotient

就我而言,所有这些都是无证的。

【问题讨论】:

  • 我能够重现您的问题。这似乎是一个错误/未记录的“功能”。
  • @ponzao:感谢转载!如果这是一个功能,那么他们的示例确实具有误导性。他们使用 *,就像我在我的 HP 计算器 (docs.datomic.com/query.html) 上使用它一样。我昨天在 Datomic 用户组中询问过这个问题,还没有人回答。

标签: java clojure datomic datalog


【解决方案1】:

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

查询中可用的运算符的文档丢失,因为您 发现。我们正在努力,感谢您的报告。这 / 运算符目前只执行整数除法,我们正在寻找 在不让消费者接触到某种类型的情况下,让这种方式变得更丰富 (比率)是大多数 JVM 语言所没有的。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多