Правила 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"]
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))