如何在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