Es gibt eine Abfragefunktion, mit der der Inhalt der Clara-Rules-Sitzung von außen überprüft werden kann. Deshalb habe ich versucht, herauszufinden, wie man sie verwendet.
(ns clara-rules.join
(:require [clara.rules :refer [defrule fire-rules insert
mk-session query defquery]]))
(defrecord TypeA [attr-a join-key])
(defrecord TypeB [attr-b join-key])
;;Queries
(defquery find-all-As
[];;parameters
[?a <- TypeA];;Matching condition
)
(defquery find-As-by-attr
[:?value];; Parameter needs to be a keyword
[?a <- TypeA (= attr-a ?value)])
(defquery find-join-key-of-As
[]
[TypeA (= ?jk join-key)])
(defquery find-A-and-B-pair-by-join-key
[:?value]
[?a <- TypeA (= join-key ?value)]
[?b <- TypeB (= join-key ?value)])
(def sess (-> (mk-session)
(insert (->TypeA "a1" :foo)
(->TypeA "a2" :bar)
(->TypeA "a3" :baz)
(->TypeB "b1" :foo)
(->TypeB "b2" :bar)
(->TypeB "b3" :baz)
(->TypeB "b4" :qux))
(fire-rules)))
(query sess find-all-As)
;; ({:?a {:attr-a "a1", :join-key :foo}}
;; {:?a {:attr-a "a2", :join-key :bar}}
;; {:?a {:attr-a "a3", :join-key :baz}})
(query sess find-As-by-attr :?value "a1")
;; => ({:?a #clara_rules.join.TypeA{:attr-a "a1", :join-key :foo}, :?value "a1"})
(query sess find-join-key-of-As)
;; => ({:?jk :foo} {:?jk :bar} {:?jk :baz})
(query sess find-A-and-B-pair-by-join-key :?value :foo)
;; => ({:?a {:attr-a "a1", :join-key :foo},
;; :?value :foo,
;; :?b {:attr-b "b1", :join-key :foo}})
--defquery
kann auf die gleiche Weise wie die linke Seite von defrule
geschrieben werden, außer dass Parameter extern empfangen werden können.
--Variable Bindung etc.
--query
gibt die gebundene Variable in defquery
als Schlüssel der resultierenden Map zurück
--query
gibt die Übereinstimmung als Folge von Karten zurück
In den vorherigen Beispielen bestand die einzige Möglichkeit, das Ergebnis anzuzeigen, darin, den Nebeneffekt (println) auf der rechten Seite der Regel zu verwenden. Ich bin froh, dass ich eine der Fragen lösen konnte, die ich hatte, seit ich angesprochen habe, ob es eine Möglichkeit gibt, die Ergebnisse ohne Nebenwirkungen zu überprüfen.
Recommended Posts