如何将地图作为?input
传递给Datomic查询并解构地图以与事实进行匹配?
运行以下查询时,我得到一个NullPointerException
:
(d/q '[:find ?e
:where
:in $ ?input
[?e :amount ?amount]
[(:amount ?input) ?amount]]
(d/db conn)
{:amount 123.0M})
=> Syntax error (NullPointerException) compiling at ...
但是,将金额作为输入参数传递是可行的:
(d/q '[:find ?e
:where
:in $ ?amount
[?e :amount ?amount]
(d/db conn)
123.0M)
=> [[1234]]
答案 0 :(得分:1)
您不能将地图传递到Datalog查询中,您只能使用标量,元组,集合和关系:
如果您的地图比示例复杂得多,并且需要使用其中的许多值,则必须在查询之外对它进行解构(如@Alan Thompson所建议),并将值作为元组传递给< / p>
(let [input-fn (juxt :amount :timestamp :quantity)
input-data {:timestamp "29/08/2019" :quantity 3 :amount 123.0}
inputs (input-fn input-data)]
(d/q '[:find ?e
:in $ [?amount ?timestamp ?quantity]
:where
[?e :amount ?amount]
[?e :timestamp ?timestamp]
[?e :quantity ?quantity]]
(d/db conn)
inputs))