Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure DataScript/datahike规则不返回任何内容_Clojure_Clojurescript_Datascript - Fatal编程技术网

Clojure DataScript/datahike规则不返回任何内容

Clojure DataScript/datahike规则不返回任何内容,clojure,clojurescript,datascript,Clojure,Clojurescript,Datascript,我尝试在中的数据库的多个字段中搜索字符串。到目前为止还没有成功。以下是我迄今为止最努力的方法: (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 :ca

我尝试在中的数据库的多个字段中搜索字符串。到目前为止还没有成功。以下是我迄今为止最努力的方法:

(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还不支持
。我认为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))

正确的!应该记住不要把这两个词混为一谈,因为它们的意思完全不同:)