datomic - 数据日志中的参数化和不区分大小写的查询(数据)

标签 datomic datalog

我想编写一个以名字作为输入参数并返回所有匹配记录的查询。匹配应该不区分大小写。例如,我想提取所有名为 Douglass 的人。参数化,但区分大小写,这将是:

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

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

(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 :

(d/q '[:find (pull ?e [*])
       :in $ ?par
       :where
       [?e :person/firstname ?bfn]
       [ (re-find (re-pattern (str "(?i)" ?par)) ?bfn)]
       ] db "Douglass")

那么:如何为这种情况传递名字?

最佳答案

如所述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 中调用它。

关于datomic - 数据日志中的参数化和不区分大小写的查询(数据),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32164131/

相关文章:

clojure - 数据查询和懒惰

heroku - 如何在 Heroku 上使用 Datomic Pro?

clojure - 合并原子查询结果中的某些属性

java - 如何使用 Datalog 查询接口(interface)公开巨大的语义图(链接数据)

encoding - 如何在 LogicBlox 中编码 "implies"逻辑?

database - 令人困惑的DES Datalog语法错误

amazon-web-services - 由 : java. lang.ClassNotFoundException : com. amazonaws.services.dynamodbv2.model.PutItemRequest 引起

java - GDL Antlr语法

prolog - Datalog、CLIPS、Prolog