Aus dem Video der Vorlesung habe ich gelernt, dass Clara-Regeln für Verknüpfungsoperationen zwischen verschiedenen Entitäten verwendet werden können. Deshalb habe ich selbst ein einfaches Beispiel implementiert.
(ns clara-rules.join
(:require [clara.rules :refer [defrule fire-rules insert insert! mk-session]]))
(defrecord TypeA [attr-a join-key])
(defrecord TypeB [attr-b join-key])
(defrecord TypeC [attr-a attr-b join-key])
(defrule Join
[TypeA (= ?jk-a join-key) (= ?a attr-a)]
[TypeB (= join-key ?jk-a) (= ?b attr-b)]
=>
(insert! (->TypeC ?a ?b ?jk-a)))
(defrule Print
[?result <- TypeC];; Will always match
=>
(println ?result))
(-> (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))
;;#clara_rules.join.TypeC{:attr-a a1, :attr-b b1, :join-key :foo}
;;#clara_rules.join.TypeC{:attr-a a2, :attr-b b2, :join-key :bar}
;;#clara_rules.join.TypeC{:attr-a a3, :attr-b b3, :join-key :baz}
--Typ C wird für Paare vom Typ A und Typ B gedruckt, die wie vorgesehen einen gemeinsamen : Join-Schlüssel
haben. Du hast es geschafft!
--(-> TypeB "b4": qux)
erscheint nicht im Ergebnis, da es keine TypeA-Tatsache mit demselben: join-key: qux
gibt. Das war's.
<-
auf der linken Seite von defrule
Binden Sie die Tatsache selbst an eine Variable, nicht an das Attribut der Tatsache. Am Beispiel von "[? Ergebnis <-TypeC]" ist die gesamte übereinstimmende TypeC-Instanz an "Ergebnis" gebunden.
Recommended Posts