Business rules
LifecycleEvent
Das LifecycleEvent bestimmt die Vorgehensweise unseres Programms. Für jede neue Aussage, d.h. Wechsel zwischen dem Sprechenden, wird ein neues ComplexTokenEvent gebildet und dann mit den Informationen dieser Aussage angereichert. Zum Abschluss der Aussage wird das ComplexTokenEvent ausgegeben.
Daher wurde eine LifecycleEvent.java definiert. Diese kennzeichnet den Beginn und das Ende einer Aussage mithilfe ihrer Variable ‘Token’. Ist diese auf ‘start’ gesetzt, so wird ein neues ComplexTokenEvent erstellt. Folgt schließlich ein LifecycleEvent mit dem Token ‘end’, so wird die Ausgabe der Inhalte des ComplexTokenEvents getriggert.
Einheitliches Vokabular
Bei der Definition der Regeln ist auf ein einheitliches Vokabular zu achten. Aus diesem Grund können die Regeln zwei Kategorien zugeordnet werden. So existieren Regeln, welche einzelne Ausdrücke, welche aus mehreren Worten bestehen, zu einem einheitlichen Vokabular zusammenzufassen. Andere Regeln können anschließend auf diesem einheitlichen Vokabular aufbauen, um aus den einzelenen Tokens sinnvolle Informationen zu generieren.
Ausdrücke aus mehreren Worten erkennen
Um zwei zusammenhängende Worte zu erkennen, wird auf den temporalen Operator after
zurückgegriffen.
$prevToken
definiert dabei den Token, welcher vorangestellt ist. $nextToken
`der daran Anschließende.
rule "Merge separated Google Drive"
when
// Vorangestellter Token
$prevToken : Event(
token == "google"
) from window LastEvents // Nur innerhalb der letzten beiden Events
// Anschießender Token
$nextToken : Event(
token == "drive",
this after $prevToken // Tokenevent muss nach $prevToken fallen
)
then
// Das Event $prevToken entfernen, da dessen Bedeutung $nextToken hinzugefügt wird
retract($prevToken);
// $nextToken bearbeiten. `modify` weißt die Rules Engine auf die Änderung des Events hin und führt zum Aufruf der eigentlichen Verständnisregel (s.u.)
modify($nextToken) {
setToken(ComplexToken.DRIVE); // Ein einheitliches Vokabular durch den Einsatz von Variablen
}
end
rule "Identify Google Drive"
// Regel im direkten Anschluss nicht erneut ausführen
no-loop
when
Event(
token == "drive"
|| token == "Google drive"
|| token == ComplexToken.DRIVE
) from window CurrentEvent // Nur aktuellstes Event betrachten. Erforderlich, da sonst vergangene und nicht mehr relevante Events mit aktuellstem ComplexTokenEvent in Zusammenhang geracht werden
// Nur aktuellstes und damit geltendes ComplexTokenEvent beachten
$complexTokenEvent : ComplexTokenEvent() from window LastComplexTokenEvent
then
// ComplextokenEvent mit Informationen anreichern
modify($complexTokenEvent) {
addTopic(ComplexToken.DRIVE) // Ein einheitliches Vokabular durch den Einsatz von Variablen
}
end
Einleitende Deklarationen
Bei der Definition der Regeln sind folgende Abschnitte notwendig.
Rolle: Event
Zur Unterstützung von windows
müssen die Events der Rolle Event
zugewiesen sein.
declare Event
@role(event)
end
declare ComplexTokenEvent
@role(event)
end
Windows (Mengenfenster)
Das Window CurrentEvent
wird benötigt, um die Anwendung der Regeln auf das jeweils aktuelle Event zu beschränken. LastEvents
wird für die Kombination zweier Tokens / Events benötigt, um ein einheitliches Vokabular zu ermöglichen. Das Window LastComplexTokenEvent
ermöglicht es, auf das jeweils aktuelle ComplexToken
-Event zuzugreifen.
declare window CurrentEvent
Event() over window:length(1)
end
declare window LastEvents
Event() over window:length(2)
end
declare window LastComplexTokenEvent
ComplexTokenEvent() over window:length(1)
end
Windows (Zeitfenster)
Das Window ThreeMinutes
soll lediglich die Möglichkeit veranschaulichen, um Zeitfenster mithilfe von Drools zu definieren und zu nutzen. Dabei wird window:time
statt window:length
verwendet und in der Klammer kann man im Anschluss den Wert und die Einheit der Zeitangabe festlegen. ‘3m’ steht für 3 Minuten.
declare window ThreeMinutes
Event() over window:time(3m)
end