2014-01-13 34 views
3

我正在嘗試編寫Datomic查詢,該查詢使用Scala包裝器Datomisca調用2個規則。結合Datomisca中的查詢規則

如何組合兩個單獨的查詢?

我的代碼如下所示:

val rule1 = Query.rules("[[(rule1 ?a) [ ... ]]]") 
val rule2 = Query.rules("[[(rule2 ?b) [ ... ]]]") 

Datomic.q(Query("""[:find ?x 
        :in $ % % 
        :where (rule1 ?a) (rule2 ?b)]"""), conn.db(), rule1, rule2) 

這給了我一個錯誤關於「無法解析鍵rule1」)。我只用了一個%,但它不會編譯(類型不匹配)。

我寧願不在一個字符串中將它們合併到Query.rules,因爲這意味着我必須重複它們以使用不同的規則組合(例如:一個查詢與兩個,另一個只有rule1)。

由於Query.rules是一個宏,我必須使用文字字符串值,否則它將不會編譯。

回答

1

您可以將規則對待爲String來將它們連接起來。你沒有得到靜態類型檢查的好處,但我還沒有找到任何其他方式。

val rule1 = "[[(rule1 ?a) [ ... ]]]" 
val rule2 = "[[(rule2 ?b) [ ... ]]]" 

Datomic.q(Query(...), conn.db(), DString(s"[$rule1 $rule2]"), ...)