数据记录中的参数化和不区分大小写的查询(datomic)

时间:2015-08-23 07:10:54

标签: datomic datalog

我想编写一个查询,它将firstname作为输入参数并返回所有匹配的记录。匹配应该不区分大小写。作为一个例子,我想提取所有名为道格拉斯的人。参数化,但区分大小写的是:

SELECT *

以下查询将产生所有匹配,无论大小写如何,但未参数化(?par尚未使用,但是参数化查询的占位符):

(d/q '[:find (pull ?e [*])
       :in $ ?par
       :where
       [?e :person/firstname ?par]
       ] db "Douglass")

但我无法将它们结合起来。 A - 可能是天真的 - 方法是投掷(d/q '[:find (pull ?e [*]) :in $ ?par :where [?e :person/firstname ?bfn] [(re-find (re-pattern "(?i)DouGLASS") ?bfn)] ] db "")

Unable to resolve symbol: ?par in this context

那么:如何传递这个案例的名字?

1 个答案:

答案 0 :(得分:1)

正如here所述,问题是Datomic Datalog中的函数表达式没有嵌套。您可以像这样分解它(对mbrainz数据库使用经过测试的查询)。

(d/q '[:find ?name ?year
       :in $ ?match
       :where [(str "(?i)" ?match) ?matcher]
              [(re-pattern ?matcher) ?regex]
              [(re-find ?regex ?aname)]
              [?a :artist/name ?aname]
              [?r :release/artists ?a]
              [?r :release/name ?name]
              [?r :release/year ?year]]
     (d/db conn) "pink floyd")

返回:

#{["Point Me at the Sky" 1972]
  ["Any Colour You Like" 1972]
  ["The Dark Side of the Moon" 1973]
  ["Obscured by Clouds" 1972]
  ...

您也可以编写自己的函数并从Datalog调用它。