Modellerweiterung auf Stufe Topic

Möchte man ein bestehendes Interlismodell erweitern, kann man dies Mittels IMPORTS und EXTENDS bzw. EXTENDED vornehmen.

Als Beispiel folgendes Basismodell:

INTERLIS 2.3;

MODEL Basiskonstrukt (de) AT "https://localhost" VERSION "2023-04-25" =
    DOMAIN

    TOPIC Basis =

        CLASS Info =
            foo : TEXT*10;
        END Info;

        CLASS Dokument =
            DokImWeb : URI;
        END Dokument;

        ASSOCIATION Dokument_Info_M2N = 
            rInfoM2N -- {0..*} Info;
            rDokumentM2N -- {0..*} Dokument;
        END Dokument_Info_M2N;

        ASSOCIATION Dokument_Info = 
            rInfo -- {0..*} Info;
            rDokument -- {1} Dokument;
        END Dokument_Info;

    END Basis;

END Basiskonstrukt.

Dies kann nun mittels IMPORTS und EXTENDS erweitert werden:

INTERLIS 2.3;

MODEL Model_XY (de) AT "https://localhost" VERSION "2023-08-16" = 
    IMPORTS Basiskonstrukt;

    DOMAIN

    TOPIC ThemaX =
        CLASS Info EXTENDS Basiskonstrukt.Basis.Info = END Info;
        CLASS Dokument EXTENDS Basiskonstrukt.Basis.Dokument = END Dokument;
        ASSOCIATION Dokument_Info_M2N EXTENDS Basiskonstrukt.Basis.Dokument_Info_M2N = END Dokument_Info_M2N;

        CLASS NewClass = 
            text : MANDATORY TEXT*10;
        END NewClass;

        ASSOCIATION Info_NewClass = 
            rNewClass -- {0..*} NewClass;
            rInfoxy -- {1} Info;
        END Info_NewClass;

    END ThemaX;
    
END Model_XY.

Oder auch mittels IMPORTS und EXTENDED:

INTERLIS 2.3;

MODEL Model_XY (de) AT "https://localhost" VERSION "2023-08-16" = 
    IMPORTS Basiskonstrukt;

    DOMAIN

    TOPIC ThemaX EXTENDS Basiskonstrukt.Basis =

        CLASS Info (EXTENDED) = END Info;
        CLASS Dokument (EXTENDED) = END Dokument;
        ASSOCIATION Dokument_Info_M2N (EXTENDED) = END Dokument_Info_M2N;

        CLASS NewClass = 
            text : MANDATORY TEXT*10;
        END NewClass;

        ASSOCIATION Info_NewClass = 
            rNewClass -- {0..*} NewClass;
            rInfoxy -- {1} Info;
        END Info_NewClass;

    END ThemaX;

END Model_XY.

Mit beiden erweiterten Modellvarianten ist folgendes Transferfile valide:

<?xml version="1.0" encoding="UTF-8"?>
<TRANSFER xmlns="http://www.interlis.ch/INTERLIS2.3">
    <HEADERSECTION SENDER="manual" VERSION="2.3">
        <MODELS>
            <MODEL NAME="Model_XY" VERSION="2023-08-16" URI="https://localhost"></MODEL>
        </MODELS>
    </HEADERSECTION>
    <DATASECTION>
        <Model_XY.ThemaX BID="1">
            <Model_XY.ThemaX.Info TID="2">
                <foo>test</foo>
                <rDokument REF="3"></rDokument>
            </Model_XY.ThemaX.Info>

            <Model_XY.ThemaX.Dokument TID="3">
                <DokImWeb>https://meine-dat.ei</DokImWeb>
            </Model_XY.ThemaX.Dokument>

            <Model_XY.ThemaX.NewClass TID="4">
                <text>test</text>
                <rInfoxy REF="2"></rInfoxy>
            </Model_XY.ThemaX.NewClass>

            <Model_XY.ThemaX.Dokument_Info_M2N>
                <rInfoM2N REF="2"></rInfoM2N>
                <rDokumentM2N REF="3"></rDokumentM2N>
            </Model_XY.ThemaX.Dokument_Info_M2N>

        </Model_XY.ThemaX>
    </DATASECTION>
</TRANSFER>

Nun zur effektiven Frage bzw. Unverständnis. Weshalb werden bei einem EXTENDS auf Topic-Ebene nicht alle Klassen und Beziehungen übernommen? Im Referenzhandbuch zu Interlis 2.3 steht auf S. 30:

Erweitert ein Thema ein anderes, werden alle Klassen des geerbten Themas übernommen. Sie werden also zu Klassen das aktuellen Themas und haben denselben Namen wie im geerbten Thema.

Somit hätte ich gedacht das der ilivalidator folgendes Modell zusammen mit dem obigen Transferfile auch als valide anschauen sollte:

INTERLIS 2.3;

MODEL Model_XY (de) AT "https://localhost" VERSION "2023-04-25" = 
   IMPORTS Basiskonstrukt;

   DOMAIN

   TOPIC ThemaX EXTENDS Basiskonstrukt.Basis =

       CLASS NewClass = 
           text : MANDATORY TEXT*10;
       END NewClass;

       ASSOCIATION Info_NewClass = 
           rNewClass -- {0..*} NewClass;
           rInfoxy -- {1} Info;
       END Info_NewClass;

   END ThemaX;

END Model_XY.

Der Ilivalidator spukt nun jedoch Fehler aus:

Error: line 10: Model_XY.ThemaX.Info: tid 2: unknown class <Model_XY.ThemaX.Info>
Error: line 15: Model_XY.ThemaX.Dokument: tid 3: unknown class <Model_XY.ThemaX.Dokument>
Error: line 24: Model_XY.ThemaX.Dokument_Info_M2N: unknown class <Model_XY.ThemaX.Dokument_Info_M2N>

Somit besteht keine Möglichkeit ein Topic eines anderen Modells komplett zu erweitern ohne alle Klassen und Beziehungen nochmals „leer“ zu erweitern ?

Die werden m.E. schon übernommen. Vielleicht anders als man erwartet. Das validiert bei mir:


<?xml version="1.0" encoding="UTF-8"?>
<TRANSFER xmlns="http://www.interlis.ch/INTERLIS2.3">
    <HEADERSECTION SENDER="manual" VERSION="2.3">
        <MODELS>
            <MODEL NAME="Model_XY" VERSION="2023-08-16" URI="https://localhost"></MODEL>
        </MODELS>
    </HEADERSECTION>
    <DATASECTION>
        <Model_XY.ThemaX BID="1">
            <Basiskonstrukt.Basis.Info TID="2">
                <foo>test</foo>
                <rDokument REF="3"></rDokument>
            </Basiskonstrukt.Basis.Info>

            <Basiskonstrukt.Basis.Dokument TID="3">
                <DokImWeb>https://meine-dat.ei</DokImWeb>
            </Basiskonstrukt.Basis.Dokument>

            <Model_XY.ThemaX.NewClass TID="4">
                <text>test</text>
                <rInfoxy REF="2"></rInfoxy>
            </Model_XY.ThemaX.NewClass>

            <Basiskonstrukt.Basis.Dokument_Info_M2N>
                <rInfoM2N REF="2"></rInfoM2N>
                <rDokumentM2N REF="3"></rDokumentM2N>
            </Basiskonstrukt.Basis.Dokument_Info_M2N>

        </Model_XY.ThemaX>
    </DATASECTION>
</TRANSFER>

Aber wäre um professionelle Bestätigung froh.

Das ist jetzt keine professionelle Bestätigung, aber wenigstens eine Beipflichtung :slight_smile:

Die Tatsache, dass in einem Behälter des vererbten Modells Objekte mit dem XML-Elementnamen der Basisklasse liegen (so wie in den Daten von @edigonzales), hat mich auch schon verwirrt, ist aber eigentlich logisch:

Die Klassen werden geerbt, aber definiert sind sie im Basismodell (bzw. Basistopic). Deshalb sind die XML-Elementnamen dieser Objekte Basiskonstrukt.Basis.Info und eine andere Bezeichnung wäre eher irreführend.

Ich danke euch für die prompten Erläuterungen!

Ganz klar ist mir den Nutzen von EXTENDS auf Topic-Ebene immer noch nicht, da es sich anders verhält als auf Class-Ebene. Wieder ein Beispiel:

INTERLIS 2.3;

MODEL Model_XY (de) AT "https://localhost" VERSION "2023-04-25" = 
    IMPORTS Basiskonstrukt;

    DOMAIN

    TOPIC ThemaX EXTENDS Basiskonstrukt.Basis =
        CLASS Info2 EXTENDS Basiskonstrukt.Basis.Info = END Info2;

        CLASS NewClass = 
            text : MANDATORY TEXT*10;
        END NewClass;

        ASSOCIATION Info_NewClass = 
            rNewClass -- {1..*} NewClass;
            rInfo2 -- {1} Info2;
        END Info_NewClass;

    END ThemaX;
    
END Model_XY.

Und hier haben wir folgende Transferdatei:

<?xml version="1.0" encoding="UTF-8"?>
<TRANSFER xmlns="http://www.interlis.ch/INTERLIS2.3">
    <HEADERSECTION SENDER="manual" VERSION="2.3">
        <MODELS>
            <MODEL NAME="Model_XY" VERSION="2023-08-16" URI="https://localhost"></MODEL>
        </MODELS>
    </HEADERSECTION>
    <DATASECTION>
        <Model_XY.ThemaX BID="1">
             <!-- Mit EXTENDS auf TOPIC-Ebene erweitert - Modell und Topic wird aus dem zu erweiternden Modell übernommen -->
            <Basiskonstrukt.Basis.Info TID="2">
                <foo>test</foo>
                <rDokument REF="3"></rDokument>
            </Basiskonstrukt.Basis.Info>

            <Basiskonstrukt.Basis.Dokument TID="3">
                <DokImWeb>https://meine-dat.ei</DokImWeb>
            </Basiskonstrukt.Basis.Dokument>

            <!-- Mit EXTENDS auf CLASS-Ebene erweitert - Modell und Topic wird aus dem aktuellen Modell übernommen -->
            <Model_XY.ThemaX.Info2 TID="99">
                <foo>test</foo>
                <rDokument REF="3"></rDokument>
            </Model_XY.ThemaX.Info2>

            <!-- Mit EXTENDS auf CLASS-Ebene erweitert - So müsste es doch aussehen wenn es analog dem EXTENDS auf Topic-Ebene wäre?  -->
            <!-- Error: line 27: Basiskonstrukt.Basis.Info2: tid 100: unknown class <Basiskonstrukt.Basis.Info2></Basiskonstrukt.Basis.Info2> -->
            <Basiskonstrukt.Basis.Info2 TID="100">
                <foo>test</foo>
                <rDokument REF="3"></rDokument>
            </Basiskonstrukt.Basis.Info2>

            <Model_XY.ThemaX.NewClass TID="4">
                <text>test</text>
                <rInfo2 REF="99"></rInfo2>
            </Model_XY.ThemaX.NewClass>

            <Basiskonstrukt.Basis.Dokument_Info_M2N>
                <rInfoM2N REF="2"></rInfoM2N>
                <rDokumentM2N REF="3"></rDokumentM2N>
            </Basiskonstrukt.Basis.Dokument_Info_M2N>

        </Model_XY.ThemaX>
    </DATASECTION>
</TRANSFER>

Wenn man das ganze wie nachfolgend löst, ist ein „mischmasch“ der Klassen möglich. Klar, die Objekte Model_XY.ThemaX.Info könnten effektiv erweitert werden und somit zusätzliche Attribute gegenüber Basiskonstrukt.Basis.Info besitzen.

INTERLIS 2.3;

MODEL Model_XY (de) AT "https://localhost" VERSION "2023-04-25" = 
    IMPORTS Basiskonstrukt;

    DOMAIN

    TOPIC ThemaX EXTENDS Basiskonstrukt.Basis =
            
        CLASS Info (EXTENDED) = END Info;

    END ThemaX;
    
END Model_XY.
<?xml version="1.0" encoding="UTF-8"?>
<TRANSFER xmlns="http://www.interlis.ch/INTERLIS2.3">
    <HEADERSECTION SENDER="manual" VERSION="2.3">
        <MODELS>
            <MODEL NAME="Model_XY" VERSION="2023-08-16" URI="https://localhost"></MODEL>
        </MODELS>
    </HEADERSECTION>
    <DATASECTION>
        <Model_XY.ThemaX BID="1">
            
            <Basiskonstrukt.Basis.Info TID="2">
                <foo>test</foo>
                <rDokument REF="5"></rDokument>
            </Basiskonstrukt.Basis.Info>

            <Model_XY.ThemaX.Info TID="4">
                <foo>test2</foo>
                <rDokument REF="5"></rDokument>
            </Model_XY.ThemaX.Info>

            <Basiskonstrukt.Basis.Dokument TID="5">
                <DokImWeb>https://meine-dat.ei</DokImWeb>
            </Basiskonstrukt.Basis.Dokument>

        </Model_XY.ThemaX>
    </DATASECTION>
</TRANSFER>

Somit ist der Einsatz von EXTENDS auf Topic-Ebene wohl nicht sinnvoll. Man erweitertet die benötigten Klassen und Beziehungen (nur M:N) am besten auf Klassen-Ebene. Ein „gemisch“ von unterschiedlichen Namensräumen wird so verhindert. Das resultierende erweiterte Modell kennt nur den „neuen, eigenen“ Namensraum, was zumindest für unseren Anwendungsfall wünschenswert ist.

Somit:

INTERLIS 2.3;

MODEL Model_XY (de) AT "https://localhost" VERSION "2023-08-17" = 
    IMPORTS Basiskonstrukt;

    DOMAIN

    TOPIC ThemaX =
            
        CLASS Info EXTENDS Basiskonstrukt.Basis.Info = END Info;
        CLASS Dokument EXTENDS Basiskonstrukt.Basis.Dokument = END Dokument;
        ASSOCIATION Dokument_Info_M2N EXTENDS Basiskonstrukt.Basis.Dokument_Info_M2N = END Dokument_Info_M2N;
        
        CLASS NewClass = 
            text : MANDATORY TEXT*10;
        END NewClass;

        ASSOCIATION Info_NewClass = 
            rNewClass -- {0..*} NewClass;
            rInfo -- {1} Info;
        END Info_NewClass;
    END ThemaX;

END Model_XY.
<?xml version="1.0" encoding="UTF-8"?>
<TRANSFER xmlns="http://www.interlis.ch/INTERLIS2.3">
    <HEADERSECTION SENDER="manual" VERSION="2.3">
        <MODELS>
            <MODEL NAME="Model_XY" VERSION="2023-08-17" URI="https://localhost"></MODEL>
        </MODELS>
    </HEADERSECTION>
    <DATASECTION>
        <Model_XY.ThemaX BID="1">
            
            <Model_XY.ThemaX.Info TID="2">
                <foo>test</foo>
                <rDokument REF="5"></rDokument>
            </Model_XY.ThemaX.Info>

            <Model_XY.ThemaX.Info TID="4">
                <foo>test2</foo>
                <rDokument REF="5"></rDokument>
            </Model_XY.ThemaX.Info>

            <Model_XY.ThemaX.Dokument TID="5">
                <DokImWeb>https://meine-dat.ei</DokImWeb>
            </Model_XY.ThemaX.Dokument>

            <Model_XY.ThemaX.Dokument_Info_M2N >
                <rInfoM2N REF="2"></rInfoM2N>
                <rDokumentM2N REF="5"></rDokumentM2N>
            </Model_XY.ThemaX.Dokument_Info_M2N>

            <Model_XY.ThemaX.NewClass TID="6">
                <text>test3</text>
                <rInfo REF="4"></rInfo>
            </Model_XY.ThemaX.NewClass>
 
        </Model_XY.ThemaX>
    </DATASECTION>
</TRANSFER>
Info: ...validation done

Das funktioniert natürlich nicht, weil im Basismodell kein Info2 existiert, sondern nur ein Info.

Ja, dieses „Mischmasch“ ist möglich. Weshalb auch nicht? Es gibt die Basisklasse und die leere Erweiterung (welche nichts erweitert) und beide können verwendet werden. Ob es sinnvoll ist, ist die andere Frage. Der gängige Weg wär - soweit ich weiss - dass man keine solche leeren Erweiterungen macht, sondern das Topic erweitert und somit die Basisklassen im erweiterten Modell nutzt auch wenn dies die XML-Namespaces mischt.

Ich denke aber, dass du nicht der Einzige bist, dem das nicht gefällt. Auch dieses Modell https://models.geo.zg.ch/ARV/ZG_Nutzungsplanung_V1_1.ili nutzt den Workaround mit den leeren Erweiterungen. Ich kenne aber den Hintergrund dafür nicht.

Wenn vorhandene Konstrukte importiert und erweitert werden, stehen sie im neuen Modell zur Verfügung. Und zwar im ursprünglichen Namensraum. Das kann man durchaus bewusst wollen, etwas aus semantischen Gründen.
Sobald man so genannt „spezialisiert“, also z.B. weitere Attribute hinzudefiniert befindet sich die entsprechende erweiterte Klasse im neuen Namensraum.

Bei der Erweiterung von Themen (TOPIC) ist es tatsächlich so, dass man sehr bewusst vorgehen muss. Ein häufiger Anwendungsfall ist, wenn abstrakte Basisdefinitionen auf diesem Weg konkretisiert werden. Typischerweise will man aus Interoperabilitätsgründen harmonisierte Definitionen verwenden, aber natürlich jeweils im entsprechenden Kontext, sprich: Namensraum. Hier muss man sowieso explizit erweitert.

1 „Gefällt mir“

Könnte es sein, dass sie es machen, weil sie das TOPIC um BASKET OID AS BasketID und OID AS INTERLIS.UUIDOID erweitern? Hast du nicht das gleiche gemacht @peterstaub in GL? Kommt mir irgendwie bekannt vor.

Das funktioniert natürlich nicht, weil im Basismodell kein Info2 existiert, sondern nur ein Info .

Wollte nur testen, dass dies wirklich nicht geht. Nicht das man doch auch noch eine Erweiterung im importierten Namensraum durchführt.

Ja, dieses „Mischmasch“ ist möglich. Weshalb auch nicht?

Wenn man das Topic und ein Klasse erweitert, die anderen Klassen jedoch bestehen lässt, können Daten in der einen konkret erweiterten und nicht erweiterten Klasse (Namensraum importiertes Modell) geliefert werden und das Transferfile ist valide. Man wäre ja dann nicht zwingend gezwungen die Daten in der erweiterten Klasse zu liefern. Wenn ich eine Erweiterung vornehme, möchte ich doch, dass nur noch diese gilt.

Im Anhang ein valides Transferfile für Zug, von welchem ich nicht glaube das dies so das Ziel war, das man die Erweiterungen „umgehen“ kann. Müsste man ja alles prüfen beim Import auf die DB…

Beispiel_Zug.xtf (2,6 KB)

Man muss sich wirklich bewusst sein, was man noch für „Schattenklassen“ erstellt wenn man auf Ebene Topic erweitert. Ich war mir dies zuvor nicht bewusst und habe zumindest für mich Licht ins Dunkle gebracht. Logischer und „sichererer“ fände ich persönlich, wenn der „neue“ Namensraum beim erweitern auf Stufe Topic verwendet würde.

Ja, das stimmt schon…
Ich stelle mir vor, dass die „reine Lehre“ sagt, dass die Namensräume so repräsentiert werden müssen, dass die Objekte so erscheinen, wie (bzw. wo) sie definiert wurden. Erst, wenn durch die Erweiterung an dieser Definition etwas geändert wurde, wechselt auch der Namensraum – konsequenterweise – dorthin. Das explizite Erweitern einer Klasse in einem erweiterten Topic (ohne, dass an der inhaltlichen Klassendefinition etwas geändert wird) reicht also minimal aus, um den Namensraum umzuschalten.

Mit EXTENDS definiert man eine Spezialisierung der Basisklasse; z.B. wenn Gebäude die Basisklasse ist, ist Wohngebäude eine Spezialisierung.

Mit EXTENDED definiert man keine Spezialisierung sondern erweitert die Basisklasse; also Gebäude bleibt Gebäude (aber erhält im erweiterten Topic weitere Attribute, Beziehungen oder Konsistenzbedingungen).

Darum kann kann es bei Verwendung von EXTENDS sowohl Objekte der Basisklasse (Gebäude) als auch Objekte der spezialisierten Klasse (Wohngebäude) im Transfer gem erweitertem Topic geben.

Bei Verwendung von EXTENDED kann es nur Objekte der Erweiterung im Transfer gem. erweiterten Topic geben (man hat ja kein neues Fachkonzept definiert; es bleibt bei „Gebäude“).

Es ist also eine fachliche Frage: will man eine neues, spezialisiertes, zusätzliches Konzept definieren (Wohngebäude), oder bleibt es beim bestehenden Konzept (Gebäude), das man um weitere Eigenschaften ergänzt?

Danke für die Ausführungen!