【问题标题】:Parameterized and case insensitive query in datalog (datomic)数据日志中的参数化和不区分大小写的查询(datomic)
【发布时间】:2015-08-23 07:10:54
【问题描述】:

我想编写一个以名字作为输入参数并返回所有匹配记录的查询。匹配应该不区分大小写。作为一个例子,我想提取所有名为 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 "")

但我无法将它们结合起来。 A - 可能是幼稚的 - 方法是抛出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")

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

【问题讨论】:

    标签: datomic datalog


    【解决方案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 中调用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-17
      • 2022-06-26
      • 1970-01-01
      • 2013-06-03
      相关资源
      最近更新 更多