clojure - DataScript / datahike 规则不返回任何内容
问题描述
我尝试在datahike的数据库的多个字段中搜索字符串。到目前为止没有成功。到目前为止,这是我最大的努力方法:
(ns my.ns
(:require [clojure.string :as st]
[datahike.api :as dh]))
(def card-db [[1 :card/name "CardA"]
[1 :card/text "Text of CardA mentioning CardB"]
[2 :card/name "CardB"]
[2 :card/text "A mystery"]])
(def rules '[
[
(matches-name ?ent ?fn ?str)
[?ent :card/name ?name]
(?fn ?name ?str)]
[(matches-text ?ent ?fn ?str)
[?ent :card/text ?text]
(?fn ?text ?str)
]
])
(defn my-search [db search-strs]
(dh/q '[:find ?e
:in $ % ?fn [?str ...]
:where
[?e :card/name ?name]
#_[(?fn ?name ?str)] ;; this finds CardB
(or
(matches-name ?e ?fn ?str)
(matches-text ?e ?fn ?str)
) ;; this finds nothing
]
db rules st/includes? search-strs))
#_(count (my-search card-db ["CardB"]))
预期结果:2
实际结果:0
就我而言,解决方案不需要使用规则。如果在多个字段中的至少一个中找到一个字符串,它应该只返回一个匹配项。
我在用着[io.replikativ/datahike "0.1.1"]
解决方案
DataScript 还不支持or
。我认为 Datahike 两者都没有。但是您可以使用规则来模拟它。尝试:
(def rules '[[(matches ?ent ?fn ?str)
[?ent :card/name ?name]
(?fn ?name ?str)]
[(matches ?ent ?fn ?str)
[?ent :card/text ?text]
(?fn ?text ?str)]])
(defn my-search [db search-strs]
(dh/q '[:find ?e
:in $ % ?fn [?str ...]
:where [?e :card/name ?name]
(matches ?e ?fn ?str)]
db rules st/includes? search-strs))
推荐阅读
- sap-cloud-platform - 使用 Cloud SDK 定义 S4HANA BAPI 调用的 SCP 目标
- apache - 在 MacOS 上的 Apache 中启用 CGI
- reactjs - 如何在 React 中自定义 Reactstrap 按钮?
- git - .gitignore 到底是什么
- apache-camel - 无法解析端点:jetty://http://localhost:8888/sample,原因是:没有找到带有方案的组件:jetty
- kubernetes - 使用 AWS Container Insights 监控 Kubernetes CronJob 完成情况
- php - LARAVEL 得到错误 500 | SmarterASP.NET 托管服务器中的服务器错误
- c++ - 如何将双精度值直接转换为 PQ^-1 模 MOD,其中 q 与 MOD 互质
- perforce - 检查给定的 perforce 标签是否存在
- python - 检索对象