2013-04-19 60 views
1

我正在通過following example在的克隆中使用lein repl。我已經運行:Cascalog first-n - 無法加入謂詞

(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) 

這似乎是一個查詢創建VS執行的事情。是否有可能創建一個執行此查詢的查詢?

回答

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和Δy內queryx定義僅適用於該查詢,他們是不會自動適用於在任何你正在使用queryx數據srouce,因此你需要明確它們綁定如上圖所示。