[Intersult Expert] ist ein leichtgewichtiges Expertensystem, das mit moderner [Java] Technologie implementiert ist. Als Hintergrund wird eine JDBC-Datenbank verwendet, die Bedienung des Systems erfolgt durch eine Service-API.

!!!Inhalt
[{TableOfContents title='Page contents' numbered='true'}]

!!!Merkmale
!!Strukturierung
Die Logik hinter [Intersult Expert] ist ein an die Programmiersprache Prolog angelehntes OAW-System, das Expertenwissen in Dreiheiten von Object Attribute Value ablegen kann. Dabei handelt es sich um eine nichtlineare Verknüfung von Objekten, mit denen beliebiges Wissen abgespeichert werden kann.

!!Zugriff
Insbesondere zwichnet sich [Intersult Expert] durch die [Expert Query Language] aus, mit der Anfragen an das gespeicherte Wissen formuliert werden können. Anders als SQL, ist EQL eine Sprache die nur aus einfachen Elementen besteht und den Schwerpunkt auf Objektbeziehungen legt.

!!!Anwendung
[Intersult Expert] kann direkt an Oberflächen, wie zum Beispiel Java Server Faces ([JSF], [JSF2]) angebunden werden. Damit können Ein- und Ausgabemasken mit einer Wissensbasis verbunden werden. Logik und [Workflows|Workflow] können verständlich abgebildet werden, ohne versteckten prozeduralen Programmcode.

!!!JSF Integration
[Intersult Expert] wird mit einem Modul für die Integration in [JSF] geliefert. Besonders nützlich wird dies im Zusammenspiel mit [JSF Ext].

!!Query Component
Bei der Query Component handelt es sich um eine Implementierung von UIParameter, der Tag <expert:query> kann an jeder Stelle von <f:param> verwendet werden.

Die Query unterstützt dabei auch Variablen, diese werden durch Literale angegeben, die mit einem Fragezeichen (?) beginnen.

{{{
<expert:query name="attribute" query="?object.inverse" unique="true">
	<f:param name="object" value="#{rule.attribute}"/>
</expert:query>
}}}

__Erklärung:__ Die Query erzeugt einen Wert für den Parameter "attribute" mit Hilfe der Expert-Expression "?object.inverse", die dabei die Variable "?object" enthält. Diese Variable wird wiederum durch einen Tag <f:param> versorgt.

!!Scope mit einer Rule vorbelegen
Das folgende Beispiel übergibt eine Vorbelegung einer Scope-Variable mit einer Rule. Dabei handelt es sich um einen Vorschlag einer inversen Rule, die durch die Query-Component <expert:query> erzeugt wird:

{{{
<h:commandButton image="#{resource['images/bitcons:switch.gif']}">
	<f:ajax/>
	<e:load scopeId="rule-create">
		<e:new name="rule" type="com.intersult.expert.entity.Rule">
			<f:param name="object" value="#{rule.value}"/>
			<expert:query name="attribute" query="?object.inverse" unique="true">
				<f:param name="object" value="#{rule.attribute}"/>
			</expert:query>
			<f:param name="value" value="#{rule.object}"/>
		</e:new>
	</e:load>
</h:commandButton>
}}}

!!!Evaluieren
Das Evaluieren der Querys erfolgt durch den ExpertService. Dahinter stehen mehrere Resolver, die das Interface Resolver implementieren. Im Wesentlichen bestehen zwei Resolver:

* __DirectResolver:__ Der Resolver fragt jedes Goal direkt bei der dahinter liegenden Datenbank ab und arbeitet mit den Ergebnissen weiter. Einfache Querys können so schnell evaluiert werden und der Datenbank-Cache optimal genutzt. Der Nachteil kann bei komplexen Querys darin bestehen, dass für Zwischenergebnisse große Mengen an Daten in den Speicher geladen werden und die Query daher langsam und Speicher intensiv sein kann.
* __HibernateResolver:__ Der Resolver wandelt die Query mit Hilfe von Hibernate Criteria-Querys in eine Datenbankabfrage um, ohne Zwischenergebnisse zu erzeugen. Dadurch kann die Performance für große Querys optimiert werden.

!!!Medien
[{Image src='Intersult Expert/expert-001.png' width='100%'}]

[{Flash src='https://www.youtube.com/v/iPw9yuKySus' controls='false' play='true'}]