将?input映射作为Datomic查询参数传递

时间:2019-08-19 10:52:01

标签: database clojure datomic

如何将地图作为?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]]

1 个答案:

答案 0 :(得分:1)

您不能将地图传递到Datalog查询中,您只能使用标量,元组,集合和关系:

Datomic Query Bindings

如果您的地图比示例复杂得多,并且需要使用其中的许多值,则必须在查询之外对它进行解构(如@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))