Die [Expert Query Language] ist Bestandteil des [Intersult Expert] Systems.

!!!Verwendung
Der Expert Parser wird durch die Klasse com.intersult.expert.query.ExpertParser angesprochen oder implizit durch ExpertService.

!!!Hintergrund
Die [Expert Query Language] wird durch den Parser [Lambda] geparst, einem effizienten und zugleich simplen Parser.

!!Primitiven
Die [Expert Query Language] kennt nur zwei Primitive:

* __Literale:__ Einfache Literale können ohne jegliche Anführungsstriche geschrieben werden. Als Anführungsstriche sind Hochkomma und Anführungszeichen erlaubt. Folgende Ausdrücke sind vollkommen gleichwertig: test, 'test' und "test".
* __Variable:__ Ausdrücke die mit einem Fragezeichen (?) beginnen, können als Variablen dienen. Diese können sowohl zur Parse-Zeit als auch zur Compile-Zeit ersetzt werden. Beispiel wären ?object, ?parameter oder ?var.

Variablen spielen insbesondere beim Einbetten der [Expert Query Language] in andere Systeme eine Rolle. Wie zum Beispiel in [JSF] durch das [Intersult Expert].

!!Rules und Goals
Grundsätzlich werden Goal- und Rule-Querys unterschieden:

* __Goal-Query:__ Diese Query evaluiert zu einer Liste von Strings und kann wieder für andere Goals herangezogen werden.
* __Rule-Query:__ Diese Query evaluiert zu einer Liste von Rule-Objekten. Mit diesen kann ebenfalls wieder weitergearbeitet werden, vor allem durch einen goal-selector wieder in eine Goal-Query umgewandelt werden.

||Ausdruck||Beschreibung||Beispiel
|goal-query|Ein Audruck der zu einer Liste von Goals evaluiert|(Expertensystem, *, *).value
|rule-query|Ein Ausdruck der zu einem Liste von Rules evaluiert|(Expertensystem, *, *)
|goal-combination|Verknüpfung zweier Goals durch die Experten-Operatoren +, -, / und .|red + green
|goal-restriction|Einschränkung eines Goals durch die Attribut-Operatoren =, !=, <, <=, >, >=|*.contains = Knowledge
|braced-goal|Goals können geklammert werden, um die Priorität festzulegen.|(red + green) / (green + blue)
|goal-selector|Ein Rule-Goal kann durch die drei Selektoren object, attribute oder value in ein Goal verwandelt werden|(Expertensystem, *, *).value
|goal-single|Selektion eines Goals aus einer Menge durch die Operatoren ! (erstes Goal) und # (zufälliges Goal)|(*.example)!

!!Goal Combinations
Wie schon beschrieben, gibt es vier Goal Combinations. Der Goal-Operator +, -, / und . steht zwischen den Goals. Das Goal links vom Goal-Operator wird auch als Links-Goal und das Goal rechts davon entsprechend als Rechts-Goal bezeichnet.

||Goal Combination||Bezeichnung||Beschreibung
|+|Union|Das Zusammenfügen beider Goal-Mengen. Es entstehen keine Doppelten Goals, diese werden ausgefiltert.
|-|Subtraction|Als Grundmenge dient die Links-Goals, davon werden die Rechts-Goals entfernt. Goals die in den Rechts-Goals vorkommen, jedoch nicht in den Links-Goals sind dabei ebenfalls nicht enthalten.
|/|Intersection|Es wird die Schnittmenge zwischen den Links-Goals und den Rechts-Goals berechnet.
|.|Transformation|Eine Kurzschreibweise für (left, right, *).value. Die Ergebnis-Goals sind die Values alles Attributes mit dem Namen der Rechts-Goals von den Links-Goals. Zum Beispiel kann haus.wohnfläche zum Ergebnis 110qm führen.

!!Goal Restrictions
Goals können auch eingeschränkt werden. Dabei wird ebenfalls der Operator . verwendet, nach dem Rechts-Goal folgt allerdings ein weiterer Operator aus =, !=, <, <=, > und >= mit einem weiteren Goal, also <object>.<attribute>.<value>.

||Operator||Beschreibung
|=|Der Equal-Operator selektiert alle Objekte, deren Attributswert sich in der gegebenen Liste befindet.
|!=|Der Not-Equal-Operator selektiert alle Objekte, deren Attributswert sich nicht in der gegebenen Liste befindet.
|<|Der Less-Operator selektiert alle Objekte, deren Attributswert kleiner als der gegebene Wert ist. In der Liste darf sich nur ein Wert befinden.
|<=|Der Less-Equal-Operator selektiert alle Objekte, deren Attributswert kleiner oder gleich als der gegebene Wert ist. In der Liste darf sich nur ein Wert befinden.
|>|Der Less-Operator selektiert alle Objekte, deren Attributswert größer als der gegebene Wert ist. In der Liste darf sich nur ein Wert befinden.
|>=|Der Less-Operator selektiert alle Objekte, deren Attributswert größer oder gleich als der gegebene Wert ist. In der Liste darf sich nur ein Wert befinden.

Ziel einer Restriction ist es, eine Menge von Goals einzuschränken. Dies ist generell gleichwertig zu einer Rule-Query mit anschließender Objekt-Selektion (<object>, <attribute>, <value>).object, allerdings immer mit Equals.

!!!Beispiele
!!Rules mit bestimmten Werten
Sucht man Rules, deren Attributwerte bestimmte Eigenschaften haben, kann folgende Query verwendet werden:

{{{
(*, answer, *.is = Qualification)
}}}

Ergebnis:

{{{
|Bist du IT'ler?|answer|Bist du einer dieser Budget-Wächter?
}}}

__Erklärung:__ Der Attributwert 'Bist du einer dieser Budget-Wächter?' erfüllt (*, is, Qualification), wie durch die entsprechende Query zu belegen ist.