[JAVA] Die Welt der Clara-Regeln (3)

Letztes Mal

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.

Problem

Code

(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.

Erklärung von <- 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.

Impressionen

Fortsetzung

Recommended Posts

Die Welt der Clara-Regeln (2)
Die Welt der Clara-Regeln (4)
Die Welt der Clara-Regeln (1)
Die Welt der Clara-Regeln (3)
Die Welt der Clara-Regeln (5)
Die Idee der schnellen Sortierung
Die Idee von jQuery
Docker-Überwachung - Erläuterung der Grundlagen der Grundlagen
Informationen zur Beschreibung von Docker-compose.yml
Das Spiel der Instanziierung von java.lang.Void
Medianwert von drei Werten
Die Illusion der Objektorientierung
Über das Verhalten von Ruby Hash # ==
[Java] Löschen Sie die Elemente von List
Fortsetzung: Das Gleichnis von OOP (weggelassen)
Ändern Sie nur einen Teil des Textes
Verstehen Sie den grundlegenden Mechanismus von log4j2.xml
Über die Grundlagen der Android-Entwicklung
'% 02d' Was ist der% von% 2?
[Java Edition] Geschichte der Serialisierung
Überprüfen Sie die Version von Cent OS
Erläuterung der Reihenfolge der Schienenrouten
Ich habe die Quelle von ArrayList gelesen, die ich gelesen habe
Die Grundlagen von SpringBoot + MyBatis + MySQL
Hinweis zum Pfad von request.getRequestDispatcher
Probieren Sie HelloWorld mit der Mindestkonfiguration von Heroku Java Spring-Boot aus
Ich habe die Quelle von Integer gelesen
Dies und das von JDK
Überprüfen Sie den Migrationsstatus von Schienen
Die Geschichte von @ViewScoped, die Speicher verschlingt
Filtern Sie die Schwankungen der Rohdaten
Erklären der Spalten von Spree :: Taxonomy
Ein Memorandum über das FizzBuzz-Problem
Ich habe die Quelle von Long gelesen
Erklären Sie die Spalte von Spree :: Product
Verschiedene Methoden der String-Klasse
Informationen zur Rolle der Initialisierungsmethode
Denken Sie an die 7 Regeln von Optional
Holen Sie sich die ID der automatischen Nummerierung
Ich habe die Quelle von Short gelesen
Ich habe die Quelle von Byte gelesen
Reihenfolge der Verarbeitung im Programm
Ich habe die Quelle von String gelesen
Der Ursprung von Java-Lambda-Ausdrücken
[Ruby] Zeigt den Inhalt von Variablen an
Filtern Sie das Ergebnis von BindingResult [Spring]
Remote-Debugging von Cognos SDK
Informationen zur Protokollebene von java.util.logging.Logger
Holen Sie sich die Beschleunigung und Ausrichtung des Weltkoordinatensystems auf Android
Die Geschichte der Begegnung mit Spring Custom Annotation
Zeigen Sie Text über dem Bild an