これは、私が Datomic google グループで行った質問の再投稿です (ここを参照してください - 最後の 3 つの投稿が最適です)。
この問題は、Datomic クエリを動的に生成しているという事実に関係しています。したがって、パラメーター (名前と値) の数は、関数に渡されるまでわかりません。クエリをうまく生成できます。核となる問題は、Clojure Datomic API を使用すると、動的な数の引数でdatomic.api/q関数を呼び出すことができないことです。したがって、以下の~@unquote-splice式は失敗します。partialやapplyなど、他のいくつかのアプローチを試しましたが、役に立ちませんでした。
(def expression-final `(datomic.api/q ~expression-intermediate ~db-conn ~@param-values)) ;; gives the error in question
(eval expression-final)
java.lang.Exception: processing rule: (q__34868 ?e)
at datomic.datalog$eval_rule$fn__4687.invoke(datalog.clj:977)
at datomic.datalog$eval_rule.invoke(datalog.clj:957)
at datomic.datalog$eval_query.invoke(datalog.clj:999)
at datomic.datalog$qsqr.invoke(datalog.clj:1053)
at datomic.datalog$qsqr.invoke(datalog.clj:1021)
at datomic.query$q.invoke(query.clj:453)
at datomic.api$q.doInvoke(api.clj:31)
... 1 stack levels elided ...
at user$eval34866.invoke(crud_spec.clj:32)
... 3 stack levels elided ...
at stefon_datomic.crud$retrieve_entity.invoke(crud.clj:95)
...
Caused by: java.lang.Exception: processing clause: [?e :posts/title (quote ?title)] ;; this fails with or without the (quote ...)
at datomic.datalog$eval_clause$fn__4667.invoke(datalog.clj:934)
at datomic.datalog$eval_clause.invoke(datalog.clj:900)
at datomic.datalog$eval_rule$fn__4687.invoke(datalog.clj:972)
at datomic.datalog$eval_rule.invoke(datalog.clj:957)
...
Caused by: java.lang.UnsupportedOperationException: nth not supported on this type: Symbol
... 2 stack levels elided ...
at datomic.datalog$extrel_coll$fn__4384.invoke(datalog.clj:197)
... 4 stack levels elided ...
at datomic.datalog$iterator.invoke(datalog.clj:30)
これは Datomic Clojure API のバグなのだろうか? または、動的な数の変数を渡す簡単な方法がある場合。渡される変数の量をハード コーディングすると、クエリを動的に生成する目的が無効になります。詳細については、ここの最後の3 つの投稿を参照してください。
ありがとう