4

我正在尝试使用 Scala 包装器 Datomisca 编写一个调用2 个规则的Datomic查询。

如何组合两个单独的查询?

我的代码如下所示:

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是宏,我必须使用文字字符串值,否则将无法编译。

4

1 回答 1

2

您可以通过将规则视为Strings 可以连接它们来组合规则。你没有得到静态类型检查的好处,但我还没有找到任何其他方法。

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

Datomic.q(Query(...), conn.db(), DString(s"[$rule1 $rule2]"), ...)
于 2014-01-22T14:14:40.247 回答