regex - 数据原子查询 - 过滤和绑定(bind)的函数

标签 regex clojure datomic

我希望能够做这样的事情:

(defn match? [m] (re-find (re-pattern "so (\\d+)") m))

(datomic.api/q 
  '[:find ?m
    :where [[?e :user/regex-match ?r]
            [(user/match? ?e) ?m]] 
   dbconn)

这给了我我所期望的,但它称为“匹配?”每个实体两次:

(datomic.api/q 
  '[:find ?m
    :where [[?e :user/regex-match ?r]
            [(user/match? ?e) ?m]
            [(user/match? ?e)] 
   dbconn)

最佳答案

如果您担心性能,请使用:

(->> (d/datoms (d/db conn) :aevt :user/regex-match)
 (filter #(user/match? (:v %)))
 (map :v))

它使用 datomic.api/datoms用于流式传输与谓词匹配的 :user/regex-match 属性值的 API,即 user/match?。这保证您的谓词函数仅执行一次(每个实体)。请注意,您可以将 (map :v) 替换为 (map :e) 来检索其实体 ID。

如果您真的担心性能并且愿意使用额外的内存来实现它,请使用:

(def fast-match? (memoize match?))

(->> (d/datoms (d/db conn) :aevt :user/regex-match)
 (filter #(fast-match? (:v %)))
 (map :v))

这会创建一个 memoized你的函数的版本。此版本具有更强的性能保证,因为您的谓词函数将最多运行一次(即每个不同值运行一次),并且如果您的属性值是有限集的一部分,它可以为您提供卓越的性能。

有关完整的代码示例,请参阅 https://gist.github.com/a2ndrade/5651065

关于regex - 数据原子查询 - 过滤和绑定(bind)的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16386793/

相关文章:

macros - 为什么 clojure 向反引号内的名称添加 namespace 限定符?

regex - 如何使用正则表达式和R正确编辑字符串?

clojure - 在 datomic 中获取插入实体的 ID?

java - 如何使用正则表达式获得正确的子字符串

java - Clojure 在项目中的用例

clojure 如何同时对两个 seq 的元素执行函数?

clojure - 当需要处理 seq 两次时,如何实现不保留头部的惰性 seq?

clojure - lein 在 mac 上安装 datomic 对等库

python - 正则表达式:搜索几个可能的组

java - 过滤带点并以方括号结尾的单词