In ENGCON werden abstrakte, domänenunabhängige Constraints durch Constraint-Relationen beschrieben. Sie werden innerhalb der konzeptuellen Constraints definiert und sind Teil des Constraint-Wissens der Wissensbasis. Auch Constraint-Relationen haben per se keinen Bezug zu konkreten Konfigurierungsobjekten. Der Bezug wird erst durch die Zuordnung des Pattern-Matchers vorgenommen (vgl. Abschnitt 3.6.1). Es wird zwischen drei unterschiedlichen Klassen für Constraint-Relationen unterschieden (vgl. Ranze et al., 2002, S. 850):
Die Definition eines Constraints sollte nach Möglichkeit so abstrakt wie möglich, d.h. als Funktions- bzw. Prädikat-Constraint, erfolgen. In Szenarien mit überschaubaren Lösungsmengen bietet es sich allerdings zweckmäßigerweise an, Constraints zu nutzen, die als Tupel von konkreten Attribut-Werten modelliert werden. Extensionale Constraints sollten entsprechend immer dann eingesetzt werden, wenn die Relation endlich ist und eine geringe Mächtigkeit aufweist, oder wenn sie sich nicht bzw. nur sehr aufwendig abstrakt spezifizieren lässt. Das Constraint kann in diesem Fall einfach durch Angabe aller zulässigen Wertekombinationen als Tupel definiert werden. Für nicht endliche oder sehr umfangreiche Relationen, d.h. für Relationen, die eine unendliche oder sehr große Lösungsmenge aufweisen, dienen Funktions- bzw. Prädikat-Constraints. Mit ihnen lassen sich Gleichungen und Ungleichungen angeben, aufgrund denen entschieden wird, welche Tupel zur Relation gehören und welche nicht, bzw. in welcher Form die Wertebereiche eingeschränkt werden müssen. Werden noch flexiblere Mechanismen benötigt, kann auf Java-Constraints zurückgegriffen werden. Sie erlauben es, beliebigen Programm-Code auf die übergebenen Attribute anzuwenden.3.15 Java-Constraints können z.B. Verwendung finden bei der Aufsummierung der Attribut-Werte unterschiedlicher Konzeptinstanzen oder um Anfragen, z.B. die Verfügbarkeit von Komponenten betreffend, an externe Systeme zu stellen.
Constraint-Relationen werden mittels einer deklarativen Beschreibung in einer Meta-Modellierungssprache innerhalb der Wissensbasis definiert. Sie können dadurch relativ einfach modifiziert bzw. erweitert werden. Zur Verdeutlichung sind in Abbildung 3.9 mehrere Constraint-Relationen aufgeführt. Das Funktions-Constraint mit dem Namen func_CD_Rom aus berechnet beispielhaft die Datentransfer-Rate A für ein CD-ROM-Laufwerk anhand des Multiplikators B für die CD-ROM-Geschwindigkeit.3.16 Das entsprechende konzeptuelle Constraint, welches den Aufruf für die Constraint-Relation func_CD_Rom enthält, übergibt bei der Instantiierung zwei Parameter, die den externen Pins, bzw. den Constraint-Variablen, A und B zugewiesen werden. Der in ENGCON derzeit eingesetzte externe Constraint-Solver verwendet intern zur Repräsentation und Auswertung der Wertebereiche von Constraint-Variablen reellwertige Intervalle und Methoden der von Hyvönen (1992) vorgestellten ,,Toleranzpropagation`` (vgl. Abschnitt 5.3.4 ff.).
Ebenfalls in Abbildung 3.9 ist ein Tupel-Constraint mit dem Namen tpc_FSB_Rate spezifiziert. Dieses Constraint dient dazu, bei einer PC-Konfigurierung von der Taktfrequenz des Front-Side-Bus des Mainboards entsprechend auf die Taktfrequenzen für die CPU und den RAM-Speicher schließen zu können und umgekehrt, bzw. um selbige eingrenzen zu können. Die externen Pins MB_FSB_Rate, P_FSB_Rate und S_FSB_Rate stehen entsprechend für die Taktfrequenzen von Mainboard, Prozessor und Speicher. In Tabelle 3.1 sind die Abhängigkeiten der Taktfrequenzen dargestellt. Eine ebensolche Tabelle muss zur Nutzung und Auswertung für ENGCON unter dem Namen des Constraints (tpc_FSB_Rate) in einer relationalen Datenbank hinterlegt werden.3.17 Jede Constraint-Relation vom Typ tupel entspricht einer Tabelle innerhalb der Datenbank. Eine Spalte der Datenbank-Tabelle entspricht jeweils einem Pin des Constraints. Es sind ausschließlich atomare Datentypen (String, Integer, Float) erlaubt. Im Gegensatz zu Funktions- bzw. Prädikat-Constraints sind keine intervallwertigen Wertebereiche möglich. Die Datenbank muss dem System unter dem in der Constraint-Relation angegebenen (ODBC-)Namen (hier: PC_DB) bekannt sein, damit eine Auswertung durch ENGCON erfolgen kann.
SELECT * FROM tpc_FSB_Rate WHERE (MB_FSB_Rate IN (66, 100, 133)) AND (P_FSB_Rate EQ 100) AND (S_FSB_Rate IN (100, 133))
Die Anfrage würde als Ergebnis die Zeilen 4 und 5 aus der Tabelle 3.1 zurückgeben, aus denen entsprechend die neuen, eingeschränkten Wertebereiche der Constraint-Variablen abgeleitet werden können.
Das Java-Constraint mit dem Namen jc_Price in Abbildung 3.9 wird dazu genutzt, den Gesamtpreis mehrerer Komponenten zu summieren, in diesem Beispiel der beiden Instanzen, die an die Constraint-Variablen A und B gebunden sind. Der letzte externe Pin (hier: C) nimmt jeweils den berechneten Rückgabewert der Java-Methode auf. In diesem Fall heißt die Methode partialPriceForPC, die sich innerhalb der Klasse PC_AdvancedLib befinden muss. Der Pfad zu dem Java-Package, in dem sich die Klasse PC_AdvancedLib befindet, wird über classpath spezifiziert.