1

我正在从cascalog 项目的克隆中的 lein repl 中完成以下示例。我跑过:

(def src [[1] [3] [2]])

(def queryx (<- [?x ?y] (src ?x) (inc ?x :> ?y)))

(?<- (stdout) [?x ?y] 
(queryx ?x ?y))
-- works

(?- (stdout) queryx) ;; produces (([1 2] [2 3] [3 4]))
-- works

(?- (stdout) (first-n queryx 1 :sort ["?x"] :reverse true))
--works

但是当我尝试这个时:

(?<- (stdout) [?x ?y] (first-n queryx 1 :sort ["?x"] :reverse true))

我明白了

IllegalArgumentException Unable to join predicates together  jackknife.core/throw-illegal (core.clj:100)

这似乎是一个查询创建与执行的事情。是否可以创建执行此查询的查询?

4

1 回答 1

2

根据文档,first-n返回一个查询,一个查询对象也可以作为数据源。

如果你这样做,以你自己的例子:

(?<- (stdout) [?x ?y] (queryx ?x ?y))

您将 ?x 和 ?y 绑定到查询的输出,因此它可以工作。

在错误代码中,没有绑定 ?x 和 ?y ,这就是异常的原因。只需添加绑定即可。

(?<- (stdout) [?x ?y] ((first-n queryx 1 :sort ["?x"] :reverse true) ?x ?y))

请记住,内部定义的 ?x 和 ?yqueryx仅适用于该查询,并且它们不会自动用于您使用该 queryx 作为数据源的任何地方,因此您需要如上所示显式绑定它们。

于 2013-04-19T08:09:28.530 回答