From 076cc026c735839f07c2a6c4ff6c12a7bc139135 Mon Sep 17 00:00:00 2001 From: "OD-T14S-25\\PCUser" Date: Sun, 18 Jan 2026 11:08:23 +0100 Subject: [PATCH 01/26] latest examples in JSON-LD and XML --- ...ement with Enumerated Property'.pig.jsonld | 2 +- ... Model (FMC) with Requirements'.pig.jsonld | 2 +- .../22/Small Autonomous Vehicle.pig.jsonld | 2 +- ...ple Model (FMC) with Requirements'.pig.xml | 25 ++++++--- .../Very-Simple-Model-FMC.svg | 54 +++++++++++++++++++ tests/unit/import-jsonld.spec.ts | 4 +- 6 files changed, 76 insertions(+), 13 deletions(-) create mode 100644 tests/data/XML/21/files_and_images/Very-Simple-Model-FMC.svg diff --git a/tests/data/JSON-LD/05/Project 'Requirement with Enumerated Property'.pig.jsonld b/tests/data/JSON-LD/05/Project 'Requirement with Enumerated Property'.pig.jsonld index baee042..5ba3400 100644 --- a/tests/data/JSON-LD/05/Project 'Requirement with Enumerated Property'.pig.jsonld +++ b/tests/data/JSON-LD/05/Project 'Requirement with Enumerated Property'.pig.jsonld @@ -1 +1 @@ -{"@context":{"o":"https://product-information-graph.org/v0.2/ontology#","d":"https://product-information-graph.org/examples/05_Requirement-with-Enumerated-Property.specif#","rdf":"http://www.w3.org/1999/02/22-rdf-syntax-ns#","owl":"http://www.w3.org/2002/07/owl#","sh":"http://www.w3.org/ns/shacl#","xs":"http://www.w3.org/2001/XMLSchema#","dcterms":"http://purl.org/dc/terms/","IREB":"https://cpre.ireb.org/en/downloads-and-resources/glossary#","ReqIF":"https://www.prostep.org/fileadmin/downloads/PSI_ImplementationGuide_ReqIF_V1-7.pdf#","pig":"https://product-information-graph.org/v0.2/metamodel#","SpecIF":"https://specif.de/v1.2/schema#"},"@id":"d:P-Requirement-with-Enumerated-Property","@type":"pig:Package","dcterms:title":[{"@value":"Project 'Requirement with Enumerated Property'"}],"dcterms:modified":"2026-01-12T12:41:01.050Z","@graph":[{"@id":"pig:Entity","@type":"owl:Class","pig:itemType":{"@id":"pig:Entity"},"dcterms:title":[{"@value":"Entity"}],"dcterms:description":[{"@value":"A PIG meta-model element used for entities (aka resources or artifacts)."}],"pig:eligibleProperty":[{"@id":"pig:category"},{"@id":"pig:icon"}]},{"@id":"pig:Organizer","pig:specializes":{"@id":"pig:Entity"},"pig:itemType":{"@id":"pig:Entity"},"dcterms:title":[{"@value":"Organizer"}],"dcterms:description":[{"@value":"An element organizing model elements. An example is a list of requirements or a diagram using a certain notation."}],"pig:eligibleProperty":[{"@id":"pig:category"}]},{"@id":"pig:HierarchyRoot","pig:specializes":{"@id":"pig:Organizer"},"pig:itemType":{"@id":"pig:Entity"},"dcterms:title":[{"@value":"Hierarchy Root"}],"dcterms:description":[{"@value":"A subclass of PIG organizer serving as a root for hierarchically organized graph elements."}],"pig:eligibleProperty":[],"pig:eligibleTargetLink":[{"@id":"pig:lists"}]},{"@id":"pig:Outline","pig:specializes":{"@id":"pig:Organizer"},"pig:itemType":{"@id":"pig:Entity"},"dcterms:title":[{"@value":"Outline"}],"dcterms:description":[{"@value":"A subclass of PIG organizer comprising all information items of a human-readable document. As usual, the outline is hierarchically organized."}],"pig:eligibleProperty":[{"@id":"pig:category"}],"pig:eligibleTargetLink":[{"@id":"pig:lists"}]},{"@id":"pig:View","pig:specializes":{"@id":"pig:Organizer"},"pig:itemType":{"@id":"pig:Entity"},"dcterms:title":[{"@value":"View"}],"dcterms:description":[{"@value":"A subclass of PIG organizer representing a model view (diagram) using a certain notation showing selected model elements."}],"pig:eligibleProperty":[{"@id":"pig:category"},{"@id":"pig:icon"}],"pig:eligibleTargetLink":[{"@id":"pig:shows"},{"@id":"pig:depicts"}]},{"@id":"pig:Relationship","@type":"owl:Class","pig:itemType":{"@id":"pig:Relationship"},"dcterms:title":[{"@value":"Relationship"}],"dcterms:description":[{"@value":"A PIG meta-model element used for reified relationships (aka predicates)."}],"pig:eligibleProperty":[{"@id":"pig:category"},{"@id":"pig:icon"}],"pig:eligibleSourceLink":{"@id":"pig:SourceLink"},"pig:eligibleTargetLink":{"@id":"pig:TargetLink"}},{"@id":"pig:icon","@type":"owl:DatatypeProperty","pig:itemType":{"@id":"pig:Property"},"dcterms:title":[{"@value":"has icon"}],"dcterms:description":[{"@value":"Specifies an icon for a model element (entity or relationship)."}],"sh:datatype":{"@id":"xs:string"},"sh:minCount":0,"sh:maxCount":1},{"@id":"pig:category","pig:specializes":{"@id":"dcterms:type"},"pig:itemType":{"@id":"pig:Property"},"dcterms:title":[{"@value":"has category"}],"dcterms:description":[{"@value":"Specifies a category for an element (entity, relationship or organizer)."}],"sh:datatype":{"@id":"xs:string"},"sh:maxLength":32,"sh:minCount":0,"sh:maxCount":1},{"@id":"pig:Link","@type":"owl:ObjectProperty","pig:itemType":{"@id":"pig:Link"},"pig:eligibleEndpoint":[{"@id":"pig:Entity"},{"@id":"pig:Relationship"}],"dcterms:title":[{"@value":"linked with"}],"dcterms:description":[{"@value":"Connects a reified relationship with its source or target. Also connects an organizer to a model element"}]},{"@id":"pig:SourceLink","pig:specializes":{"@id":"pig:Link"},"pig:itemType":{"@id":"pig:Link"},"pig:eligibleEndpoint":[{"@id":"pig:Entity"},{"@id":"pig:Relationship"}],"dcterms:title":[{"@value":"to source"}],"dcterms:description":[{"@value":"Connects the source of a reified relationship."}]},{"@id":"pig:TargetLink","pig:specializes":{"@id":"pig:Link"},"pig:itemType":{"@id":"pig:Link"},"pig:eligibleEndpoint":[{"@id":"pig:Entity"},{"@id":"pig:Relationship"}],"dcterms:title":[{"@value":"to target"}],"dcterms:description":[{"@value":"Connects the target of a reified relationship or an organizer."}]},{"@id":"pig:lists","pig:specializes":{"@id":"pig:TargetLink"},"pig:itemType":{"@id":"pig:Link"},"pig:eligibleEndpoint":[{"@id":"pig:Entity"},{"@id":"pig:Relationship"},{"@id":"pig:Organizer"}],"dcterms:title":[{"@value":"lists"}],"dcterms:description":[{"@value":"Lists an entity, a relationship or a subordinated organizer."}]},{"@id":"pig:shows","pig:specializes":{"@id":"pig:TargetLink"},"pig:itemType":{"@id":"pig:Link"},"pig:eligibleEndpoint":[{"@id":"pig:Entity"},{"@id":"pig:Relationship"}],"dcterms:title":[{"@value":"shows"}],"dcterms:description":[{"@value":"Shows an entity or a relationship."}]},{"@id":"pig:depicts","pig:specializes":{"@id":"pig:TargetLink"},"pig:itemType":{"@id":"pig:Link"},"pig:eligibleEndpoint":[{"@id":"pig:Entity"}],"dcterms:title":[{"@value":"depicts"}],"dcterms:description":[{"@value":"Depicts an entity; inverse of uml:ownedDiagram."}]},{"@id":"dcterms:title","dcterms:title":[{"@value":"Title","@language":"en"},{"@value":"Titel","@language":"de"},{"@value":"Titre","@language":"fr"}],"dcterms:description":[{"@value":"

A name given to the resource. (source: DCMI)

Title (reference: Dublin Core) of the resource represented as rich text in XHTML content. SHOULD include only content that is valid inside an XHTML 'span' element. (source: OSLC)

","@language":"en"}],"@type":"owl:DatatypeProperty","pig:itemType":{"@id":"pig:Property"},"sh:datatype":{"@id":"xs:string"},"sh:maxCount":1,"sh:maxLength":256},{"@id":"dcterms:description","dcterms:title":[{"@value":"Description","@language":"en"},{"@value":"Beschreibung","@language":"de"},{"@value":"Description","@language":"fr"}],"dcterms:description":[{"@value":"

An account of the resource. (source: DCMI)

Descriptive text (reference: Dublin Core) about resource represented as rich text in XHTML content. SHOULD include only content that is valid and suitable inside an XHTML 'div' element. (source: OSLC)

","@language":"en"}],"@type":"owl:DatatypeProperty","pig:itemType":{"@id":"pig:Property"},"sh:datatype":{"@id":"xs:string"},"sh:maxCount":1},{"@id":"SpecIF:Diagram","dcterms:title":[{"@value":"Diagram","@language":"en"},{"@value":"Diagramm","@language":"de"},{"@value":"Diagramme","@language":"fr"}],"dcterms:description":[{"@value":"A diagram illustrating the resource or a link to a diagram.","@language":"en"}],"@type":"owl:DatatypeProperty","pig:itemType":{"@id":"pig:Property"},"sh:datatype":{"@id":"xs:string"}},{"@id":"dcterms:type","dcterms:title":[{"@value":"Element Type","@language":"en"},{"@value":"Element-Typ","@language":"de"},{"@value":"Type d'élément","@language":"fr"}],"dcterms:description":[{"@value":"

The nature or genre of the resource. (source: DCMI)

Recommended best practice is to use a controlled vocabulary such as the DCMI Type Vocabulary [DCMITYPE]. To describe the file format, physical medium, or dimensions of the resource, use the Format element.

For example, a [[FMC:Actor]] may represent a System Function, a System Component or a User Role. Similarly, in the context of process modelling, a FMC:Actor may represent a Process Step or again a User Role. So, all of these are meaningful values for a FMC:Actor's property named dcterms:type.

","@language":"en"}],"@type":"owl:DatatypeProperty","pig:itemType":{"@id":"pig:Property"},"sh:datatype":{"@id":"xs:string"},"sh:maxCount":1,"sh:maxLength":32},{"@id":"SpecIF:Priority","dcterms:title":[{"@value":"Priority","@language":"en"},{"@value":"Priorität","@language":"de"},{"@value":"Priorité","@language":"fr"}],"dcterms:description":[{"@value":"Enumerated values for the 'Priority' of the resource.","@language":"en"}],"@type":"owl:ObjectProperty","pig:itemType":{"@id":"pig:Property"},"sh:datatype":{"@id":"xs:string"},"pig:eligibleValue":[{"@id":"SpecIF:priorityHigh","dcterms:title":[{"@value":"high","@language":"en"},{"@value":"hoch","@language":"de"},{"@value":"haut","@language":"fr"}]},{"@id":"SpecIF:priorityRatherHigh","dcterms:title":[{"@value":"rather high","@language":"en"},{"@value":"eher hoch","@language":"de"},{"@value":"plutôt haut","@language":"fr"}]},{"@id":"SpecIF:priorityMedium","dcterms:title":[{"@value":"medium","@language":"en"},{"@value":"mittel","@language":"de"},{"@value":"moyen","@language":"fr"}]},{"@id":"SpecIF:priorityRatherLow","dcterms:title":[{"@value":"rather low","@language":"en"},{"@value":"eher niedrig","@language":"de"},{"@value":"plutôt bas","@language":"fr"}]},{"@id":"SpecIF:priorityLow","dcterms:title":[{"@value":"low","@language":"en"},{"@value":"niedrig","@language":"de"},{"@value":"bas","@language":"fr"}]}]},{"@id":"SpecIF:Paragraph","dcterms:title":[{"@value":"Paragraph","@language":"en"},{"@value":"Textabsatz","@language":"de"},{"@value":"Paragraphe","@language":"fr"}],"dcterms:description":[{"@value":"

A 'Paragraph' is an unspecified information in a document at any level.

","@language":"en"},{"@value":"

Ein 'Textabschnitt' in einem Dokument auf beliebiger Ebene.

","@language":"de"}],"pig:specializes":{"@id":"pig:Entity"},"pig:eligibleProperty":[{"@id":"SpecIF:Diagram"},{"@id":"dcterms:type"}],"pig:eligibleTargetLink":[],"pig:itemType":{"@id":"pig:Entity"}},{"@id":"SpecIF:Heading","dcterms:title":[{"@value":"Heading","@language":"en"},{"@value":"Überschrift","@language":"de"},{"@value":"Intitulé","@language":"fr"}],"dcterms:description":[{"@value":"A 'Heading' is a chapter title at any level with optional description.","@language":"en"},{"@value":"Eine 'Überschrift' in einem Dokument ist der Titel eines Kapitels. Sie kann eine Beschreibung haben, die als Einleitung oder Zusammenfassung des Kapitels genutzt werden kann.","@language":"de"}],"pig:specializes":{"@id":"SpecIF:Paragraph"},"pig:eligibleProperty":[],"pig:eligibleTargetLink":[],"pig:itemType":{"@id":"pig:Entity"}},{"@id":"IREB:Requirement","dcterms:title":[{"@value":"Requirement","@language":"en"},{"@value":"Anforderung","@language":"de"},{"@value":"Exigence","@language":"fr"}],"dcterms:description":[{"@value":"

A 'Requirement' is a singular documented physical and functional need that a particular design, product or process must be able to perform. (source: Wikipedia)

Definition:

  1. A condition or capability needed by a user to solve a problem or achieve an objective.
  2. A condition or capability that must be met or possessed by a system or system component to satisfy a contract, standard, specification, or other formally imposed documents.
  3. A documented representation of a condition or capability as in (1) or (2).

Note: The definition above is the classic one from IEEE Std 610.12 of 1990. Alternatively, we also give a more modern definition:

  1. A need perceived by a stakeholder.
  2. A capability or property that a system shall have.
  3. A documented representation of a need, capability or property.
","@language":"en"},{"@value":"

Eine 'Anforderung' ist ein einzelnes dokumentiertes physisches und funktionales Bedürfnis, das ein bestimmter Entwurf, ein Produkt oder ein Prozess erfüllen muss. (source: Wikipedia)

Definition:

  1. Eine Bedingung oder Fähigkeit, die ein Benutzer benötigt, um ein Problem zu lösen oder ein Ziel zu erreichen.
  2. Eine Bedingung oder Fähigkeit, die ein System oder eine Systemkomponente erfüllen oder besitzen muss, um einen Vertrag, eine Norm, eine Spezifikation oder ein anderes formal vorgeschriebenes Dokument zu erfüllen.
  3. Eine dokumentierte Darstellung einer Bedingung oder Fähigkeit wie in (1) oder (2).

Anmerkung: Die obige Definition ist die klassische Definition aus IEEE Std 610.12 von 1990. Alternativ geben wir auch eine modernere Definition an:

  1. Ein von einem Stakeholder wahrgenommener Bedarf.
  2. Eine Fähigkeit oder Eigenschaft, die ein System haben soll.
  3. Eine dokumentierte Darstellung eines Bedarfs, einer Fähigkeit oder Eigenschaft.
","@language":"de"},{"@value":"

Une 'Exigence' est un besoin physique et fonctionnel unique et documenté qu'une conception, un produit ou un processus particulier doit pouvoir satisfaire. (source: Wikipedia)

Définition:

  1. Condition ou capacité dont un utilisateur a besoin pour résoudre un problème ou atteindre un objectif.
  2. Condition ou capacité qui doit être remplie ou possédée par un système ou un composant de système pour satisfaire à un contrat, à une norme, à une spécification ou à d'autres documents imposés officiellement.
  3. Une représentation documentée d'une condition ou d'une capacité comme dans (1) ou (2).

Remarque: La définition ci-dessus est la définition classique de la norme IEEE 610.12 de 1990. Nous donnons également une définition plus moderne:

  1. Un besoin perçu par une partie prenante;
  2. Une capacité ou une propriété qu'un système doit avoir.
  3. Une représentation documentée d'un besoin, d'une capacité ou d'une propriété.
","@language":"fr"}],"pig:specializes":{"@id":"pig:Entity"},"pig:icon":{"@value":"↯"},"pig:eligibleProperty":[{"@id":"SpecIF:Priority"}],"pig:eligibleTargetLink":[],"pig:itemType":{"@id":"pig:Entity"}},{"@id":"d:Req-35100bca2b005ba","@type":"IREB:Requirement","dcterms:modified":"2020-03-26T22:59:00+02:00","dcterms:title":[{"@value":"Minimum button size","@language":"en"}],"dcterms:description":[{"@value":"

The button size MUST not be less than 20mm in diameter.

","@language":"en"}],"SpecIF:Priority":[{"@id":"SpecIF:priorityRatherHigh","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:HierarchyRoot-P-Requirement-with-Enumerated-Property","@type":"pig:HierarchyRoot","pig:itemType":{"@id":"pig:anEntity"},"dcterms:modified":"2026-01-12T12:41:01.215Z","dcterms:title":[{"@value":"Hierarchy Root"}],"dcterms:description":[{"@value":"... anchoring all hierarchies of this graph (package)"}],"pig:lists":[{"@id":"d:HR-bca801377e3d1547","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:HR-bca801377e3d1547","@type":"SpecIF:Heading","dcterms:modified":"2026-01-12T12:41:01.134Z","dcterms:title":[{"@value":"Project 'Requirement with Enumerated Property'"}],"dcterms:type":[{"@value":"ReqIF:HierarchyRoot","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"},"pig:lists":[{"@id":"d:Req-35100bca2b005ba","pig:itemType":{"@id":"pig:aTargetLink"}}]}]} \ No newline at end of file +{"@context":{"o":"https://product-information-graph.org/v0.2/ontology#","d":"https://product-information-graph.org/examples/05_Requirement-with-Enumerated-Property.specif#","rdf":"http://www.w3.org/1999/02/22-rdf-syntax-ns#","owl":"http://www.w3.org/2002/07/owl#","sh":"http://www.w3.org/ns/shacl#","xs":"http://www.w3.org/2001/XMLSchema#","dcterms":"http://purl.org/dc/terms/","IREB":"https://cpre.ireb.org/en/downloads-and-resources/glossary#","ReqIF":"https://www.prostep.org/fileadmin/downloads/PSI_ImplementationGuide_ReqIF_V1-7.pdf#","pig":"https://product-information-graph.org/v0.2/metamodel#","SpecIF":"https://specif.de/v1.2/schema#"},"@id":"d:P-Requirement-with-Enumerated-Property","@type":"pig:Package","dcterms:title":[{"@value":"Project 'Requirement with Enumerated Property'"}],"dcterms:modified":"2026-01-17T22:31:13.052Z","@graph":[{"@id":"pig:Entity","@type":"owl:Class","pig:itemType":{"@id":"pig:Entity"},"dcterms:title":[{"@value":"Entity"}],"dcterms:description":[{"@value":"A PIG meta-model element used for entities (aka resources or artifacts)."}],"pig:eligibleProperty":[{"@id":"pig:category"},{"@id":"pig:icon"}]},{"@id":"pig:Organizer","pig:specializes":{"@id":"pig:Entity"},"pig:itemType":{"@id":"pig:Entity"},"dcterms:title":[{"@value":"Organizer"}],"dcterms:description":[{"@value":"An element organizing model elements. An example is a list of requirements or a diagram using a certain notation."}],"pig:eligibleProperty":[{"@id":"pig:category"}]},{"@id":"pig:HierarchyRoot","pig:specializes":{"@id":"pig:Organizer"},"pig:itemType":{"@id":"pig:Entity"},"dcterms:title":[{"@value":"Hierarchy Root"}],"dcterms:description":[{"@value":"A subclass of PIG organizer serving as a root for hierarchically organized graph elements."}],"pig:eligibleProperty":[],"pig:eligibleTargetLink":[{"@id":"pig:lists"}]},{"@id":"pig:Outline","pig:specializes":{"@id":"pig:Organizer"},"pig:itemType":{"@id":"pig:Entity"},"dcterms:title":[{"@value":"Outline"}],"dcterms:description":[{"@value":"A subclass of PIG organizer comprising all information items of a human-readable document. As usual, the outline is hierarchically organized."}],"pig:eligibleProperty":[{"@id":"pig:category"}],"pig:eligibleTargetLink":[{"@id":"pig:lists"}]},{"@id":"pig:View","pig:specializes":{"@id":"pig:Organizer"},"pig:itemType":{"@id":"pig:Entity"},"dcterms:title":[{"@value":"View"}],"dcterms:description":[{"@value":"A subclass of PIG organizer representing a model view (diagram) using a certain notation showing selected model elements."}],"pig:eligibleProperty":[{"@id":"pig:category"},{"@id":"pig:icon"}],"pig:eligibleTargetLink":[{"@id":"pig:shows"},{"@id":"pig:depicts"}]},{"@id":"pig:Relationship","@type":"owl:Class","pig:itemType":{"@id":"pig:Relationship"},"dcterms:title":[{"@value":"Relationship"}],"dcterms:description":[{"@value":"A PIG meta-model element used for reified relationships (aka predicates)."}],"pig:eligibleProperty":[{"@id":"pig:category"},{"@id":"pig:icon"}],"pig:eligibleSourceLink":{"@id":"pig:SourceLink"},"pig:eligibleTargetLink":{"@id":"pig:TargetLink"}},{"@id":"pig:Property","@type":"owl:DatatypeProperty","pig:itemType":{"@id":"pig:Property"},"dcterms:title":[{"@value":"Property"}],"dcterms:description":[{"@value":"A PIG meta-model element used for properties (aka attributes)."}],"sh:datatype":{"@id":"xs:anyType"}},{"@id":"pig:icon","pig:specializes":{"@id":"pig:Property"},"pig:itemType":{"@id":"pig:Property"},"dcterms:title":[{"@value":"has icon"}],"dcterms:description":[{"@value":"Specifies an icon for a model element (entity or relationship)."}],"sh:datatype":{"@id":"xs:string"},"sh:minCount":0,"sh:maxCount":1},{"@id":"pig:category","pig:specializes":{"@id":"dcterms:type"},"pig:itemType":{"@id":"pig:Property"},"dcterms:title":[{"@value":"has category"}],"dcterms:description":[{"@value":"Specifies a category for an element (entity, relationship or organizer)."}],"sh:datatype":{"@id":"xs:string"},"sh:maxLength":32,"sh:minCount":0,"sh:maxCount":1},{"@id":"pig:Link","@type":"owl:ObjectProperty","pig:itemType":{"@id":"pig:Link"},"pig:eligibleEndpoint":[{"@id":"pig:Entity"},{"@id":"pig:Relationship"}],"dcterms:title":[{"@value":"linked with"}],"dcterms:description":[{"@value":"Connects a reified relationship with its source or target. Also connects an organizer to a model element"}]},{"@id":"pig:SourceLink","pig:specializes":{"@id":"pig:Link"},"pig:itemType":{"@id":"pig:Link"},"pig:eligibleEndpoint":[{"@id":"pig:Entity"},{"@id":"pig:Relationship"}],"dcterms:title":[{"@value":"to source"}],"dcterms:description":[{"@value":"Connects the source of a reified relationship."}]},{"@id":"pig:TargetLink","pig:specializes":{"@id":"pig:Link"},"pig:itemType":{"@id":"pig:Link"},"pig:eligibleEndpoint":[{"@id":"pig:Entity"},{"@id":"pig:Relationship"}],"dcterms:title":[{"@value":"to target"}],"dcterms:description":[{"@value":"Connects the target of a reified relationship or an organizer."}]},{"@id":"pig:lists","pig:specializes":{"@id":"pig:TargetLink"},"pig:itemType":{"@id":"pig:Link"},"pig:eligibleEndpoint":[{"@id":"pig:Entity"},{"@id":"pig:Relationship"},{"@id":"pig:Organizer"}],"dcterms:title":[{"@value":"lists"}],"dcterms:description":[{"@value":"Lists an entity, a relationship or a subordinated organizer."}]},{"@id":"pig:shows","pig:specializes":{"@id":"pig:TargetLink"},"pig:itemType":{"@id":"pig:Link"},"pig:eligibleEndpoint":[{"@id":"pig:Entity"},{"@id":"pig:Relationship"}],"dcterms:title":[{"@value":"shows"}],"dcterms:description":[{"@value":"Shows an entity or a relationship."}]},{"@id":"pig:depicts","pig:specializes":{"@id":"pig:TargetLink"},"pig:itemType":{"@id":"pig:Link"},"pig:eligibleEndpoint":[{"@id":"pig:Entity"}],"dcterms:title":[{"@value":"depicts"}],"dcterms:description":[{"@value":"Depicts an entity; inverse of uml:ownedDiagram."}]},{"@id":"dcterms:title","dcterms:title":[{"@value":"Title","@language":"en"},{"@value":"Titel","@language":"de"},{"@value":"Titre","@language":"fr"}],"dcterms:description":[{"@value":"

A name given to the resource. (source: DCMI)

Title (reference: Dublin Core) of the resource represented as rich text in XHTML content. SHOULD include only content that is valid inside an XHTML 'span' element. (source: OSLC)

","@language":"en"}],"@type":"owl:DatatypeProperty","pig:itemType":{"@id":"pig:Property"},"sh:datatype":{"@id":"xs:string"},"sh:maxCount":1,"sh:maxLength":256},{"@id":"dcterms:description","dcterms:title":[{"@value":"Description","@language":"en"},{"@value":"Beschreibung","@language":"de"},{"@value":"Description","@language":"fr"}],"dcterms:description":[{"@value":"

An account of the resource. (source: DCMI)

Descriptive text (reference: Dublin Core) about resource represented as rich text in XHTML content. SHOULD include only content that is valid and suitable inside an XHTML 'div' element. (source: OSLC)

","@language":"en"}],"@type":"owl:DatatypeProperty","pig:itemType":{"@id":"pig:Property"},"sh:datatype":{"@id":"xs:string"},"sh:maxCount":1},{"@id":"SpecIF:Diagram","dcterms:title":[{"@value":"Diagram","@language":"en"},{"@value":"Diagramm","@language":"de"},{"@value":"Diagramme","@language":"fr"}],"dcterms:description":[{"@value":"A diagram illustrating the resource or a link to a diagram.","@language":"en"}],"@type":"owl:DatatypeProperty","pig:itemType":{"@id":"pig:Property"},"sh:datatype":{"@id":"xs:string"}},{"@id":"dcterms:type","dcterms:title":[{"@value":"Element Type","@language":"en"},{"@value":"Element-Typ","@language":"de"},{"@value":"Type d'élément","@language":"fr"}],"dcterms:description":[{"@value":"

The nature or genre of the resource. (source: DCMI)

Recommended best practice is to use a controlled vocabulary such as the DCMI Type Vocabulary [DCMITYPE]. To describe the file format, physical medium, or dimensions of the resource, use the Format element.

For example, a [[FMC:Actor]] may represent a System Function, a System Component or a User Role. Similarly, in the context of process modelling, a FMC:Actor may represent a Process Step or again a User Role. So, all of these are meaningful values for a FMC:Actor's property named dcterms:type.

","@language":"en"}],"@type":"owl:DatatypeProperty","pig:itemType":{"@id":"pig:Property"},"sh:datatype":{"@id":"xs:string"},"sh:maxCount":1,"sh:maxLength":32},{"@id":"SpecIF:Priority","dcterms:title":[{"@value":"Priority","@language":"en"},{"@value":"Priorität","@language":"de"},{"@value":"Priorité","@language":"fr"}],"dcterms:description":[{"@value":"Enumerated values for the 'Priority' of the resource.","@language":"en"}],"@type":"owl:ObjectProperty","pig:itemType":{"@id":"pig:Property"},"sh:datatype":{"@id":"xs:string"},"pig:eligibleValue":[{"@id":"SpecIF:priorityHigh","dcterms:title":[{"@value":"high","@language":"en"},{"@value":"hoch","@language":"de"},{"@value":"haut","@language":"fr"}]},{"@id":"SpecIF:priorityRatherHigh","dcterms:title":[{"@value":"rather high","@language":"en"},{"@value":"eher hoch","@language":"de"},{"@value":"plutôt haut","@language":"fr"}]},{"@id":"SpecIF:priorityMedium","dcterms:title":[{"@value":"medium","@language":"en"},{"@value":"mittel","@language":"de"},{"@value":"moyen","@language":"fr"}]},{"@id":"SpecIF:priorityRatherLow","dcterms:title":[{"@value":"rather low","@language":"en"},{"@value":"eher niedrig","@language":"de"},{"@value":"plutôt bas","@language":"fr"}]},{"@id":"SpecIF:priorityLow","dcterms:title":[{"@value":"low","@language":"en"},{"@value":"niedrig","@language":"de"},{"@value":"bas","@language":"fr"}]}]},{"@id":"SpecIF:Paragraph","dcterms:title":[{"@value":"Paragraph","@language":"en"},{"@value":"Textabsatz","@language":"de"},{"@value":"Paragraphe","@language":"fr"}],"dcterms:description":[{"@value":"

A 'Paragraph' is an unspecified information in a document at any level.

","@language":"en"},{"@value":"

Ein 'Textabschnitt' in einem Dokument auf beliebiger Ebene.

","@language":"de"}],"pig:specializes":{"@id":"pig:Entity"},"pig:eligibleProperty":[{"@id":"SpecIF:Diagram"},{"@id":"dcterms:type"}],"pig:eligibleTargetLink":[],"pig:itemType":{"@id":"pig:Entity"}},{"@id":"SpecIF:Heading","dcterms:title":[{"@value":"Heading","@language":"en"},{"@value":"Überschrift","@language":"de"},{"@value":"Intitulé","@language":"fr"}],"dcterms:description":[{"@value":"A 'Heading' is a chapter title at any level with optional description.","@language":"en"},{"@value":"Eine 'Überschrift' in einem Dokument ist der Titel eines Kapitels. Sie kann eine Beschreibung haben, die als Einleitung oder Zusammenfassung des Kapitels genutzt werden kann.","@language":"de"}],"pig:specializes":{"@id":"SpecIF:Paragraph"},"pig:eligibleProperty":[],"pig:eligibleTargetLink":[],"pig:itemType":{"@id":"pig:Entity"}},{"@id":"IREB:Requirement","dcterms:title":[{"@value":"Requirement","@language":"en"},{"@value":"Anforderung","@language":"de"},{"@value":"Exigence","@language":"fr"}],"dcterms:description":[{"@value":"

A 'Requirement' is a singular documented physical and functional need that a particular design, product or process must be able to perform. (source: Wikipedia)

Definition:

  1. A condition or capability needed by a user to solve a problem or achieve an objective.
  2. A condition or capability that must be met or possessed by a system or system component to satisfy a contract, standard, specification, or other formally imposed documents.
  3. A documented representation of a condition or capability as in (1) or (2).

Note: The definition above is the classic one from IEEE Std 610.12 of 1990. Alternatively, we also give a more modern definition:

  1. A need perceived by a stakeholder.
  2. A capability or property that a system shall have.
  3. A documented representation of a need, capability or property.
","@language":"en"},{"@value":"

Eine 'Anforderung' ist ein einzelnes dokumentiertes physisches und funktionales Bedürfnis, das ein bestimmter Entwurf, ein Produkt oder ein Prozess erfüllen muss. (source: Wikipedia)

Definition:

  1. Eine Bedingung oder Fähigkeit, die ein Benutzer benötigt, um ein Problem zu lösen oder ein Ziel zu erreichen.
  2. Eine Bedingung oder Fähigkeit, die ein System oder eine Systemkomponente erfüllen oder besitzen muss, um einen Vertrag, eine Norm, eine Spezifikation oder ein anderes formal vorgeschriebenes Dokument zu erfüllen.
  3. Eine dokumentierte Darstellung einer Bedingung oder Fähigkeit wie in (1) oder (2).

Anmerkung: Die obige Definition ist die klassische Definition aus IEEE Std 610.12 von 1990. Alternativ geben wir auch eine modernere Definition an:

  1. Ein von einem Stakeholder wahrgenommener Bedarf.
  2. Eine Fähigkeit oder Eigenschaft, die ein System haben soll.
  3. Eine dokumentierte Darstellung eines Bedarfs, einer Fähigkeit oder Eigenschaft.
","@language":"de"},{"@value":"

Une 'Exigence' est un besoin physique et fonctionnel unique et documenté qu'une conception, un produit ou un processus particulier doit pouvoir satisfaire. (source: Wikipedia)

Définition:

  1. Condition ou capacité dont un utilisateur a besoin pour résoudre un problème ou atteindre un objectif.
  2. Condition ou capacité qui doit être remplie ou possédée par un système ou un composant de système pour satisfaire à un contrat, à une norme, à une spécification ou à d'autres documents imposés officiellement.
  3. Une représentation documentée d'une condition ou d'une capacité comme dans (1) ou (2).

Remarque: La définition ci-dessus est la définition classique de la norme IEEE 610.12 de 1990. Nous donnons également une définition plus moderne:

  1. Un besoin perçu par une partie prenante;
  2. Une capacité ou une propriété qu'un système doit avoir.
  3. Une représentation documentée d'un besoin, d'une capacité ou d'une propriété.
","@language":"fr"}],"pig:specializes":{"@id":"pig:Entity"},"pig:icon":{"@value":"↯"},"pig:eligibleProperty":[{"@id":"SpecIF:Priority"}],"pig:eligibleTargetLink":[],"pig:itemType":{"@id":"pig:Entity"}},{"@id":"d:Req-35100bca2b005ba","@type":"IREB:Requirement","dcterms:modified":"2020-03-26T22:59:00+02:00","dcterms:title":[{"@value":"Minimum button size","@language":"en"}],"dcterms:description":[{"@value":"

The button size MUST not be less than 20mm in diameter.

","@language":"en"}],"SpecIF:Priority":[{"@id":"SpecIF:priorityRatherHigh","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:HierarchyRoot-P-Requirement-with-Enumerated-Property","@type":"pig:HierarchyRoot","pig:itemType":{"@id":"pig:anEntity"},"dcterms:modified":"2026-01-17T22:31:13.255Z","dcterms:title":[{"@value":"Hierarchy Root"}],"dcterms:description":[{"@value":"... anchoring all hierarchies of this graph (package)"}],"pig:lists":[{"@id":"d:HR-bca801377e3d1547","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:HR-bca801377e3d1547","@type":"SpecIF:Heading","dcterms:modified":"2026-01-17T22:31:13.146Z","dcterms:title":[{"@value":"Project 'Requirement with Enumerated Property'"}],"dcterms:type":[{"@value":"ReqIF:HierarchyRoot","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"},"pig:lists":[{"@id":"d:Req-35100bca2b005ba","pig:itemType":{"@id":"pig:aTargetLink"}}]}]} \ No newline at end of file diff --git a/tests/data/JSON-LD/21/Project 'Very Simple Model (FMC) with Requirements'.pig.jsonld b/tests/data/JSON-LD/21/Project 'Very Simple Model (FMC) with Requirements'.pig.jsonld index 55e991a..06d6e64 100644 --- a/tests/data/JSON-LD/21/Project 'Very Simple Model (FMC) with Requirements'.pig.jsonld +++ b/tests/data/JSON-LD/21/Project 'Very Simple Model (FMC) with Requirements'.pig.jsonld @@ -1 +1 @@ -{"@context":{"o":"https://product-information-graph.org/v0.2/ontology#","d":"https://product-information-graph.org/examples/09_Very-Simple-Model-FMC-with-Requirements.specif.zip#","rdf":"http://www.w3.org/1999/02/22-rdf-syntax-ns#","owl":"http://www.w3.org/2002/07/owl#","sh":"http://www.w3.org/ns/shacl#","xs":"http://www.w3.org/2001/XMLSchema#","dcterms":"http://purl.org/dc/terms/","FMC":"http://fmc-modeling.org#","IREB":"https://cpre.ireb.org/en/downloads-and-resources/glossary#","ReqIF":"https://www.prostep.org/fileadmin/downloads/PSI_ImplementationGuide_ReqIF_V1-7.pdf#","oslc_rm":"http://open-services.net/ns/rm#","pig":"https://product-information-graph.org/v0.2/metamodel#","SpecIF":"https://specif.de/v1.2/schema#"},"@id":"d:ACP-Very-Simple-Model-FMC-with-Requirements","@type":"pig:Package","dcterms:title":[{"@value":"Project 'Very Simple Model (FMC) with Requirements'"}],"dcterms:modified":"2026-01-12T12:38:50.406Z","@graph":[{"@id":"pig:Entity","@type":"owl:Class","pig:itemType":{"@id":"pig:Entity"},"dcterms:title":[{"@value":"Entity"}],"dcterms:description":[{"@value":"A PIG meta-model element used for entities (aka resources or artifacts)."}],"pig:eligibleProperty":[{"@id":"pig:category"},{"@id":"pig:icon"}]},{"@id":"pig:Organizer","pig:specializes":{"@id":"pig:Entity"},"pig:itemType":{"@id":"pig:Entity"},"dcterms:title":[{"@value":"Organizer"}],"dcterms:description":[{"@value":"An element organizing model elements. An example is a list of requirements or a diagram using a certain notation."}],"pig:eligibleProperty":[{"@id":"pig:category"}]},{"@id":"pig:HierarchyRoot","pig:specializes":{"@id":"pig:Organizer"},"pig:itemType":{"@id":"pig:Entity"},"dcterms:title":[{"@value":"Hierarchy Root"}],"dcterms:description":[{"@value":"A subclass of PIG organizer serving as a root for hierarchically organized graph elements."}],"pig:eligibleProperty":[],"pig:eligibleTargetLink":[{"@id":"pig:lists"}]},{"@id":"pig:Outline","pig:specializes":{"@id":"pig:Organizer"},"pig:itemType":{"@id":"pig:Entity"},"dcterms:title":[{"@value":"Outline"}],"dcterms:description":[{"@value":"A subclass of PIG organizer comprising all information items of a human-readable document. As usual, the outline is hierarchically organized."}],"pig:eligibleProperty":[{"@id":"pig:category"}],"pig:eligibleTargetLink":[{"@id":"pig:lists"}]},{"@id":"pig:View","pig:specializes":{"@id":"pig:Organizer"},"pig:itemType":{"@id":"pig:Entity"},"dcterms:title":[{"@value":"View"}],"dcterms:description":[{"@value":"A subclass of PIG organizer representing a model view (diagram) using a certain notation showing selected model elements."}],"pig:eligibleProperty":[{"@id":"pig:category"},{"@id":"pig:icon"}],"pig:eligibleTargetLink":[{"@id":"pig:shows"},{"@id":"pig:depicts"}]},{"@id":"pig:Relationship","@type":"owl:Class","pig:itemType":{"@id":"pig:Relationship"},"dcterms:title":[{"@value":"Relationship"}],"dcterms:description":[{"@value":"A PIG meta-model element used for reified relationships (aka predicates)."}],"pig:eligibleProperty":[{"@id":"pig:category"},{"@id":"pig:icon"}],"pig:eligibleSourceLink":{"@id":"pig:SourceLink"},"pig:eligibleTargetLink":{"@id":"pig:TargetLink"}},{"@id":"pig:icon","@type":"owl:DatatypeProperty","pig:itemType":{"@id":"pig:Property"},"dcterms:title":[{"@value":"has icon"}],"dcterms:description":[{"@value":"Specifies an icon for a model element (entity or relationship)."}],"sh:datatype":{"@id":"xs:string"},"sh:minCount":0,"sh:maxCount":1},{"@id":"pig:category","pig:specializes":{"@id":"dcterms:type"},"pig:itemType":{"@id":"pig:Property"},"dcterms:title":[{"@value":"has category"}],"dcterms:description":[{"@value":"Specifies a category for an element (entity, relationship or organizer)."}],"sh:datatype":{"@id":"xs:string"},"sh:maxLength":32,"sh:minCount":0,"sh:maxCount":1},{"@id":"pig:Link","@type":"owl:ObjectProperty","pig:itemType":{"@id":"pig:Link"},"pig:eligibleEndpoint":[{"@id":"pig:Entity"},{"@id":"pig:Relationship"}],"dcterms:title":[{"@value":"linked with"}],"dcterms:description":[{"@value":"Connects a reified relationship with its source or target. Also connects an organizer to a model element"}]},{"@id":"pig:SourceLink","pig:specializes":{"@id":"pig:Link"},"pig:itemType":{"@id":"pig:Link"},"pig:eligibleEndpoint":[{"@id":"pig:Entity"},{"@id":"pig:Relationship"}],"dcterms:title":[{"@value":"to source"}],"dcterms:description":[{"@value":"Connects the source of a reified relationship."}]},{"@id":"pig:TargetLink","pig:specializes":{"@id":"pig:Link"},"pig:itemType":{"@id":"pig:Link"},"pig:eligibleEndpoint":[{"@id":"pig:Entity"},{"@id":"pig:Relationship"}],"dcterms:title":[{"@value":"to target"}],"dcterms:description":[{"@value":"Connects the target of a reified relationship or an organizer."}]},{"@id":"pig:lists","pig:specializes":{"@id":"pig:TargetLink"},"pig:itemType":{"@id":"pig:Link"},"pig:eligibleEndpoint":[{"@id":"pig:Entity"},{"@id":"pig:Relationship"},{"@id":"pig:Organizer"}],"dcterms:title":[{"@value":"lists"}],"dcterms:description":[{"@value":"Lists an entity, a relationship or a subordinated organizer."}]},{"@id":"pig:shows","pig:specializes":{"@id":"pig:TargetLink"},"pig:itemType":{"@id":"pig:Link"},"pig:eligibleEndpoint":[{"@id":"pig:Entity"},{"@id":"pig:Relationship"}],"dcterms:title":[{"@value":"shows"}],"dcterms:description":[{"@value":"Shows an entity or a relationship."}]},{"@id":"pig:depicts","pig:specializes":{"@id":"pig:TargetLink"},"pig:itemType":{"@id":"pig:Link"},"pig:eligibleEndpoint":[{"@id":"pig:Entity"}],"dcterms:title":[{"@value":"depicts"}],"dcterms:description":[{"@value":"Depicts an entity; inverse of uml:ownedDiagram."}]},{"@id":"dcterms:title","dcterms:title":[{"@value":"Title","@language":"en"},{"@value":"Titel","@language":"de"},{"@value":"Titre","@language":"fr"}],"dcterms:description":[{"@value":"

A name given to the resource. (source: DCMI)

Title (reference: Dublin Core) of the resource represented as rich text in XHTML content. SHOULD include only content that is valid inside an XHTML 'span' element. (source: OSLC)

","@language":"en"}],"@type":"owl:DatatypeProperty","pig:itemType":{"@id":"pig:Property"},"sh:datatype":{"@id":"xs:string"},"sh:maxCount":1,"sh:maxLength":256},{"@id":"dcterms:description","dcterms:title":[{"@value":"Description","@language":"en"},{"@value":"Beschreibung","@language":"de"},{"@value":"Description","@language":"fr"}],"dcterms:description":[{"@value":"

An account of the resource. (source: DCMI)

Descriptive text (reference: Dublin Core) about resource represented as rich text in XHTML content. SHOULD include only content that is valid and suitable inside an XHTML 'div' element. (source: OSLC)

","@language":"en"}],"@type":"owl:DatatypeProperty","pig:itemType":{"@id":"pig:Property"},"sh:datatype":{"@id":"xs:string"},"sh:maxCount":1},{"@id":"SpecIF:Diagram","dcterms:title":[{"@value":"Diagram","@language":"en"},{"@value":"Diagramm","@language":"de"},{"@value":"Diagramme","@language":"fr"}],"dcterms:description":[{"@value":"A diagram illustrating the resource or a link to a diagram.","@language":"en"}],"@type":"owl:DatatypeProperty","pig:itemType":{"@id":"pig:Property"},"sh:datatype":{"@id":"xs:string"}},{"@id":"SpecIF:Priority","dcterms:title":[{"@value":"Priority","@language":"en"},{"@value":"Priorität","@language":"de"},{"@value":"Priorité","@language":"fr"}],"dcterms:description":[{"@value":"Enumerated values for the 'Priority' of the resource.","@language":"en"}],"@type":"owl:ObjectProperty","pig:itemType":{"@id":"pig:Property"},"sh:datatype":{"@id":"xs:string"},"pig:eligibleValue":[{"@id":"SpecIF:priorityHigh","dcterms:title":[{"@value":"high","@language":"en"},{"@value":"hoch","@language":"de"},{"@value":"haut","@language":"fr"}]},{"@id":"SpecIF:priorityMedium","dcterms:title":[{"@value":"medium","@language":"en"},{"@value":"mittel","@language":"de"},{"@value":"moyen","@language":"fr"}]},{"@id":"SpecIF:priorityLow","dcterms:title":[{"@value":"low","@language":"en"},{"@value":"niedrig","@language":"de"},{"@value":"bas","@language":"fr"}]}]},{"@id":"SpecIF:Paragraph","dcterms:title":[{"@value":"Paragraph","@language":"en"},{"@value":"Textabsatz","@language":"de"},{"@value":"Paragraphe","@language":"fr"}],"dcterms:description":[{"@value":"

A 'Paragraph' is an unspecified information in a document at any level.

","@language":"en"},{"@value":"

Ein 'Textabschnitt' in einem Dokument auf beliebiger Ebene.

","@language":"de"}],"pig:specializes":{"@id":"pig:Entity"},"pig:eligibleProperty":[{"@id":"SpecIF:Diagram"},{"@id":"pig:category"}],"pig:eligibleTargetLink":[],"pig:itemType":{"@id":"pig:Entity"}},{"@id":"FMC:Actor","dcterms:title":[{"@value":"Actor","@language":"en"},{"@value":"Akteur","@language":"de"},{"@value":"Acteur","@language":"fr"}],"dcterms:description":[{"@value":"

An 'Actor' is a fundamental model element type representing an active entity, be it an activity, a process step, a function, a system component or a role.

The particular use or original type is specified with a [[dcterms:type]] property of the 'FMC:Actor'. A value of that property should be an ontology-term, such as [[bpmn:processStep]].

","@language":"en"},{"@value":"

Ein 'Akteur' ist ein fundamentaler Modellelementtyp, der eine aktive Entität darstellt, sei es eine Aktivität, ein Prozessschritt, eine Funktion, eine Systemkomponente oder eine Rolle.

Die spezielle Verwendung oder der ursprüngliche Typ wird mit einer [[dcterms:type]] Eigenschaft von 'FMC:Actor' spezifiziert. Die Werte dieser Eigenschaft können Ontologiebegriffe sein, wie z.B. [[bpmn:timer]].

","@language":"de"},{"@value":"

Un 'Acteur' est un type d'élément de modèle fondamental représentant une entité active, qu'il s'agisse d'une activité, d'une étape de processus, d'une fonction, d'un composant de système ou d'un rôle.

L'utilisation particulière ou le type original est spécifié avec une propriété [[dcterms:type]] de 'FMC:Actor'. Les valeurs de cette propriété peuvent être des termes d'ontologie, tels que [[bpmn:timer]].

","@language":"fr"}],"pig:specializes":{"@id":"pig:Entity"},"pig:icon":{"@value":"□"},"pig:eligibleProperty":[{"@id":"pig:category"}],"pig:eligibleTargetLink":[],"pig:itemType":{"@id":"pig:Entity"}},{"@id":"FMC:State","dcterms:title":[{"@value":"State","@language":"en"},{"@value":"Zustand","@language":"de"},{"@value":"État","@language":"fr"}],"dcterms:description":[{"@value":"

A 'State' is a fundamental model element type representing a passive entity, be it a value, a condition, an information storage or even a physical shape.

The particular use or the original type is specified with a [[dcterms:type]] property of the 'FMC:State'. A value of that property should bean ontology-term, such as [[bpmn:dataObject]].

","@language":"en"},{"@value":"

Ein 'Zustand' ist ein fundamentaler Modellelementtyp, der eine passive Entität darstellt, sei es ein Wert, ein Dokument, ein Informationsspeicher, eine Bedingung oder eine physische Beschaffenheit.

Die spezielle Verwendung oder der ursprüngliche Typ wird mit einer [[dcterms:type]] Eigenschaft von 'FMC:State' spezifiziert. Die Werte dieser Eigenschaft können Ontologiebegriffe sein, wie z.B. [[ArchiMate:DataObject]].

","@language":"de"},{"@value":"

Un 'État' est un type d'élément de modèle fondamental représentant une entité passive, qu'il s'agisse d'une valeur, d'une condition, d'un stockage d'informations ou même d'une forme physique.

L'utilisation particulière ou le type original est spécifié avec une propriété [[dcterms:type]] de 'FMC:State'. Les valeurs de cette propriété peuvent être des termes d'ontologie, tels que [[ArchiMate:DataObject]].

","@language":"fr"}],"pig:specializes":{"@id":"pig:Entity"},"pig:icon":{"@value":"○"},"pig:eligibleProperty":[{"@id":"pig:category"}],"pig:eligibleTargetLink":[],"pig:itemType":{"@id":"pig:Entity"}},{"@id":"FMC:Event","dcterms:title":[{"@value":"Event","@language":"en"},{"@value":"Ereignis","@language":"de"},{"@value":"Évenement","@language":"fr"}],"dcterms:description":[{"@value":"

An 'Event' is a fundamental model element type representing a time reference, a change in condition/value or more generally a synchronization primitive.

The particular use or the original type is specified with a [[dcterms:type]] property of the 'FMC:Event'. A value of that property should be an ontology-term, such as [[bpmn:startEvent]].

","@language":"en"},{"@value":"

Ein 'Ereignis' ist ein fundamentaler Modellelementtyp, der eine Zeitreferenz, eine Änderung einer Bedingung/eines Wertes oder allgemeiner ein Synchronisationsmittel darstellt.

Die spezielle Verwendung oder der ursprüngliche Typ wird mit einer [[dcterms:type]] Eigenschaft von 'FMC:Event' spezifiziert. Die Werte dieser Eigenschaft sollen Ontologiebegriffe sein, wie z.B. [[bpmn:startEvent]].

","@language":"de"},{"@value":"

Un 'Événement' est un type d'élément de modèle fondamental représentant une référence temporelle, un changement de condition/valeur ou plus généralement une primitive de synchronisation.

L'utilisation particulière ou le type original est spécifié avec une propriété [[dcterms:type]] de 'FMC:Event'. Les valeurs de cette propriété peuvent être des termes d'ontologie, tels que [[bpmn:startEvent]].

","@language":"fr"}],"pig:specializes":{"@id":"pig:Entity"},"pig:icon":{"@value":"♢"},"pig:eligibleProperty":[{"@id":"pig:category"}],"pig:eligibleTargetLink":[],"pig:itemType":{"@id":"pig:Entity"}},{"@id":"IREB:Requirement","dcterms:title":[{"@value":"Requirement","@language":"en"},{"@value":"Anforderung","@language":"de"},{"@value":"Exigence","@language":"fr"}],"dcterms:description":[{"@value":"

A 'Requirement' is a singular documented physical and functional need that a particular design, product or process must be able to perform. (source: Wikipedia)

Definition:

  1. A condition or capability needed by a user to solve a problem or achieve an objective.
  2. A condition or capability that must be met or possessed by a system or system component to satisfy a contract, standard, specification, or other formally imposed documents.
  3. A documented representation of a condition or capability as in (1) or (2).

Note: The definition above is the classic one from IEEE Std 610.12 of 1990. Alternatively, we also give a more modern definition:

  1. A need perceived by a stakeholder.
  2. A capability or property that a system shall have.
  3. A documented representation of a need, capability or property.
","@language":"en"},{"@value":"

Eine 'Anforderung' ist ein einzelnes dokumentiertes physisches und funktionales Bedürfnis, das ein bestimmter Entwurf, ein Produkt oder ein Prozess erfüllen muss. (source: Wikipedia)

Definition:

  1. Eine Bedingung oder Fähigkeit, die ein Benutzer benötigt, um ein Problem zu lösen oder ein Ziel zu erreichen.
  2. Eine Bedingung oder Fähigkeit, die ein System oder eine Systemkomponente erfüllen oder besitzen muss, um einen Vertrag, eine Norm, eine Spezifikation oder ein anderes formal vorgeschriebenes Dokument zu erfüllen.
  3. Eine dokumentierte Darstellung einer Bedingung oder Fähigkeit wie in (1) oder (2).

Anmerkung: Die obige Definition ist die klassische Definition aus IEEE Std 610.12 von 1990. Alternativ geben wir auch eine modernere Definition an:

  1. Ein von einem Stakeholder wahrgenommener Bedarf.
  2. Eine Fähigkeit oder Eigenschaft, die ein System haben soll.
  3. Eine dokumentierte Darstellung eines Bedarfs, einer Fähigkeit oder Eigenschaft.
","@language":"de"},{"@value":"

Une 'Exigence' est un besoin physique et fonctionnel unique et documenté qu'une conception, un produit ou un processus particulier doit pouvoir satisfaire. (source: Wikipedia)

Définition:

  1. Condition ou capacité dont un utilisateur a besoin pour résoudre un problème ou atteindre un objectif.
  2. Condition ou capacité qui doit être remplie ou possédée par un système ou un composant de système pour satisfaire à un contrat, à une norme, à une spécification ou à d'autres documents imposés officiellement.
  3. Une représentation documentée d'une condition ou d'une capacité comme dans (1) ou (2).

Remarque: La définition ci-dessus est la définition classique de la norme IEEE 610.12 de 1990. Nous donnons également une définition plus moderne:

  1. Un besoin perçu par une partie prenante;
  2. Une capacité ou une propriété qu'un système doit avoir.
  3. Une représentation documentée d'un besoin, d'une capacité ou d'une propriété.
","@language":"fr"}],"pig:specializes":{"@id":"pig:Entity"},"pig:icon":{"@value":"↯"},"pig:eligibleProperty":[{"@id":"SpecIF:Priority"}],"pig:eligibleTargetLink":[],"pig:itemType":{"@id":"pig:Entity"}},{"@id":"SpecIF:writes","dcterms:title":[{"@value":"writes","@language":"en"},{"@value":"schreibt","@language":"de"},{"@value":"écrit","@language":"fr"}],"dcterms:description":[{"@value":"A [[FMC:Actor]] 'writes' (changes) a [[FMC:State]].","@language":"en"}],"pig:specializes":{"@id":"pig:Relationship"},"pig:eligibleProperty":[],"pig:itemType":{"@id":"pig:Relationship"},"pig:eligibleSourceLink":{"@id":"SpecIF:writes-toSource"},"pig:eligibleTargetLink":{"@id":"SpecIF:writes-toTarget"}},{"@id":"SpecIF:writes-toSource","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:SourceLink"},"dcterms:title":[{"@value":"SpecIF:writes to source"}],"dcterms:description":[{"@value":"Connects the source of SpecIF:writes"}],"pig:eligibleEndpoint":[{"@id":"FMC:Actor"}]},{"@id":"SpecIF:writes-toTarget","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:TargetLink"},"dcterms:title":[{"@value":"SpecIF:writes to target"}],"dcterms:description":[{"@value":"Connects the target of SpecIF:writes"}],"pig:eligibleEndpoint":[{"@id":"FMC:State"}]},{"@id":"SpecIF:reads","dcterms:title":[{"@value":"reads","@language":"en"},{"@value":"liest","@language":"de"},{"@value":"lit","@language":"fr"}],"dcterms:description":[{"@value":"A [[FMC:Actor]] 'reads' a [[FMC:State]].","@language":"en"}],"pig:specializes":{"@id":"pig:Relationship"},"pig:eligibleProperty":[],"pig:itemType":{"@id":"pig:Relationship"},"pig:eligibleSourceLink":{"@id":"SpecIF:reads-toSource"},"pig:eligibleTargetLink":{"@id":"SpecIF:reads-toTarget"}},{"@id":"SpecIF:reads-toSource","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:SourceLink"},"dcterms:title":[{"@value":"SpecIF:reads to source"}],"dcterms:description":[{"@value":"Connects the source of SpecIF:reads"}],"pig:eligibleEndpoint":[{"@id":"FMC:Actor"}]},{"@id":"SpecIF:reads-toTarget","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:TargetLink"},"dcterms:title":[{"@value":"SpecIF:reads to target"}],"dcterms:description":[{"@value":"Connects the target of SpecIF:reads"}],"pig:eligibleEndpoint":[{"@id":"FMC:State"}]},{"@id":"oslc_rm:satisfies","dcterms:title":[{"@value":"satisfies","@language":"en"},{"@value":"erfüllt","@language":"de"},{"@value":"satisfait","@language":"fr"}],"dcterms:description":[{"@value":"

The object is satisfied by the subject. (source: OSLC)

SpecIF suggests that the subject is confined to a model element, e.g, a [[FMC:Actor]] or [[FMC:State]], and the object is confined to a [[IREB:Requirement]]. More concretely, an example for this type of statement is 'Component-X satisfies 'Requirement-4711'.

","@language":"en"}],"pig:specializes":{"@id":"pig:Relationship"},"pig:eligibleProperty":[],"pig:itemType":{"@id":"pig:Relationship"},"pig:eligibleSourceLink":{"@id":"oslc_rm:satisfies-toSource"},"pig:eligibleTargetLink":{"@id":"oslc_rm:satisfies-toTarget"}},{"@id":"oslc_rm:satisfies-toSource","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:SourceLink"},"dcterms:title":[{"@value":"oslc_rm:satisfies to source"}],"dcterms:description":[{"@value":"Connects the source of oslc_rm:satisfies"}],"pig:eligibleEndpoint":[{"@id":"FMC:Actor"},{"@id":"FMC:State"}]},{"@id":"oslc_rm:satisfies-toTarget","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:TargetLink"},"dcterms:title":[{"@value":"oslc_rm:satisfies to target"}],"dcterms:description":[{"@value":"Connects the target of oslc_rm:satisfies"}],"pig:eligibleEndpoint":[{"@id":"IREB:Requirement"}]},{"@id":"d:Req-1a8016e2872e78ecadc50feddc00029b","@type":"IREB:Requirement","dcterms:modified":"2020-10-17T10:00:00+01:00","dcterms:title":[{"@value":"Data Volume"}],"dcterms:description":[{"@value":"

The data store MUST support a total volume up to 850 GB.

"}],"SpecIF:Priority":[{"@id":"SpecIF:priorityHigh","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:Req-0Z7916e2872e78ecadc50feddc00918a","@type":"IREB:Requirement","dcterms:modified":"2020-10-17T10:00:00+01:00","dcterms:title":[{"@value":"Consistency"}],"dcterms:description":[{"@value":"

The data store MUST be consistent at all times.

"}],"SpecIF:Priority":[{"@id":"SpecIF:priorityHigh","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:Req-2b9016e2872e78ecadc50feddc0013Ac","@type":"IREB:Requirement","dcterms:modified":"2020-10-17T10:00:00+01:00","dcterms:title":[{"@value":"Response Time"}],"dcterms:description":[{"@value":"

The system SHOULD respond on user queries within 300 ms.

"}],"SpecIF:Priority":[{"@id":"SpecIF:priorityMedium","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:Diagram-aec0df7900010000017001eaf53e8876","@type":"pig:View","dcterms:modified":"2020-03-06T08:32:00+01:00","dcterms:title":[{"@value":"IT-Integration: FiCo-Application and FiCo-Data"}],"SpecIF:Diagram":[{"@value":"

Model Diagram:

Notation: FMC Block Diagram

","pig:itemType":{"@id":"pig:aProperty"}}],"pig:category":[{"@value":"FMC Block Diagram","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"},"pig:shows":[{"@id":"d:MEl-50fbfe8f0029b1a8016ea86245a9d83a","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:MEl-50feddc00029b1a8016e2872e78ecadc","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:SWri-50fbfe8f0029b1a8016ea86245a9d83a-50feddc00029b1a8016e2872e78ecadc","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:SRea-50fbfe8f0029b1a8016ea86245a9d83a-50feddc00029b1a8016e2872e78ecadc","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:MEl-50fbfe8f0029b1a8016ea86245a9d83a","@type":"FMC:Actor","dcterms:modified":"2020-03-06T09:04:00+01:00","dcterms:title":[{"@value":"FiCo-Application"}],"dcterms:description":[{"@value":"

IT-Application for Finance and Controlling.

"}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:MEl-50feddc00029b1a8016e2872e78ecadc","@type":"FMC:State","dcterms:modified":"2020-03-06T09:03:00+01:00","dcterms:title":[{"@value":"FiCo-Data"}],"dcterms:description":[{"@value":"

Finance and Controlling Data, such as cost-units per project with budget, accrued cost etc.

"}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:SWri-50fbfe8f0029b1a8016ea86245a9d83a-50feddc00029b1a8016e2872e78ecadc","@type":"SpecIF:writes","dcterms:modified":"2020-03-06T09:05:00+01:00","dcterms:description":[{"@value":"'FiCo-Application' writes 'FiCo-Data'"}],"pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:writes-toSource":[{"@id":"d:MEl-50fbfe8f0029b1a8016ea86245a9d83a","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:writes-toTarget":[{"@id":"d:MEl-50feddc00029b1a8016e2872e78ecadc","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:SRea-50fbfe8f0029b1a8016ea86245a9d83a-50feddc00029b1a8016e2872e78ecadc","@type":"SpecIF:reads","dcterms:modified":"2020-03-06T09:05:00+01:00","dcterms:description":[{"@value":"'FiCo-Application' reads 'FiCo-Data'"}],"pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:reads-toSource":[{"@id":"d:MEl-50fbfe8f0029b1a8016ea86245a9d83a","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:reads-toTarget":[{"@id":"d:MEl-50feddc00029b1a8016e2872e78ecadc","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:Ssat-50feddc00029b1a8016e2872e78ecadc-1a8016e2872e78ecadc50feddc00029b","@type":"oslc_rm:satisfies","dcterms:modified":"2020-10-17T10:00:00+01:00","dcterms:description":[{"@value":"'FiCo-Data' satisfies 'Data Volume'"}],"pig:itemType":{"@id":"pig:aRelationship"},"oslc_rm:satisfies-toSource":[{"@id":"d:MEl-50feddc00029b1a8016e2872e78ecadc","pig:itemType":{"@id":"pig:aSourceLink"}}],"oslc_rm:satisfies-toTarget":[{"@id":"d:Req-1a8016e2872e78ecadc50feddc00029b","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:Ssat-50feddc00029b1a8016e2872e78ecadc-0Z7916e2872e78ecadc50feddc00918a","@type":"oslc_rm:satisfies","dcterms:modified":"2020-10-17T10:00:00+01:00","dcterms:description":[{"@value":"'FiCo-Data' satisfies 'Consistency'"}],"pig:itemType":{"@id":"pig:aRelationship"},"oslc_rm:satisfies-toSource":[{"@id":"d:MEl-50feddc00029b1a8016e2872e78ecadc","pig:itemType":{"@id":"pig:aSourceLink"}}],"oslc_rm:satisfies-toTarget":[{"@id":"d:Req-0Z7916e2872e78ecadc50feddc00918a","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:Ssat-50fbfe8f0029b1a8016ea86245a9d83a-2b9016e2872e78ecadc50feddc0013Ac","@type":"oslc_rm:satisfies","dcterms:modified":"2020-10-17T10:00:00+01:00","dcterms:description":[{"@value":"'FiCo-Application' satisfies 'Response Time'"}],"pig:itemType":{"@id":"pig:aRelationship"},"oslc_rm:satisfies-toSource":[{"@id":"d:MEl-50fbfe8f0029b1a8016ea86245a9d83a","pig:itemType":{"@id":"pig:aSourceLink"}}],"oslc_rm:satisfies-toTarget":[{"@id":"d:Req-2b9016e2872e78ecadc50feddc0013Ac","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:HierarchyRoot-ACP-Very-Simple-Model-FMC-with-Requirements","@type":"pig:HierarchyRoot","pig:itemType":{"@id":"pig:anEntity"},"dcterms:modified":"2026-01-12T12:38:50.710Z","dcterms:title":[{"@value":"Hierarchy Root"}],"dcterms:description":[{"@value":"... anchoring all hierarchies of this graph (package)"}],"pig:lists":[{"@id":"d:HR-Folder-Introduction","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:HR-Folder-Requirements","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:HR-Folder-SystemModel","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:HR-FolderGlossary-10875487071","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:Folder-Introduction","@type":"pig:Outline","dcterms:modified":"2025-02-07T08:32:00+01:00","dcterms:title":[{"@value":"Introduction"}],"dcterms:description":[{"@value":"

This is a minimal showcase for a model with model-elements and related requirements. It covers pretty much all characteristics neeeded in such cases (including 'statements on statements'), so that transformations and expressive power of other data formats can be evaluated. The example and its representation in SpecIF format is discussed in Tutorial 6: Very Simple Model (FMC) and Tutorial 9: Very Simple Model (FMC) with Requirements.

"}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:HR-Folder-Introduction","@type":"pig:Outline","dcterms:modified":"2026-01-12T12:38:50.579Z","dcterms:title":[{"@value":"Project 'Very Simple Model (FMC) with Requirements'"}],"pig:category":[{"@value":"ReqIF:HierarchyRoot","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"},"pig:lists":[{"@id":"d:Folder-Introduction","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:Folder-Requirements","@type":"pig:Outline","dcterms:modified":"2020-03-06T08:32:00+01:00","dcterms:title":[{"@value":"Requirements"}],"pig:itemType":{"@id":"pig:anEntity"},"pig:lists":[{"@id":"d:Req-1a8016e2872e78ecadc50feddc00029b","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:Req-0Z7916e2872e78ecadc50feddc00918a","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:Req-2b9016e2872e78ecadc50feddc0013Ac","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:HR-Folder-Requirements","@type":"pig:Outline","dcterms:modified":"2026-01-12T12:38:50.579Z","dcterms:title":[{"@value":"Project 'Very Simple Model (FMC) with Requirements'"}],"pig:category":[{"@value":"ReqIF:HierarchyRoot","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"},"pig:lists":[{"@id":"d:Folder-Requirements","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:Folder-SystemModel","@type":"pig:Outline","dcterms:modified":"2020-03-06T08:32:00+01:00","dcterms:title":[{"@value":"System Model"}],"pig:itemType":{"@id":"pig:anEntity"},"pig:lists":[{"@id":"d:Diagram-aec0df7900010000017001eaf53e8876","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:HR-Folder-SystemModel","@type":"pig:Outline","dcterms:modified":"2026-01-12T12:38:50.579Z","dcterms:title":[{"@value":"Project 'Very Simple Model (FMC) with Requirements'"}],"pig:category":[{"@value":"ReqIF:HierarchyRoot","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"},"pig:lists":[{"@id":"d:Folder-SystemModel","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:FolderGlossary-10875487071","@type":"pig:Outline","dcterms:modified":"2026-01-12T12:38:44.062Z","dcterms:title":[{"@value":"Model Elements (Glossary)"}],"pig:category":[{"@value":"SpecIF:Glossary","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"},"pig:lists":[{"@id":"d:MEl-50fbfe8f0029b1a8016ea86245a9d83a","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:MEl-50feddc00029b1a8016e2872e78ecadc","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:HR-FolderGlossary-10875487071","@type":"pig:Outline","dcterms:modified":"2026-01-12T12:38:50.579Z","dcterms:title":[{"@value":"Project 'Very Simple Model (FMC) with Requirements'"}],"pig:category":[{"@value":"ReqIF:HierarchyRoot","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"},"pig:lists":[{"@id":"d:FolderGlossary-10875487071","pig:itemType":{"@id":"pig:aTargetLink"}}]}]} \ No newline at end of file +{"@context":{"o":"https://product-information-graph.org/v0.2/ontology#","d":"https://product-information-graph.org/examples/09_Very-Simple-Model-FMC-with-Requirements.specif.zip#","rdf":"http://www.w3.org/1999/02/22-rdf-syntax-ns#","owl":"http://www.w3.org/2002/07/owl#","sh":"http://www.w3.org/ns/shacl#","xs":"http://www.w3.org/2001/XMLSchema#","dcterms":"http://purl.org/dc/terms/","FMC":"http://fmc-modeling.org#","IREB":"https://cpre.ireb.org/en/downloads-and-resources/glossary#","ReqIF":"https://www.prostep.org/fileadmin/downloads/PSI_ImplementationGuide_ReqIF_V1-7.pdf#","oslc_rm":"http://open-services.net/ns/rm#","pig":"https://product-information-graph.org/v0.2/metamodel#","SpecIF":"https://specif.de/v1.2/schema#"},"@id":"d:ACP-Very-Simple-Model-FMC-with-Requirements","@type":"pig:Package","dcterms:title":[{"@value":"Project 'Very Simple Model (FMC) with Requirements'"}],"dcterms:modified":"2026-01-17T22:38:19.595Z","@graph":[{"@id":"pig:Entity","@type":"owl:Class","pig:itemType":{"@id":"pig:Entity"},"dcterms:title":[{"@value":"Entity"}],"dcterms:description":[{"@value":"A PIG meta-model element used for entities (aka resources or artifacts)."}],"pig:eligibleProperty":[{"@id":"pig:category"},{"@id":"pig:icon"}]},{"@id":"pig:Organizer","pig:specializes":{"@id":"pig:Entity"},"pig:itemType":{"@id":"pig:Entity"},"dcterms:title":[{"@value":"Organizer"}],"dcterms:description":[{"@value":"An element organizing model elements. An example is a list of requirements or a diagram using a certain notation."}],"pig:eligibleProperty":[{"@id":"pig:category"}]},{"@id":"pig:HierarchyRoot","pig:specializes":{"@id":"pig:Organizer"},"pig:itemType":{"@id":"pig:Entity"},"dcterms:title":[{"@value":"Hierarchy Root"}],"dcterms:description":[{"@value":"A subclass of PIG organizer serving as a root for hierarchically organized graph elements."}],"pig:eligibleProperty":[],"pig:eligibleTargetLink":[{"@id":"pig:lists"}]},{"@id":"pig:Outline","pig:specializes":{"@id":"pig:Organizer"},"pig:itemType":{"@id":"pig:Entity"},"dcterms:title":[{"@value":"Outline"}],"dcterms:description":[{"@value":"A subclass of PIG organizer comprising all information items of a human-readable document. As usual, the outline is hierarchically organized."}],"pig:eligibleProperty":[{"@id":"pig:category"}],"pig:eligibleTargetLink":[{"@id":"pig:lists"}]},{"@id":"pig:View","pig:specializes":{"@id":"pig:Organizer"},"pig:itemType":{"@id":"pig:Entity"},"dcterms:title":[{"@value":"View"}],"dcterms:description":[{"@value":"A subclass of PIG organizer representing a model view (diagram) using a certain notation showing selected model elements."}],"pig:eligibleProperty":[{"@id":"pig:category"},{"@id":"pig:icon"}],"pig:eligibleTargetLink":[{"@id":"pig:shows"},{"@id":"pig:depicts"}]},{"@id":"pig:Relationship","@type":"owl:Class","pig:itemType":{"@id":"pig:Relationship"},"dcterms:title":[{"@value":"Relationship"}],"dcterms:description":[{"@value":"A PIG meta-model element used for reified relationships (aka predicates)."}],"pig:eligibleProperty":[{"@id":"pig:category"},{"@id":"pig:icon"}],"pig:eligibleSourceLink":{"@id":"pig:SourceLink"},"pig:eligibleTargetLink":{"@id":"pig:TargetLink"}},{"@id":"pig:Property","@type":"owl:DatatypeProperty","pig:itemType":{"@id":"pig:Property"},"dcterms:title":[{"@value":"Property"}],"dcterms:description":[{"@value":"A PIG meta-model element used for properties (aka attributes)."}],"sh:datatype":{"@id":"xs:anyType"}},{"@id":"pig:icon","pig:specializes":{"@id":"pig:Property"},"pig:itemType":{"@id":"pig:Property"},"dcterms:title":[{"@value":"has icon"}],"dcterms:description":[{"@value":"Specifies an icon for a model element (entity or relationship)."}],"sh:datatype":{"@id":"xs:string"},"sh:minCount":0,"sh:maxCount":1},{"@id":"pig:category","pig:specializes":{"@id":"dcterms:type"},"pig:itemType":{"@id":"pig:Property"},"dcterms:title":[{"@value":"has category"}],"dcterms:description":[{"@value":"Specifies a category for an element (entity, relationship or organizer)."}],"sh:datatype":{"@id":"xs:string"},"sh:maxLength":32,"sh:minCount":0,"sh:maxCount":1},{"@id":"pig:Link","@type":"owl:ObjectProperty","pig:itemType":{"@id":"pig:Link"},"pig:eligibleEndpoint":[{"@id":"pig:Entity"},{"@id":"pig:Relationship"}],"dcterms:title":[{"@value":"linked with"}],"dcterms:description":[{"@value":"Connects a reified relationship with its source or target. Also connects an organizer to a model element"}]},{"@id":"pig:SourceLink","pig:specializes":{"@id":"pig:Link"},"pig:itemType":{"@id":"pig:Link"},"pig:eligibleEndpoint":[{"@id":"pig:Entity"},{"@id":"pig:Relationship"}],"dcterms:title":[{"@value":"to source"}],"dcterms:description":[{"@value":"Connects the source of a reified relationship."}]},{"@id":"pig:TargetLink","pig:specializes":{"@id":"pig:Link"},"pig:itemType":{"@id":"pig:Link"},"pig:eligibleEndpoint":[{"@id":"pig:Entity"},{"@id":"pig:Relationship"}],"dcterms:title":[{"@value":"to target"}],"dcterms:description":[{"@value":"Connects the target of a reified relationship or an organizer."}]},{"@id":"pig:lists","pig:specializes":{"@id":"pig:TargetLink"},"pig:itemType":{"@id":"pig:Link"},"pig:eligibleEndpoint":[{"@id":"pig:Entity"},{"@id":"pig:Relationship"},{"@id":"pig:Organizer"}],"dcterms:title":[{"@value":"lists"}],"dcterms:description":[{"@value":"Lists an entity, a relationship or a subordinated organizer."}]},{"@id":"pig:shows","pig:specializes":{"@id":"pig:TargetLink"},"pig:itemType":{"@id":"pig:Link"},"pig:eligibleEndpoint":[{"@id":"pig:Entity"},{"@id":"pig:Relationship"}],"dcterms:title":[{"@value":"shows"}],"dcterms:description":[{"@value":"Shows an entity or a relationship."}]},{"@id":"pig:depicts","pig:specializes":{"@id":"pig:TargetLink"},"pig:itemType":{"@id":"pig:Link"},"pig:eligibleEndpoint":[{"@id":"pig:Entity"}],"dcterms:title":[{"@value":"depicts"}],"dcterms:description":[{"@value":"Depicts an entity; inverse of uml:ownedDiagram."}]},{"@id":"dcterms:title","dcterms:title":[{"@value":"Title","@language":"en"},{"@value":"Titel","@language":"de"},{"@value":"Titre","@language":"fr"}],"dcterms:description":[{"@value":"

A name given to the resource. (source: DCMI)

Title (reference: Dublin Core) of the resource represented as rich text in XHTML content. SHOULD include only content that is valid inside an XHTML 'span' element. (source: OSLC)

","@language":"en"}],"@type":"owl:DatatypeProperty","pig:itemType":{"@id":"pig:Property"},"sh:datatype":{"@id":"xs:string"},"sh:maxCount":1,"sh:maxLength":256},{"@id":"dcterms:description","dcterms:title":[{"@value":"Description","@language":"en"},{"@value":"Beschreibung","@language":"de"},{"@value":"Description","@language":"fr"}],"dcterms:description":[{"@value":"

An account of the resource. (source: DCMI)

Descriptive text (reference: Dublin Core) about resource represented as rich text in XHTML content. SHOULD include only content that is valid and suitable inside an XHTML 'div' element. (source: OSLC)

","@language":"en"}],"@type":"owl:DatatypeProperty","pig:itemType":{"@id":"pig:Property"},"sh:datatype":{"@id":"xs:string"},"sh:maxCount":1},{"@id":"SpecIF:Diagram","dcterms:title":[{"@value":"Diagram","@language":"en"},{"@value":"Diagramm","@language":"de"},{"@value":"Diagramme","@language":"fr"}],"dcterms:description":[{"@value":"A diagram illustrating the resource or a link to a diagram.","@language":"en"}],"@type":"owl:DatatypeProperty","pig:itemType":{"@id":"pig:Property"},"sh:datatype":{"@id":"xs:string"}},{"@id":"SpecIF:Priority","dcterms:title":[{"@value":"Priority","@language":"en"},{"@value":"Priorität","@language":"de"},{"@value":"Priorité","@language":"fr"}],"dcterms:description":[{"@value":"Enumerated values for the 'Priority' of the resource.","@language":"en"}],"@type":"owl:ObjectProperty","pig:itemType":{"@id":"pig:Property"},"sh:datatype":{"@id":"xs:string"},"pig:eligibleValue":[{"@id":"SpecIF:priorityHigh","dcterms:title":[{"@value":"high","@language":"en"},{"@value":"hoch","@language":"de"},{"@value":"haut","@language":"fr"}]},{"@id":"SpecIF:priorityMedium","dcterms:title":[{"@value":"medium","@language":"en"},{"@value":"mittel","@language":"de"},{"@value":"moyen","@language":"fr"}]},{"@id":"SpecIF:priorityLow","dcterms:title":[{"@value":"low","@language":"en"},{"@value":"niedrig","@language":"de"},{"@value":"bas","@language":"fr"}]}]},{"@id":"SpecIF:Paragraph","dcterms:title":[{"@value":"Paragraph","@language":"en"},{"@value":"Textabsatz","@language":"de"},{"@value":"Paragraphe","@language":"fr"}],"dcterms:description":[{"@value":"

A 'Paragraph' is an unspecified information in a document at any level.

","@language":"en"},{"@value":"

Ein 'Textabschnitt' in einem Dokument auf beliebiger Ebene.

","@language":"de"}],"pig:specializes":{"@id":"pig:Entity"},"pig:eligibleProperty":[{"@id":"SpecIF:Diagram"},{"@id":"pig:category"}],"pig:eligibleTargetLink":[],"pig:itemType":{"@id":"pig:Entity"}},{"@id":"FMC:Actor","dcterms:title":[{"@value":"Actor","@language":"en"},{"@value":"Akteur","@language":"de"},{"@value":"Acteur","@language":"fr"}],"dcterms:description":[{"@value":"

An 'Actor' is a fundamental model element type representing an active entity, be it an activity, a process step, a function, a system component or a role.

The particular use or original type is specified with a [[dcterms:type]] property of the 'FMC:Actor'. A value of that property should be an ontology-term, such as [[bpmn:processStep]].

","@language":"en"},{"@value":"

Ein 'Akteur' ist ein fundamentaler Modellelementtyp, der eine aktive Entität darstellt, sei es eine Aktivität, ein Prozessschritt, eine Funktion, eine Systemkomponente oder eine Rolle.

Die spezielle Verwendung oder der ursprüngliche Typ wird mit einer [[dcterms:type]] Eigenschaft von 'FMC:Actor' spezifiziert. Die Werte dieser Eigenschaft können Ontologiebegriffe sein, wie z.B. [[bpmn:timer]].

","@language":"de"},{"@value":"

Un 'Acteur' est un type d'élément de modèle fondamental représentant une entité active, qu'il s'agisse d'une activité, d'une étape de processus, d'une fonction, d'un composant de système ou d'un rôle.

L'utilisation particulière ou le type original est spécifié avec une propriété [[dcterms:type]] de 'FMC:Actor'. Les valeurs de cette propriété peuvent être des termes d'ontologie, tels que [[bpmn:timer]].

","@language":"fr"}],"pig:specializes":{"@id":"pig:Entity"},"pig:icon":{"@value":"□"},"pig:eligibleProperty":[{"@id":"pig:category"}],"pig:eligibleTargetLink":[],"pig:itemType":{"@id":"pig:Entity"}},{"@id":"FMC:State","dcterms:title":[{"@value":"State","@language":"en"},{"@value":"Zustand","@language":"de"},{"@value":"État","@language":"fr"}],"dcterms:description":[{"@value":"

A 'State' is a fundamental model element type representing a passive entity, be it a value, a condition, an information storage or even a physical shape.

The particular use or the original type is specified with a [[dcterms:type]] property of the 'FMC:State'. A value of that property should bean ontology-term, such as [[bpmn:dataObject]].

","@language":"en"},{"@value":"

Ein 'Zustand' ist ein fundamentaler Modellelementtyp, der eine passive Entität darstellt, sei es ein Wert, ein Dokument, ein Informationsspeicher, eine Bedingung oder eine physische Beschaffenheit.

Die spezielle Verwendung oder der ursprüngliche Typ wird mit einer [[dcterms:type]] Eigenschaft von 'FMC:State' spezifiziert. Die Werte dieser Eigenschaft können Ontologiebegriffe sein, wie z.B. [[ArchiMate:DataObject]].

","@language":"de"},{"@value":"

Un 'État' est un type d'élément de modèle fondamental représentant une entité passive, qu'il s'agisse d'une valeur, d'une condition, d'un stockage d'informations ou même d'une forme physique.

L'utilisation particulière ou le type original est spécifié avec une propriété [[dcterms:type]] de 'FMC:State'. Les valeurs de cette propriété peuvent être des termes d'ontologie, tels que [[ArchiMate:DataObject]].

","@language":"fr"}],"pig:specializes":{"@id":"pig:Entity"},"pig:icon":{"@value":"○"},"pig:eligibleProperty":[{"@id":"pig:category"}],"pig:eligibleTargetLink":[],"pig:itemType":{"@id":"pig:Entity"}},{"@id":"FMC:Event","dcterms:title":[{"@value":"Event","@language":"en"},{"@value":"Ereignis","@language":"de"},{"@value":"Évenement","@language":"fr"}],"dcterms:description":[{"@value":"

An 'Event' is a fundamental model element type representing a time reference, a change in condition/value or more generally a synchronization primitive.

The particular use or the original type is specified with a [[dcterms:type]] property of the 'FMC:Event'. A value of that property should be an ontology-term, such as [[bpmn:startEvent]].

","@language":"en"},{"@value":"

Ein 'Ereignis' ist ein fundamentaler Modellelementtyp, der eine Zeitreferenz, eine Änderung einer Bedingung/eines Wertes oder allgemeiner ein Synchronisationsmittel darstellt.

Die spezielle Verwendung oder der ursprüngliche Typ wird mit einer [[dcterms:type]] Eigenschaft von 'FMC:Event' spezifiziert. Die Werte dieser Eigenschaft sollen Ontologiebegriffe sein, wie z.B. [[bpmn:startEvent]].

","@language":"de"},{"@value":"

Un 'Événement' est un type d'élément de modèle fondamental représentant une référence temporelle, un changement de condition/valeur ou plus généralement une primitive de synchronisation.

L'utilisation particulière ou le type original est spécifié avec une propriété [[dcterms:type]] de 'FMC:Event'. Les valeurs de cette propriété peuvent être des termes d'ontologie, tels que [[bpmn:startEvent]].

","@language":"fr"}],"pig:specializes":{"@id":"pig:Entity"},"pig:icon":{"@value":"♢"},"pig:eligibleProperty":[{"@id":"pig:category"}],"pig:eligibleTargetLink":[],"pig:itemType":{"@id":"pig:Entity"}},{"@id":"IREB:Requirement","dcterms:title":[{"@value":"Requirement","@language":"en"},{"@value":"Anforderung","@language":"de"},{"@value":"Exigence","@language":"fr"}],"dcterms:description":[{"@value":"

A 'Requirement' is a singular documented physical and functional need that a particular design, product or process must be able to perform. (source: Wikipedia)

Definition:

  1. A condition or capability needed by a user to solve a problem or achieve an objective.
  2. A condition or capability that must be met or possessed by a system or system component to satisfy a contract, standard, specification, or other formally imposed documents.
  3. A documented representation of a condition or capability as in (1) or (2).

Note: The definition above is the classic one from IEEE Std 610.12 of 1990. Alternatively, we also give a more modern definition:

  1. A need perceived by a stakeholder.
  2. A capability or property that a system shall have.
  3. A documented representation of a need, capability or property.
","@language":"en"},{"@value":"

Eine 'Anforderung' ist ein einzelnes dokumentiertes physisches und funktionales Bedürfnis, das ein bestimmter Entwurf, ein Produkt oder ein Prozess erfüllen muss. (source: Wikipedia)

Definition:

  1. Eine Bedingung oder Fähigkeit, die ein Benutzer benötigt, um ein Problem zu lösen oder ein Ziel zu erreichen.
  2. Eine Bedingung oder Fähigkeit, die ein System oder eine Systemkomponente erfüllen oder besitzen muss, um einen Vertrag, eine Norm, eine Spezifikation oder ein anderes formal vorgeschriebenes Dokument zu erfüllen.
  3. Eine dokumentierte Darstellung einer Bedingung oder Fähigkeit wie in (1) oder (2).

Anmerkung: Die obige Definition ist die klassische Definition aus IEEE Std 610.12 von 1990. Alternativ geben wir auch eine modernere Definition an:

  1. Ein von einem Stakeholder wahrgenommener Bedarf.
  2. Eine Fähigkeit oder Eigenschaft, die ein System haben soll.
  3. Eine dokumentierte Darstellung eines Bedarfs, einer Fähigkeit oder Eigenschaft.
","@language":"de"},{"@value":"

Une 'Exigence' est un besoin physique et fonctionnel unique et documenté qu'une conception, un produit ou un processus particulier doit pouvoir satisfaire. (source: Wikipedia)

Définition:

  1. Condition ou capacité dont un utilisateur a besoin pour résoudre un problème ou atteindre un objectif.
  2. Condition ou capacité qui doit être remplie ou possédée par un système ou un composant de système pour satisfaire à un contrat, à une norme, à une spécification ou à d'autres documents imposés officiellement.
  3. Une représentation documentée d'une condition ou d'une capacité comme dans (1) ou (2).

Remarque: La définition ci-dessus est la définition classique de la norme IEEE 610.12 de 1990. Nous donnons également une définition plus moderne:

  1. Un besoin perçu par une partie prenante;
  2. Une capacité ou une propriété qu'un système doit avoir.
  3. Une représentation documentée d'un besoin, d'une capacité ou d'une propriété.
","@language":"fr"}],"pig:specializes":{"@id":"pig:Entity"},"pig:icon":{"@value":"↯"},"pig:eligibleProperty":[{"@id":"SpecIF:Priority"}],"pig:eligibleTargetLink":[],"pig:itemType":{"@id":"pig:Entity"}},{"@id":"SpecIF:writes","dcterms:title":[{"@value":"writes","@language":"en"},{"@value":"schreibt","@language":"de"},{"@value":"écrit","@language":"fr"}],"dcterms:description":[{"@value":"A [[FMC:Actor]] 'writes' (changes) a [[FMC:State]].","@language":"en"}],"pig:specializes":{"@id":"pig:Relationship"},"pig:eligibleProperty":[],"pig:itemType":{"@id":"pig:Relationship"},"pig:eligibleSourceLink":{"@id":"SpecIF:writes-toSource"},"pig:eligibleTargetLink":{"@id":"SpecIF:writes-toTarget"}},{"@id":"SpecIF:writes-toSource","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:SourceLink"},"dcterms:title":[{"@value":"SpecIF:writes to source"}],"dcterms:description":[{"@value":"Connects the source of SpecIF:writes"}],"pig:eligibleEndpoint":[{"@id":"FMC:Actor"}]},{"@id":"SpecIF:writes-toTarget","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:TargetLink"},"dcterms:title":[{"@value":"SpecIF:writes to target"}],"dcterms:description":[{"@value":"Connects the target of SpecIF:writes"}],"pig:eligibleEndpoint":[{"@id":"FMC:State"}]},{"@id":"SpecIF:reads","dcterms:title":[{"@value":"reads","@language":"en"},{"@value":"liest","@language":"de"},{"@value":"lit","@language":"fr"}],"dcterms:description":[{"@value":"A [[FMC:Actor]] 'reads' a [[FMC:State]].","@language":"en"}],"pig:specializes":{"@id":"pig:Relationship"},"pig:eligibleProperty":[],"pig:itemType":{"@id":"pig:Relationship"},"pig:eligibleSourceLink":{"@id":"SpecIF:reads-toSource"},"pig:eligibleTargetLink":{"@id":"SpecIF:reads-toTarget"}},{"@id":"SpecIF:reads-toSource","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:SourceLink"},"dcterms:title":[{"@value":"SpecIF:reads to source"}],"dcterms:description":[{"@value":"Connects the source of SpecIF:reads"}],"pig:eligibleEndpoint":[{"@id":"FMC:Actor"}]},{"@id":"SpecIF:reads-toTarget","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:TargetLink"},"dcterms:title":[{"@value":"SpecIF:reads to target"}],"dcterms:description":[{"@value":"Connects the target of SpecIF:reads"}],"pig:eligibleEndpoint":[{"@id":"FMC:State"}]},{"@id":"oslc_rm:satisfies","dcterms:title":[{"@value":"satisfies","@language":"en"},{"@value":"erfüllt","@language":"de"},{"@value":"satisfait","@language":"fr"}],"dcterms:description":[{"@value":"

The object is satisfied by the subject. (source: OSLC)

SpecIF suggests that the subject is confined to a model element, e.g, a [[FMC:Actor]] or [[FMC:State]], and the object is confined to a [[IREB:Requirement]]. More concretely, an example for this type of statement is 'Component-X satisfies 'Requirement-4711'.

","@language":"en"}],"pig:specializes":{"@id":"pig:Relationship"},"pig:eligibleProperty":[],"pig:itemType":{"@id":"pig:Relationship"},"pig:eligibleSourceLink":{"@id":"oslc_rm:satisfies-toSource"},"pig:eligibleTargetLink":{"@id":"oslc_rm:satisfies-toTarget"}},{"@id":"oslc_rm:satisfies-toSource","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:SourceLink"},"dcterms:title":[{"@value":"oslc_rm:satisfies to source"}],"dcterms:description":[{"@value":"Connects the source of oslc_rm:satisfies"}],"pig:eligibleEndpoint":[{"@id":"FMC:Actor"},{"@id":"FMC:State"}]},{"@id":"oslc_rm:satisfies-toTarget","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:TargetLink"},"dcterms:title":[{"@value":"oslc_rm:satisfies to target"}],"dcterms:description":[{"@value":"Connects the target of oslc_rm:satisfies"}],"pig:eligibleEndpoint":[{"@id":"IREB:Requirement"}]},{"@id":"d:Req-1a8016e2872e78ecadc50feddc00029b","@type":"IREB:Requirement","dcterms:modified":"2020-10-17T10:00:00+01:00","dcterms:title":[{"@value":"Data Volume"}],"dcterms:description":[{"@value":"

The data store MUST support a total volume up to 850 GB.

"}],"SpecIF:Priority":[{"@id":"SpecIF:priorityHigh","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:Req-0Z7916e2872e78ecadc50feddc00918a","@type":"IREB:Requirement","dcterms:modified":"2020-10-17T10:00:00+01:00","dcterms:title":[{"@value":"Consistency"}],"dcterms:description":[{"@value":"

The data store MUST be consistent at all times.

"}],"SpecIF:Priority":[{"@id":"SpecIF:priorityHigh","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:Req-2b9016e2872e78ecadc50feddc0013Ac","@type":"IREB:Requirement","dcterms:modified":"2020-10-17T10:00:00+01:00","dcterms:title":[{"@value":"Response Time"}],"dcterms:description":[{"@value":"

The system SHOULD respond on user queries within 300 ms.

"}],"SpecIF:Priority":[{"@id":"SpecIF:priorityMedium","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:Diagram-aec0df7900010000017001eaf53e8876","@type":"pig:View","dcterms:modified":"2020-03-06T08:32:00+01:00","dcterms:title":[{"@value":"IT-Integration: FiCo-Application and FiCo-Data"}],"SpecIF:Diagram":[{"@value":"

Model Diagram:

Notation: FMC Block Diagram

","pig:itemType":{"@id":"pig:aProperty"}}],"pig:category":[{"@value":"FMC Block Diagram","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"},"pig:shows":[{"@id":"d:MEl-50fbfe8f0029b1a8016ea86245a9d83a","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:MEl-50feddc00029b1a8016e2872e78ecadc","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:SWri-50fbfe8f0029b1a8016ea86245a9d83a-50feddc00029b1a8016e2872e78ecadc","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:SRea-50fbfe8f0029b1a8016ea86245a9d83a-50feddc00029b1a8016e2872e78ecadc","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:MEl-50fbfe8f0029b1a8016ea86245a9d83a","@type":"FMC:Actor","dcterms:modified":"2020-03-06T09:04:00+01:00","dcterms:title":[{"@value":"FiCo-Application"}],"dcterms:description":[{"@value":"

IT-Application for Finance and Controlling.

"}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:MEl-50feddc00029b1a8016e2872e78ecadc","@type":"FMC:State","dcterms:modified":"2020-03-06T09:03:00+01:00","dcterms:title":[{"@value":"FiCo-Data"}],"dcterms:description":[{"@value":"

Finance and Controlling Data, such as cost-units per project with budget, accrued cost etc.

"}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:SWri-50fbfe8f0029b1a8016ea86245a9d83a-50feddc00029b1a8016e2872e78ecadc","@type":"SpecIF:writes","dcterms:modified":"2020-03-06T09:05:00+01:00","dcterms:description":[{"@value":"'FiCo-Application' writes 'FiCo-Data'"}],"pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:writes-toSource":[{"@id":"d:MEl-50fbfe8f0029b1a8016ea86245a9d83a","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:writes-toTarget":[{"@id":"d:MEl-50feddc00029b1a8016e2872e78ecadc","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:SRea-50fbfe8f0029b1a8016ea86245a9d83a-50feddc00029b1a8016e2872e78ecadc","@type":"SpecIF:reads","dcterms:modified":"2020-03-06T09:05:00+01:00","dcterms:description":[{"@value":"'FiCo-Application' reads 'FiCo-Data'"}],"pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:reads-toSource":[{"@id":"d:MEl-50fbfe8f0029b1a8016ea86245a9d83a","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:reads-toTarget":[{"@id":"d:MEl-50feddc00029b1a8016e2872e78ecadc","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:Ssat-50feddc00029b1a8016e2872e78ecadc-1a8016e2872e78ecadc50feddc00029b","@type":"oslc_rm:satisfies","dcterms:modified":"2020-10-17T10:00:00+01:00","dcterms:description":[{"@value":"'FiCo-Data' satisfies 'Data Volume'"}],"pig:itemType":{"@id":"pig:aRelationship"},"oslc_rm:satisfies-toSource":[{"@id":"d:MEl-50feddc00029b1a8016e2872e78ecadc","pig:itemType":{"@id":"pig:aSourceLink"}}],"oslc_rm:satisfies-toTarget":[{"@id":"d:Req-1a8016e2872e78ecadc50feddc00029b","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:Ssat-50feddc00029b1a8016e2872e78ecadc-0Z7916e2872e78ecadc50feddc00918a","@type":"oslc_rm:satisfies","dcterms:modified":"2020-10-17T10:00:00+01:00","dcterms:description":[{"@value":"'FiCo-Data' satisfies 'Consistency'"}],"pig:itemType":{"@id":"pig:aRelationship"},"oslc_rm:satisfies-toSource":[{"@id":"d:MEl-50feddc00029b1a8016e2872e78ecadc","pig:itemType":{"@id":"pig:aSourceLink"}}],"oslc_rm:satisfies-toTarget":[{"@id":"d:Req-0Z7916e2872e78ecadc50feddc00918a","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:Ssat-50fbfe8f0029b1a8016ea86245a9d83a-2b9016e2872e78ecadc50feddc0013Ac","@type":"oslc_rm:satisfies","dcterms:modified":"2020-10-17T10:00:00+01:00","dcterms:description":[{"@value":"'FiCo-Application' satisfies 'Response Time'"}],"pig:itemType":{"@id":"pig:aRelationship"},"oslc_rm:satisfies-toSource":[{"@id":"d:MEl-50fbfe8f0029b1a8016ea86245a9d83a","pig:itemType":{"@id":"pig:aSourceLink"}}],"oslc_rm:satisfies-toTarget":[{"@id":"d:Req-2b9016e2872e78ecadc50feddc0013Ac","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:HierarchyRoot-ACP-Very-Simple-Model-FMC-with-Requirements","@type":"pig:HierarchyRoot","pig:itemType":{"@id":"pig:anEntity"},"dcterms:modified":"2026-01-17T22:38:20.041Z","dcterms:title":[{"@value":"Hierarchy Root"}],"dcterms:description":[{"@value":"... anchoring all hierarchies of this graph (package)"}],"pig:lists":[{"@id":"d:HR-Folder-Introduction","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:HR-Folder-Requirements","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:HR-Folder-SystemModel","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:HR-FolderGlossary-10875487071","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:Folder-Introduction","@type":"pig:Outline","dcterms:modified":"2025-02-07T08:32:00+01:00","dcterms:title":[{"@value":"Introduction"}],"dcterms:description":[{"@value":"

This is a minimal showcase for a model with model-elements and related requirements. It covers pretty much all characteristics neeeded in such cases (including 'statements on statements'), so that transformations and expressive power of other data formats can be evaluated. The example and its representation in SpecIF format is discussed in Tutorial 6: Very Simple Model (FMC) and Tutorial 9: Very Simple Model (FMC) with Requirements.

"}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:HR-Folder-Introduction","@type":"pig:Outline","dcterms:modified":"2026-01-17T22:38:19.821Z","dcterms:title":[{"@value":"Project 'Very Simple Model (FMC) with Requirements'"}],"pig:category":[{"@value":"ReqIF:HierarchyRoot","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"},"pig:lists":[{"@id":"d:Folder-Introduction","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:Folder-Requirements","@type":"pig:Outline","dcterms:modified":"2020-03-06T08:32:00+01:00","dcterms:title":[{"@value":"Requirements"}],"pig:itemType":{"@id":"pig:anEntity"},"pig:lists":[{"@id":"d:Req-1a8016e2872e78ecadc50feddc00029b","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:Req-0Z7916e2872e78ecadc50feddc00918a","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:Req-2b9016e2872e78ecadc50feddc0013Ac","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:HR-Folder-Requirements","@type":"pig:Outline","dcterms:modified":"2026-01-17T22:38:19.821Z","dcterms:title":[{"@value":"Project 'Very Simple Model (FMC) with Requirements'"}],"pig:category":[{"@value":"ReqIF:HierarchyRoot","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"},"pig:lists":[{"@id":"d:Folder-Requirements","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:Folder-SystemModel","@type":"pig:Outline","dcterms:modified":"2020-03-06T08:32:00+01:00","dcterms:title":[{"@value":"System Model"}],"pig:itemType":{"@id":"pig:anEntity"},"pig:lists":[{"@id":"d:Diagram-aec0df7900010000017001eaf53e8876","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:HR-Folder-SystemModel","@type":"pig:Outline","dcterms:modified":"2026-01-17T22:38:19.821Z","dcterms:title":[{"@value":"Project 'Very Simple Model (FMC) with Requirements'"}],"pig:category":[{"@value":"ReqIF:HierarchyRoot","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"},"pig:lists":[{"@id":"d:Folder-SystemModel","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:FolderGlossary-10875487071","@type":"pig:Outline","dcterms:modified":"2026-01-17T22:38:13.953Z","dcterms:title":[{"@value":"Model Elements (Glossary)"}],"pig:category":[{"@value":"SpecIF:Glossary","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"},"pig:lists":[{"@id":"d:MEl-50fbfe8f0029b1a8016ea86245a9d83a","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:MEl-50feddc00029b1a8016e2872e78ecadc","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:HR-FolderGlossary-10875487071","@type":"pig:Outline","dcterms:modified":"2026-01-17T22:38:19.821Z","dcterms:title":[{"@value":"Project 'Very Simple Model (FMC) with Requirements'"}],"pig:category":[{"@value":"ReqIF:HierarchyRoot","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"},"pig:lists":[{"@id":"d:FolderGlossary-10875487071","pig:itemType":{"@id":"pig:aTargetLink"}}]}]} \ No newline at end of file diff --git a/tests/data/JSON-LD/22/Small Autonomous Vehicle.pig.jsonld b/tests/data/JSON-LD/22/Small Autonomous Vehicle.pig.jsonld index e17fb5f..4ee70a8 100644 --- a/tests/data/JSON-LD/22/Small Autonomous Vehicle.pig.jsonld +++ b/tests/data/JSON-LD/22/Small Autonomous Vehicle.pig.jsonld @@ -1 +1 @@ -{"@context":{"o":"https://product-information-graph.org/v0.2/ontology#","d":"https://product-information-graph.org/examples/Small%20Autonomous%20Vehicle.specif.zip#","rdf":"http://www.w3.org/1999/02/22-rdf-syntax-ns#","owl":"http://www.w3.org/2002/07/owl#","sh":"http://www.w3.org/ns/shacl#","xs":"http://www.w3.org/2001/XMLSchema#","dcterms":"http://purl.org/dc/terms/","FMC":"http://fmc-modeling.org#","RFLP":"https://product-information-graph.org/v0.2/ontology/RFLP#","IREB":"https://cpre.ireb.org/en/downloads-and-resources/glossary#","ReqIF":"https://www.prostep.org/fileadmin/downloads/PSI_ImplementationGuide_ReqIF_V1-7.pdf#","oslc_rm":"http://open-services.net/ns/rm#","uml":"https://www.omg.org/spec/UML#","sysml":"https://www.omg.org/spec/SysML#","pig":"https://product-information-graph.org/v0.2/metamodel#","SpecIF":"https://specif.de/v1.2/schema#"},"@id":"d:P-eee_1045467100313_135436_1","@type":"pig:Package","dcterms:title":[{"@value":"Small Autonomous Vehicle"}],"dcterms:description":[{"@value":"A set of SpecIF Classes derived from a SpecIF Ontology for the domains SpecIF:DomainBase, SpecIF:DomainSystemsEngineering, SpecIF:DomainSystemModelIntegration.","@language":"en"}],"dcterms:modified":"2026-01-12T12:39:23.730Z","@graph":[{"@id":"pig:Entity","@type":"owl:Class","pig:itemType":{"@id":"pig:Entity"},"dcterms:title":[{"@value":"Entity"}],"dcterms:description":[{"@value":"A PIG meta-model element used for entities (aka resources or artifacts)."}],"pig:eligibleProperty":[{"@id":"pig:category"},{"@id":"pig:icon"}]},{"@id":"pig:Organizer","pig:specializes":{"@id":"pig:Entity"},"pig:itemType":{"@id":"pig:Entity"},"dcterms:title":[{"@value":"Organizer"}],"dcterms:description":[{"@value":"An element organizing model elements. An example is a list of requirements or a diagram using a certain notation."}],"pig:eligibleProperty":[{"@id":"pig:category"}]},{"@id":"pig:HierarchyRoot","pig:specializes":{"@id":"pig:Organizer"},"pig:itemType":{"@id":"pig:Entity"},"dcterms:title":[{"@value":"Hierarchy Root"}],"dcterms:description":[{"@value":"A subclass of PIG organizer serving as a root for hierarchically organized graph elements."}],"pig:eligibleProperty":[],"pig:eligibleTargetLink":[{"@id":"pig:lists"}]},{"@id":"pig:Outline","pig:specializes":{"@id":"pig:Organizer"},"pig:itemType":{"@id":"pig:Entity"},"dcterms:title":[{"@value":"Outline"}],"dcterms:description":[{"@value":"A subclass of PIG organizer comprising all information items of a human-readable document. As usual, the outline is hierarchically organized."}],"pig:eligibleProperty":[{"@id":"pig:category"}],"pig:eligibleTargetLink":[{"@id":"pig:lists"}]},{"@id":"pig:View","pig:specializes":{"@id":"pig:Organizer"},"pig:itemType":{"@id":"pig:Entity"},"dcterms:title":[{"@value":"View"}],"dcterms:description":[{"@value":"A subclass of PIG organizer representing a model view (diagram) using a certain notation showing selected model elements."}],"pig:eligibleProperty":[{"@id":"pig:category"},{"@id":"pig:icon"}],"pig:eligibleTargetLink":[{"@id":"pig:shows"},{"@id":"pig:depicts"}]},{"@id":"pig:Relationship","@type":"owl:Class","pig:itemType":{"@id":"pig:Relationship"},"dcterms:title":[{"@value":"Relationship"}],"dcterms:description":[{"@value":"A PIG meta-model element used for reified relationships (aka predicates)."}],"pig:eligibleProperty":[{"@id":"pig:category"},{"@id":"pig:icon"}],"pig:eligibleSourceLink":{"@id":"pig:SourceLink"},"pig:eligibleTargetLink":{"@id":"pig:TargetLink"}},{"@id":"pig:icon","@type":"owl:DatatypeProperty","pig:itemType":{"@id":"pig:Property"},"dcterms:title":[{"@value":"has icon"}],"dcterms:description":[{"@value":"Specifies an icon for a model element (entity or relationship)."}],"sh:datatype":{"@id":"xs:string"},"sh:minCount":0,"sh:maxCount":1},{"@id":"pig:category","pig:specializes":{"@id":"dcterms:type"},"pig:itemType":{"@id":"pig:Property"},"dcterms:title":[{"@value":"has category"}],"dcterms:description":[{"@value":"Specifies a category for an element (entity, relationship or organizer)."}],"sh:datatype":{"@id":"xs:string"},"sh:maxLength":32,"sh:minCount":0,"sh:maxCount":1},{"@id":"pig:Link","@type":"owl:ObjectProperty","pig:itemType":{"@id":"pig:Link"},"pig:eligibleEndpoint":[{"@id":"pig:Entity"},{"@id":"pig:Relationship"}],"dcterms:title":[{"@value":"linked with"}],"dcterms:description":[{"@value":"Connects a reified relationship with its source or target. Also connects an organizer to a model element"}]},{"@id":"pig:SourceLink","pig:specializes":{"@id":"pig:Link"},"pig:itemType":{"@id":"pig:Link"},"pig:eligibleEndpoint":[{"@id":"pig:Entity"},{"@id":"pig:Relationship"}],"dcterms:title":[{"@value":"to source"}],"dcterms:description":[{"@value":"Connects the source of a reified relationship."}]},{"@id":"pig:TargetLink","pig:specializes":{"@id":"pig:Link"},"pig:itemType":{"@id":"pig:Link"},"pig:eligibleEndpoint":[{"@id":"pig:Entity"},{"@id":"pig:Relationship"}],"dcterms:title":[{"@value":"to target"}],"dcterms:description":[{"@value":"Connects the target of a reified relationship or an organizer."}]},{"@id":"pig:lists","pig:specializes":{"@id":"pig:TargetLink"},"pig:itemType":{"@id":"pig:Link"},"pig:eligibleEndpoint":[{"@id":"pig:Entity"},{"@id":"pig:Relationship"},{"@id":"pig:Organizer"}],"dcterms:title":[{"@value":"lists"}],"dcterms:description":[{"@value":"Lists an entity, a relationship or a subordinated organizer."}]},{"@id":"pig:shows","pig:specializes":{"@id":"pig:TargetLink"},"pig:itemType":{"@id":"pig:Link"},"pig:eligibleEndpoint":[{"@id":"pig:Entity"},{"@id":"pig:Relationship"}],"dcterms:title":[{"@value":"shows"}],"dcterms:description":[{"@value":"Shows an entity or a relationship."}]},{"@id":"pig:depicts","pig:specializes":{"@id":"pig:TargetLink"},"pig:itemType":{"@id":"pig:Link"},"pig:eligibleEndpoint":[{"@id":"pig:Entity"}],"dcterms:title":[{"@value":"depicts"}],"dcterms:description":[{"@value":"Depicts an entity; inverse of uml:ownedDiagram."}]},{"@id":"dcterms:title","dcterms:title":[{"@value":"Title","@language":"en"},{"@value":"Titel","@language":"de"},{"@value":"Titre","@language":"fr"}],"dcterms:description":[{"@value":"

A name given to the resource. (source: DCMI)

Title (reference: Dublin Core) of the resource represented as rich text in XHTML content. SHOULD include only content that is valid inside an XHTML 'span' element. (source: OSLC)

","@language":"en"}],"@type":"owl:DatatypeProperty","pig:itemType":{"@id":"pig:Property"},"sh:datatype":{"@id":"xs:string"},"sh:maxCount":1,"sh:maxLength":256},{"@id":"dcterms:description","dcterms:title":[{"@value":"Description","@language":"en"},{"@value":"Beschreibung","@language":"de"},{"@value":"Description","@language":"fr"}],"dcterms:description":[{"@value":"

An account of the resource. (source: DCMI)

Descriptive text (reference: Dublin Core) about resource represented as rich text in XHTML content. SHOULD include only content that is valid and suitable inside an XHTML 'div' element. (source: OSLC)

","@language":"en"}],"@type":"owl:DatatypeProperty","pig:itemType":{"@id":"pig:Property"},"sh:datatype":{"@id":"xs:string"},"sh:maxCount":1},{"@id":"SpecIF:Diagram","dcterms:title":[{"@value":"Diagram","@language":"en"},{"@value":"Diagramm","@language":"de"},{"@value":"Diagramme","@language":"fr"}],"dcterms:description":[{"@value":"A diagram illustrating the resource or a link to a diagram.","@language":"en"}],"@type":"owl:DatatypeProperty","pig:itemType":{"@id":"pig:Property"},"sh:datatype":{"@id":"xs:string"}},{"@id":"SpecIF:Notation","dcterms:title":[{"@value":"Notation","@language":"en"}],"dcterms:description":[{"@value":"The notation used by a model diagram, e.g. 'BPMN 2.0', 'SysML Activity Diagram' or 'FMC Block Diagram'.","@language":"en"}],"@type":"owl:DatatypeProperty","pig:itemType":{"@id":"pig:Property"},"sh:datatype":{"@id":"xs:string"},"sh:maxCount":1,"sh:maxLength":32},{"@id":"SpecIF:Paragraph","dcterms:title":[{"@value":"Paragraph","@language":"en"},{"@value":"Textabsatz","@language":"de"},{"@value":"Paragraphe","@language":"fr"}],"dcterms:description":[{"@value":"

A 'Paragraph' is an unspecified information in a document at any level.

","@language":"en"},{"@value":"

Ein 'Textabschnitt' in einem Dokument auf beliebiger Ebene.

","@language":"de"}],"pig:specializes":{"@id":"pig:Entity"},"pig:eligibleProperty":[{"@id":"SpecIF:Diagram"},{"@id":"pig:category"}],"pig:eligibleTargetLink":[],"pig:itemType":{"@id":"pig:Entity"}},{"@id":"SpecIF:ModelElement","dcterms:title":[{"@value":"Model Element","@language":"en"},{"@value":"Modellelement","@language":"de"}],"dcterms:description":[{"@value":"Is a generalized type for model elements.","@language":"en"},{"@value":"Ist ein generalisierter Typ für Modellelemente.","@language":"de"}],"pig:specializes":{"@id":"pig:Entity"},"pig:icon":{"@value":"☆"},"pig:eligibleProperty":[{"@id":"pig:category"}],"pig:eligibleTargetLink":[],"pig:itemType":{"@id":"pig:Entity"}},{"@id":"FMC:Actor","dcterms:title":[{"@value":"Actor","@language":"en"},{"@value":"Akteur","@language":"de"},{"@value":"Acteur","@language":"fr"}],"dcterms:description":[{"@value":"

An 'Actor' is a fundamental model element type representing an active entity, be it an activity, a process step, a function, a system component or a role.

The particular use or original type is specified with a [[dcterms:type]] property of the 'FMC:Actor'. A value of that property should be an ontology-term, such as [[bpmn:processStep]].

","@language":"en"},{"@value":"

Ein 'Akteur' ist ein fundamentaler Modellelementtyp, der eine aktive Entität darstellt, sei es eine Aktivität, ein Prozessschritt, eine Funktion, eine Systemkomponente oder eine Rolle.

Die spezielle Verwendung oder der ursprüngliche Typ wird mit einer [[dcterms:type]] Eigenschaft von 'FMC:Actor' spezifiziert. Die Werte dieser Eigenschaft können Ontologiebegriffe sein, wie z.B. [[bpmn:timer]].

","@language":"de"},{"@value":"

Un 'Acteur' est un type d'élément de modèle fondamental représentant une entité active, qu'il s'agisse d'une activité, d'une étape de processus, d'une fonction, d'un composant de système ou d'un rôle.

L'utilisation particulière ou le type original est spécifié avec une propriété [[dcterms:type]] de 'FMC:Actor'. Les valeurs de cette propriété peuvent être des termes d'ontologie, tels que [[bpmn:timer]].

","@language":"fr"}],"pig:specializes":{"@id":"SpecIF:ModelElement"},"pig:icon":{"@value":"□"},"pig:eligibleProperty":[],"pig:eligibleTargetLink":[],"pig:itemType":{"@id":"pig:Entity"}},{"@id":"SpecIF:Collection","dcterms:title":[{"@value":"Collection or Group","@language":"en"},{"@value":"Kollektion oder Gruppe","@language":"de"},{"@value":"Collection ou Groupe","@language":"fr"}],"dcterms:description":[{"@value":"

A 'Collection' is a logical (often conceptual) group of resources linked with a [[SpecIF:contains]] statement. It corresponds to a 'Group' in BPMN Diagrams.

BPMN: An arbitrary set of objects can be defined as a Group to show that they logically belong together. (source: BPMN Tutorial)

","@language":"en"},{"@value":"

Eine 'Kollektion' ist eine logische Gruppierung bestimmter Modellelemente, die per [[SpecIF:contains]] Relation zusammen gefasst sind. Sie entspricht einer 'Gruppe' in BPMN Diagrammen. (source: BPMN Tutorial)

","@language":"de"},{"@value":"

Une 'collection' est un groupe logique (souvent conceptuel) de ressources liées par une déclaration [[SpecIF:contains]]. Elle correspond à un 'groupe' dans les diagrammes BPMN. (source: BPMN Tutoriel)

","@language":"fr"}],"pig:specializes":{"@id":"SpecIF:ModelElement"},"pig:icon":{"@value":"⬚"},"pig:eligibleProperty":[],"pig:eligibleTargetLink":[],"pig:itemType":{"@id":"pig:Entity"}},{"@id":"FMC:State","dcterms:title":[{"@value":"State","@language":"en"},{"@value":"Zustand","@language":"de"},{"@value":"État","@language":"fr"}],"dcterms:description":[{"@value":"

A 'State' is a fundamental model element type representing a passive entity, be it a value, a condition, an information storage or even a physical shape.

The particular use or the original type is specified with a [[dcterms:type]] property of the 'FMC:State'. A value of that property should bean ontology-term, such as [[bpmn:dataObject]].

","@language":"en"},{"@value":"

Ein 'Zustand' ist ein fundamentaler Modellelementtyp, der eine passive Entität darstellt, sei es ein Wert, ein Dokument, ein Informationsspeicher, eine Bedingung oder eine physische Beschaffenheit.

Die spezielle Verwendung oder der ursprüngliche Typ wird mit einer [[dcterms:type]] Eigenschaft von 'FMC:State' spezifiziert. Die Werte dieser Eigenschaft können Ontologiebegriffe sein, wie z.B. [[ArchiMate:DataObject]].

","@language":"de"},{"@value":"

Un 'État' est un type d'élément de modèle fondamental représentant une entité passive, qu'il s'agisse d'une valeur, d'une condition, d'un stockage d'informations ou même d'une forme physique.

L'utilisation particulière ou le type original est spécifié avec une propriété [[dcterms:type]] de 'FMC:State'. Les valeurs de cette propriété peuvent être des termes d'ontologie, tels que [[ArchiMate:DataObject]].

","@language":"fr"}],"pig:specializes":{"@id":"SpecIF:ModelElement"},"pig:icon":{"@value":"○"},"pig:eligibleProperty":[],"pig:eligibleTargetLink":[],"pig:itemType":{"@id":"pig:Entity"}},{"@id":"FMC:Event","dcterms:title":[{"@value":"Event","@language":"en"},{"@value":"Ereignis","@language":"de"},{"@value":"Évenement","@language":"fr"}],"dcterms:description":[{"@value":"

An 'Event' is a fundamental model element type representing a time reference, a change in condition/value or more generally a synchronization primitive.

The particular use or the original type is specified with a [[dcterms:type]] property of the 'FMC:Event'. A value of that property should be an ontology-term, such as [[bpmn:startEvent]].

","@language":"en"},{"@value":"

Ein 'Ereignis' ist ein fundamentaler Modellelementtyp, der eine Zeitreferenz, eine Änderung einer Bedingung/eines Wertes oder allgemeiner ein Synchronisationsmittel darstellt.

Die spezielle Verwendung oder der ursprüngliche Typ wird mit einer [[dcterms:type]] Eigenschaft von 'FMC:Event' spezifiziert. Die Werte dieser Eigenschaft sollen Ontologiebegriffe sein, wie z.B. [[bpmn:startEvent]].

","@language":"de"},{"@value":"

Un 'Événement' est un type d'élément de modèle fondamental représentant une référence temporelle, un changement de condition/valeur ou plus généralement une primitive de synchronisation.

L'utilisation particulière ou le type original est spécifié avec une propriété [[dcterms:type]] de 'FMC:Event'. Les valeurs de cette propriété peuvent être des termes d'ontologie, tels que [[bpmn:startEvent]].

","@language":"fr"}],"pig:specializes":{"@id":"SpecIF:ModelElement"},"pig:icon":{"@value":"♢"},"pig:eligibleProperty":[],"pig:eligibleTargetLink":[],"pig:itemType":{"@id":"pig:Entity"}},{"@id":"uml:Package","dcterms:title":[{"@value":"Package","@language":"en"}],"pig:specializes":{"@id":"SpecIF:Collection"},"pig:eligibleProperty":[],"pig:eligibleTargetLink":[],"pig:itemType":{"@id":"pig:Entity"}},{"@id":"IREB:Requirement","dcterms:title":[{"@value":"Requirement","@language":"en"},{"@value":"Anforderung","@language":"de"},{"@value":"Exigence","@language":"fr"}],"dcterms:description":[{"@value":"

A 'Requirement' is a singular documented physical and functional need that a particular design, product or process must be able to perform. (source: Wikipedia)

Definition:

  1. A condition or capability needed by a user to solve a problem or achieve an objective.
  2. A condition or capability that must be met or possessed by a system or system component to satisfy a contract, standard, specification, or other formally imposed documents.
  3. A documented representation of a condition or capability as in (1) or (2).

Note: The definition above is the classic one from IEEE Std 610.12 of 1990. Alternatively, we also give a more modern definition:

  1. A need perceived by a stakeholder.
  2. A capability or property that a system shall have.
  3. A documented representation of a need, capability or property.
","@language":"en"},{"@value":"

Eine 'Anforderung' ist ein einzelnes dokumentiertes physisches und funktionales Bedürfnis, das ein bestimmter Entwurf, ein Produkt oder ein Prozess erfüllen muss. (source: Wikipedia)

Definition:

  1. Eine Bedingung oder Fähigkeit, die ein Benutzer benötigt, um ein Problem zu lösen oder ein Ziel zu erreichen.
  2. Eine Bedingung oder Fähigkeit, die ein System oder eine Systemkomponente erfüllen oder besitzen muss, um einen Vertrag, eine Norm, eine Spezifikation oder ein anderes formal vorgeschriebenes Dokument zu erfüllen.
  3. Eine dokumentierte Darstellung einer Bedingung oder Fähigkeit wie in (1) oder (2).

Anmerkung: Die obige Definition ist die klassische Definition aus IEEE Std 610.12 von 1990. Alternativ geben wir auch eine modernere Definition an:

  1. Ein von einem Stakeholder wahrgenommener Bedarf.
  2. Eine Fähigkeit oder Eigenschaft, die ein System haben soll.
  3. Eine dokumentierte Darstellung eines Bedarfs, einer Fähigkeit oder Eigenschaft.
","@language":"de"},{"@value":"

Une 'Exigence' est un besoin physique et fonctionnel unique et documenté qu'une conception, un produit ou un processus particulier doit pouvoir satisfaire. (source: Wikipedia)

Définition:

  1. Condition ou capacité dont un utilisateur a besoin pour résoudre un problème ou atteindre un objectif.
  2. Condition ou capacité qui doit être remplie ou possédée par un système ou un composant de système pour satisfaire à un contrat, à une norme, à une spécification ou à d'autres documents imposés officiellement.
  3. Une représentation documentée d'une condition ou d'une capacité comme dans (1) ou (2).

Remarque: La définition ci-dessus est la définition classique de la norme IEEE 610.12 de 1990. Nous donnons également une définition plus moderne:

  1. Un besoin perçu par une partie prenante;
  2. Une capacité ou une propriété qu'un système doit avoir.
  3. Une représentation documentée d'un besoin, d'une capacité ou d'une propriété.
","@language":"fr"}],"pig:specializes":{"@id":"pig:Entity"},"pig:icon":{"@value":"↯"},"pig:eligibleProperty":[{"@id":"pig:category"}],"pig:eligibleTargetLink":[],"pig:itemType":{"@id":"pig:Entity"}},{"@id":"SpecIF:relates","dcterms:title":[{"@value":"relates","@language":"en"},{"@value":"verbindet","@language":"de"},{"@value":"relie","@language":"fr"}],"dcterms:description":[{"@value":"Is a generalized type for model relations.","@language":"en"},{"@value":"Ist ein generalisierter Typ für Modellrelationen.","@language":"de"}],"pig:specializes":{"@id":"pig:Relationship"},"pig:eligibleProperty":[{"@id":"pig:category"}],"pig:itemType":{"@id":"pig:Relationship"},"pig:eligibleSourceLink":{"@id":"SpecIF:relates-toSource"},"pig:eligibleTargetLink":{"@id":"SpecIF:relates-toTarget"}},{"@id":"SpecIF:relates-toSource","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:SourceLink"},"dcterms:title":[{"@value":"SpecIF:relates to source"}],"dcterms:description":[{"@value":"Connects the source of SpecIF:relates"}],"pig:eligibleEndpoint":[{"@id":"pig:Entity"},{"@id":"pig:Relationship"}]},{"@id":"SpecIF:relates-toTarget","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:TargetLink"},"dcterms:title":[{"@value":"SpecIF:relates to target"}],"dcterms:description":[{"@value":"Connects the target of SpecIF:relates"}],"pig:eligibleEndpoint":[{"@id":"pig:Entity"},{"@id":"pig:Relationship"}]},{"@id":"dcterms:hasPart","dcterms:title":[{"@value":"has part","@language":"en"},{"@value":"enthält","@language":"de"},{"@value":"contient","@language":"fr"}],"dcterms:description":[{"@value":"A related resource that is included either physically or logically in the described resource.\n\n*Comment: This property is intended to be used with non-literal values. This property is an inverse property of [[dcterms:isPartOf]].*","@language":"en"}],"pig:specializes":{"@id":"SpecIF:relates"},"pig:eligibleProperty":[],"pig:itemType":{"@id":"pig:Relationship"},"pig:eligibleSourceLink":{"@id":"dcterms:hasPart-toSource"},"pig:eligibleTargetLink":{"@id":"dcterms:hasPart-toTarget"}},{"@id":"dcterms:hasPart-toSource","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:SourceLink"},"dcterms:title":[{"@value":"dcterms:hasPart to source"}],"dcterms:description":[{"@value":"Connects the source of dcterms:hasPart"}],"pig:eligibleEndpoint":[{"@id":"FMC:Actor"},{"@id":"FMC:State"},{"@id":"SpecIF:Collection"},{"@id":"SpecIF:ModelElement"},{"@id":"o:RC-UmlClass"}]},{"@id":"dcterms:hasPart-toTarget","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:TargetLink"},"dcterms:title":[{"@value":"dcterms:hasPart to target"}],"dcterms:description":[{"@value":"Connects the target of dcterms:hasPart"}],"pig:eligibleEndpoint":[{"@id":"FMC:Actor"},{"@id":"FMC:State"},{"@id":"SpecIF:Collection"},{"@id":"SpecIF:ModelElement"},{"@id":"o:RC-UmlPort"},{"@id":"o:RC-UmlClass"}]},{"@id":"SpecIF:contains","dcterms:title":[{"@value":"contains","@language":"en"},{"@value":"enthält","@language":"de"},{"@value":"contient","@language":"fr"}],"dcterms:description":[{"@value":"General containment, such as:\n- Package-A *contains* Diagram-B\n- Collection-1 *contains* DataObject-1.1\n\nNot to confound with *[[dcterms:hasPart]]*.","@language":"en"}],"pig:specializes":{"@id":"SpecIF:relates"},"pig:eligibleProperty":[],"pig:itemType":{"@id":"pig:Relationship"},"pig:eligibleSourceLink":{"@id":"SpecIF:contains-toSource"},"pig:eligibleTargetLink":{"@id":"SpecIF:contains-toTarget"}},{"@id":"SpecIF:contains-toSource","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:SourceLink"},"dcterms:title":[{"@value":"SpecIF:contains to source"}],"dcterms:description":[{"@value":"Connects the source of SpecIF:contains"}],"pig:eligibleEndpoint":[{"@id":"FMC:Actor"},{"@id":"FMC:State"},{"@id":"SpecIF:Collection"},{"@id":"uml:Package"}]},{"@id":"SpecIF:contains-toTarget","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:TargetLink"},"dcterms:title":[{"@value":"SpecIF:contains to target"}],"dcterms:description":[{"@value":"Connects the target of SpecIF:contains"}],"pig:eligibleEndpoint":[{"@id":"FMC:Actor"},{"@id":"FMC:State"},{"@id":"FMC:Event"},{"@id":"SpecIF:Collection"},{"@id":"uml:Package"},{"@id":"SpecIF:ModelElement"},{"@id":"o:RC-SpecifView"},{"@id":"o:RC-PigView"},{"@id":"pig:View"},{"@id":"IREB:Requirement"}]},{"@id":"oslc_rm:satisfies","dcterms:title":[{"@value":"satisfies","@language":"en"},{"@value":"erfüllt","@language":"de"},{"@value":"satisfait","@language":"fr"}],"dcterms:description":[{"@value":"

The object is satisfied by the subject. (source: OSLC)

SpecIF suggests that the subject is confined to a model element, e.g, a [[FMC:Actor]] or [[FMC:State]], and the object is confined to a [[IREB:Requirement]]. More concretely, an example for this type of statement is 'Component-X satisfies 'Requirement-4711'.

","@language":"en"}],"pig:specializes":{"@id":"pig:Relationship"},"pig:eligibleProperty":[],"pig:itemType":{"@id":"pig:Relationship"},"pig:eligibleSourceLink":{"@id":"oslc_rm:satisfies-toSource"},"pig:eligibleTargetLink":{"@id":"oslc_rm:satisfies-toTarget"}},{"@id":"oslc_rm:satisfies-toSource","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:SourceLink"},"dcterms:title":[{"@value":"oslc_rm:satisfies to source"}],"dcterms:description":[{"@value":"Connects the source of oslc_rm:satisfies"}],"pig:eligibleEndpoint":[{"@id":"pig:Entity"},{"@id":"pig:Relationship"}]},{"@id":"oslc_rm:satisfies-toTarget","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:TargetLink"},"dcterms:title":[{"@value":"oslc_rm:satisfies to target"}],"dcterms:description":[{"@value":"Connects the target of oslc_rm:satisfies"}],"pig:eligibleEndpoint":[{"@id":"IREB:Requirement"}]},{"@id":"IREB:refines","dcterms:title":[{"@value":"refines","@language":"en"},{"@value":"verfeinert","@language":"de"},{"@value":"affine","@language":"fr"}],"dcterms:description":[{"@value":"

A [[IREB:Requirement]] 'refines' another [[IREB:Requirement]].

","@language":"en"}],"pig:specializes":{"@id":"pig:Relationship"},"pig:eligibleProperty":[],"pig:itemType":{"@id":"pig:Relationship"},"pig:eligibleSourceLink":{"@id":"IREB:refines-toSource"},"pig:eligibleTargetLink":{"@id":"IREB:refines-toTarget"}},{"@id":"IREB:refines-toSource","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:SourceLink"},"dcterms:title":[{"@value":"IREB:refines to source"}],"dcterms:description":[{"@value":"Connects the source of IREB:refines"}],"pig:eligibleEndpoint":[{"@id":"IREB:Requirement"}]},{"@id":"IREB:refines-toTarget","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:TargetLink"},"dcterms:title":[{"@value":"IREB:refines to target"}],"dcterms:description":[{"@value":"Connects the target of IREB:refines"}],"pig:eligibleEndpoint":[{"@id":"IREB:Requirement"}]},{"@id":"sysml:Allocate","dcterms:title":[{"@value":"is allocated to","@language":"en"},{"@value":"zugeordnet zu","@language":"de"},{"@value":"allouée à","@language":"fr"}],"dcterms:description":[{"@value":"

An [[FMC:Actor]] is allocated to another [[FMC:Actor]] (e.g. a logical function is allocated to a physical component.

","@language":"en"}],"pig:specializes":{"@id":"pig:Relationship"},"pig:eligibleProperty":[],"pig:itemType":{"@id":"pig:Relationship"},"pig:eligibleSourceLink":{"@id":"sysml:Allocate-toSource"},"pig:eligibleTargetLink":{"@id":"sysml:Allocate-toTarget"}},{"@id":"sysml:Allocate-toSource","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:SourceLink"},"dcterms:title":[{"@value":"sysml:Allocate to source"}],"dcterms:description":[{"@value":"Connects the source of sysml:Allocate"}],"pig:eligibleEndpoint":[{"@id":"SpecIF:ModelElement"}]},{"@id":"sysml:Allocate-toTarget","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:TargetLink"},"dcterms:title":[{"@value":"sysml:Allocate to target"}],"dcterms:description":[{"@value":"Connects the target of sysml:Allocate"}],"pig:eligibleEndpoint":[{"@id":"SpecIF:ModelElement"}]},{"@id":"uml:ownedBehavior","dcterms:title":[{"@value":"has Behavior"}],"pig:specializes":{"@id":"pig:Relationship"},"pig:eligibleProperty":[],"pig:itemType":{"@id":"pig:Relationship"},"pig:eligibleSourceLink":{"@id":"uml:ownedBehavior-toSource"},"pig:eligibleTargetLink":{"@id":"uml:ownedBehavior-toTarget"}},{"@id":"uml:ownedBehavior-toSource","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:SourceLink"},"dcterms:title":[{"@value":"uml:ownedBehavior to source"}],"dcterms:description":[{"@value":"Connects the source of uml:ownedBehavior"}],"pig:eligibleEndpoint":[{"@id":"pig:Entity"},{"@id":"pig:Relationship"}]},{"@id":"uml:ownedBehavior-toTarget","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:TargetLink"},"dcterms:title":[{"@value":"uml:ownedBehavior to target"}],"dcterms:description":[{"@value":"Connects the target of uml:ownedBehavior"}],"pig:eligibleEndpoint":[{"@id":"o:RC-UmlStatemachine"},{"@id":"o:RC-UmlActivity"},{"@id":"FMC:Actor"},{"@id":"o:RC-UmlUsecase"}]},{"@id":"uml:Trigger","dcterms:title":[{"@value":"triggers"}],"pig:specializes":{"@id":"pig:Relationship"},"pig:eligibleProperty":[],"pig:itemType":{"@id":"pig:Relationship"},"pig:eligibleSourceLink":{"@id":"uml:Trigger-toSource"},"pig:eligibleTargetLink":{"@id":"uml:Trigger-toTarget"}},{"@id":"uml:Trigger-toSource","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:SourceLink"},"dcterms:title":[{"@value":"uml:Trigger to source"}],"dcterms:description":[{"@value":"Connects the source of uml:Trigger"}],"pig:eligibleEndpoint":[{"@id":"pig:Entity"},{"@id":"pig:Relationship"}]},{"@id":"uml:Trigger-toTarget","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:TargetLink"},"dcterms:title":[{"@value":"uml:Trigger to target"}],"dcterms:description":[{"@value":"Connects the target of uml:Trigger"}],"pig:eligibleEndpoint":[{"@id":"pig:Entity"},{"@id":"pig:Relationship"}]},{"@id":"uml:TransitionSource","dcterms:title":[{"@value":"starts from"}],"pig:specializes":{"@id":"pig:Relationship"},"pig:eligibleProperty":[],"pig:itemType":{"@id":"pig:Relationship"},"pig:eligibleSourceLink":{"@id":"uml:TransitionSource-toSource"},"pig:eligibleTargetLink":{"@id":"uml:TransitionSource-toTarget"}},{"@id":"uml:TransitionSource-toSource","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:SourceLink"},"dcterms:title":[{"@value":"uml:TransitionSource to source"}],"dcterms:description":[{"@value":"Connects the source of uml:TransitionSource"}],"pig:eligibleEndpoint":[{"@id":"o:RC-UmlTransition"},{"@id":"FMC:Actor"}]},{"@id":"uml:TransitionSource-toTarget","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:TargetLink"},"dcterms:title":[{"@value":"uml:TransitionSource to target"}],"dcterms:description":[{"@value":"Connects the target of uml:TransitionSource"}],"pig:eligibleEndpoint":[{"@id":"o:RC-UmlState"},{"@id":"FMC:State"}]},{"@id":"uml:TransitionTarget","dcterms:title":[{"@value":"ends at"}],"pig:specializes":{"@id":"pig:Relationship"},"pig:eligibleProperty":[],"pig:itemType":{"@id":"pig:Relationship"},"pig:eligibleSourceLink":{"@id":"uml:TransitionTarget-toSource"},"pig:eligibleTargetLink":{"@id":"uml:TransitionTarget-toTarget"}},{"@id":"uml:TransitionTarget-toSource","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:SourceLink"},"dcterms:title":[{"@value":"uml:TransitionTarget to source"}],"dcterms:description":[{"@value":"Connects the source of uml:TransitionTarget"}],"pig:eligibleEndpoint":[{"@id":"o:RC-UmlTransition"},{"@id":"FMC:Actor"}]},{"@id":"uml:TransitionTarget-toTarget","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:TargetLink"},"dcterms:title":[{"@value":"uml:TransitionTarget to target"}],"dcterms:description":[{"@value":"Connects the target of uml:TransitionTarget"}],"pig:eligibleEndpoint":[{"@id":"o:RC-UmlState"},{"@id":"FMC:State"}]},{"@id":"d:_19_0_3_71e0233_1746001337727_31616_14119","@type":"uml:Package","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"1. Requirements"}],"pig:category":[{"@value":"uml:Package","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552810549321_335902_14037","@type":"pig:View","pig:revision":"rev-9405830621","dcterms:modified":"2025-11-12T09:28:04.871Z","dcterms:title":[{"@value":"Original Requirement Specification"}],"SpecIF:Diagram":[{"@value":"files_and_images/Original Requirement Specification.png","pig:itemType":{"@id":"pig:aProperty"}}],"pig:category":[{"@value":"uml:Diagram","pig:itemType":{"@id":"pig:aProperty"}}],"SpecIF:Notation":[{"@value":"UML Requirement Diagram","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"},"pig:shows":[{"@id":"d:_18_5_3_bc402f4_1552810869277_586147_14175","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552810948738_707540_14217","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552810776263_894029_14121","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552813199775_830344_15281","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552810644650_650036_14079","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552812437056_257578_14975","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552812370943_152244_14924","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552811136575_459751_14253","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552811141795_384989_14263","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552813433937_279860_15327","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552810808641_447672_14157","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552813334959_22842_15317","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552813438857_436917_15337","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552810776263_894029_14121","@type":"IREB:Requirement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Navigation"}],"pig:category":[{"@value":"uml:Class","pig:itemType":{"@id":"pig:aProperty"}}],"dcterms:description":[{"@value":"The Vehicle shall autonomously choose the best route from the current location C to the target location T by means of a road map and actual traffic conditions."}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552810869277_586147_14175","@type":"IREB:Requirement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Road Driving"}],"pig:category":[{"@value":"uml:Class","pig:itemType":{"@id":"pig:aProperty"}}],"dcterms:description":[{"@value":"The vehicle shall be able to follow a selected road."}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552810644650_650036_14079","@type":"IREB:Requirement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Transport to Target"}],"pig:category":[{"@value":"uml:Class","pig:itemType":{"@id":"pig:aProperty"}}],"dcterms:description":[{"@value":"As a customer I would like to get a parcel delivered from the current location C to a target location T. "}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552812370943_152244_14924","@type":"IREB:Requirement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Location as Postal Address"}],"pig:category":[{"@value":"uml:Class","pig:itemType":{"@id":"pig:aProperty"}}],"dcterms:description":[{"@value":"A location may be specified as a postal address."}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552813199775_830344_15281","@type":"IREB:Requirement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Obstacle Avoidance"}],"pig:category":[{"@value":"uml:Class","pig:itemType":{"@id":"pig:aProperty"}}],"dcterms:description":[{"@value":"The vehicle shall not hit a person or an obstacle on the road."}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552810948738_707540_14217","@type":"IREB:Requirement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Safe Driving"}],"pig:category":[{"@value":"uml:Class","pig:itemType":{"@id":"pig:aProperty"}}],"dcterms:description":[{"@value":"The vehicle shall drive no faster than allowed or adequate for the actual road condition."}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552812437056_257578_14975","@type":"IREB:Requirement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Loacation as GPS Coordinate"}],"pig:category":[{"@value":"uml:Class","pig:itemType":{"@id":"pig:aProperty"}}],"dcterms:description":[{"@value":"A location may be specified as GPS Coordinate with Longitude and Latitude in Degrees."}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746001480225_327746_14120","@type":"uml:Package","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"2. Functional Layer"}],"pig:category":[{"@value":"uml:Package","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552811870216_105923_14824","@type":"pig:View","pig:revision":"rev-11094738149","dcterms:modified":"2025-11-12T09:28:21.131Z","dcterms:title":[{"@value":"Functional Decomposition"}],"SpecIF:Diagram":[{"@value":"files_and_images/Functional Decomposition.png","pig:itemType":{"@id":"pig:aProperty"}}],"pig:category":[{"@value":"uml:Diagram","pig:itemType":{"@id":"pig:aProperty"}}],"SpecIF:Notation":[{"@value":"SysML Block Definition Diagram","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"},"pig:shows":[{"@id":"d:_18_5_3_bc402f4_1552814104357_719492_15607","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552812805784_548404_15062","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552815791106_548984_16360","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552814523707_628151_15988","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1556615164506_303870_14975","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552811937697_690731_14862","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552812663506_709974_15011","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552813556602_820961_15353","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552810948738_707540_14217","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552810776263_894029_14121","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1556615212765_548060_15021","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552814194319_862392_15683","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552814246502_629251_15775","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_e40094_1718632293724_754873_14112","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552810869277_586147_14175","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552814212889_663150_15729","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552813038602_222864_15129","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552811510062_903764_14503","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552814266523_206006_15821","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552813818846_218375_15548","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_e40094_1718632569345_311906_14190","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_bc402f4_1604324293194_85516_13666","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_e40094_1718632549973_831908_14172","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_bc402f4_1604324214402_6480_13631","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_bc402f4_1604324487193_60359_13731","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_bc402f4_1604323867629_562362_13452","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552813096475_160687_15177","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1556615683513_411874_15073","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1556615721418_831605_15106","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_bc402f4_1604323821792_371188_13426","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552813723040_381289_15401","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552813102494_993665_15207","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_bc402f4_1604324465452_775050_13715","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_bc402f4_1604324188817_384398_13615","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552815590348_672436_16293","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552815653359_771130_16352","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_bc402f4_1604323888993_530325_13468","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552813795106_879353_15508","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_bc402f4_1604324636141_429081_13763","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_bc402f4_1604324764626_856811_13779","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_bc402f4_1604324512097_628722_13747","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552813870706_981259_15588","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_bc402f4_1604324447693_373448_13698","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_bc402f4_1604324321433_274293_13682","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552815541056_996851_16231","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552813556602_820961_15353","@type":"SpecIF:ModelElement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Brake in an Emergency"}],"pig:category":[{"@value":"RFLP:Function","pig:itemType":{"@id":"pig:aProperty"}}],"dcterms:description":[{"@value":"Take the vehicle to a full stop in the shortest time possible without loosing control over the trajectory."}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552814212889_663150_15729","@type":"SpecIF:ModelElement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Set Speed"}],"pig:category":[{"@value":"RFLP:Function","pig:itemType":{"@id":"pig:aProperty"}}],"dcterms:description":[{"@value":"The (autonomous) driver's speed command (gas pedal position)."}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1556615164506_303870_14975","@type":"SpecIF:ModelElement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Turn Right"}],"pig:category":[{"@value":"RFLP:Function","pig:itemType":{"@id":"pig:aProperty"}}],"dcterms:description":[{"@value":"Take a right turn at a road intersection. Observe the traffic entering the same lane and avoid a collision, if another vehicle does not observe the priority rules."}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552814194319_862392_15683","@type":"SpecIF:ModelElement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Set Radius"}],"pig:category":[{"@value":"RFLP:Function","pig:itemType":{"@id":"pig:aProperty"}}],"dcterms:description":[{"@value":"The (autonomous) driver's steering command (steering wheel position)."}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552812663506_709974_15011","@type":"SpecIF:ModelElement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Navigate"}],"pig:category":[{"@value":"RFLP:Function","pig:itemType":{"@id":"pig:aProperty"}}],"dcterms:description":[{"@value":"Select a path to get from the current position to the target."}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552814523707_628151_15988","@type":"SpecIF:ModelElement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Calculate Accelerations"}],"pig:category":[{"@value":"RFLP:Function","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1556615212765_548060_15021","@type":"SpecIF:ModelElement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Turn Left"}],"pig:category":[{"@value":"RFLP:Function","pig:itemType":{"@id":"pig:aProperty"}}],"dcterms:description":[{"@value":"Take a left turn in a road intersection. Observe the priority rules and avoid traffic on the two lanes you are crossing."}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552811937697_690731_14862","@type":"SpecIF:ModelElement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Drive to Target"}],"pig:category":[{"@value":"RFLP:Function","pig:itemType":{"@id":"pig:aProperty"}}],"dcterms:description":[{"@value":"Manoevre the vehicle from the current position to the selected target."}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552814246502_629251_15775","@type":"SpecIF:ModelElement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Set Acceleration Left"}],"pig:category":[{"@value":"RFLP:Function","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552813038602_222864_15129","@type":"SpecIF:ModelElement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Select an adequate Speed"}],"pig:category":[{"@value":"RFLP:Function","pig:itemType":{"@id":"pig:aProperty"}}],"dcterms:description":[{"@value":"Taking into account road condition and weather, select a safe speed."}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552815791106_548984_16360","@type":"SpecIF:ModelElement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Set Acceleration Right"}],"pig:category":[{"@value":"RFLP:Function","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552812805784_548404_15062","@type":"SpecIF:ModelElement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Follow the Road"}],"pig:category":[{"@value":"RFLP:Function","pig:itemType":{"@id":"pig:aProperty"}}],"dcterms:description":[{"@value":"Keep the vehicle on the selected road."}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552814266523_206006_15821","@type":"SpecIF:ModelElement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Apply Brake"}],"pig:category":[{"@value":"RFLP:Function","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","@type":"uml:Package","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"3. Logical Layer"}],"pig:category":[{"@value":"uml:Package","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746027287147_82140_14431","@type":"pig:View","pig:revision":"rev-7887707545","dcterms:modified":"2025-11-12T09:28:38.225Z","dcterms:title":[{"@value":"Logical Decomposition"}],"SpecIF:Diagram":[{"@value":"files_and_images/Logical Decomposition.png","pig:itemType":{"@id":"pig:aProperty"}}],"pig:category":[{"@value":"uml:Diagram","pig:itemType":{"@id":"pig:aProperty"}}],"SpecIF:Notation":[{"@value":"SysML Block Definition Diagram","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"},"pig:shows":[{"@id":"d:_18_5_3_bc402f4_1552814104357_719492_15607","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552811538626_715866_14549","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_e40094_1718632293724_754873_14112","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_bc402f4_1604360793737_196507_13523","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552811469014_293642_14411","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552811454014_108965_14365","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552827771600_60767_16481","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552811554859_819240_14595","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552811412605_640145_14319","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552811510062_903764_14503","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552811672063_243990_14798","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_e40094_1718634030433_51877_14234","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_bc402f4_1604360962045_534106_13570","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552814131280_1190_15654","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552811613008_58411_14648","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552811666192_832840_14768","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552827804167_216283_16528","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552811619502_982677_14678","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552811653332_976698_14708","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_19_0_3_e40094_1718632293724_754873_14112","@type":"SpecIF:ModelElement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Drive Right"}],"pig:category":[{"@value":"RFLP:Logical_System","pig:itemType":{"@id":"pig:aProperty"}}],"dcterms:description":[{"@value":"The wheel with motor and brake on the right side. The motor can accelerate and decelerate. The motor controller is \"4-quadrant\" and can supply electrical current for recharging the batteries."}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552827771600_60767_16481","@type":"SpecIF:ModelElement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Track Sensor"}],"pig:category":[{"@value":"RFLP:Logical_System","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552811469014_293642_14411","@type":"SpecIF:ModelElement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Body"}],"pig:category":[{"@value":"RFLP:Logical_System","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552811510062_903764_14503","@type":"SpecIF:ModelElement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Drive Left"}],"pig:category":[{"@value":"RFLP:Logical_System","pig:itemType":{"@id":"pig:aProperty"}}],"dcterms:description":[{"@value":"The wheel with motor and brake on the left side. The motor can accelerate and decelerate. The motor controller is \"4-quadrant\" and can supply electrical current for recharging the batteries."}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552811412605_640145_14319","@type":"SpecIF:ModelElement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"LEGO Mindstorms Vehicle"}],"pig:category":[{"@value":"RFLP:Logical_System","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552811538626_715866_14549","@type":"SpecIF:ModelElement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Support Front"}],"pig:category":[{"@value":"RFLP:Logical_System","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552814104357_719492_15607","@type":"SpecIF:ModelElement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Controller"}],"pig:category":[{"@value":"RFLP:Logical_System","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746027630926_778269_14800","@type":"pig:View","pig:revision":"rev-11807243868","dcterms:modified":"2025-11-12T09:29:01.139Z","dcterms:title":[{"@value":"Controller State Machine"}],"SpecIF:Diagram":[{"@value":"files_and_images/Controller State Machine.png","pig:itemType":{"@id":"pig:aProperty"}}],"pig:category":[{"@value":"uml:Diagram","pig:itemType":{"@id":"pig:aProperty"}}],"SpecIF:Notation":[{"@value":"SysML State Machine Diagram","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"},"pig:shows":[{"@id":"d:_19_0_3_71e0233_1746027747207_605800_14880","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028306923_558192_15006","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027631039_116153_14834","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027847324_539644_14916","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028149871_266697_14985","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028183413_413266_14988","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028605370_466818_15028","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027920180_215768_14934","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027631053_836894_14835","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028442990_717820_15013","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028275862_880382_14999","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027631056_691503_14836","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027731735_863978_14871","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027704287_746273_14855","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746029049431_401220_15072","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027837044_867827_14913","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027882482_912182_14918","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028839192_503107_15053","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028827712_739888_15050","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028061993_960870_14971","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028073773_979720_14974","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027804266_719052_14896","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028508430_363448_15020","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028822501_191804_15047","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027731735_371186_14872","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027967661_707482_14950","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027630942_863638_14801","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027630942_464786_14802","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746029024681_691401_15066","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028118776_36360_14979","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746029726958_589946_15078","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028195311_519257_14989","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028216231_986687_14993","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028282302_943711_15000","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028313498_548385_15007","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028899054_101006_15058","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028954791_356054_15062","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028884803_562591_15054","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746029056197_950529_15073","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028540160_854095_15021","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028483612_410592_15014","pig:itemType":{"@id":"pig:aTargetLink"}}],"pig:depicts":[{"@id":"d:_19_0_3_71e0233_1746027630942_863638_14801","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_19_0_3_71e0233_1746027631039_116153_14834","@type":"FMC:State","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"entry"}],"pig:category":[{"@value":"uml:Pseudostate","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746027631053_836894_14835","@type":"FMC:State","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Off"}],"pig:category":[{"@value":"uml:State","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746027731735_863978_14871","@type":"FMC:State","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"entry"}],"pig:category":[{"@value":"uml:Pseudostate","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746027747207_605800_14880","@type":"FMC:State","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Navigating"}],"pig:category":[{"@value":"uml:State","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746027804266_719052_14896","@type":"FMC:State","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Defining Target"}],"pig:category":[{"@value":"uml:State","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746027882482_912182_14918","@type":"FMC:State","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Following the Road"}],"pig:category":[{"@value":"uml:State","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746027920180_215768_14934","@type":"FMC:State","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Turning Right"}],"pig:category":[{"@value":"uml:State","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746027967661_707482_14950","@type":"FMC:State","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Turning Left"}],"pig:category":[{"@value":"uml:State","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746028605370_466818_15028","@type":"FMC:State","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Standing"}],"pig:category":[{"@value":"uml:State","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746027837044_867827_14913","@type":"FMC:Actor","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"entry→Defining Target"}],"pig:category":[{"@value":"uml:Transition","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746027847324_539644_14916","@type":"FMC:Actor","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Defining Target→Navigating"}],"pig:category":[{"@value":"uml:Transition","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746028061993_960870_14971","@type":"FMC:Actor","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Navigating→Following the Road"}],"pig:category":[{"@value":"uml:Transition","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746028073773_979720_14974","@type":"FMC:Actor","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Following the Road→Navigating"}],"pig:category":[{"@value":"uml:Transition","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746028149871_266697_14985","@type":"FMC:Actor","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Following the Road→Turning Right"}],"pig:category":[{"@value":"uml:Transition","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746028183413_413266_14988","@type":"FMC:Actor","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Turning Right→Following the Road"}],"pig:category":[{"@value":"uml:Transition","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746028275862_880382_14999","@type":"FMC:Actor","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Following the Road→Turning Left"}],"pig:category":[{"@value":"uml:Transition","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746028306923_558192_15006","@type":"FMC:Actor","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Turning Left→Following the Road"}],"pig:category":[{"@value":"uml:Transition","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746028822501_191804_15047","@type":"FMC:Actor","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Following the Road→Standing"}],"pig:category":[{"@value":"uml:Transition","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746028827712_739888_15050","@type":"FMC:Actor","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Following the Road→Standing"}],"pig:category":[{"@value":"uml:Transition","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746028839192_503107_15053","@type":"FMC:Actor","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Standing→Following the Road"}],"pig:category":[{"@value":"uml:Transition","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746029049431_401220_15072","@type":"FMC:Actor","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Standing→Defining Target"}],"pig:category":[{"@value":"uml:Transition","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746028508430_363448_15020","@type":"FMC:Actor","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Standing→Off"}],"pig:category":[{"@value":"uml:Transition","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746027704287_746273_14855","@type":"FMC:State","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"On"}],"pig:category":[{"@value":"uml:State","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746027631056_691503_14836","@type":"FMC:Actor","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"entry→Off"}],"pig:category":[{"@value":"uml:Transition","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746028442990_717820_15013","@type":"FMC:Actor","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Off→On"}],"pig:category":[{"@value":"uml:Transition","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552811554859_819240_14595","@type":"SpecIF:ModelElement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Support Rear"}],"pig:category":[{"@value":"RFLP:Logical_System","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552811454014_108965_14365","@type":"SpecIF:ModelElement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Chassis"}],"pig:category":[{"@value":"RFLP:Logical_System","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_bc402f4_1604360793737_196507_13523","@type":"SpecIF:ModelElement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Collision Alarm \nSensor"}],"pig:category":[{"@value":"RFLP:Logical_System","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746028118776_36360_14979","@type":"FMC:Event","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"start_driving!"}],"pig:category":[{"@value":"uml:SignalEvent","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746028195311_519257_14989","@type":"FMC:Event","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"turn_right!"}],"pig:category":[{"@value":"uml:SignalEvent","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746028216231_986687_14993","@type":"FMC:Event","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"turned_right!"}],"pig:category":[{"@value":"uml:SignalEvent","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746028282302_943711_15000","@type":"FMC:Event","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"turn_left!"}],"pig:category":[{"@value":"uml:SignalEvent","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746028313498_548385_15007","@type":"FMC:Event","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"turned_left!"}],"pig:category":[{"@value":"uml:SignalEvent","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746028483612_410592_15014","@type":"FMC:Event","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"switch_on!"}],"pig:category":[{"@value":"uml:SignalEvent","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746028540160_854095_15021","@type":"FMC:Event","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"switch_off!"}],"pig:category":[{"@value":"uml:SignalEvent","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746028884803_562591_15054","@type":"FMC:Event","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"continue_driving!"}],"pig:category":[{"@value":"uml:SignalEvent","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746028899054_101006_15058","@type":"FMC:Event","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"halt!"}],"pig:category":[{"@value":"uml:SignalEvent","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746028954791_356054_15062","@type":"FMC:Event","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"emergency_brake!"}],"pig:category":[{"@value":"uml:SignalEvent","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746029024681_691401_15066","@type":"FMC:Event","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"navigate!"}],"pig:category":[{"@value":"uml:SignalEvent","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746029056197_950529_15073","@type":"FMC:Event","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"new_target!"}],"pig:category":[{"@value":"uml:SignalEvent","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746029726958_589946_15078","@type":"FMC:Event","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"re-navigate!"}],"pig:category":[{"@value":"uml:CallEvent","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746027630942_863638_14801","@type":"FMC:Actor","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Controller State Machine"}],"pig:category":[{"@value":"uml:StateMachine","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746027630942_464786_14802","@type":"FMC:Actor","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"unnamed uml:Region"}],"pig:category":[{"@value":"uml:Region","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746027731735_371186_14872","@type":"FMC:Actor","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"unnamed uml:Region"}],"pig:category":[{"@value":"uml:Region","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:S-contains-10399921810","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001337727_31616_14119","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552810549321_335902_14037","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-10330010667","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001337727_31616_14119","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552810776263_894029_14121","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-10652725449","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001337727_31616_14119","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552810869277_586147_14175","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-11927092777","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001337727_31616_14119","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552810644650_650036_14079","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-8881937697","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001337727_31616_14119","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552812370943_152244_14924","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-10783514673","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001337727_31616_14119","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552813199775_830344_15281","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-10945506396","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001337727_31616_14119","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552810948738_707540_14217","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-11407335150","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001337727_31616_14119","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552812437056_257578_14975","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-9116397029","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001480225_327746_14120","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552811870216_105923_14824","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-10022314071","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001480225_327746_14120","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552813556602_820961_15353","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-9131303994","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001480225_327746_14120","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552814212889_663150_15729","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-8559115413","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001480225_327746_14120","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1556615164506_303870_14975","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-10881577187","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001480225_327746_14120","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552814194319_862392_15683","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-9119481481","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001480225_327746_14120","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552812663506_709974_15011","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-12098040971","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001480225_327746_14120","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552814523707_628151_15988","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-10442923979","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001480225_327746_14120","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1556615212765_548060_15021","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-11694297906","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001480225_327746_14120","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552811937697_690731_14862","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-9652197932","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001480225_327746_14120","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552814246502_629251_15775","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-9362975811","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001480225_327746_14120","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552813038602_222864_15129","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-10771124872","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001480225_327746_14120","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552815791106_548984_16360","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-9168262784","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001480225_327746_14120","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552812805784_548404_15062","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-8878119738","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001480225_327746_14120","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552814266523_206006_15821","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_19_0_3_bc402f4_1604324487193_60359_13731","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1552812805784_548404_15062","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552814194319_862392_15683","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_19_0_3_bc402f4_1604323888993_530325_13468","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1552813556602_820961_15353","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552814523707_628151_15988","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_19_0_3_bc402f4_1604324214402_6480_13631","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1552814523707_628151_15988","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552815791106_548984_16360","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_19_0_3_bc402f4_1604324447693_373448_13698","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1556615212765_548060_15021","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552814194319_862392_15683","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1556615721418_831605_15106","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1552811937697_690731_14862","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1556615212765_548060_15021","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1556615683513_411874_15073","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1552811937697_690731_14862","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1556615164506_303870_14975","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552813723040_381289_15401","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1552811937697_690731_14862","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552813556602_820961_15353","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_19_0_3_bc402f4_1604324465452_775050_13715","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1556615164506_303870_14975","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552814194319_862392_15683","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_19_0_3_bc402f4_1604324512097_628722_13747","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1556615164506_303870_14975","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552813038602_222864_15129","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_19_0_3_bc402f4_1604323867629_562362_13452","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1552814212889_663150_15729","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552814523707_628151_15988","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_19_0_3_bc402f4_1604324293194_85516_13666","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1552814523707_628151_15988","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552814266523_206006_15821","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_19_0_3_bc402f4_1604324321433_274293_13682","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1556615212765_548060_15021","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552813038602_222864_15129","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_19_0_3_bc402f4_1604324636141_429081_13763","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1552812805784_548404_15062","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552813038602_222864_15129","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552813096475_160687_15177","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1552811937697_690731_14862","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552812663506_709974_15011","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_19_0_3_bc402f4_1604324764626_856811_13779","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1552813038602_222864_15129","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552814212889_663150_15729","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_19_0_3_bc402f4_1604323821792_371188_13426","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1552814194319_862392_15683","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552814523707_628151_15988","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552813102494_993665_15207","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1552811937697_690731_14862","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552812805784_548404_15062","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_19_0_3_bc402f4_1604324188817_384398_13615","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1552814523707_628151_15988","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552814246502_629251_15775","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-10564266575","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027287147_82140_14431","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-11515557626","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_e40094_1718632293724_754873_14112","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-9482395742","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552827771600_60767_16481","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-9179309009","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552811469014_293642_14411","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-8743767210","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552811510062_903764_14503","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-8520696102","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552811412605_640145_14319","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-8274829800","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552811538626_715866_14549","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-8790231064","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552814104357_719492_15607","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-ownedBehavior-10906203416","@type":"uml:ownedBehavior","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:ownedBehavior-toSource":[{"@id":"d:_18_5_3_bc402f4_1552814104357_719492_15607","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:ownedBehavior-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027630942_863638_14801","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-8869082288","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027630942_863638_14801","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-9973927808","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027630926_778269_14800","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-11028317306","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746027630942_863638_14801","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027630942_464786_14802","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-10256822099","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746027630942_464786_14802","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027631039_116153_14834","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-8821517563","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746027630942_464786_14802","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027631053_836894_14835","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-8168210938","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746027630942_464786_14802","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027704287_746273_14855","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-11015906742","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746027704287_746273_14855","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027731735_371186_14872","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-10159638974","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746027731735_371186_14872","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027731735_863978_14871","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-11234558713","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746027731735_371186_14872","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027747207_605800_14880","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-8004350392","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746027731735_371186_14872","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027804266_719052_14896","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-10687126464","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746027731735_371186_14872","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027882482_912182_14918","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-9457711542","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746027731735_371186_14872","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027920180_215768_14934","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-10206589560","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746027731735_371186_14872","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027967661_707482_14950","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-11254687961","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746027731735_371186_14872","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028605370_466818_15028","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-startsFrom-10764992335","@type":"uml:TransitionSource","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionSource-toSource":[{"@id":"d:_19_0_3_71e0233_1746027837044_867827_14913","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionSource-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027731735_863978_14871","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-endsAt-10266389823","@type":"uml:TransitionTarget","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionTarget-toSource":[{"@id":"d:_19_0_3_71e0233_1746027837044_867827_14913","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionTarget-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027804266_719052_14896","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-startsFrom-9736561245","@type":"uml:TransitionSource","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionSource-toSource":[{"@id":"d:_19_0_3_71e0233_1746027847324_539644_14916","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionSource-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027804266_719052_14896","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-endsAt-11306959252","@type":"uml:TransitionTarget","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionTarget-toSource":[{"@id":"d:_19_0_3_71e0233_1746027847324_539644_14916","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionTarget-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027747207_605800_14880","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-triggers-11057421225","@type":"uml:Trigger","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:Trigger-toSource":[{"@id":"d:_19_0_3_71e0233_1746029024681_691401_15066","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:Trigger-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027847324_539644_14916","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-startsFrom-10753048967","@type":"uml:TransitionSource","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionSource-toSource":[{"@id":"d:_19_0_3_71e0233_1746028061993_960870_14971","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionSource-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027747207_605800_14880","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-endsAt-10164860996","@type":"uml:TransitionTarget","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionTarget-toSource":[{"@id":"d:_19_0_3_71e0233_1746028061993_960870_14971","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionTarget-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027882482_912182_14918","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-triggers-9989729747","@type":"uml:Trigger","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:Trigger-toSource":[{"@id":"d:_19_0_3_71e0233_1746028118776_36360_14979","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:Trigger-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028061993_960870_14971","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-startsFrom-8258457006","@type":"uml:TransitionSource","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionSource-toSource":[{"@id":"d:_19_0_3_71e0233_1746028073773_979720_14974","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionSource-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027882482_912182_14918","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-endsAt-8326005469","@type":"uml:TransitionTarget","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionTarget-toSource":[{"@id":"d:_19_0_3_71e0233_1746028073773_979720_14974","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionTarget-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027747207_605800_14880","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-triggers-11586041943","@type":"uml:Trigger","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:Trigger-toSource":[{"@id":"d:_19_0_3_71e0233_1746029726958_589946_15078","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:Trigger-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028073773_979720_14974","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-startsFrom-10663437825","@type":"uml:TransitionSource","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionSource-toSource":[{"@id":"d:_19_0_3_71e0233_1746028149871_266697_14985","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionSource-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027882482_912182_14918","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-endsAt-10827655661","@type":"uml:TransitionTarget","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionTarget-toSource":[{"@id":"d:_19_0_3_71e0233_1746028149871_266697_14985","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionTarget-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027920180_215768_14934","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-triggers-11897440242","@type":"uml:Trigger","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:Trigger-toSource":[{"@id":"d:_19_0_3_71e0233_1746028195311_519257_14989","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:Trigger-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028149871_266697_14985","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-startsFrom-10501816934","@type":"uml:TransitionSource","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionSource-toSource":[{"@id":"d:_19_0_3_71e0233_1746028183413_413266_14988","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionSource-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027920180_215768_14934","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-endsAt-9816959590","@type":"uml:TransitionTarget","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionTarget-toSource":[{"@id":"d:_19_0_3_71e0233_1746028183413_413266_14988","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionTarget-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027882482_912182_14918","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-triggers-8400858676","@type":"uml:Trigger","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:Trigger-toSource":[{"@id":"d:_19_0_3_71e0233_1746028216231_986687_14993","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:Trigger-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028183413_413266_14988","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-startsFrom-9888010871","@type":"uml:TransitionSource","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionSource-toSource":[{"@id":"d:_19_0_3_71e0233_1746028275862_880382_14999","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionSource-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027882482_912182_14918","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-endsAt-7971585829","@type":"uml:TransitionTarget","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionTarget-toSource":[{"@id":"d:_19_0_3_71e0233_1746028275862_880382_14999","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionTarget-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027967661_707482_14950","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-triggers-8791358862","@type":"uml:Trigger","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:Trigger-toSource":[{"@id":"d:_19_0_3_71e0233_1746028282302_943711_15000","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:Trigger-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028275862_880382_14999","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-startsFrom-8873253251","@type":"uml:TransitionSource","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionSource-toSource":[{"@id":"d:_19_0_3_71e0233_1746028306923_558192_15006","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionSource-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027967661_707482_14950","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-endsAt-10269038785","@type":"uml:TransitionTarget","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionTarget-toSource":[{"@id":"d:_19_0_3_71e0233_1746028306923_558192_15006","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionTarget-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027882482_912182_14918","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-triggers-8710683288","@type":"uml:Trigger","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:Trigger-toSource":[{"@id":"d:_19_0_3_71e0233_1746028313498_548385_15007","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:Trigger-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028306923_558192_15006","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-startsFrom-8996430444","@type":"uml:TransitionSource","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionSource-toSource":[{"@id":"d:_19_0_3_71e0233_1746028822501_191804_15047","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionSource-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027882482_912182_14918","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-endsAt-11699322235","@type":"uml:TransitionTarget","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionTarget-toSource":[{"@id":"d:_19_0_3_71e0233_1746028822501_191804_15047","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionTarget-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028605370_466818_15028","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-triggers-9704245737","@type":"uml:Trigger","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:Trigger-toSource":[{"@id":"d:_19_0_3_71e0233_1746028899054_101006_15058","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:Trigger-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028822501_191804_15047","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-startsFrom-8860759247","@type":"uml:TransitionSource","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionSource-toSource":[{"@id":"d:_19_0_3_71e0233_1746028827712_739888_15050","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionSource-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027882482_912182_14918","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-endsAt-11563651038","@type":"uml:TransitionTarget","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionTarget-toSource":[{"@id":"d:_19_0_3_71e0233_1746028827712_739888_15050","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionTarget-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028605370_466818_15028","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-triggers-8483779004","@type":"uml:Trigger","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:Trigger-toSource":[{"@id":"d:_19_0_3_71e0233_1746028954791_356054_15062","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:Trigger-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028827712_739888_15050","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-startsFrom-11316265439","@type":"uml:TransitionSource","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionSource-toSource":[{"@id":"d:_19_0_3_71e0233_1746028839192_503107_15053","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionSource-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028605370_466818_15028","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-endsAt-8092734140","@type":"uml:TransitionTarget","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionTarget-toSource":[{"@id":"d:_19_0_3_71e0233_1746028839192_503107_15053","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionTarget-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027882482_912182_14918","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-triggers-9344676895","@type":"uml:Trigger","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:Trigger-toSource":[{"@id":"d:_19_0_3_71e0233_1746028884803_562591_15054","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:Trigger-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028839192_503107_15053","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-startsFrom-10914308453","@type":"uml:TransitionSource","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionSource-toSource":[{"@id":"d:_19_0_3_71e0233_1746029049431_401220_15072","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionSource-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028605370_466818_15028","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-endsAt-10482894906","@type":"uml:TransitionTarget","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionTarget-toSource":[{"@id":"d:_19_0_3_71e0233_1746029049431_401220_15072","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionTarget-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027804266_719052_14896","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-triggers-10198907956","@type":"uml:Trigger","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:Trigger-toSource":[{"@id":"d:_19_0_3_71e0233_1746029056197_950529_15073","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:Trigger-toTarget":[{"@id":"d:_19_0_3_71e0233_1746029049431_401220_15072","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-startsFrom-10203202111","@type":"uml:TransitionSource","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionSource-toSource":[{"@id":"d:_19_0_3_71e0233_1746028508430_363448_15020","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionSource-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028605370_466818_15028","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-endsAt-10388500447","@type":"uml:TransitionTarget","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionTarget-toSource":[{"@id":"d:_19_0_3_71e0233_1746028508430_363448_15020","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionTarget-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027631053_836894_14835","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-triggers-8226880185","@type":"uml:Trigger","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:Trigger-toSource":[{"@id":"d:_19_0_3_71e0233_1746028540160_854095_15021","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:Trigger-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028508430_363448_15020","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-startsFrom-10505811433","@type":"uml:TransitionSource","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionSource-toSource":[{"@id":"d:_19_0_3_71e0233_1746027631056_691503_14836","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionSource-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027631039_116153_14834","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-endsAt-11750312327","@type":"uml:TransitionTarget","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionTarget-toSource":[{"@id":"d:_19_0_3_71e0233_1746027631056_691503_14836","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionTarget-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027631053_836894_14835","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-startsFrom-9662251988","@type":"uml:TransitionSource","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionSource-toSource":[{"@id":"d:_19_0_3_71e0233_1746028442990_717820_15013","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionSource-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027631053_836894_14835","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-endsAt-10042078921","@type":"uml:TransitionTarget","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionTarget-toSource":[{"@id":"d:_19_0_3_71e0233_1746028442990_717820_15013","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionTarget-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027704287_746273_14855","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-triggers-11689502440","@type":"uml:Trigger","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:Trigger-toSource":[{"@id":"d:_19_0_3_71e0233_1746028483612_410592_15014","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:Trigger-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028442990_717820_15013","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-8524437672","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552811554859_819240_14595","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-10606577794","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552811454014_108965_14365","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-10600261667","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_bc402f4_1604360793737_196507_13523","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-8034687851","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028118776_36360_14979","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-8284367231","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028195311_519257_14989","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-11116214028","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028216231_986687_14993","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-11694709529","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028282302_943711_15000","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-12033035043","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028313498_548385_15007","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-9345097305","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028483612_410592_15014","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-10887885853","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028540160_854095_15021","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-11330005271","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028884803_562591_15054","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-10697539955","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028899054_101006_15058","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-8277838339","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028954791_356054_15062","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-10218959244","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746029024681_691401_15066","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-10331126120","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746029056197_950529_15073","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-8478289863","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746029726958_589946_15078","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552814131280_1190_15654","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1552811412605_640145_14319","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552814104357_719492_15607","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_19_0_3_bc402f4_1604360962045_534106_13570","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1552811412605_640145_14319","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_19_0_3_bc402f4_1604360793737_196507_13523","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552811613008_58411_14648","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1552811412605_640145_14319","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552811454014_108965_14365","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_19_0_3_e40094_1718634030433_51877_14234","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1552811412605_640145_14319","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_19_0_3_e40094_1718632293724_754873_14112","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552811619502_982677_14678","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1552811412605_640145_14319","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552811469014_293642_14411","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552827804167_216283_16528","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1552811412605_640145_14319","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552827771600_60767_16481","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552811666192_832840_14768","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1552811412605_640145_14319","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552811538626_715866_14549","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552811672063_243990_14798","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1552811412605_640145_14319","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552811554859_819240_14595","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552811653332_976698_14708","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1552811412605_640145_14319","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552811510062_903764_14503","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552810808641_447672_14157","@type":"IREB:refines","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"IREB:refines-toSource":[{"@id":"d:_18_5_3_bc402f4_1552810776263_894029_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"IREB:refines-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552810644650_650036_14079","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552811141795_384989_14263","@type":"IREB:refines","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"IREB:refines-toSource":[{"@id":"d:_18_5_3_bc402f4_1552810948738_707540_14217","pig:itemType":{"@id":"pig:aSourceLink"}}],"IREB:refines-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552810644650_650036_14079","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552813438857_436917_15337","@type":"IREB:refines","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"IREB:refines-toSource":[{"@id":"d:_18_5_3_bc402f4_1552812370943_152244_14924","pig:itemType":{"@id":"pig:aSourceLink"}}],"IREB:refines-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552810644650_650036_14079","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552813334959_22842_15317","@type":"IREB:refines","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"IREB:refines-toSource":[{"@id":"d:_18_5_3_bc402f4_1552813199775_830344_15281","pig:itemType":{"@id":"pig:aSourceLink"}}],"IREB:refines-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552810644650_650036_14079","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552813433937_279860_15327","@type":"IREB:refines","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"IREB:refines-toSource":[{"@id":"d:_18_5_3_bc402f4_1552812437056_257578_14975","pig:itemType":{"@id":"pig:aSourceLink"}}],"IREB:refines-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552810644650_650036_14079","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552811136575_459751_14253","@type":"IREB:refines","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"IREB:refines-toSource":[{"@id":"d:_18_5_3_bc402f4_1552810869277_586147_14175","pig:itemType":{"@id":"pig:aSourceLink"}}],"IREB:refines-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552810644650_650036_14079","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552813795106_879353_15508","@type":"oslc_rm:satisfies","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"oslc_rm:satisfies-toSource":[{"@id":"d:_18_5_3_bc402f4_1552812805784_548404_15062","pig:itemType":{"@id":"pig:aSourceLink"}}],"oslc_rm:satisfies-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552810869277_586147_14175","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552813870706_981259_15588","@type":"oslc_rm:satisfies","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"oslc_rm:satisfies-toSource":[{"@id":"d:_18_5_3_bc402f4_1552812663506_709974_15011","pig:itemType":{"@id":"pig:aSourceLink"}}],"oslc_rm:satisfies-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552810776263_894029_14121","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552815653359_771130_16352","@type":"sysml:Allocate","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"sysml:Allocate-toSource":[{"@id":"d:_18_5_3_bc402f4_1552814523707_628151_15988","pig:itemType":{"@id":"pig:aSourceLink"}}],"sysml:Allocate-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552814104357_719492_15607","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552815590348_672436_16293","@type":"sysml:Allocate","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"sysml:Allocate-toSource":[{"@id":"d:_18_5_3_bc402f4_1552814266523_206006_15821","pig:itemType":{"@id":"pig:aSourceLink"}}],"sysml:Allocate-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552811510062_903764_14503","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_19_0_3_e40094_1718632549973_831908_14172","@type":"sysml:Allocate","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"sysml:Allocate-toSource":[{"@id":"d:_18_5_3_bc402f4_1552815791106_548984_16360","pig:itemType":{"@id":"pig:aSourceLink"}}],"sysml:Allocate-toTarget":[{"@id":"d:_19_0_3_e40094_1718632293724_754873_14112","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552815541056_996851_16231","@type":"sysml:Allocate","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"sysml:Allocate-toSource":[{"@id":"d:_18_5_3_bc402f4_1552814246502_629251_15775","pig:itemType":{"@id":"pig:aSourceLink"}}],"sysml:Allocate-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552811510062_903764_14503","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552813818846_218375_15548","@type":"oslc_rm:satisfies","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"oslc_rm:satisfies-toSource":[{"@id":"d:_18_5_3_bc402f4_1552813038602_222864_15129","pig:itemType":{"@id":"pig:aSourceLink"}}],"oslc_rm:satisfies-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552810948738_707540_14217","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_19_0_3_e40094_1718632569345_311906_14190","@type":"sysml:Allocate","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"sysml:Allocate-toSource":[{"@id":"d:_18_5_3_bc402f4_1552814266523_206006_15821","pig:itemType":{"@id":"pig:aSourceLink"}}],"sysml:Allocate-toTarget":[{"@id":"d:_19_0_3_e40094_1718632293724_754873_14112","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:HierarchyRoot-P-eee_1045467100313_135436_1","@type":"pig:HierarchyRoot","pig:itemType":{"@id":"pig:anEntity"},"dcterms:modified":"2026-01-12T12:39:24.150Z","dcterms:title":[{"@value":"Hierarchy Root"}],"dcterms:description":[{"@value":"... anchoring all hierarchies of this graph (package)"}],"pig:lists":[{"@id":"d:HR-9052885961","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:HR-FolderGlossary-10391243923","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:eee_1045467100313_135436_1","@type":"pig:Outline","pig:revision":"rev-10410861023","dcterms:modified":"2025-11-12T09:27:42.126Z","dcterms:title":[{"@value":"Small Autonomous Vehicle"}],"pig:category":[{"@value":"uml:Model","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"},"pig:lists":[{"@id":"d:_19_0_3_71e0233_1746001337727_31616_14119","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746001480225_327746_14120","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:HR-9052885961","@type":"pig:Outline","dcterms:modified":"2026-01-12T12:39:23.956Z","dcterms:title":[{"@value":"Small Autonomous Vehicle"}],"dcterms:description":[{"@value":"A set of SpecIF Classes derived from a SpecIF Ontology for the domains SpecIF:DomainBase, SpecIF:DomainSystemsEngineering, SpecIF:DomainSystemModelIntegration.","@language":"en"}],"pig:category":[{"@value":"ReqIF:HierarchyRoot","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"},"pig:lists":[{"@id":"d:eee_1045467100313_135436_1","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:FolderGlossary-10391243923","@type":"pig:Outline","dcterms:modified":"2026-01-12T12:39:18.325Z","dcterms:title":[{"@value":"Model Elements (Glossary)"}],"pig:category":[{"@value":"SpecIF:Glossary","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"},"pig:lists":[{"@id":"d:_18_5_3_bc402f4_1552814266523_206006_15821","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552811469014_293642_14411","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552813556602_820961_15353","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552814523707_628151_15988","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552811454014_108965_14365","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_bc402f4_1604360793737_196507_13523","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028884803_562591_15054","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552814104357_719492_15607","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027630942_863638_14801","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027804266_719052_14896","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027847324_539644_14916","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552811510062_903764_14503","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_e40094_1718632293724_754873_14112","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552811937697_690731_14862","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028954791_356054_15062","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027631039_116153_14834","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027731735_863978_14871","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027837044_867827_14913","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027631056_691503_14836","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552812805784_548404_15062","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027882482_912182_14918","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028073773_979720_14974","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028822501_191804_15047","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028827712_739888_15050","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028275862_880382_14999","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028149871_266697_14985","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028899054_101006_15058","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552811412605_640145_14319","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552812437056_257578_14975","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552812370943_152244_14924","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552812663506_709974_15011","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746029024681_691401_15066","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027747207_605800_14880","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028061993_960870_14971","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552810776263_894029_14121","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746029056197_950529_15073","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552813199775_830344_15281","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027631053_836894_14835","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028442990_717820_15013","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027704287_746273_14855","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746029726958_589946_15078","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552810869277_586147_14175","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552810948738_707540_14217","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552813038602_222864_15129","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552814246502_629251_15775","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552815791106_548984_16360","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552814194319_862392_15683","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552814212889_663150_15729","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028605370_466818_15028","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746029049431_401220_15072","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028839192_503107_15053","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028508430_363448_15020","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028118776_36360_14979","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552811538626_715866_14549","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552811554859_819240_14595","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028540160_854095_15021","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028483612_410592_15014","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552827771600_60767_16481","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552810644650_650036_14079","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1556615212765_548060_15021","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1556615164506_303870_14975","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028282302_943711_15000","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028195311_519257_14989","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028313498_548385_15007","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028216231_986687_14993","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027967661_707482_14950","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028306923_558192_15006","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027920180_215768_14934","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028183413_413266_14988","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027630942_464786_14802","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027731735_371186_14872","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:HR-FolderGlossary-10391243923","@type":"pig:Outline","dcterms:modified":"2026-01-12T12:39:23.956Z","dcterms:title":[{"@value":"Small Autonomous Vehicle"}],"dcterms:description":[{"@value":"A set of SpecIF Classes derived from a SpecIF Ontology for the domains SpecIF:DomainBase, SpecIF:DomainSystemsEngineering, SpecIF:DomainSystemModelIntegration.","@language":"en"}],"pig:category":[{"@value":"ReqIF:HierarchyRoot","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"},"pig:lists":[{"@id":"d:FolderGlossary-10391243923","pig:itemType":{"@id":"pig:aTargetLink"}}]}]} \ No newline at end of file +{"@context":{"o":"https://product-information-graph.org/v0.2/ontology#","d":"https://product-information-graph.org/examples/Small%20Autonomous%20Vehicle.specif.zip#","rdf":"http://www.w3.org/1999/02/22-rdf-syntax-ns#","owl":"http://www.w3.org/2002/07/owl#","sh":"http://www.w3.org/ns/shacl#","xs":"http://www.w3.org/2001/XMLSchema#","dcterms":"http://purl.org/dc/terms/","FMC":"http://fmc-modeling.org#","RFLP":"https://product-information-graph.org/v0.2/ontology/RFLP#","IREB":"https://cpre.ireb.org/en/downloads-and-resources/glossary#","ReqIF":"https://www.prostep.org/fileadmin/downloads/PSI_ImplementationGuide_ReqIF_V1-7.pdf#","oslc_rm":"http://open-services.net/ns/rm#","uml":"https://www.omg.org/spec/UML#","sysml":"https://www.omg.org/spec/SysML#","pig":"https://product-information-graph.org/v0.2/metamodel#","SpecIF":"https://specif.de/v1.2/schema#"},"@id":"d:P-eee_1045467100313_135436_1","@type":"pig:Package","dcterms:title":[{"@value":"Small Autonomous Vehicle"}],"dcterms:description":[{"@value":"A set of SpecIF Classes derived from a SpecIF Ontology for the domains SpecIF:DomainBase, SpecIF:DomainSystemsEngineering, SpecIF:DomainSystemModelIntegration.","@language":"en"}],"dcterms:modified":"2026-01-17T22:38:55.612Z","@graph":[{"@id":"pig:Entity","@type":"owl:Class","pig:itemType":{"@id":"pig:Entity"},"dcterms:title":[{"@value":"Entity"}],"dcterms:description":[{"@value":"A PIG meta-model element used for entities (aka resources or artifacts)."}],"pig:eligibleProperty":[{"@id":"pig:category"},{"@id":"pig:icon"}]},{"@id":"pig:Organizer","pig:specializes":{"@id":"pig:Entity"},"pig:itemType":{"@id":"pig:Entity"},"dcterms:title":[{"@value":"Organizer"}],"dcterms:description":[{"@value":"An element organizing model elements. An example is a list of requirements or a diagram using a certain notation."}],"pig:eligibleProperty":[{"@id":"pig:category"}]},{"@id":"pig:HierarchyRoot","pig:specializes":{"@id":"pig:Organizer"},"pig:itemType":{"@id":"pig:Entity"},"dcterms:title":[{"@value":"Hierarchy Root"}],"dcterms:description":[{"@value":"A subclass of PIG organizer serving as a root for hierarchically organized graph elements."}],"pig:eligibleProperty":[],"pig:eligibleTargetLink":[{"@id":"pig:lists"}]},{"@id":"pig:Outline","pig:specializes":{"@id":"pig:Organizer"},"pig:itemType":{"@id":"pig:Entity"},"dcterms:title":[{"@value":"Outline"}],"dcterms:description":[{"@value":"A subclass of PIG organizer comprising all information items of a human-readable document. As usual, the outline is hierarchically organized."}],"pig:eligibleProperty":[{"@id":"pig:category"}],"pig:eligibleTargetLink":[{"@id":"pig:lists"}]},{"@id":"pig:View","pig:specializes":{"@id":"pig:Organizer"},"pig:itemType":{"@id":"pig:Entity"},"dcterms:title":[{"@value":"View"}],"dcterms:description":[{"@value":"A subclass of PIG organizer representing a model view (diagram) using a certain notation showing selected model elements."}],"pig:eligibleProperty":[{"@id":"pig:category"},{"@id":"pig:icon"}],"pig:eligibleTargetLink":[{"@id":"pig:shows"},{"@id":"pig:depicts"}]},{"@id":"pig:Relationship","@type":"owl:Class","pig:itemType":{"@id":"pig:Relationship"},"dcterms:title":[{"@value":"Relationship"}],"dcterms:description":[{"@value":"A PIG meta-model element used for reified relationships (aka predicates)."}],"pig:eligibleProperty":[{"@id":"pig:category"},{"@id":"pig:icon"}],"pig:eligibleSourceLink":{"@id":"pig:SourceLink"},"pig:eligibleTargetLink":{"@id":"pig:TargetLink"}},{"@id":"pig:Property","@type":"owl:DatatypeProperty","pig:itemType":{"@id":"pig:Property"},"dcterms:title":[{"@value":"Property"}],"dcterms:description":[{"@value":"A PIG meta-model element used for properties (aka attributes)."}],"sh:datatype":{"@id":"xs:anyType"}},{"@id":"pig:icon","pig:specializes":{"@id":"pig:Property"},"pig:itemType":{"@id":"pig:Property"},"dcterms:title":[{"@value":"has icon"}],"dcterms:description":[{"@value":"Specifies an icon for a model element (entity or relationship)."}],"sh:datatype":{"@id":"xs:string"},"sh:minCount":0,"sh:maxCount":1},{"@id":"pig:category","pig:specializes":{"@id":"dcterms:type"},"pig:itemType":{"@id":"pig:Property"},"dcterms:title":[{"@value":"has category"}],"dcterms:description":[{"@value":"Specifies a category for an element (entity, relationship or organizer)."}],"sh:datatype":{"@id":"xs:string"},"sh:maxLength":32,"sh:minCount":0,"sh:maxCount":1},{"@id":"pig:Link","@type":"owl:ObjectProperty","pig:itemType":{"@id":"pig:Link"},"pig:eligibleEndpoint":[{"@id":"pig:Entity"},{"@id":"pig:Relationship"}],"dcterms:title":[{"@value":"linked with"}],"dcterms:description":[{"@value":"Connects a reified relationship with its source or target. Also connects an organizer to a model element"}]},{"@id":"pig:SourceLink","pig:specializes":{"@id":"pig:Link"},"pig:itemType":{"@id":"pig:Link"},"pig:eligibleEndpoint":[{"@id":"pig:Entity"},{"@id":"pig:Relationship"}],"dcterms:title":[{"@value":"to source"}],"dcterms:description":[{"@value":"Connects the source of a reified relationship."}]},{"@id":"pig:TargetLink","pig:specializes":{"@id":"pig:Link"},"pig:itemType":{"@id":"pig:Link"},"pig:eligibleEndpoint":[{"@id":"pig:Entity"},{"@id":"pig:Relationship"}],"dcterms:title":[{"@value":"to target"}],"dcterms:description":[{"@value":"Connects the target of a reified relationship or an organizer."}]},{"@id":"pig:lists","pig:specializes":{"@id":"pig:TargetLink"},"pig:itemType":{"@id":"pig:Link"},"pig:eligibleEndpoint":[{"@id":"pig:Entity"},{"@id":"pig:Relationship"},{"@id":"pig:Organizer"}],"dcterms:title":[{"@value":"lists"}],"dcterms:description":[{"@value":"Lists an entity, a relationship or a subordinated organizer."}]},{"@id":"pig:shows","pig:specializes":{"@id":"pig:TargetLink"},"pig:itemType":{"@id":"pig:Link"},"pig:eligibleEndpoint":[{"@id":"pig:Entity"},{"@id":"pig:Relationship"}],"dcterms:title":[{"@value":"shows"}],"dcterms:description":[{"@value":"Shows an entity or a relationship."}]},{"@id":"pig:depicts","pig:specializes":{"@id":"pig:TargetLink"},"pig:itemType":{"@id":"pig:Link"},"pig:eligibleEndpoint":[{"@id":"pig:Entity"}],"dcterms:title":[{"@value":"depicts"}],"dcterms:description":[{"@value":"Depicts an entity; inverse of uml:ownedDiagram."}]},{"@id":"dcterms:title","dcterms:title":[{"@value":"Title","@language":"en"},{"@value":"Titel","@language":"de"},{"@value":"Titre","@language":"fr"}],"dcterms:description":[{"@value":"

A name given to the resource. (source: DCMI)

Title (reference: Dublin Core) of the resource represented as rich text in XHTML content. SHOULD include only content that is valid inside an XHTML 'span' element. (source: OSLC)

","@language":"en"}],"@type":"owl:DatatypeProperty","pig:itemType":{"@id":"pig:Property"},"sh:datatype":{"@id":"xs:string"},"sh:maxCount":1,"sh:maxLength":256},{"@id":"dcterms:description","dcterms:title":[{"@value":"Description","@language":"en"},{"@value":"Beschreibung","@language":"de"},{"@value":"Description","@language":"fr"}],"dcterms:description":[{"@value":"

An account of the resource. (source: DCMI)

Descriptive text (reference: Dublin Core) about resource represented as rich text in XHTML content. SHOULD include only content that is valid and suitable inside an XHTML 'div' element. (source: OSLC)

","@language":"en"}],"@type":"owl:DatatypeProperty","pig:itemType":{"@id":"pig:Property"},"sh:datatype":{"@id":"xs:string"},"sh:maxCount":1},{"@id":"SpecIF:Diagram","dcterms:title":[{"@value":"Diagram","@language":"en"},{"@value":"Diagramm","@language":"de"},{"@value":"Diagramme","@language":"fr"}],"dcterms:description":[{"@value":"A diagram illustrating the resource or a link to a diagram.","@language":"en"}],"@type":"owl:DatatypeProperty","pig:itemType":{"@id":"pig:Property"},"sh:datatype":{"@id":"xs:string"}},{"@id":"SpecIF:Notation","dcterms:title":[{"@value":"Notation","@language":"en"}],"dcterms:description":[{"@value":"The notation used by a model diagram, e.g. 'BPMN 2.0', 'SysML Activity Diagram' or 'FMC Block Diagram'.","@language":"en"}],"@type":"owl:DatatypeProperty","pig:itemType":{"@id":"pig:Property"},"sh:datatype":{"@id":"xs:string"},"sh:maxCount":1,"sh:maxLength":32},{"@id":"SpecIF:Paragraph","dcterms:title":[{"@value":"Paragraph","@language":"en"},{"@value":"Textabsatz","@language":"de"},{"@value":"Paragraphe","@language":"fr"}],"dcterms:description":[{"@value":"

A 'Paragraph' is an unspecified information in a document at any level.

","@language":"en"},{"@value":"

Ein 'Textabschnitt' in einem Dokument auf beliebiger Ebene.

","@language":"de"}],"pig:specializes":{"@id":"pig:Entity"},"pig:eligibleProperty":[{"@id":"SpecIF:Diagram"},{"@id":"pig:category"}],"pig:eligibleTargetLink":[],"pig:itemType":{"@id":"pig:Entity"}},{"@id":"SpecIF:ModelElement","dcterms:title":[{"@value":"Model Element","@language":"en"},{"@value":"Modellelement","@language":"de"}],"dcterms:description":[{"@value":"Is a generalized type for model elements.","@language":"en"},{"@value":"Ist ein generalisierter Typ für Modellelemente.","@language":"de"}],"pig:specializes":{"@id":"pig:Entity"},"pig:icon":{"@value":"☆"},"pig:eligibleProperty":[{"@id":"pig:category"}],"pig:eligibleTargetLink":[],"pig:itemType":{"@id":"pig:Entity"}},{"@id":"FMC:Actor","dcterms:title":[{"@value":"Actor","@language":"en"},{"@value":"Akteur","@language":"de"},{"@value":"Acteur","@language":"fr"}],"dcterms:description":[{"@value":"

An 'Actor' is a fundamental model element type representing an active entity, be it an activity, a process step, a function, a system component or a role.

The particular use or original type is specified with a [[dcterms:type]] property of the 'FMC:Actor'. A value of that property should be an ontology-term, such as [[bpmn:processStep]].

","@language":"en"},{"@value":"

Ein 'Akteur' ist ein fundamentaler Modellelementtyp, der eine aktive Entität darstellt, sei es eine Aktivität, ein Prozessschritt, eine Funktion, eine Systemkomponente oder eine Rolle.

Die spezielle Verwendung oder der ursprüngliche Typ wird mit einer [[dcterms:type]] Eigenschaft von 'FMC:Actor' spezifiziert. Die Werte dieser Eigenschaft können Ontologiebegriffe sein, wie z.B. [[bpmn:timer]].

","@language":"de"},{"@value":"

Un 'Acteur' est un type d'élément de modèle fondamental représentant une entité active, qu'il s'agisse d'une activité, d'une étape de processus, d'une fonction, d'un composant de système ou d'un rôle.

L'utilisation particulière ou le type original est spécifié avec une propriété [[dcterms:type]] de 'FMC:Actor'. Les valeurs de cette propriété peuvent être des termes d'ontologie, tels que [[bpmn:timer]].

","@language":"fr"}],"pig:specializes":{"@id":"SpecIF:ModelElement"},"pig:icon":{"@value":"□"},"pig:eligibleProperty":[],"pig:eligibleTargetLink":[],"pig:itemType":{"@id":"pig:Entity"}},{"@id":"SpecIF:Collection","dcterms:title":[{"@value":"Collection or Group","@language":"en"},{"@value":"Kollektion oder Gruppe","@language":"de"},{"@value":"Collection ou Groupe","@language":"fr"}],"dcterms:description":[{"@value":"

A 'Collection' is a logical (often conceptual) group of resources linked with a [[SpecIF:contains]] statement. It corresponds to a 'Group' in BPMN Diagrams.

BPMN: An arbitrary set of objects can be defined as a Group to show that they logically belong together. (source: BPMN Tutorial)

","@language":"en"},{"@value":"

Eine 'Kollektion' ist eine logische Gruppierung bestimmter Modellelemente, die per [[SpecIF:contains]] Relation zusammen gefasst sind. Sie entspricht einer 'Gruppe' in BPMN Diagrammen. (source: BPMN Tutorial)

","@language":"de"},{"@value":"

Une 'collection' est un groupe logique (souvent conceptuel) de ressources liées par une déclaration [[SpecIF:contains]]. Elle correspond à un 'groupe' dans les diagrammes BPMN. (source: BPMN Tutoriel)

","@language":"fr"}],"pig:specializes":{"@id":"SpecIF:ModelElement"},"pig:icon":{"@value":"⬚"},"pig:eligibleProperty":[],"pig:eligibleTargetLink":[],"pig:itemType":{"@id":"pig:Entity"}},{"@id":"FMC:State","dcterms:title":[{"@value":"State","@language":"en"},{"@value":"Zustand","@language":"de"},{"@value":"État","@language":"fr"}],"dcterms:description":[{"@value":"

A 'State' is a fundamental model element type representing a passive entity, be it a value, a condition, an information storage or even a physical shape.

The particular use or the original type is specified with a [[dcterms:type]] property of the 'FMC:State'. A value of that property should bean ontology-term, such as [[bpmn:dataObject]].

","@language":"en"},{"@value":"

Ein 'Zustand' ist ein fundamentaler Modellelementtyp, der eine passive Entität darstellt, sei es ein Wert, ein Dokument, ein Informationsspeicher, eine Bedingung oder eine physische Beschaffenheit.

Die spezielle Verwendung oder der ursprüngliche Typ wird mit einer [[dcterms:type]] Eigenschaft von 'FMC:State' spezifiziert. Die Werte dieser Eigenschaft können Ontologiebegriffe sein, wie z.B. [[ArchiMate:DataObject]].

","@language":"de"},{"@value":"

Un 'État' est un type d'élément de modèle fondamental représentant une entité passive, qu'il s'agisse d'une valeur, d'une condition, d'un stockage d'informations ou même d'une forme physique.

L'utilisation particulière ou le type original est spécifié avec une propriété [[dcterms:type]] de 'FMC:State'. Les valeurs de cette propriété peuvent être des termes d'ontologie, tels que [[ArchiMate:DataObject]].

","@language":"fr"}],"pig:specializes":{"@id":"SpecIF:ModelElement"},"pig:icon":{"@value":"○"},"pig:eligibleProperty":[],"pig:eligibleTargetLink":[],"pig:itemType":{"@id":"pig:Entity"}},{"@id":"FMC:Event","dcterms:title":[{"@value":"Event","@language":"en"},{"@value":"Ereignis","@language":"de"},{"@value":"Évenement","@language":"fr"}],"dcterms:description":[{"@value":"

An 'Event' is a fundamental model element type representing a time reference, a change in condition/value or more generally a synchronization primitive.

The particular use or the original type is specified with a [[dcterms:type]] property of the 'FMC:Event'. A value of that property should be an ontology-term, such as [[bpmn:startEvent]].

","@language":"en"},{"@value":"

Ein 'Ereignis' ist ein fundamentaler Modellelementtyp, der eine Zeitreferenz, eine Änderung einer Bedingung/eines Wertes oder allgemeiner ein Synchronisationsmittel darstellt.

Die spezielle Verwendung oder der ursprüngliche Typ wird mit einer [[dcterms:type]] Eigenschaft von 'FMC:Event' spezifiziert. Die Werte dieser Eigenschaft sollen Ontologiebegriffe sein, wie z.B. [[bpmn:startEvent]].

","@language":"de"},{"@value":"

Un 'Événement' est un type d'élément de modèle fondamental représentant une référence temporelle, un changement de condition/valeur ou plus généralement une primitive de synchronisation.

L'utilisation particulière ou le type original est spécifié avec une propriété [[dcterms:type]] de 'FMC:Event'. Les valeurs de cette propriété peuvent être des termes d'ontologie, tels que [[bpmn:startEvent]].

","@language":"fr"}],"pig:specializes":{"@id":"SpecIF:ModelElement"},"pig:icon":{"@value":"♢"},"pig:eligibleProperty":[],"pig:eligibleTargetLink":[],"pig:itemType":{"@id":"pig:Entity"}},{"@id":"uml:Package","dcterms:title":[{"@value":"Package","@language":"en"}],"pig:specializes":{"@id":"SpecIF:Collection"},"pig:eligibleProperty":[],"pig:eligibleTargetLink":[],"pig:itemType":{"@id":"pig:Entity"}},{"@id":"IREB:Requirement","dcterms:title":[{"@value":"Requirement","@language":"en"},{"@value":"Anforderung","@language":"de"},{"@value":"Exigence","@language":"fr"}],"dcterms:description":[{"@value":"

A 'Requirement' is a singular documented physical and functional need that a particular design, product or process must be able to perform. (source: Wikipedia)

Definition:

  1. A condition or capability needed by a user to solve a problem or achieve an objective.
  2. A condition or capability that must be met or possessed by a system or system component to satisfy a contract, standard, specification, or other formally imposed documents.
  3. A documented representation of a condition or capability as in (1) or (2).

Note: The definition above is the classic one from IEEE Std 610.12 of 1990. Alternatively, we also give a more modern definition:

  1. A need perceived by a stakeholder.
  2. A capability or property that a system shall have.
  3. A documented representation of a need, capability or property.
","@language":"en"},{"@value":"

Eine 'Anforderung' ist ein einzelnes dokumentiertes physisches und funktionales Bedürfnis, das ein bestimmter Entwurf, ein Produkt oder ein Prozess erfüllen muss. (source: Wikipedia)

Definition:

  1. Eine Bedingung oder Fähigkeit, die ein Benutzer benötigt, um ein Problem zu lösen oder ein Ziel zu erreichen.
  2. Eine Bedingung oder Fähigkeit, die ein System oder eine Systemkomponente erfüllen oder besitzen muss, um einen Vertrag, eine Norm, eine Spezifikation oder ein anderes formal vorgeschriebenes Dokument zu erfüllen.
  3. Eine dokumentierte Darstellung einer Bedingung oder Fähigkeit wie in (1) oder (2).

Anmerkung: Die obige Definition ist die klassische Definition aus IEEE Std 610.12 von 1990. Alternativ geben wir auch eine modernere Definition an:

  1. Ein von einem Stakeholder wahrgenommener Bedarf.
  2. Eine Fähigkeit oder Eigenschaft, die ein System haben soll.
  3. Eine dokumentierte Darstellung eines Bedarfs, einer Fähigkeit oder Eigenschaft.
","@language":"de"},{"@value":"

Une 'Exigence' est un besoin physique et fonctionnel unique et documenté qu'une conception, un produit ou un processus particulier doit pouvoir satisfaire. (source: Wikipedia)

Définition:

  1. Condition ou capacité dont un utilisateur a besoin pour résoudre un problème ou atteindre un objectif.
  2. Condition ou capacité qui doit être remplie ou possédée par un système ou un composant de système pour satisfaire à un contrat, à une norme, à une spécification ou à d'autres documents imposés officiellement.
  3. Une représentation documentée d'une condition ou d'une capacité comme dans (1) ou (2).

Remarque: La définition ci-dessus est la définition classique de la norme IEEE 610.12 de 1990. Nous donnons également une définition plus moderne:

  1. Un besoin perçu par une partie prenante;
  2. Une capacité ou une propriété qu'un système doit avoir.
  3. Une représentation documentée d'un besoin, d'une capacité ou d'une propriété.
","@language":"fr"}],"pig:specializes":{"@id":"pig:Entity"},"pig:icon":{"@value":"↯"},"pig:eligibleProperty":[{"@id":"pig:category"}],"pig:eligibleTargetLink":[],"pig:itemType":{"@id":"pig:Entity"}},{"@id":"SpecIF:relates","dcterms:title":[{"@value":"relates","@language":"en"},{"@value":"verbindet","@language":"de"},{"@value":"relie","@language":"fr"}],"dcterms:description":[{"@value":"Is a generalized type for model relations.","@language":"en"},{"@value":"Ist ein generalisierter Typ für Modellrelationen.","@language":"de"}],"pig:specializes":{"@id":"pig:Relationship"},"pig:eligibleProperty":[{"@id":"pig:category"}],"pig:itemType":{"@id":"pig:Relationship"},"pig:eligibleSourceLink":{"@id":"SpecIF:relates-toSource"},"pig:eligibleTargetLink":{"@id":"SpecIF:relates-toTarget"}},{"@id":"SpecIF:relates-toSource","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:SourceLink"},"dcterms:title":[{"@value":"SpecIF:relates to source"}],"dcterms:description":[{"@value":"Connects the source of SpecIF:relates"}],"pig:eligibleEndpoint":[{"@id":"pig:Entity"},{"@id":"pig:Relationship"}]},{"@id":"SpecIF:relates-toTarget","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:TargetLink"},"dcterms:title":[{"@value":"SpecIF:relates to target"}],"dcterms:description":[{"@value":"Connects the target of SpecIF:relates"}],"pig:eligibleEndpoint":[{"@id":"pig:Entity"},{"@id":"pig:Relationship"}]},{"@id":"dcterms:hasPart","dcterms:title":[{"@value":"has part","@language":"en"},{"@value":"enthält","@language":"de"},{"@value":"contient","@language":"fr"}],"dcterms:description":[{"@value":"A related resource that is included either physically or logically in the described resource.\n\n*Comment: This property is intended to be used with non-literal values. This property is an inverse property of [[dcterms:isPartOf]].*","@language":"en"}],"pig:specializes":{"@id":"SpecIF:relates"},"pig:eligibleProperty":[],"pig:itemType":{"@id":"pig:Relationship"},"pig:eligibleSourceLink":{"@id":"dcterms:hasPart-toSource"},"pig:eligibleTargetLink":{"@id":"dcterms:hasPart-toTarget"}},{"@id":"dcterms:hasPart-toSource","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:SourceLink"},"dcterms:title":[{"@value":"dcterms:hasPart to source"}],"dcterms:description":[{"@value":"Connects the source of dcterms:hasPart"}],"pig:eligibleEndpoint":[{"@id":"FMC:Actor"},{"@id":"FMC:State"},{"@id":"SpecIF:Collection"},{"@id":"SpecIF:ModelElement"},{"@id":"o:RC-UmlClass"}]},{"@id":"dcterms:hasPart-toTarget","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:TargetLink"},"dcterms:title":[{"@value":"dcterms:hasPart to target"}],"dcterms:description":[{"@value":"Connects the target of dcterms:hasPart"}],"pig:eligibleEndpoint":[{"@id":"FMC:Actor"},{"@id":"FMC:State"},{"@id":"SpecIF:Collection"},{"@id":"SpecIF:ModelElement"},{"@id":"o:RC-UmlPort"},{"@id":"o:RC-UmlClass"}]},{"@id":"SpecIF:contains","dcterms:title":[{"@value":"contains","@language":"en"},{"@value":"enthält","@language":"de"},{"@value":"contient","@language":"fr"}],"dcterms:description":[{"@value":"General containment, such as:\n- Package-A *contains* Diagram-B\n- Collection-1 *contains* DataObject-1.1\n\nNot to confound with *[[dcterms:hasPart]]*.","@language":"en"}],"pig:specializes":{"@id":"SpecIF:relates"},"pig:eligibleProperty":[],"pig:itemType":{"@id":"pig:Relationship"},"pig:eligibleSourceLink":{"@id":"SpecIF:contains-toSource"},"pig:eligibleTargetLink":{"@id":"SpecIF:contains-toTarget"}},{"@id":"SpecIF:contains-toSource","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:SourceLink"},"dcterms:title":[{"@value":"SpecIF:contains to source"}],"dcterms:description":[{"@value":"Connects the source of SpecIF:contains"}],"pig:eligibleEndpoint":[{"@id":"FMC:Actor"},{"@id":"FMC:State"},{"@id":"SpecIF:Collection"},{"@id":"uml:Package"}]},{"@id":"SpecIF:contains-toTarget","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:TargetLink"},"dcterms:title":[{"@value":"SpecIF:contains to target"}],"dcterms:description":[{"@value":"Connects the target of SpecIF:contains"}],"pig:eligibleEndpoint":[{"@id":"FMC:Actor"},{"@id":"FMC:State"},{"@id":"FMC:Event"},{"@id":"SpecIF:Collection"},{"@id":"uml:Package"},{"@id":"SpecIF:ModelElement"},{"@id":"o:RC-SpecifView"},{"@id":"o:RC-PigView"},{"@id":"pig:View"},{"@id":"IREB:Requirement"}]},{"@id":"oslc_rm:satisfies","dcterms:title":[{"@value":"satisfies","@language":"en"},{"@value":"erfüllt","@language":"de"},{"@value":"satisfait","@language":"fr"}],"dcterms:description":[{"@value":"

The object is satisfied by the subject. (source: OSLC)

SpecIF suggests that the subject is confined to a model element, e.g, a [[FMC:Actor]] or [[FMC:State]], and the object is confined to a [[IREB:Requirement]]. More concretely, an example for this type of statement is 'Component-X satisfies 'Requirement-4711'.

","@language":"en"}],"pig:specializes":{"@id":"pig:Relationship"},"pig:eligibleProperty":[],"pig:itemType":{"@id":"pig:Relationship"},"pig:eligibleSourceLink":{"@id":"oslc_rm:satisfies-toSource"},"pig:eligibleTargetLink":{"@id":"oslc_rm:satisfies-toTarget"}},{"@id":"oslc_rm:satisfies-toSource","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:SourceLink"},"dcterms:title":[{"@value":"oslc_rm:satisfies to source"}],"dcterms:description":[{"@value":"Connects the source of oslc_rm:satisfies"}],"pig:eligibleEndpoint":[{"@id":"pig:Entity"},{"@id":"pig:Relationship"}]},{"@id":"oslc_rm:satisfies-toTarget","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:TargetLink"},"dcterms:title":[{"@value":"oslc_rm:satisfies to target"}],"dcterms:description":[{"@value":"Connects the target of oslc_rm:satisfies"}],"pig:eligibleEndpoint":[{"@id":"IREB:Requirement"}]},{"@id":"IREB:refines","dcterms:title":[{"@value":"refines","@language":"en"},{"@value":"verfeinert","@language":"de"},{"@value":"affine","@language":"fr"}],"dcterms:description":[{"@value":"

A [[IREB:Requirement]] 'refines' another [[IREB:Requirement]].

","@language":"en"}],"pig:specializes":{"@id":"pig:Relationship"},"pig:eligibleProperty":[],"pig:itemType":{"@id":"pig:Relationship"},"pig:eligibleSourceLink":{"@id":"IREB:refines-toSource"},"pig:eligibleTargetLink":{"@id":"IREB:refines-toTarget"}},{"@id":"IREB:refines-toSource","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:SourceLink"},"dcterms:title":[{"@value":"IREB:refines to source"}],"dcterms:description":[{"@value":"Connects the source of IREB:refines"}],"pig:eligibleEndpoint":[{"@id":"IREB:Requirement"}]},{"@id":"IREB:refines-toTarget","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:TargetLink"},"dcterms:title":[{"@value":"IREB:refines to target"}],"dcterms:description":[{"@value":"Connects the target of IREB:refines"}],"pig:eligibleEndpoint":[{"@id":"IREB:Requirement"}]},{"@id":"sysml:Allocate","dcterms:title":[{"@value":"is allocated to","@language":"en"},{"@value":"zugeordnet zu","@language":"de"},{"@value":"allouée à","@language":"fr"}],"dcterms:description":[{"@value":"

An [[FMC:Actor]] is allocated to another [[FMC:Actor]] (e.g. a logical function is allocated to a physical component.

","@language":"en"}],"pig:specializes":{"@id":"pig:Relationship"},"pig:eligibleProperty":[],"pig:itemType":{"@id":"pig:Relationship"},"pig:eligibleSourceLink":{"@id":"sysml:Allocate-toSource"},"pig:eligibleTargetLink":{"@id":"sysml:Allocate-toTarget"}},{"@id":"sysml:Allocate-toSource","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:SourceLink"},"dcterms:title":[{"@value":"sysml:Allocate to source"}],"dcterms:description":[{"@value":"Connects the source of sysml:Allocate"}],"pig:eligibleEndpoint":[{"@id":"SpecIF:ModelElement"}]},{"@id":"sysml:Allocate-toTarget","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:TargetLink"},"dcterms:title":[{"@value":"sysml:Allocate to target"}],"dcterms:description":[{"@value":"Connects the target of sysml:Allocate"}],"pig:eligibleEndpoint":[{"@id":"SpecIF:ModelElement"}]},{"@id":"uml:ownedBehavior","dcterms:title":[{"@value":"has Behavior"}],"pig:specializes":{"@id":"pig:Relationship"},"pig:eligibleProperty":[],"pig:itemType":{"@id":"pig:Relationship"},"pig:eligibleSourceLink":{"@id":"uml:ownedBehavior-toSource"},"pig:eligibleTargetLink":{"@id":"uml:ownedBehavior-toTarget"}},{"@id":"uml:ownedBehavior-toSource","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:SourceLink"},"dcterms:title":[{"@value":"uml:ownedBehavior to source"}],"dcterms:description":[{"@value":"Connects the source of uml:ownedBehavior"}],"pig:eligibleEndpoint":[{"@id":"pig:Entity"},{"@id":"pig:Relationship"}]},{"@id":"uml:ownedBehavior-toTarget","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:TargetLink"},"dcterms:title":[{"@value":"uml:ownedBehavior to target"}],"dcterms:description":[{"@value":"Connects the target of uml:ownedBehavior"}],"pig:eligibleEndpoint":[{"@id":"o:RC-UmlStatemachine"},{"@id":"o:RC-UmlActivity"},{"@id":"FMC:Actor"},{"@id":"o:RC-UmlUsecase"}]},{"@id":"uml:Trigger","dcterms:title":[{"@value":"triggers"}],"pig:specializes":{"@id":"pig:Relationship"},"pig:eligibleProperty":[],"pig:itemType":{"@id":"pig:Relationship"},"pig:eligibleSourceLink":{"@id":"uml:Trigger-toSource"},"pig:eligibleTargetLink":{"@id":"uml:Trigger-toTarget"}},{"@id":"uml:Trigger-toSource","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:SourceLink"},"dcterms:title":[{"@value":"uml:Trigger to source"}],"dcterms:description":[{"@value":"Connects the source of uml:Trigger"}],"pig:eligibleEndpoint":[{"@id":"pig:Entity"},{"@id":"pig:Relationship"}]},{"@id":"uml:Trigger-toTarget","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:TargetLink"},"dcterms:title":[{"@value":"uml:Trigger to target"}],"dcterms:description":[{"@value":"Connects the target of uml:Trigger"}],"pig:eligibleEndpoint":[{"@id":"pig:Entity"},{"@id":"pig:Relationship"}]},{"@id":"uml:TransitionSource","dcterms:title":[{"@value":"starts from"}],"pig:specializes":{"@id":"pig:Relationship"},"pig:eligibleProperty":[],"pig:itemType":{"@id":"pig:Relationship"},"pig:eligibleSourceLink":{"@id":"uml:TransitionSource-toSource"},"pig:eligibleTargetLink":{"@id":"uml:TransitionSource-toTarget"}},{"@id":"uml:TransitionSource-toSource","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:SourceLink"},"dcterms:title":[{"@value":"uml:TransitionSource to source"}],"dcterms:description":[{"@value":"Connects the source of uml:TransitionSource"}],"pig:eligibleEndpoint":[{"@id":"o:RC-UmlTransition"},{"@id":"FMC:Actor"}]},{"@id":"uml:TransitionSource-toTarget","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:TargetLink"},"dcterms:title":[{"@value":"uml:TransitionSource to target"}],"dcterms:description":[{"@value":"Connects the target of uml:TransitionSource"}],"pig:eligibleEndpoint":[{"@id":"o:RC-UmlState"},{"@id":"FMC:State"}]},{"@id":"uml:TransitionTarget","dcterms:title":[{"@value":"ends at"}],"pig:specializes":{"@id":"pig:Relationship"},"pig:eligibleProperty":[],"pig:itemType":{"@id":"pig:Relationship"},"pig:eligibleSourceLink":{"@id":"uml:TransitionTarget-toSource"},"pig:eligibleTargetLink":{"@id":"uml:TransitionTarget-toTarget"}},{"@id":"uml:TransitionTarget-toSource","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:SourceLink"},"dcterms:title":[{"@value":"uml:TransitionTarget to source"}],"dcterms:description":[{"@value":"Connects the source of uml:TransitionTarget"}],"pig:eligibleEndpoint":[{"@id":"o:RC-UmlTransition"},{"@id":"FMC:Actor"}]},{"@id":"uml:TransitionTarget-toTarget","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:TargetLink"},"dcterms:title":[{"@value":"uml:TransitionTarget to target"}],"dcterms:description":[{"@value":"Connects the target of uml:TransitionTarget"}],"pig:eligibleEndpoint":[{"@id":"o:RC-UmlState"},{"@id":"FMC:State"}]},{"@id":"d:_19_0_3_71e0233_1746001337727_31616_14119","@type":"uml:Package","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"1. Requirements"}],"pig:category":[{"@value":"uml:Package","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552810549321_335902_14037","@type":"pig:View","pig:revision":"rev-9405830621","dcterms:modified":"2025-11-12T09:28:04.871Z","dcterms:title":[{"@value":"Original Requirement Specification"}],"SpecIF:Diagram":[{"@value":"files_and_images/Original Requirement Specification.png","pig:itemType":{"@id":"pig:aProperty"}}],"pig:category":[{"@value":"uml:Diagram","pig:itemType":{"@id":"pig:aProperty"}}],"SpecIF:Notation":[{"@value":"UML Requirement Diagram","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"},"pig:shows":[{"@id":"d:_18_5_3_bc402f4_1552810869277_586147_14175","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552810948738_707540_14217","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552810776263_894029_14121","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552813199775_830344_15281","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552810644650_650036_14079","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552812437056_257578_14975","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552812370943_152244_14924","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552811136575_459751_14253","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552811141795_384989_14263","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552813433937_279860_15327","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552810808641_447672_14157","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552813334959_22842_15317","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552813438857_436917_15337","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552810776263_894029_14121","@type":"IREB:Requirement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Navigation"}],"pig:category":[{"@value":"uml:Class","pig:itemType":{"@id":"pig:aProperty"}}],"dcterms:description":[{"@value":"The Vehicle shall autonomously choose the best route from the current location C to the target location T by means of a road map and actual traffic conditions."}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552810869277_586147_14175","@type":"IREB:Requirement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Road Driving"}],"pig:category":[{"@value":"uml:Class","pig:itemType":{"@id":"pig:aProperty"}}],"dcterms:description":[{"@value":"The vehicle shall be able to follow a selected road."}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552810644650_650036_14079","@type":"IREB:Requirement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Transport to Target"}],"pig:category":[{"@value":"uml:Class","pig:itemType":{"@id":"pig:aProperty"}}],"dcterms:description":[{"@value":"As a customer I would like to get a parcel delivered from the current location C to a target location T. "}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552812370943_152244_14924","@type":"IREB:Requirement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Location as Postal Address"}],"pig:category":[{"@value":"uml:Class","pig:itemType":{"@id":"pig:aProperty"}}],"dcterms:description":[{"@value":"A location may be specified as a postal address."}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552813199775_830344_15281","@type":"IREB:Requirement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Obstacle Avoidance"}],"pig:category":[{"@value":"uml:Class","pig:itemType":{"@id":"pig:aProperty"}}],"dcterms:description":[{"@value":"The vehicle shall not hit a person or an obstacle on the road."}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552810948738_707540_14217","@type":"IREB:Requirement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Safe Driving"}],"pig:category":[{"@value":"uml:Class","pig:itemType":{"@id":"pig:aProperty"}}],"dcterms:description":[{"@value":"The vehicle shall drive no faster than allowed or adequate for the actual road condition."}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552812437056_257578_14975","@type":"IREB:Requirement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Loacation as GPS Coordinate"}],"pig:category":[{"@value":"uml:Class","pig:itemType":{"@id":"pig:aProperty"}}],"dcterms:description":[{"@value":"A location may be specified as GPS Coordinate with Longitude and Latitude in Degrees."}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746001480225_327746_14120","@type":"uml:Package","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"2. Functional Layer"}],"pig:category":[{"@value":"uml:Package","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552811870216_105923_14824","@type":"pig:View","pig:revision":"rev-11094738149","dcterms:modified":"2025-11-12T09:28:21.131Z","dcterms:title":[{"@value":"Functional Decomposition"}],"SpecIF:Diagram":[{"@value":"files_and_images/Functional Decomposition.png","pig:itemType":{"@id":"pig:aProperty"}}],"pig:category":[{"@value":"uml:Diagram","pig:itemType":{"@id":"pig:aProperty"}}],"SpecIF:Notation":[{"@value":"SysML Block Definition Diagram","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"},"pig:shows":[{"@id":"d:_18_5_3_bc402f4_1552814104357_719492_15607","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552812805784_548404_15062","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552815791106_548984_16360","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552814523707_628151_15988","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1556615164506_303870_14975","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552811937697_690731_14862","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552812663506_709974_15011","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552813556602_820961_15353","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552810948738_707540_14217","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552810776263_894029_14121","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1556615212765_548060_15021","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552814194319_862392_15683","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552814246502_629251_15775","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_e40094_1718632293724_754873_14112","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552810869277_586147_14175","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552814212889_663150_15729","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552813038602_222864_15129","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552811510062_903764_14503","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552814266523_206006_15821","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552813818846_218375_15548","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_e40094_1718632569345_311906_14190","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_bc402f4_1604324293194_85516_13666","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_e40094_1718632549973_831908_14172","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_bc402f4_1604324214402_6480_13631","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_bc402f4_1604324487193_60359_13731","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_bc402f4_1604323867629_562362_13452","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552813096475_160687_15177","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1556615683513_411874_15073","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1556615721418_831605_15106","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_bc402f4_1604323821792_371188_13426","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552813723040_381289_15401","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552813102494_993665_15207","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_bc402f4_1604324465452_775050_13715","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_bc402f4_1604324188817_384398_13615","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552815590348_672436_16293","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552815653359_771130_16352","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_bc402f4_1604323888993_530325_13468","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552813795106_879353_15508","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_bc402f4_1604324636141_429081_13763","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_bc402f4_1604324764626_856811_13779","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_bc402f4_1604324512097_628722_13747","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552813870706_981259_15588","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_bc402f4_1604324447693_373448_13698","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_bc402f4_1604324321433_274293_13682","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552815541056_996851_16231","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552813556602_820961_15353","@type":"SpecIF:ModelElement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Brake in an Emergency"}],"pig:category":[{"@value":"RFLP:Function","pig:itemType":{"@id":"pig:aProperty"}}],"dcterms:description":[{"@value":"Take the vehicle to a full stop in the shortest time possible without loosing control over the trajectory."}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552814212889_663150_15729","@type":"SpecIF:ModelElement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Set Speed"}],"pig:category":[{"@value":"RFLP:Function","pig:itemType":{"@id":"pig:aProperty"}}],"dcterms:description":[{"@value":"The (autonomous) driver's speed command (gas pedal position)."}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1556615164506_303870_14975","@type":"SpecIF:ModelElement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Turn Right"}],"pig:category":[{"@value":"RFLP:Function","pig:itemType":{"@id":"pig:aProperty"}}],"dcterms:description":[{"@value":"Take a right turn at a road intersection. Observe the traffic entering the same lane and avoid a collision, if another vehicle does not observe the priority rules."}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552814194319_862392_15683","@type":"SpecIF:ModelElement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Set Radius"}],"pig:category":[{"@value":"RFLP:Function","pig:itemType":{"@id":"pig:aProperty"}}],"dcterms:description":[{"@value":"The (autonomous) driver's steering command (steering wheel position)."}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552812663506_709974_15011","@type":"SpecIF:ModelElement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Navigate"}],"pig:category":[{"@value":"RFLP:Function","pig:itemType":{"@id":"pig:aProperty"}}],"dcterms:description":[{"@value":"Select a path to get from the current position to the target."}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552814523707_628151_15988","@type":"SpecIF:ModelElement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Calculate Accelerations"}],"pig:category":[{"@value":"RFLP:Function","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1556615212765_548060_15021","@type":"SpecIF:ModelElement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Turn Left"}],"pig:category":[{"@value":"RFLP:Function","pig:itemType":{"@id":"pig:aProperty"}}],"dcterms:description":[{"@value":"Take a left turn in a road intersection. Observe the priority rules and avoid traffic on the two lanes you are crossing."}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552811937697_690731_14862","@type":"SpecIF:ModelElement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Drive to Target"}],"pig:category":[{"@value":"RFLP:Function","pig:itemType":{"@id":"pig:aProperty"}}],"dcterms:description":[{"@value":"Manoevre the vehicle from the current position to the selected target."}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552814246502_629251_15775","@type":"SpecIF:ModelElement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Set Acceleration Left"}],"pig:category":[{"@value":"RFLP:Function","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552813038602_222864_15129","@type":"SpecIF:ModelElement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Select an adequate Speed"}],"pig:category":[{"@value":"RFLP:Function","pig:itemType":{"@id":"pig:aProperty"}}],"dcterms:description":[{"@value":"Taking into account road condition and weather, select a safe speed."}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552815791106_548984_16360","@type":"SpecIF:ModelElement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Set Acceleration Right"}],"pig:category":[{"@value":"RFLP:Function","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552812805784_548404_15062","@type":"SpecIF:ModelElement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Follow the Road"}],"pig:category":[{"@value":"RFLP:Function","pig:itemType":{"@id":"pig:aProperty"}}],"dcterms:description":[{"@value":"Keep the vehicle on the selected road."}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552814266523_206006_15821","@type":"SpecIF:ModelElement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Apply Brake"}],"pig:category":[{"@value":"RFLP:Function","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","@type":"uml:Package","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"3. Logical Layer"}],"pig:category":[{"@value":"uml:Package","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746027287147_82140_14431","@type":"pig:View","pig:revision":"rev-7887707545","dcterms:modified":"2025-11-12T09:28:38.225Z","dcterms:title":[{"@value":"Logical Decomposition"}],"SpecIF:Diagram":[{"@value":"files_and_images/Logical Decomposition.png","pig:itemType":{"@id":"pig:aProperty"}}],"pig:category":[{"@value":"uml:Diagram","pig:itemType":{"@id":"pig:aProperty"}}],"SpecIF:Notation":[{"@value":"SysML Block Definition Diagram","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"},"pig:shows":[{"@id":"d:_18_5_3_bc402f4_1552814104357_719492_15607","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552811538626_715866_14549","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_e40094_1718632293724_754873_14112","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_bc402f4_1604360793737_196507_13523","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552811469014_293642_14411","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552811454014_108965_14365","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552827771600_60767_16481","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552811554859_819240_14595","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552811412605_640145_14319","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552811510062_903764_14503","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552811672063_243990_14798","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_e40094_1718634030433_51877_14234","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_bc402f4_1604360962045_534106_13570","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552814131280_1190_15654","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552811613008_58411_14648","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552811666192_832840_14768","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552827804167_216283_16528","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552811619502_982677_14678","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552811653332_976698_14708","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_19_0_3_e40094_1718632293724_754873_14112","@type":"SpecIF:ModelElement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Drive Right"}],"pig:category":[{"@value":"RFLP:Logical_System","pig:itemType":{"@id":"pig:aProperty"}}],"dcterms:description":[{"@value":"The wheel with motor and brake on the right side. The motor can accelerate and decelerate. The motor controller is \"4-quadrant\" and can supply electrical current for recharging the batteries."}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552827771600_60767_16481","@type":"SpecIF:ModelElement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Track Sensor"}],"pig:category":[{"@value":"RFLP:Logical_System","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552811469014_293642_14411","@type":"SpecIF:ModelElement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Body"}],"pig:category":[{"@value":"RFLP:Logical_System","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552811510062_903764_14503","@type":"SpecIF:ModelElement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Drive Left"}],"pig:category":[{"@value":"RFLP:Logical_System","pig:itemType":{"@id":"pig:aProperty"}}],"dcterms:description":[{"@value":"The wheel with motor and brake on the left side. The motor can accelerate and decelerate. The motor controller is \"4-quadrant\" and can supply electrical current for recharging the batteries."}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552811412605_640145_14319","@type":"SpecIF:ModelElement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"LEGO Mindstorms Vehicle"}],"pig:category":[{"@value":"RFLP:Logical_System","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552811538626_715866_14549","@type":"SpecIF:ModelElement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Support Front"}],"pig:category":[{"@value":"RFLP:Logical_System","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552814104357_719492_15607","@type":"SpecIF:ModelElement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Controller"}],"pig:category":[{"@value":"RFLP:Logical_System","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746027630926_778269_14800","@type":"pig:View","pig:revision":"rev-11807243868","dcterms:modified":"2025-11-12T09:29:01.139Z","dcterms:title":[{"@value":"Controller State Machine"}],"SpecIF:Diagram":[{"@value":"files_and_images/Controller State Machine.png","pig:itemType":{"@id":"pig:aProperty"}}],"pig:category":[{"@value":"uml:Diagram","pig:itemType":{"@id":"pig:aProperty"}}],"SpecIF:Notation":[{"@value":"SysML State Machine Diagram","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"},"pig:shows":[{"@id":"d:_19_0_3_71e0233_1746027747207_605800_14880","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028306923_558192_15006","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027631039_116153_14834","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027847324_539644_14916","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028149871_266697_14985","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028183413_413266_14988","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028605370_466818_15028","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027920180_215768_14934","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027631053_836894_14835","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028442990_717820_15013","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028275862_880382_14999","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027631056_691503_14836","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027731735_863978_14871","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027704287_746273_14855","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746029049431_401220_15072","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027837044_867827_14913","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027882482_912182_14918","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028839192_503107_15053","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028827712_739888_15050","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028061993_960870_14971","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028073773_979720_14974","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027804266_719052_14896","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028508430_363448_15020","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028822501_191804_15047","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027731735_371186_14872","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027967661_707482_14950","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027630942_863638_14801","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027630942_464786_14802","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746029024681_691401_15066","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028118776_36360_14979","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746029726958_589946_15078","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028195311_519257_14989","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028216231_986687_14993","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028282302_943711_15000","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028313498_548385_15007","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028899054_101006_15058","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028954791_356054_15062","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028884803_562591_15054","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746029056197_950529_15073","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028540160_854095_15021","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028483612_410592_15014","pig:itemType":{"@id":"pig:aTargetLink"}}],"pig:depicts":[{"@id":"d:_19_0_3_71e0233_1746027630942_863638_14801","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_19_0_3_71e0233_1746027631039_116153_14834","@type":"FMC:State","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"entry"}],"pig:category":[{"@value":"uml:Pseudostate","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746027631053_836894_14835","@type":"FMC:State","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Off"}],"pig:category":[{"@value":"uml:State","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746027731735_863978_14871","@type":"FMC:State","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"entry"}],"pig:category":[{"@value":"uml:Pseudostate","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746027747207_605800_14880","@type":"FMC:State","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Navigating"}],"pig:category":[{"@value":"uml:State","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746027804266_719052_14896","@type":"FMC:State","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Defining Target"}],"pig:category":[{"@value":"uml:State","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746027882482_912182_14918","@type":"FMC:State","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Following the Road"}],"pig:category":[{"@value":"uml:State","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746027920180_215768_14934","@type":"FMC:State","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Turning Right"}],"pig:category":[{"@value":"uml:State","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746027967661_707482_14950","@type":"FMC:State","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Turning Left"}],"pig:category":[{"@value":"uml:State","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746028605370_466818_15028","@type":"FMC:State","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Standing"}],"pig:category":[{"@value":"uml:State","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746027837044_867827_14913","@type":"FMC:Actor","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"entry→Defining Target"}],"pig:category":[{"@value":"uml:Transition","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746027847324_539644_14916","@type":"FMC:Actor","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Defining Target→Navigating"}],"pig:category":[{"@value":"uml:Transition","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746028061993_960870_14971","@type":"FMC:Actor","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Navigating→Following the Road"}],"pig:category":[{"@value":"uml:Transition","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746028073773_979720_14974","@type":"FMC:Actor","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Following the Road→Navigating"}],"pig:category":[{"@value":"uml:Transition","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746028149871_266697_14985","@type":"FMC:Actor","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Following the Road→Turning Right"}],"pig:category":[{"@value":"uml:Transition","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746028183413_413266_14988","@type":"FMC:Actor","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Turning Right→Following the Road"}],"pig:category":[{"@value":"uml:Transition","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746028275862_880382_14999","@type":"FMC:Actor","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Following the Road→Turning Left"}],"pig:category":[{"@value":"uml:Transition","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746028306923_558192_15006","@type":"FMC:Actor","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Turning Left→Following the Road"}],"pig:category":[{"@value":"uml:Transition","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746028822501_191804_15047","@type":"FMC:Actor","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Following the Road→Standing"}],"pig:category":[{"@value":"uml:Transition","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746028827712_739888_15050","@type":"FMC:Actor","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Following the Road→Standing"}],"pig:category":[{"@value":"uml:Transition","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746028839192_503107_15053","@type":"FMC:Actor","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Standing→Following the Road"}],"pig:category":[{"@value":"uml:Transition","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746029049431_401220_15072","@type":"FMC:Actor","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Standing→Defining Target"}],"pig:category":[{"@value":"uml:Transition","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746028508430_363448_15020","@type":"FMC:Actor","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Standing→Off"}],"pig:category":[{"@value":"uml:Transition","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746027704287_746273_14855","@type":"FMC:State","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"On"}],"pig:category":[{"@value":"uml:State","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746027631056_691503_14836","@type":"FMC:Actor","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"entry→Off"}],"pig:category":[{"@value":"uml:Transition","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746028442990_717820_15013","@type":"FMC:Actor","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Off→On"}],"pig:category":[{"@value":"uml:Transition","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552811554859_819240_14595","@type":"SpecIF:ModelElement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Support Rear"}],"pig:category":[{"@value":"RFLP:Logical_System","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552811454014_108965_14365","@type":"SpecIF:ModelElement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Chassis"}],"pig:category":[{"@value":"RFLP:Logical_System","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_bc402f4_1604360793737_196507_13523","@type":"SpecIF:ModelElement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Collision Alarm \nSensor"}],"pig:category":[{"@value":"RFLP:Logical_System","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746028118776_36360_14979","@type":"FMC:Event","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"start_driving!"}],"pig:category":[{"@value":"uml:SignalEvent","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746028195311_519257_14989","@type":"FMC:Event","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"turn_right!"}],"pig:category":[{"@value":"uml:SignalEvent","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746028216231_986687_14993","@type":"FMC:Event","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"turned_right!"}],"pig:category":[{"@value":"uml:SignalEvent","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746028282302_943711_15000","@type":"FMC:Event","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"turn_left!"}],"pig:category":[{"@value":"uml:SignalEvent","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746028313498_548385_15007","@type":"FMC:Event","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"turned_left!"}],"pig:category":[{"@value":"uml:SignalEvent","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746028483612_410592_15014","@type":"FMC:Event","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"switch_on!"}],"pig:category":[{"@value":"uml:SignalEvent","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746028540160_854095_15021","@type":"FMC:Event","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"switch_off!"}],"pig:category":[{"@value":"uml:SignalEvent","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746028884803_562591_15054","@type":"FMC:Event","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"continue_driving!"}],"pig:category":[{"@value":"uml:SignalEvent","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746028899054_101006_15058","@type":"FMC:Event","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"halt!"}],"pig:category":[{"@value":"uml:SignalEvent","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746028954791_356054_15062","@type":"FMC:Event","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"emergency_brake!"}],"pig:category":[{"@value":"uml:SignalEvent","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746029024681_691401_15066","@type":"FMC:Event","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"navigate!"}],"pig:category":[{"@value":"uml:SignalEvent","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746029056197_950529_15073","@type":"FMC:Event","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"new_target!"}],"pig:category":[{"@value":"uml:SignalEvent","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746029726958_589946_15078","@type":"FMC:Event","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"re-navigate!"}],"pig:category":[{"@value":"uml:CallEvent","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746027630942_863638_14801","@type":"FMC:Actor","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Controller State Machine"}],"pig:category":[{"@value":"uml:StateMachine","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746027630942_464786_14802","@type":"FMC:Actor","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"unnamed uml:Region"}],"pig:category":[{"@value":"uml:Region","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746027731735_371186_14872","@type":"FMC:Actor","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"unnamed uml:Region"}],"pig:category":[{"@value":"uml:Region","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:S-contains-10399921810","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001337727_31616_14119","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552810549321_335902_14037","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-10330010667","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001337727_31616_14119","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552810776263_894029_14121","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-10652725449","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001337727_31616_14119","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552810869277_586147_14175","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-11927092777","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001337727_31616_14119","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552810644650_650036_14079","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-8881937697","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001337727_31616_14119","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552812370943_152244_14924","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-10783514673","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001337727_31616_14119","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552813199775_830344_15281","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-10945506396","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001337727_31616_14119","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552810948738_707540_14217","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-11407335150","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001337727_31616_14119","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552812437056_257578_14975","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-9116397029","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001480225_327746_14120","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552811870216_105923_14824","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-10022314071","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001480225_327746_14120","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552813556602_820961_15353","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-9131303994","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001480225_327746_14120","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552814212889_663150_15729","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-8559115413","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001480225_327746_14120","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1556615164506_303870_14975","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-10881577187","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001480225_327746_14120","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552814194319_862392_15683","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-9119481481","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001480225_327746_14120","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552812663506_709974_15011","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-12098040971","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001480225_327746_14120","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552814523707_628151_15988","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-10442923979","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001480225_327746_14120","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1556615212765_548060_15021","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-11694297906","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001480225_327746_14120","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552811937697_690731_14862","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-9652197932","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001480225_327746_14120","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552814246502_629251_15775","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-9362975811","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001480225_327746_14120","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552813038602_222864_15129","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-10771124872","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001480225_327746_14120","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552815791106_548984_16360","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-9168262784","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001480225_327746_14120","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552812805784_548404_15062","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-8878119738","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001480225_327746_14120","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552814266523_206006_15821","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_19_0_3_bc402f4_1604324487193_60359_13731","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1552812805784_548404_15062","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552814194319_862392_15683","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_19_0_3_bc402f4_1604323888993_530325_13468","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1552813556602_820961_15353","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552814523707_628151_15988","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_19_0_3_bc402f4_1604324214402_6480_13631","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1552814523707_628151_15988","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552815791106_548984_16360","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_19_0_3_bc402f4_1604324447693_373448_13698","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1556615212765_548060_15021","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552814194319_862392_15683","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1556615721418_831605_15106","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1552811937697_690731_14862","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1556615212765_548060_15021","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1556615683513_411874_15073","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1552811937697_690731_14862","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1556615164506_303870_14975","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552813723040_381289_15401","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1552811937697_690731_14862","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552813556602_820961_15353","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_19_0_3_bc402f4_1604324465452_775050_13715","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1556615164506_303870_14975","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552814194319_862392_15683","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_19_0_3_bc402f4_1604324512097_628722_13747","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1556615164506_303870_14975","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552813038602_222864_15129","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_19_0_3_bc402f4_1604323867629_562362_13452","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1552814212889_663150_15729","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552814523707_628151_15988","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_19_0_3_bc402f4_1604324293194_85516_13666","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1552814523707_628151_15988","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552814266523_206006_15821","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_19_0_3_bc402f4_1604324321433_274293_13682","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1556615212765_548060_15021","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552813038602_222864_15129","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_19_0_3_bc402f4_1604324636141_429081_13763","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1552812805784_548404_15062","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552813038602_222864_15129","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552813096475_160687_15177","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1552811937697_690731_14862","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552812663506_709974_15011","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_19_0_3_bc402f4_1604324764626_856811_13779","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1552813038602_222864_15129","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552814212889_663150_15729","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_19_0_3_bc402f4_1604323821792_371188_13426","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1552814194319_862392_15683","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552814523707_628151_15988","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552813102494_993665_15207","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1552811937697_690731_14862","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552812805784_548404_15062","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_19_0_3_bc402f4_1604324188817_384398_13615","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1552814523707_628151_15988","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552814246502_629251_15775","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-10564266575","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027287147_82140_14431","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-11515557626","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_e40094_1718632293724_754873_14112","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-9482395742","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552827771600_60767_16481","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-9179309009","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552811469014_293642_14411","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-8743767210","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552811510062_903764_14503","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-8520696102","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552811412605_640145_14319","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-8274829800","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552811538626_715866_14549","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-8790231064","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552814104357_719492_15607","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-ownedBehavior-10906203416","@type":"uml:ownedBehavior","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:ownedBehavior-toSource":[{"@id":"d:_18_5_3_bc402f4_1552814104357_719492_15607","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:ownedBehavior-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027630942_863638_14801","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-8869082288","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027630942_863638_14801","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-9973927808","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027630926_778269_14800","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-11028317306","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746027630942_863638_14801","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027630942_464786_14802","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-10256822099","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746027630942_464786_14802","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027631039_116153_14834","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-8821517563","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746027630942_464786_14802","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027631053_836894_14835","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-8168210938","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746027630942_464786_14802","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027704287_746273_14855","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-11015906742","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746027704287_746273_14855","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027731735_371186_14872","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-10159638974","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746027731735_371186_14872","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027731735_863978_14871","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-11234558713","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746027731735_371186_14872","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027747207_605800_14880","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-8004350392","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746027731735_371186_14872","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027804266_719052_14896","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-10687126464","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746027731735_371186_14872","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027882482_912182_14918","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-9457711542","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746027731735_371186_14872","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027920180_215768_14934","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-10206589560","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746027731735_371186_14872","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027967661_707482_14950","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-11254687961","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746027731735_371186_14872","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028605370_466818_15028","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-startsFrom-10764992335","@type":"uml:TransitionSource","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionSource-toSource":[{"@id":"d:_19_0_3_71e0233_1746027837044_867827_14913","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionSource-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027731735_863978_14871","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-endsAt-10266389823","@type":"uml:TransitionTarget","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionTarget-toSource":[{"@id":"d:_19_0_3_71e0233_1746027837044_867827_14913","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionTarget-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027804266_719052_14896","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-startsFrom-9736561245","@type":"uml:TransitionSource","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionSource-toSource":[{"@id":"d:_19_0_3_71e0233_1746027847324_539644_14916","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionSource-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027804266_719052_14896","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-endsAt-11306959252","@type":"uml:TransitionTarget","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionTarget-toSource":[{"@id":"d:_19_0_3_71e0233_1746027847324_539644_14916","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionTarget-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027747207_605800_14880","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-triggers-11057421225","@type":"uml:Trigger","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:Trigger-toSource":[{"@id":"d:_19_0_3_71e0233_1746029024681_691401_15066","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:Trigger-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027847324_539644_14916","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-startsFrom-10753048967","@type":"uml:TransitionSource","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionSource-toSource":[{"@id":"d:_19_0_3_71e0233_1746028061993_960870_14971","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionSource-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027747207_605800_14880","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-endsAt-10164860996","@type":"uml:TransitionTarget","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionTarget-toSource":[{"@id":"d:_19_0_3_71e0233_1746028061993_960870_14971","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionTarget-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027882482_912182_14918","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-triggers-9989729747","@type":"uml:Trigger","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:Trigger-toSource":[{"@id":"d:_19_0_3_71e0233_1746028118776_36360_14979","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:Trigger-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028061993_960870_14971","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-startsFrom-8258457006","@type":"uml:TransitionSource","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionSource-toSource":[{"@id":"d:_19_0_3_71e0233_1746028073773_979720_14974","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionSource-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027882482_912182_14918","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-endsAt-8326005469","@type":"uml:TransitionTarget","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionTarget-toSource":[{"@id":"d:_19_0_3_71e0233_1746028073773_979720_14974","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionTarget-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027747207_605800_14880","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-triggers-11586041943","@type":"uml:Trigger","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:Trigger-toSource":[{"@id":"d:_19_0_3_71e0233_1746029726958_589946_15078","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:Trigger-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028073773_979720_14974","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-startsFrom-10663437825","@type":"uml:TransitionSource","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionSource-toSource":[{"@id":"d:_19_0_3_71e0233_1746028149871_266697_14985","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionSource-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027882482_912182_14918","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-endsAt-10827655661","@type":"uml:TransitionTarget","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionTarget-toSource":[{"@id":"d:_19_0_3_71e0233_1746028149871_266697_14985","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionTarget-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027920180_215768_14934","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-triggers-11897440242","@type":"uml:Trigger","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:Trigger-toSource":[{"@id":"d:_19_0_3_71e0233_1746028195311_519257_14989","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:Trigger-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028149871_266697_14985","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-startsFrom-10501816934","@type":"uml:TransitionSource","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionSource-toSource":[{"@id":"d:_19_0_3_71e0233_1746028183413_413266_14988","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionSource-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027920180_215768_14934","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-endsAt-9816959590","@type":"uml:TransitionTarget","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionTarget-toSource":[{"@id":"d:_19_0_3_71e0233_1746028183413_413266_14988","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionTarget-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027882482_912182_14918","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-triggers-8400858676","@type":"uml:Trigger","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:Trigger-toSource":[{"@id":"d:_19_0_3_71e0233_1746028216231_986687_14993","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:Trigger-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028183413_413266_14988","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-startsFrom-9888010871","@type":"uml:TransitionSource","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionSource-toSource":[{"@id":"d:_19_0_3_71e0233_1746028275862_880382_14999","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionSource-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027882482_912182_14918","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-endsAt-7971585829","@type":"uml:TransitionTarget","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionTarget-toSource":[{"@id":"d:_19_0_3_71e0233_1746028275862_880382_14999","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionTarget-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027967661_707482_14950","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-triggers-8791358862","@type":"uml:Trigger","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:Trigger-toSource":[{"@id":"d:_19_0_3_71e0233_1746028282302_943711_15000","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:Trigger-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028275862_880382_14999","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-startsFrom-8873253251","@type":"uml:TransitionSource","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionSource-toSource":[{"@id":"d:_19_0_3_71e0233_1746028306923_558192_15006","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionSource-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027967661_707482_14950","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-endsAt-10269038785","@type":"uml:TransitionTarget","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionTarget-toSource":[{"@id":"d:_19_0_3_71e0233_1746028306923_558192_15006","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionTarget-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027882482_912182_14918","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-triggers-8710683288","@type":"uml:Trigger","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:Trigger-toSource":[{"@id":"d:_19_0_3_71e0233_1746028313498_548385_15007","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:Trigger-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028306923_558192_15006","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-startsFrom-8996430444","@type":"uml:TransitionSource","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionSource-toSource":[{"@id":"d:_19_0_3_71e0233_1746028822501_191804_15047","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionSource-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027882482_912182_14918","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-endsAt-11699322235","@type":"uml:TransitionTarget","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionTarget-toSource":[{"@id":"d:_19_0_3_71e0233_1746028822501_191804_15047","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionTarget-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028605370_466818_15028","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-triggers-9704245737","@type":"uml:Trigger","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:Trigger-toSource":[{"@id":"d:_19_0_3_71e0233_1746028899054_101006_15058","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:Trigger-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028822501_191804_15047","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-startsFrom-8860759247","@type":"uml:TransitionSource","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionSource-toSource":[{"@id":"d:_19_0_3_71e0233_1746028827712_739888_15050","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionSource-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027882482_912182_14918","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-endsAt-11563651038","@type":"uml:TransitionTarget","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionTarget-toSource":[{"@id":"d:_19_0_3_71e0233_1746028827712_739888_15050","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionTarget-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028605370_466818_15028","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-triggers-8483779004","@type":"uml:Trigger","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:Trigger-toSource":[{"@id":"d:_19_0_3_71e0233_1746028954791_356054_15062","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:Trigger-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028827712_739888_15050","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-startsFrom-11316265439","@type":"uml:TransitionSource","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionSource-toSource":[{"@id":"d:_19_0_3_71e0233_1746028839192_503107_15053","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionSource-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028605370_466818_15028","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-endsAt-8092734140","@type":"uml:TransitionTarget","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionTarget-toSource":[{"@id":"d:_19_0_3_71e0233_1746028839192_503107_15053","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionTarget-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027882482_912182_14918","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-triggers-9344676895","@type":"uml:Trigger","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:Trigger-toSource":[{"@id":"d:_19_0_3_71e0233_1746028884803_562591_15054","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:Trigger-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028839192_503107_15053","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-startsFrom-10914308453","@type":"uml:TransitionSource","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionSource-toSource":[{"@id":"d:_19_0_3_71e0233_1746029049431_401220_15072","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionSource-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028605370_466818_15028","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-endsAt-10482894906","@type":"uml:TransitionTarget","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionTarget-toSource":[{"@id":"d:_19_0_3_71e0233_1746029049431_401220_15072","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionTarget-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027804266_719052_14896","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-triggers-10198907956","@type":"uml:Trigger","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:Trigger-toSource":[{"@id":"d:_19_0_3_71e0233_1746029056197_950529_15073","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:Trigger-toTarget":[{"@id":"d:_19_0_3_71e0233_1746029049431_401220_15072","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-startsFrom-10203202111","@type":"uml:TransitionSource","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionSource-toSource":[{"@id":"d:_19_0_3_71e0233_1746028508430_363448_15020","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionSource-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028605370_466818_15028","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-endsAt-10388500447","@type":"uml:TransitionTarget","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionTarget-toSource":[{"@id":"d:_19_0_3_71e0233_1746028508430_363448_15020","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionTarget-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027631053_836894_14835","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-triggers-8226880185","@type":"uml:Trigger","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:Trigger-toSource":[{"@id":"d:_19_0_3_71e0233_1746028540160_854095_15021","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:Trigger-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028508430_363448_15020","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-startsFrom-10505811433","@type":"uml:TransitionSource","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionSource-toSource":[{"@id":"d:_19_0_3_71e0233_1746027631056_691503_14836","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionSource-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027631039_116153_14834","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-endsAt-11750312327","@type":"uml:TransitionTarget","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionTarget-toSource":[{"@id":"d:_19_0_3_71e0233_1746027631056_691503_14836","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionTarget-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027631053_836894_14835","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-startsFrom-9662251988","@type":"uml:TransitionSource","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionSource-toSource":[{"@id":"d:_19_0_3_71e0233_1746028442990_717820_15013","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionSource-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027631053_836894_14835","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-endsAt-10042078921","@type":"uml:TransitionTarget","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionTarget-toSource":[{"@id":"d:_19_0_3_71e0233_1746028442990_717820_15013","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionTarget-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027704287_746273_14855","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-triggers-11689502440","@type":"uml:Trigger","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:Trigger-toSource":[{"@id":"d:_19_0_3_71e0233_1746028483612_410592_15014","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:Trigger-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028442990_717820_15013","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-8524437672","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552811554859_819240_14595","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-10606577794","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552811454014_108965_14365","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-10600261667","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_bc402f4_1604360793737_196507_13523","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-8034687851","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028118776_36360_14979","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-8284367231","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028195311_519257_14989","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-11116214028","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028216231_986687_14993","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-11694709529","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028282302_943711_15000","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-12033035043","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028313498_548385_15007","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-9345097305","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028483612_410592_15014","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-10887885853","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028540160_854095_15021","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-11330005271","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028884803_562591_15054","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-10697539955","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028899054_101006_15058","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-8277838339","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028954791_356054_15062","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-10218959244","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746029024681_691401_15066","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-10331126120","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746029056197_950529_15073","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-8478289863","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746029726958_589946_15078","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552814131280_1190_15654","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1552811412605_640145_14319","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552814104357_719492_15607","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_19_0_3_bc402f4_1604360962045_534106_13570","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1552811412605_640145_14319","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_19_0_3_bc402f4_1604360793737_196507_13523","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552811613008_58411_14648","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1552811412605_640145_14319","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552811454014_108965_14365","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_19_0_3_e40094_1718634030433_51877_14234","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1552811412605_640145_14319","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_19_0_3_e40094_1718632293724_754873_14112","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552811619502_982677_14678","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1552811412605_640145_14319","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552811469014_293642_14411","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552827804167_216283_16528","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1552811412605_640145_14319","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552827771600_60767_16481","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552811666192_832840_14768","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1552811412605_640145_14319","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552811538626_715866_14549","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552811672063_243990_14798","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1552811412605_640145_14319","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552811554859_819240_14595","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552811653332_976698_14708","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1552811412605_640145_14319","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552811510062_903764_14503","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552810808641_447672_14157","@type":"IREB:refines","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"IREB:refines-toSource":[{"@id":"d:_18_5_3_bc402f4_1552810776263_894029_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"IREB:refines-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552810644650_650036_14079","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552811141795_384989_14263","@type":"IREB:refines","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"IREB:refines-toSource":[{"@id":"d:_18_5_3_bc402f4_1552810948738_707540_14217","pig:itemType":{"@id":"pig:aSourceLink"}}],"IREB:refines-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552810644650_650036_14079","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552813438857_436917_15337","@type":"IREB:refines","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"IREB:refines-toSource":[{"@id":"d:_18_5_3_bc402f4_1552812370943_152244_14924","pig:itemType":{"@id":"pig:aSourceLink"}}],"IREB:refines-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552810644650_650036_14079","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552813334959_22842_15317","@type":"IREB:refines","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"IREB:refines-toSource":[{"@id":"d:_18_5_3_bc402f4_1552813199775_830344_15281","pig:itemType":{"@id":"pig:aSourceLink"}}],"IREB:refines-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552810644650_650036_14079","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552813433937_279860_15327","@type":"IREB:refines","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"IREB:refines-toSource":[{"@id":"d:_18_5_3_bc402f4_1552812437056_257578_14975","pig:itemType":{"@id":"pig:aSourceLink"}}],"IREB:refines-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552810644650_650036_14079","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552811136575_459751_14253","@type":"IREB:refines","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"IREB:refines-toSource":[{"@id":"d:_18_5_3_bc402f4_1552810869277_586147_14175","pig:itemType":{"@id":"pig:aSourceLink"}}],"IREB:refines-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552810644650_650036_14079","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552813795106_879353_15508","@type":"oslc_rm:satisfies","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"oslc_rm:satisfies-toSource":[{"@id":"d:_18_5_3_bc402f4_1552812805784_548404_15062","pig:itemType":{"@id":"pig:aSourceLink"}}],"oslc_rm:satisfies-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552810869277_586147_14175","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552813870706_981259_15588","@type":"oslc_rm:satisfies","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"oslc_rm:satisfies-toSource":[{"@id":"d:_18_5_3_bc402f4_1552812663506_709974_15011","pig:itemType":{"@id":"pig:aSourceLink"}}],"oslc_rm:satisfies-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552810776263_894029_14121","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552815653359_771130_16352","@type":"sysml:Allocate","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"sysml:Allocate-toSource":[{"@id":"d:_18_5_3_bc402f4_1552814523707_628151_15988","pig:itemType":{"@id":"pig:aSourceLink"}}],"sysml:Allocate-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552814104357_719492_15607","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552815590348_672436_16293","@type":"sysml:Allocate","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"sysml:Allocate-toSource":[{"@id":"d:_18_5_3_bc402f4_1552814266523_206006_15821","pig:itemType":{"@id":"pig:aSourceLink"}}],"sysml:Allocate-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552811510062_903764_14503","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_19_0_3_e40094_1718632549973_831908_14172","@type":"sysml:Allocate","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"sysml:Allocate-toSource":[{"@id":"d:_18_5_3_bc402f4_1552815791106_548984_16360","pig:itemType":{"@id":"pig:aSourceLink"}}],"sysml:Allocate-toTarget":[{"@id":"d:_19_0_3_e40094_1718632293724_754873_14112","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552815541056_996851_16231","@type":"sysml:Allocate","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"sysml:Allocate-toSource":[{"@id":"d:_18_5_3_bc402f4_1552814246502_629251_15775","pig:itemType":{"@id":"pig:aSourceLink"}}],"sysml:Allocate-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552811510062_903764_14503","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552813818846_218375_15548","@type":"oslc_rm:satisfies","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"oslc_rm:satisfies-toSource":[{"@id":"d:_18_5_3_bc402f4_1552813038602_222864_15129","pig:itemType":{"@id":"pig:aSourceLink"}}],"oslc_rm:satisfies-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552810948738_707540_14217","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_19_0_3_e40094_1718632569345_311906_14190","@type":"sysml:Allocate","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"sysml:Allocate-toSource":[{"@id":"d:_18_5_3_bc402f4_1552814266523_206006_15821","pig:itemType":{"@id":"pig:aSourceLink"}}],"sysml:Allocate-toTarget":[{"@id":"d:_19_0_3_e40094_1718632293724_754873_14112","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:HierarchyRoot-P-eee_1045467100313_135436_1","@type":"pig:HierarchyRoot","pig:itemType":{"@id":"pig:anEntity"},"dcterms:modified":"2026-01-17T22:38:55.908Z","dcterms:title":[{"@value":"Hierarchy Root"}],"dcterms:description":[{"@value":"... anchoring all hierarchies of this graph (package)"}],"pig:lists":[{"@id":"d:HR-9052885961","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:HR-FolderGlossary-10391243923","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:eee_1045467100313_135436_1","@type":"pig:Outline","pig:revision":"rev-10410861023","dcterms:modified":"2025-11-12T09:27:42.126Z","dcterms:title":[{"@value":"Small Autonomous Vehicle"}],"pig:category":[{"@value":"uml:Model","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"},"pig:lists":[{"@id":"d:_19_0_3_71e0233_1746001337727_31616_14119","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746001480225_327746_14120","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:HR-9052885961","@type":"pig:Outline","dcterms:modified":"2026-01-17T22:38:55.793Z","dcterms:title":[{"@value":"Small Autonomous Vehicle"}],"dcterms:description":[{"@value":"A set of SpecIF Classes derived from a SpecIF Ontology for the domains SpecIF:DomainBase, SpecIF:DomainSystemsEngineering, SpecIF:DomainSystemModelIntegration.","@language":"en"}],"pig:category":[{"@value":"ReqIF:HierarchyRoot","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"},"pig:lists":[{"@id":"d:eee_1045467100313_135436_1","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:FolderGlossary-10391243923","@type":"pig:Outline","dcterms:modified":"2026-01-17T22:38:43.273Z","dcterms:title":[{"@value":"Model Elements (Glossary)"}],"pig:category":[{"@value":"SpecIF:Glossary","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"},"pig:lists":[{"@id":"d:_18_5_3_bc402f4_1552814266523_206006_15821","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552811469014_293642_14411","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552813556602_820961_15353","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552814523707_628151_15988","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552811454014_108965_14365","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_bc402f4_1604360793737_196507_13523","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028884803_562591_15054","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552814104357_719492_15607","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027630942_863638_14801","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027804266_719052_14896","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027847324_539644_14916","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552811510062_903764_14503","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_e40094_1718632293724_754873_14112","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552811937697_690731_14862","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028954791_356054_15062","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027631039_116153_14834","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027731735_863978_14871","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027837044_867827_14913","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027631056_691503_14836","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552812805784_548404_15062","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027882482_912182_14918","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028073773_979720_14974","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028822501_191804_15047","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028827712_739888_15050","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028275862_880382_14999","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028149871_266697_14985","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028899054_101006_15058","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552811412605_640145_14319","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552812437056_257578_14975","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552812370943_152244_14924","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552812663506_709974_15011","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746029024681_691401_15066","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027747207_605800_14880","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028061993_960870_14971","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552810776263_894029_14121","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746029056197_950529_15073","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552813199775_830344_15281","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027631053_836894_14835","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028442990_717820_15013","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027704287_746273_14855","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746029726958_589946_15078","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552810869277_586147_14175","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552810948738_707540_14217","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552813038602_222864_15129","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552814246502_629251_15775","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552815791106_548984_16360","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552814194319_862392_15683","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552814212889_663150_15729","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028605370_466818_15028","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746029049431_401220_15072","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028839192_503107_15053","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028508430_363448_15020","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028118776_36360_14979","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552811538626_715866_14549","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552811554859_819240_14595","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028540160_854095_15021","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028483612_410592_15014","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552827771600_60767_16481","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552810644650_650036_14079","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1556615212765_548060_15021","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1556615164506_303870_14975","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028282302_943711_15000","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028195311_519257_14989","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028313498_548385_15007","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028216231_986687_14993","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027967661_707482_14950","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028306923_558192_15006","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027920180_215768_14934","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028183413_413266_14988","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027630942_464786_14802","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027731735_371186_14872","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:HR-FolderGlossary-10391243923","@type":"pig:Outline","dcterms:modified":"2026-01-17T22:38:55.793Z","dcterms:title":[{"@value":"Small Autonomous Vehicle"}],"dcterms:description":[{"@value":"A set of SpecIF Classes derived from a SpecIF Ontology for the domains SpecIF:DomainBase, SpecIF:DomainSystemsEngineering, SpecIF:DomainSystemModelIntegration.","@language":"en"}],"pig:category":[{"@value":"ReqIF:HierarchyRoot","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"},"pig:lists":[{"@id":"d:FolderGlossary-10391243923","pig:itemType":{"@id":"pig:aTargetLink"}}]}]} \ No newline at end of file diff --git a/tests/data/XML/21/Project 'Very Simple Model (FMC) with Requirements'.pig.xml b/tests/data/XML/21/Project 'Very Simple Model (FMC) with Requirements'.pig.xml index a095de4..000da85 100644 --- a/tests/data/XML/21/Project 'Very Simple Model (FMC) with Requirements'.pig.xml +++ b/tests/data/XML/21/Project 'Very Simple Model (FMC) with Requirements'.pig.xml @@ -15,7 +15,7 @@ id="d:ACP-Very-Simple-Model-FMC-with-Requirements" rdf:type="pig:Package"> Project 'Very Simple Model (FMC) with Requirements' - 2026-01-12T12:38:50.406Z + 2026-01-17T22:38:19.595Z @@ -69,7 +69,16 @@ - + + Property + A PIG meta-model element used for properties (aka attributes). + + + + + + + pig:Property has icon Specifies an icon for a model element (entity or relationship). @@ -608,7 +617,7 @@ - 2026-01-12T12:38:50.710Z + 2026-01-17T22:38:20.041Z Hierarchy Root ... anchoring all hierarchies of this graph (package) @@ -636,7 +645,7 @@ - 2026-01-12T12:38:50.579Z + 2026-01-17T22:38:19.821Z Project 'Very Simple Model (FMC) with Requirements' ReqIF:HierarchyRoot @@ -661,7 +670,7 @@ - 2026-01-12T12:38:50.579Z + 2026-01-17T22:38:19.821Z Project 'Very Simple Model (FMC) with Requirements' ReqIF:HierarchyRoot @@ -680,7 +689,7 @@ - 2026-01-12T12:38:50.579Z + 2026-01-17T22:38:19.821Z Project 'Very Simple Model (FMC) with Requirements' ReqIF:HierarchyRoot @@ -691,7 +700,7 @@ - 2026-01-12T12:38:44.062Z + 2026-01-17T22:38:13.953Z Model Elements (Glossary) SpecIF:Glossary @@ -705,7 +714,7 @@ - 2026-01-12T12:38:50.579Z + 2026-01-17T22:38:19.821Z Project 'Very Simple Model (FMC) with Requirements' ReqIF:HierarchyRoot diff --git a/tests/data/XML/21/files_and_images/Very-Simple-Model-FMC.svg b/tests/data/XML/21/files_and_images/Very-Simple-Model-FMC.svg new file mode 100644 index 0000000..da9fc35 --- /dev/null +++ b/tests/data/XML/21/files_and_images/Very-Simple-Model-FMC.svg @@ -0,0 +1,54 @@ + + + + Notation: FMC Block Diagramm, fmc.bd, aec0df7900010000017001eaf53e8876 + + FiCo-Data, fmc.bd.storage, aec10382ffe793790170ac81c49b15f1 + + null, figure.plane, null + + + + + + + + + null, supplement, null + FiCo-Data + + + + + FiCo-Application, fmc.bd.agent, aec19cbaffe79379017062c66543f984 + + null, figure.plane, null + + + + + + + null, supplement, null + FiCo-Application + + + + + , fmc.bd.modifyingstorageaccess, aec24748ffe793790170938a7b8327e0 + + null, figure.lineshape, null + + + null, figure.lineshape, null + + + + + null, figure.lineshape, null + + + + + + diff --git a/tests/unit/import-jsonld.spec.ts b/tests/unit/import-jsonld.spec.ts index a499b38..0674e19 100644 --- a/tests/unit/import-jsonld.spec.ts +++ b/tests/unit/import-jsonld.spec.ts @@ -6,9 +6,9 @@ import { TPigItem } from '../../src/utils/schemas/pig/pig-metaclasses'; describe('importJSONLD (file system)', () => { // List of relative filenames (relative to this test file). Add more entries as needed. const filenames:string[] = [ - // "../data/JSON-LD/05/Project 'Requirement with Enumerated Property'.pig.jsonld", + "../data/JSON-LD/05/Project 'Requirement with Enumerated Property'.pig.jsonld", "../data/JSON-LD/21/Project 'Very Simple Model (FMC) with Requirements'.pig.jsonld", - // "../data/JSON-LD/22/Small Autonomous Vehicle.pig.jsonld" + "../data/JSON-LD/22/Small Autonomous Vehicle.pig.jsonld" // add more test files here, e.g. // "../data/JSON-LD/another-sample.pig.jsonld" ]; From fe791179b811d81b595db6459cb895677cfa3ebe Mon Sep 17 00:00:00 2001 From: "OD-T14S-25\\PCUser" Date: Sun, 18 Jan 2026 15:45:32 +0100 Subject: [PATCH 02/26] - included the JSON-LD schema files and reorganized the src folder structure --- src/utils/import/ReqIF/reqif2pig.ts | 2 +- ...ort-jsonld.ts => import-package-jsonld.ts} | 4 +- ... import-package-jsonld.ts.goodButReplaced} | 0 .../schemas/pig/{ => json}/pig-schemata.ts | 2 +- src/utils/schemas/pig/jsonld/Entity.json | 119 +++++++ src/utils/schemas/pig/jsonld/Link.json | 104 ++++++ src/utils/schemas/pig/jsonld/Property.json | 170 ++++++++++ .../schemas/pig/jsonld/Relationship.json | 120 +++++++ src/utils/schemas/pig/jsonld/aPackage.json | 223 +++++++++++++ .../schemas/pig/jsonld/aRelationship.json | 204 ++++++++++++ src/utils/schemas/pig/jsonld/anEntity.json | 204 ++++++++++++ src/utils/schemas/pig/jsonld/index.html | 303 ++++++++++++++++++ src/utils/schemas/pig/jsonld/jsonld.zip | Bin 0 -> 14482 bytes .../pig/{ => jsonld}/pig-schemata-jsonld.ts | 4 +- .../pig-infrastructure.ts.work-in-progress | 0 .../schemas/pig/{ => ts}/pig-metaclasses.ts | 10 +- .../pig/{ => ts}/pig-package-constraints.ts | 4 +- tests/unit/import-jsonld.spec.ts | 4 +- tests/unit/pig-metaclasses.spec.ts | 2 +- tests/unit/pig-package-constraints.spec.ts | 4 +- 20 files changed, 1465 insertions(+), 18 deletions(-) rename src/utils/import/jsonld/{import-jsonld.ts => import-package-jsonld.ts} (95%) rename src/utils/import/jsonld/{import-jsonld.ts.goodButReplaced => import-package-jsonld.ts.goodButReplaced} (100%) rename src/utils/schemas/pig/{ => json}/pig-schemata.ts (99%) create mode 100644 src/utils/schemas/pig/jsonld/Entity.json create mode 100644 src/utils/schemas/pig/jsonld/Link.json create mode 100644 src/utils/schemas/pig/jsonld/Property.json create mode 100644 src/utils/schemas/pig/jsonld/Relationship.json create mode 100644 src/utils/schemas/pig/jsonld/aPackage.json create mode 100644 src/utils/schemas/pig/jsonld/aRelationship.json create mode 100644 src/utils/schemas/pig/jsonld/anEntity.json create mode 100644 src/utils/schemas/pig/jsonld/index.html create mode 100644 src/utils/schemas/pig/jsonld/jsonld.zip rename src/utils/schemas/pig/{ => jsonld}/pig-schemata-jsonld.ts (99%) rename src/utils/schemas/pig/{ => ts}/pig-infrastructure.ts.work-in-progress (100%) rename src/utils/schemas/pig/{ => ts}/pig-metaclasses.ts (99%) rename src/utils/schemas/pig/{ => ts}/pig-package-constraints.ts (99%) diff --git a/src/utils/import/ReqIF/reqif2pig.ts b/src/utils/import/ReqIF/reqif2pig.ts index e5d6ed5..4516eaa 100644 --- a/src/utils/import/ReqIF/reqif2pig.ts +++ b/src/utils/import/ReqIF/reqif2pig.ts @@ -11,7 +11,7 @@ */ import { IRsp } from '../../lib/messages'; -import { IEntity, IRelationship, IProperty, IAnEntity, IARelationship } from '../../schemas/pig/pig-metaclasses'; +import { IEntity, IRelationship, IProperty, IAnEntity, IARelationship } from '../../schemas/pig/ts/pig-metaclasses'; export class reqif2pig { private validate(xml: Document): boolean { diff --git a/src/utils/import/jsonld/import-jsonld.ts b/src/utils/import/jsonld/import-package-jsonld.ts similarity index 95% rename from src/utils/import/jsonld/import-jsonld.ts rename to src/utils/import/jsonld/import-package-jsonld.ts index 22b0e6e..66b6ada 100644 --- a/src/utils/import/jsonld/import-jsonld.ts +++ b/src/utils/import/jsonld/import-package-jsonld.ts @@ -21,8 +21,8 @@ import { IRsp, rspOK, Msg } from "../../lib/messages"; import { LIB, logger } from "../../lib/helpers"; -import { APackage, TPigItem } from '../../schemas/pig/pig-metaclasses'; -import { SCH_LD } from '../../schemas/pig/pig-schemata-jsonld'; +import { APackage, TPigItem } from '../../schemas/pig/ts/pig-metaclasses'; +import { SCH_LD } from '../../schemas/pig/jsonld/pig-schemata-jsonld'; /** * Import JSON-LD document and instantiate PIG items diff --git a/src/utils/import/jsonld/import-jsonld.ts.goodButReplaced b/src/utils/import/jsonld/import-package-jsonld.ts.goodButReplaced similarity index 100% rename from src/utils/import/jsonld/import-jsonld.ts.goodButReplaced rename to src/utils/import/jsonld/import-package-jsonld.ts.goodButReplaced diff --git a/src/utils/schemas/pig/pig-schemata.ts b/src/utils/schemas/pig/json/pig-schemata.ts similarity index 99% rename from src/utils/schemas/pig/pig-schemata.ts rename to src/utils/schemas/pig/json/pig-schemata.ts index 732c6ba..1cf3da3 100644 --- a/src/utils/schemas/pig/pig-schemata.ts +++ b/src/utils/schemas/pig/json/pig-schemata.ts @@ -22,7 +22,7 @@ * - eligible values in Property only for string values; other datatypes to be implemented */ -import { ajv } from '../../../plugins/ajv'; +import { ajv } from '../../../../plugins/ajv'; const ID_NAME_PATTERN = '^(?:[A-Za-z0-9_\\-]+:[^:\\s]+|https?:\\/\\/[^\\s]+)$'; //const PROP_NAME_PATTERN = '(^[A-Za-z0-9_\\-]+:[^:\\s]+$)|(^https?:\\/\\/\\S+$)'; diff --git a/src/utils/schemas/pig/jsonld/Entity.json b/src/utils/schemas/pig/jsonld/Entity.json new file mode 100644 index 0000000..c4e980c --- /dev/null +++ b/src/utils/schemas/pig/jsonld/Entity.json @@ -0,0 +1,119 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "http://product-information-graph.org/schema/2026-01-12/jsonld/Entity.json", + "title": "PIG Entity JSON-LD Schema", + "description": "Validates Entity class definitions for individual information objects. Configures which properties (pig:eligibleProperty) and which outgoing links are allowed (pig:eligibleTargetLink). Entities classify primary information objects such as Requirements, Components and Diagrams in a systems engineering context. Supports specialization hierarchies via pig:specializes and optional visual representation via pig:icon.", + "type": "object", + "properties": { + "@id": { + "$ref": "#/$defs/idString" + }, + "@type": { + "$ref": "#/$defs/idString" + }, + "pig:specializes": { + "$ref": "#/$defs/idObject" + }, + "pig:itemType": { + "type": "object", + "required": [ "@id" ], + "properties": { + "@id": { + "type": "string", + "enum": [ "pig:Entity" ], + "description": "The PigItemType for pig:Entity" + } + }, + "additionalProperties": false + }, + "dcterms:title": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/$defs/languageValue" + } + }, + "dcterms:description": { + "type": "array", + "items": { + "$ref": "#/$defs/languageValue" + } + }, + "pig:eligibleProperty": { + "type": "array", + "description": "Array of Property class references that can be used with this Entity", + "items": { + "$ref": "#/$defs/idObject" + } + }, + "pig:eligibleTargetLink": { + "type": "array", + "description": "Array of Link class references that can be used as outgoing links from this Entity", + "items": { + "$ref": "#/$defs/idObject" + } + }, + "pig:icon": { + "type": "object", + "description": "Optional icon representation for this Entity type", + "properties": { + "@value": { + "type": "string", + "description": "Icon identifier or path" + } + }, + "additionalProperties": false + } + }, + "required": [ + "@id", + "pig:itemType", + "dcterms:title" + ], + "oneOf": [ + { + "required": [ "@type" ], + "description": "New Entity class (not specialized)" + }, + { + "required": [ "pig:specializes" ], + "description": "Specialized Entity class" + } + ], + "additionalProperties": false, + "$defs": { + "idString": { + "type": "string", + "pattern": "^(?:[A-Za-z0-9_\\-]+:[^:\\s]+|https?:\\/\\/[^\\s]+)$", + "description": "A valid ID string: either a namespaced identifier (prefix:name) or a URL" + }, + "idObject": { + "type": "object", + "required": [ "@id" ], + "properties": { + "@id": { + "$ref": "#/$defs/idString" + } + }, + "additionalProperties": false, + "description": "JSON-LD ID object wrapper" + }, + "languageValue": { + "type": "object", + "required": [ "@value" ], + "properties": { + "@value": { + "type": "string", + "description": "The actual text content" + }, + "@language": { + "type": "string", + "pattern": "^[a-z]{2}(-[A-Z]{2})?$", + "description": "IETF language tag (e.g., 'en', 'de', 'en-US')" + } + }, + "additionalProperties": false, + "description": "Multi-language text value with optional language tag" + } + } +} diff --git a/src/utils/schemas/pig/jsonld/Link.json b/src/utils/schemas/pig/jsonld/Link.json new file mode 100644 index 0000000..f8603db --- /dev/null +++ b/src/utils/schemas/pig/jsonld/Link.json @@ -0,0 +1,104 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "http://product-information-graph.org/schema/2026-01-12/jsonld/Link.json", + "title": "PIG Link JSON-LD Schema", + "description": "Validates Link class definitions that specify navigable connections between items. Defines eligible endpoint classes (pig:eligibleEndpoint) which determine which Entity or Relationship classes can be connected via this link type. Links enable traversal of the information graph and support bi-directional relationships when paired (e.g., 'contains' / 'is contained by').", + "type": "object", + "properties": { + "@id": { + "$ref": "#/$defs/idString" + }, + "@type": { + "$ref": "#/$defs/idString" + }, + "pig:specializes": { + "$ref": "#/$defs/idObject" + }, + "pig:itemType": { + "type": "object", + "required": [ "@id" ], + "properties": { + "@id": { + "type": "string", + "enum": [ "pig:Link" ], + "description": "The PigItemType for pig:Link" + } + }, + "additionalProperties": false + }, + "dcterms:title": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/$defs/languageValue" + } + }, + "dcterms:description": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/$defs/languageValue" + } + }, + "pig:eligibleEndpoint": { + "type": "array", + "minItems": 1, + "description": "Array of Entity or Relationship class references that can be endpoints for this link", + "items": { + "$ref": "#/$defs/idObject" + } + } + }, + "required": [ + "@id", + "pig:itemType", + "dcterms:title", + "pig:eligibleEndpoint" + ], + "oneOf": [ + { + "required": [ "@type" ], + "description": "New Link class (not specialized)" + }, + { + "required": [ "pig:specializes" ], + "description": "Specialized Link class" + } + ], + "additionalProperties": false, + "$defs": { + "idString": { + "type": "string", + "pattern": "^(?:[A-Za-z0-9_\\-]+:[^:\\s]+|https?:\\/\\/[^\\s]+)$", + "description": "A valid ID string: either a namespaced identifier (prefix:name) or a URL" + }, + "idObject": { + "type": "object", + "required": [ "@id" ], + "properties": { + "@id": { + "$ref": "#/$defs/idString" + } + }, + "additionalProperties": false, + "description": "JSON-LD ID object wrapper" + }, + "languageValue": { + "type": "object", + "required": [ "@value" ], + "properties": { + "@value": { + "type": "string", + "description": "The actual text content" + }, + "@language": { + "type": "string", + "pattern": "^[a-z]{2}(-[A-Z]{2})?$", + "description": "IETF language tag (e.g., 'en', 'de', 'en-US')" + } + }, + "additionalProperties": false, + "description": "Multi-language text value with optional language tag" + } + } +} \ No newline at end of file diff --git a/src/utils/schemas/pig/jsonld/Property.json b/src/utils/schemas/pig/jsonld/Property.json new file mode 100644 index 0000000..0e3bea7 --- /dev/null +++ b/src/utils/schemas/pig/jsonld/Property.json @@ -0,0 +1,170 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "http://product-information-graph.org/schema/2026-01-12/jsonld/Property.json", + "title": "PIG Property JSON-LD Schema", + "description": "Validates Property class definitions that specify attributes for entities and relationships. May include datatype specifications (string, integer, double, boolean, dateTime, etc.), cardinality constraints (sh:minCount, sh:maxCount, value constraints (sh:minInclusive, sh:maxInclusive, sh:maxLength, sh:pattern), enumeration values (pig:eligibleValue), default values, measurement units, and support for composed properties.", + "type": "object", + "properties": { + "@id": { + "$ref": "#/$defs/idString" + }, + "@type": { + "$ref": "#/$defs/idString" + }, + "pig:specializes": { + "$ref": "#/$defs/idObject" + }, + "pig:itemType": { + "type": "object", + "required": [ + "@id" + ], + "properties": { + "@id": { + "type": "string", + "enum": [ + "pig:Property" + ], + "description": "The PigItemType for pig:Property" + } + }, + "additionalProperties": false + }, + "dcterms:title": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/$defs/languageValue" + } + }, + "dcterms:description": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/$defs/languageValue" + } + }, + "sh:datatype": { + "$ref": "#/$defs/idObject" + }, + "sh:minCount": { + "type": "number", + "minimum": 0 + }, + "sh:maxCount": { + "type": "number", + "minimum": 0 + }, + "sh:maxLength": { + "type": "number", + "minimum": 0 + }, + "sh:minInclusive": { + "type": "number" + }, + "sh:maxInclusive": { + "type": "number" + }, + "sh:pattern": { + "type": "string", + "description": "Regular expression pattern for string validation" + }, + "pig:unit": { + "type": "string", + "description": "Unit of measurement (SI unit)" + }, + "sh:defaultValue": { + "type": "string", + "description": "Default value for this property" + }, + "pig:eligibleValue": { + "type": "array", + "description": "Enumeration of allowed values", + "items": { + "type": "object", + "required": [ + "@id", + "dcterms:title" + ], + "properties": { + "@id": { + "$ref": "#/$defs/idString" + }, + "dcterms:title": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/$defs/languageValue" + } + } + }, + "additionalProperties": false + } + }, + "pig:composedProperty": { + "type": "array", + "description": "References to other properties that compose this property", + "items": { + "$ref": "#/$defs/idObject" + } + } + }, + "required": [ + "@id", + "pig:itemType", + "dcterms:title", + "sh:datatype" + ], + "oneOf": [ + { + "required": [ + "@type" + ] + }, + { + "required": [ + "pig:specializes" + ] + } + ], + "additionalProperties": false, + "$defs": { + "idString": { + "type": "string", + "pattern": "^(?:[A-Za-z0-9_\\-]+:[^:\\s]+|https?:\\/\\/[^\\s]+)$", + "description": "A valid ID string: either a namespaced identifier (prefix:name) or a URL" + }, + "idObject": { + "type": "object", + "required": [ + "@id" + ], + "properties": { + "@id": { + "$ref": "#/$defs/idString" + } + }, + "additionalProperties": false, + "description": "JSON-LD ID object wrapper" + }, + "languageValue": { + "type": "object", + "required": [ + "@value" + ], + "properties": { + "@value": { + "type": "string", + "description": "The actual text content" + }, + "@language": { + "type": "string", + "pattern": "^[a-z]{2}(-[A-Z]{2})?$", + "description": "IETF language tag (e.g., 'en', 'de', 'en-US')" + } + }, + "additionalProperties": false, + "description": "Multi-language text value with optional language tag" + } + } +} \ No newline at end of file diff --git a/src/utils/schemas/pig/jsonld/Relationship.json b/src/utils/schemas/pig/jsonld/Relationship.json new file mode 100644 index 0000000..a627689 --- /dev/null +++ b/src/utils/schemas/pig/jsonld/Relationship.json @@ -0,0 +1,120 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "http://product-information-graph.org/schema/2026-01-12/jsonld/Relationship.json", + "title": "PIG Relationship JSON-LD Schema", + "description": "Validates Relationship class definitions for directed connections between entities. Configures which properties (pig:eligibleProperty), source links (pig:eligibleSourceLink) and target links (pig:eligibleTargetLink) are allowed. Relationships are reified connections that can carry their own properties, enabling rich traceability and dependency modeling (e.g., 'Refinement' relationships with rationale and traceability status). Relationships classify meaningful statements including a subject and an object, where both the subject and the object is an entity or relationship instance. Supports specialization hierarchies and optional icons.", + "type": "object", + "properties": { + "@id": { + "$ref": "#/$defs/idString" + }, + "@type": { + "$ref": "#/$defs/idString" + }, + "pig:specializes": { + "$ref": "#/$defs/idObject" + }, + "pig:itemType": { + "type": "object", + "required": [ "@id" ], + "properties": { + "@id": { + "type": "string", + "enum": [ "pig:Relationship" ], + "description": "The PigItemType for pig:Relationship" + } + }, + "additionalProperties": false + }, + "dcterms:title": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/$defs/languageValue" + } + }, + "dcterms:description": { + "type": "array", + "items": { + "$ref": "#/$defs/languageValue" + } + }, + "pig:eligibleProperty": { + "type": "array", + "description": "Array of Property class references that can be used with this Relationship", + "items": { + "$ref": "#/$defs/idObject" + } + }, + "pig:eligibleSourceLink": { + "$ref": "#/$defs/idObject", + "description": "Link class reference that defines the source endpoint of this Relationship" + }, + "pig:eligibleTargetLink": { + "$ref": "#/$defs/idObject", + "description": "Link class reference that defines the target endpoint of this Relationship" + }, + "pig:icon": { + "type": "object", + "description": "Optional icon representation for this Relationship type", + "properties": { + "@value": { + "type": "string", + "description": "Icon identifier or path" + } + }, + "additionalProperties": false + } + }, + "required": [ + "@id", + "pig:itemType", + "dcterms:title" + ], + "oneOf": [ + { + "required": [ "@type" ], + "description": "New Relationship class (not specialized)" + }, + { + "required": [ "pig:specializes" ], + "description": "Specialized Relationship class" + } + ], + "additionalProperties": false, + "$defs": { + "idString": { + "type": "string", + "pattern": "^(?:[A-Za-z0-9_\\-]+:[^:\\s]+|https?:\\/\\/[^\\s]+)$", + "description": "A valid ID string: either a namespaced identifier (prefix:name) or a URL" + }, + "idObject": { + "type": "object", + "required": [ "@id" ], + "properties": { + "@id": { + "$ref": "#/$defs/idString" + } + }, + "additionalProperties": false, + "description": "JSON-LD ID object wrapper" + }, + "languageValue": { + "type": "object", + "required": [ "@value" ], + "properties": { + "@value": { + "type": "string", + "description": "The actual text content" + }, + "@language": { + "type": "string", + "pattern": "^[a-z]{2}(-[A-Z]{2})?$", + "description": "IETF language tag (e.g., 'en', 'de', 'en-US')" + } + }, + "additionalProperties": false, + "description": "Multi-language text value with optional language tag" + } + } +} \ No newline at end of file diff --git a/src/utils/schemas/pig/jsonld/aPackage.json b/src/utils/schemas/pig/jsonld/aPackage.json new file mode 100644 index 0000000..fc6604c --- /dev/null +++ b/src/utils/schemas/pig/jsonld/aPackage.json @@ -0,0 +1,223 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "http://product-information-graph.org/schema/2026-01-12/jsonld/aPackage.json", + "title": "PIG APackage JSON-LD Schema", + "description": "Validates complete JSON-LD package documents with @context (namespace and vocabulary definitions) as well as @graph (array of PIG items). The graph contains a mix of item classes (Property, Link, Entity, Relationship) and instances (anEntity, aRelationship). Package-level metadata includes optional dcterms:modified, dcterms:creator, dcterms:title, and dcterms:description. Validates each item against its corresponding schema based on pig:itemType.", + "type": "object", + "properties": { + "@context": { + "description": "JSON-LD context defining namespaces and vocabulary mappings", + "oneOf": [ + { + "type": "object", + "description": "Context as object with namespace mappings" + }, + { + "type": "array", + "description": "Context as array of contexts", + "items": { + "oneOf": [ + { "type": "object" }, + { "type": "string" } + ] + } + }, + { + "type": "string", + "description": "Context as URL reference" + } + ] + }, + "@id": { + "type": "string", + "pattern": "^(?:[A-Za-z0-9_\\-]+:[^:\\s]+|https?:\\/\\/[^\\s]+)$", + "description": "Optional package identifier" + }, + "@type": { + "$ref": "#/$defs/idString", + "description": "Reference to the Package class this instance belongs to" + }, + "pig:itemType": { + "type": "object", + "required": [ "@id" ], + "properties": { + "@id": { + "type": "string", + "enum": [ "pig:aPackage" ], + "description": "The PigItemType for pig:aPackage" + } + }, + "additionalProperties": false + }, + "dcterms:title": { + "type": "array", + "description": "Optional package title", + "items": { + "$ref": "#/$defs/languageValue" + } + }, + "dcterms:description": { + "type": "array", + "description": "Optional package description", + "items": { + "$ref": "#/$defs/languageValue" + } + }, + "dcterms:modified": { + "type": "string", + "format": "date-time", + "description": "Optional package modification timestamp" + }, + "dcterms:creator": { + "type": "string", + "description": "Optional package creator" + } + "@graph": { + "type": "array", + "minItems": 0, + "description": "Array of PIG items (classes and instances)", + "items": { + "type": "object", + "required": [ "pig:itemType" ], + "properties": { + "pig:itemType": { + "type": "object", + "required": [ "@id" ], + "properties": { + "@id": { + "type": "string", + "enum": [ + "pig:Property", + "pig:Link", + "pig:Entity", + "pig:Relationship", + "pig:anEntity", + "pig:aRelationship" + ] + } + } + } + }, + "allOf": [ + { + "if": { + "type": "object", + "properties": { + "pig:itemType": { + "type": "object", + "properties": { + "@id": { "const": "pig:anEntity" } + } + } + } + }, + "then": { + "$ref": "http://product-information-graph.org/schema/2026-01-12/jsonld/anEntity.json" + } + }, + { + "if": { + "type": "object", + "properties": { + "pig:itemType": { + "type": "object", + "properties": { + "@id": { "const": "pig:aRelationship" } + } + } + } + }, + "then": { + "$ref": "http://product-information-graph.org/schema/2026-01-12/jsonld/aRelationship.json" + } + }, + { + "if": { + "type": "object", + "properties": { + "pig:itemType": { + "type": "object", + "properties": { + "@id": { "const": "pig:Property" } + } + } + } + }, + "then": { + "$ref": "http://product-information-graph.org/schema/2026-01-12/jsonld/Property.json" + } + }, + { + "if": { + "type": "object", + "properties": { + "pig:itemType": { + "type": "object", + "properties": { + "@id": { "const": "pig:Link" } + } + } + } + }, + "then": { + "$ref": "http://product-information-graph.org/schema/2026-01-12/jsonld/Link.json" + } + }, + { + "if": { + "type": "object", + "properties": { + "pig:itemType": { + "type": "object", + "properties": { + "@id": { "const": "pig:Entity" } + } + } + } + }, + "then": { + "$ref": "http://product-information-graph.org/schema/2026-01-12/jsonld/Entity.json" + } + }, + { + "if": { + "type": "object", + "properties": { + "pig:itemType": { + "type": "object", + "properties": { + "@id": { "const": "pig:Relationship" } + } + } + } + }, + "then": { + "$ref": "http://product-information-graph.org/schema/2026-01-12/jsonld/Relationship.json" + } + } + ] + } + } + }, + "required": [ "@context", "@graph" ], + "additionalProperties": true, + "$defs": { + "languageValue": { + "type": "object", + "required": [ "@value" ], + "properties": { + "@value": { + "type": "string", + "description": "The actual text content" + }, + "@language": { + "type": "string", + "pattern": "^[a-z]{2}(-[A-Z]{2})?$", + "description": "IETF language tag (e.g., 'en', 'de', 'en-US')" + } + }, + "additionalProperties": false, + "description": "Multi-language text value with optional language tag" + } + } +} \ No newline at end of file diff --git a/src/utils/schemas/pig/jsonld/aRelationship.json b/src/utils/schemas/pig/jsonld/aRelationship.json new file mode 100644 index 0000000..f54455e --- /dev/null +++ b/src/utils/schemas/pig/jsonld/aRelationship.json @@ -0,0 +1,204 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "http://product-information-graph.org/schema/2026-01-12/jsonld/aRelationship.json", + "title": "PIG ARelationship JSON-LD Schema", + "description": "Validates relationship instances representing directed, reified connections between items (i.e. entity or relationship instances). Similar metadata to entities, but additionally requires both source links (pig:aSourceLink) and target links (pig:aTargetLink) conforming to the class definition. Source and target links reference entity or relationship instances. Properties can carry contextual information about the relationship (e.g., traceability status, rationale, coverage analysis). Reification enables relationships to be first-class items with their own lifecycle and properties. Must have a dcterms:title and optionally a dcterms:description to convey meaning.", + "type": "object", + "properties": { + "@id": { + "$ref": "#/$defs/idString" + }, + "@type": { + "$ref": "#/$defs/idString", + "description": "Reference to the Relationship class this instance belongs to" + }, + "pig:itemType": { + "type": "object", + "required": [ "@id" ], + "properties": { + "@id": { + "type": "string", + "enum": [ "pig:aRelationship" ], + "description": "The PigItemType for pig:aRelationship" + } + }, + "additionalProperties": false + }, + "pig:revision": { + "type": "string", + "description": "Revision identifier for version control" + }, + "pig:priorRevision": { + "type": "array", + "description": "Array of prior revision identifiers", + "items": { + "type": "string" + } + }, + "dcterms:modified": { + "type": "string", + "format": "date-time", + "description": "ISO 8601 timestamp of last modification" + }, + "dcterms:creator": { + "type": "string", + "description": "Creator/author of this relationship instance" + }, + "dcterms:title": { + "type": "array", + "description": "Multi-language titles", + "items": { + "$ref": "#/$defs/languageValue" + } + }, + "dcterms:description": { + "type": "array", + "description": "Multi-language descriptions", + "items": { + "$ref": "#/$defs/languageValue" + } + } + }, + "patternProperties": { + "^(?!pig:itemType|pig:revision|pig:priorRevision|@id|@type|dcterms:modified|dcterms:creator|dcterms:title|dcterms:description)([A-Za-z0-9_\\-]+:[^:\\s]+|https?:\\/\\/[^\\s]+)$": { + "type": "array", + "description": "Configurable properties and links with namespaced keys", + "items": { + "type": "object", + "properties": { + "pig:itemType": { + "type": "object", + "required": [ "@id" ], + "properties": { + "@id": { + "type": "string", + "enum": [ "pig:aProperty", "pig:aSourceLink", "pig:aTargetLink" ], + "description": "Type of configurable item: property value, source link, or target link" + } + }, + "additionalProperties": false + }, + "@value": { + "type": "string", + "description": "Direct property value (for aProperty)" + }, + "@id": { + "$ref": "#/$defs/idString", + "description": "Reference to enumeration value or linked entity/relationship" + } + }, + "required": [ "pig:itemType" ], + "oneOf": [ + { + "type": "object", + "description": "aProperty with direct value", + "properties": { + "pig:itemType": { + "type": "object", + "properties": { + "@id": { + "const": "pig:aProperty" + } + } + } + }, + "required": [ "@value" ], + "not": { + "required": [ "@id" ] + } + }, + { + "type": "object", + "description": "aProperty with enumeration reference", + "properties": { + "pig:itemType": { + "type": "object", + "properties": { + "@id": { + "const": "pig:aProperty" + } + } + } + }, + "required": [ "@id" ], + "not": { + "required": [ "@value" ] + } + }, + { + "type": "object", + "description": "aSourceLink or aTargetLink to another entity or relationship", + "properties": { + "pig:itemType": { + "type": "object", + "properties": { + "@id": { + "enum": [ "pig:aSourceLink", "pig:aTargetLink" ] + } + } + } + }, + "required": [ "@id" ], + "not": { + "required": [ "@value" ] + } + } + ], + "additionalProperties": false + } + } + }, + "required": [ + "@id", + "pig:itemType", + "@type", + "dcterms:modified" + ], + "anyOf": [ + { + "required": [ "dcterms:title" ], + "properties": { + "dcterms:title": { + "type": "array", + "minItems": 1 + } + }, + "description": "Must have at least one title" + }, + { + "required": [ "dcterms:description" ], + "properties": { + "dcterms:description": { + "type": "array", + "minItems": 1 + } + }, + "description": "Must have at least one description" + } + ], + "additionalProperties": false, + "$defs": { + "idString": { + "type": "string", + "pattern": "^(?:[A-Za-z0-9_\\-]+:[^:\\s]+|https?:\\/\\/[^\\s]+)$", + "description": "A valid ID string: either a namespaced identifier (prefix:name) or a URL" + }, + "languageValue": { + "type": "object", + "required": [ "@value" ], + "properties": { + "@value": { + "type": "string", + "description": "The actual text content" + }, + "@language": { + "type": "string", + "pattern": "^[a-z]{2}(-[A-Z]{2})?$", + "description": "IETF language tag (e.g., 'en', 'de', 'en-US')" + } + }, + "additionalProperties": false, + "description": "Multi-language text value with optional language tag" + } + } +} \ No newline at end of file diff --git a/src/utils/schemas/pig/jsonld/anEntity.json b/src/utils/schemas/pig/jsonld/anEntity.json new file mode 100644 index 0000000..6da89fb --- /dev/null +++ b/src/utils/schemas/pig/jsonld/anEntity.json @@ -0,0 +1,204 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "http://product-information-graph.org/schema/2026-01-12/jsonld/anEntity.json", + "title": "PIG AnEntity JSON-LD Schema", + "description": "Validates entity instances with actual property values and target link references. Includes mandatory metadata: @type (reference to Entity class), pig:revision, dcterms:modified timestamp, optional pig:priorRevision and dcterms:creator. Properties can have direct values (@value) or reference enumeration values (@id) as defined by its class. Target links reference other entity or relationship instances. Must have either dcterms:title or dcterms:description (or both) to convey meaning.", + "type": "object", + "properties": { + "@id": { + "$ref": "#/$defs/idString" + }, + "@type": { + "$ref": "#/$defs/idString", + "description": "Reference to the Entity class this instance belongs to" + }, + "pig:itemType": { + "type": "object", + "required": [ "@id" ], + "properties": { + "@id": { + "type": "string", + "enum": [ "pig:anEntity" ], + "description": "The PigItemType for pig:anEntity" + } + }, + "additionalProperties": false + }, + "pig:revision": { + "type": "string", + "description": "Revision identifier for version control" + }, + "pig:priorRevision": { + "type": "array", + "description": "Array of prior revision identifiers", + "items": { + "type": "string" + } + }, + "dcterms:modified": { + "type": "string", + "format": "date-time", + "description": "ISO 8601 timestamp of last modification" + }, + "dcterms:creator": { + "type": "string", + "description": "Creator/author of this entity instance" + }, + "dcterms:title": { + "type": "array", + "description": "Multi-language titles", + "items": { + "$ref": "#/$defs/languageValue" + } + }, + "dcterms:description": { + "type": "array", + "description": "Multi-language descriptions", + "items": { + "$ref": "#/$defs/languageValue" + } + } + }, + "patternProperties": { + "^(?!pig:itemType|pig:revision|pig:priorRevision|@id|@type|dcterms:modified|dcterms:creator|dcterms:title|dcterms:description)([A-Za-z0-9_\\-]+:[^:\\s]+|https?:\\/\\/[^\\s]+)$": { + "type": "array", + "description": "Configurable properties and links with namespaced keys", + "items": { + "type": "object", + "properties": { + "pig:itemType": { + "type": "object", + "required": [ "@id" ], + "properties": { + "@id": { + "type": "string", + "enum": [ "pig:aProperty", "pig:aTargetLink" ], + "description": "Type of configurable item: property value or target link" + } + }, + "additionalProperties": false + }, + "@value": { + "type": "string", + "description": "Direct property value (for aProperty)" + }, + "@id": { + "$ref": "#/$defs/idString", + "description": "Reference ID for enumeration value or linked entity" + } + }, + "required": [ "pig:itemType" ], + "oneOf": [ + { + "type": "object", + "description": "aProperty with direct value", + "properties": { + "pig:itemType": { + "type": "object", + "properties": { + "@id": { + "const": "pig:aProperty" + } + } + } + }, + "required": [ "@value" ], + "not": { + "required": [ "@id" ] + } + }, + { + "type": "object", + "description": "aProperty with enumeration reference", + "properties": { + "pig:itemType": { + "type": "object", + "properties": { + "@id": { + "const": "pig:aProperty" + } + } + } + }, + "required": [ "@id" ], + "not": { + "required": [ "@value" ] + } + }, + { + "type": "object", + "description": "aTargetLink to another entity or relationship", + "properties": { + "pig:itemType": { + "type": "object", + "properties": { + "@id": { + "const": "pig:aTargetLink" + } + } + } + }, + "required": [ "@id" ], + "not": { + "required": [ "@value" ] + } + } + ], + "additionalProperties": false + } + } + }, + "required": [ + "@id", + "pig:itemType", + "@type", + "dcterms:modified" + ], + "anyOf": [ + { + "required": [ "dcterms:title" ], + "properties": { + "dcterms:title": { + "type": "array", + "minItems": 1 + } + }, + "description": "Must have at least one title" + }, + { + "required": [ "dcterms:description" ], + "properties": { + "dcterms:description": { + "type": "array", + "minItems": 1 + } + }, + "description": "Must have at least one description" + } + ], + "additionalProperties": false, + "$defs": { + "idString": { + "type": "string", + "pattern": "^(?:[A-Za-z0-9_\\-]+:[^:\\s]+|https?:\\/\\/[^\\s]+)$", + "description": "A valid ID string: either a namespaced identifier (prefix:name) or a URL" + }, + "languageValue": { + "type": "object", + "required": [ "@value" ], + "properties": { + "@value": { + "type": "string", + "description": "The actual text content" + }, + "@language": { + "type": "string", + "pattern": "^[a-z]{2}(-[A-Z]{2})?$", + "description": "IETF language tag (e.g., 'en', 'de', 'en-US')" + } + }, + "additionalProperties": false, + "description": "Multi-language text value with optional language tag" + } + } +} \ No newline at end of file diff --git a/src/utils/schemas/pig/jsonld/index.html b/src/utils/schemas/pig/jsonld/index.html new file mode 100644 index 0000000..c792731 --- /dev/null +++ b/src/utils/schemas/pig/jsonld/index.html @@ -0,0 +1,303 @@ + + + + + + + + PIG JSON-LD Schemata | CASCaRA | GfSE + + + +
+
+

PIG JSON-LD Schemata

+

Product Information Graph - JSON Schema Validation (Draft-07)

+
+ +
+
+

These schemata validate the JSON-LD representation of PIG items and correspond to the + PIG Metamodel. + Each schema enforces structural constraints, data types, and cardinalities defined in the PIG metamodel, + ensuring interoperability and semantic consistency across different tools and organizations.

+ +

PIG Metamodel Class Items

+

These schemata validate PIG class definitions. Classes are derived from the ontology. + In general, each concept in the ontology results in a class of either Property, Link, Entity, or Relationship. + A class definition must conform to its respective schema and must have a dcterms:title and optionally a dcterms:description to convey meaning.

+ +
    +
  • + Property.json +
    + Validates Property class definitions that specify attributes for entities and relationships. + May include datatype specifications (string, integer, double, boolean, dateTime, etc.), cardinality constraints + (sh:minCount, sh:maxCount), value constraints (sh:minInclusive, + sh:maxInclusive, sh:maxLength, sh:pattern), enumeration values + (pig:eligibleValue), default values, measurement units, and support for composed properties. +
    +
    → OWL mapping: owl:DatatypeProperty
    +
  • +
  • + Link.json +
    + Validates Link class definitions that specify navigable connections between items. + Defines eligible endpoint classes (pig:eligibleEndpoint) which determine which Entity or Relationship classes can be connected via this link type. Links enable traversal of the information graph and support bi-directional relationships when paired (e.g., "contains" / "is contained by"). +
    +
    → OWL mapping: owl:ObjectProperty
    +
  • +
  • + Entity.json +
    + Validates Entity class definitions for individual information objects. + Configures which properties (pig:eligibleProperty) and which outgoing + links are allowed (pig:eligibleTargetLink). + Entities classify primary information objects such as Requirements, Components and Diagrams in a systems engineering context. Supports specialization hierarchies via pig:specializes and optional visual representation + via pig:icon. +
    +
    → OWL mapping: owl:Class
    +
  • +
  • + Relationship.json +
    + Validates Relationship class definitions for directed connections between entities. + Configures which properties (pig:eligibleProperty), source links + (pig:eligibleSourceLink) and target links (pig:eligibleTargetLink) are allowed. + Relationships are reified connections that can carry their own properties, enabling rich traceability and dependency modeling (e.g., "Refinement" relationships with rationale and traceability status). + Relationships classify meaningful statements including a subject and an object, where both the subject and the object is an entity or relationship instance. + Supports specialization hierarchies and optional icons. +
    +
    → OWL mapping: owl:Class with constrained owl:ObjectProperty endpoints
    +
  • +
+ +

PIG Metamodel Instance Items

+

These schemata validate PIG instances (project data or "payload"). Instances represent actual data + conforming to the class definitions above. They include revision control, modification tracking, and + properties/links as configured by their respective classes.

+ +
    +
  • + anEntity.json +
    + Validates entity instances with actual property values and target link references. + Includes mandatory metadata: @type (reference to Entity class), pig:revision, + dcterms:modified timestamp, optional pig:priorRevision and + dcterms:creator. Properties can have direct values (@value) or reference enumeration values (@id) as defined by its class. Target links reference other entity or relationship instances. + Must have either dcterms:title or dcterms:description (or both) to convey meaning. +
    +
    → OWL mapping: owl:NamedIndividual
    +
  • +
  • + aRelationship.json +
    + Validates relationship instances representing directed, reified connections between items (i.e. entity or relationship instances). + Similar metadata to entities, but additionally requires both source links (pig:aSourceLink) and target links (pig:aTargetLink) conforming to the class definition. Source and target links reference entity or relationship instances. Properties can carry contextual information about the relationship (e.g., traceability status, rationale, coverage analysis). Reification enables relationships to be first-class items with their own lifecycle and properties. + Must have a dcterms:title and optionally a dcterms:description to convey meaning. +
    +
    → OWL mapping: owl:NamedIndividual (reified predicate)
    +
  • +
+ +

PIG Package Item

+

This schema validates complete PIG data packages. A package contains a subset of the product information + graph bundled for specific purposes such as customer-supplier agreements, milestone deliverables, or + change requests. Packages include their own context definitions and maintain referential integrity.

+
    +
  • + aPackage.json +
    + Validates complete JSON-LD package documents with @context (namespace and vocabulary definitions) as well as @graph (array of PIG items). The graph contains a mix of item classes (Property, Link, Entity, Relationship) + and instances (anEntity, aRelationship). Package-level metadata includes optional + dcterms:modified, dcterms:creator, dcterms:title, and + dcterms:description. Validates each item against its corresponding schema based on pig:itemType. +
    +
    → OWL mapping: Self-contained RDF graph with ontology and instance data
    +
  • +
+
+ +
+

Key Features

+
    +
  • Design for transformation: The PIG metamodel assures loss-less transformation between OWL/RDF (Knowledge Graphs), GQL (Property Graphs) and Object-oriented Programming
  • +
  • Federation: JSON-LD supports dataspaces with federated data under full control of the respective owners
  • +
  • Multi-user Operation: JSON-LD lends itself for traceable multi-user access and versioning
  • +
  • Wide technology support: Good support by many programming languages including JavaScript, Python, Java and C#
  • +
  • JSON Schema Draft-07 compliant: Industry-standard validation with wide tooling support
  • +
  • Strict validation: Additional properties are not allowed to prevent schema violations
  • +
  • Pattern-based validation: Configurable properties and links use regex patterns with negative lookahead
  • +
  • Multi-language support: IETF language tags (@language) for internationalization
  • +
  • Conditional schemata: If-then logic applies correct validation based on pig:itemType
  • +
  • Modular design: Reusable definitions for each metamodel item type
  • +
  • Package validation: Complete graph validation with both class and instance items
  • +
  • Format validation: Simple datatypes with optinal range limitation, ISO 8601 date-time, URI patterns and CURIE namespace syntax
  • +
+
+
+ + +
+ + \ No newline at end of file diff --git a/src/utils/schemas/pig/jsonld/jsonld.zip b/src/utils/schemas/pig/jsonld/jsonld.zip new file mode 100644 index 0000000000000000000000000000000000000000..8d88c11d0908993753c58dc78df1aa8bfa5a418c GIT binary patch literal 14482 zcma)j1CV6VmTlSYs_wFF+qUg4+qP}nwr#u1HoI)=SHJo5f4>(qZ|2_E88wpEo1^8(tWaVJ$;7V;~Z*Ar10u2BN^5>3!yeKKc z0)VsrwlFLX9L83r`l8m(}$N*DGT#)1pA%UkPX?RR{zA z{vm=$I~?%<#C`0J8C__9rN0%?Y2vt7IA5O>$a!^G#3iOM_@^KKV_Mq?|@N} zql^frMuv+rl(#x?A29umf5L7oU|@o1*O4cU_fwWlXgSgTj6fEb5c4;7El==5imRv| zHy+Y+f+v4Q1SE->Cp>KG>93zUjKJiSz+Joy_;en-fb6m1F*#2B(FQ*Fu$nl~Gsk%` z(qI{!@__Wtu}9*4#(K2Soa{v)O@$0VbyI!RPz~DRoT^B6=vUpz4y@O_Q#MuwH72{TemE=|*_+nN=WWf1;Zw=*u}IkmAb9U~z=tYL?%NwqOV81MN&z-$qF4mLfvf zNBub6XHya+MJ1R-xz2OR>)~%TO5EC?9#PBZFZYn#z%+~>LiQaajtUz+WyI0e$;sBn z!Yl&R>;*Vd!Y2qW7x%oojLUQ~; zy0@8N?|gTz<(0JsR%;;UqIkApcv-oEXE7D&BC8ot+ zJx0OCXV-qJZ?j;o?)q}yc2_;L$!$HYeo>AdJdfn|?#}p>a{uZLxhE%rxpnjr|3E<0 zS`$hD1ZxfVDHE(T=N0qR{j4Y}zI7B3ZZl#M{N_ZZu*q_ld;fhD*x88s8(Yk3*|uoK zd?|0K`k`ahd`no>H?GQ(VBYg{<~vnVV2x+n#|z<(C|%VJVfC8i}$Fg+S-n4G3n(3YNMeNXRdj3i3yoHh7u^+N0o!e_@#NHHIVTz3w; z?6(9H@c5=N_=p*X&=#%@vr_M|!jB3zw$Z(;Hp7E7klHHko~D|{?pj-zmAot#*FaM z0r(0J&ctgmUpMEmOzSNcR*6Ax@Ff+mUs8b@+O%>~Ntnnqd9yYABX+T!lBh?vhaW*> ze&c#)qkk{-ZqIqkuO)-)u+lapgN@aED*oBx!FMpWT%(vyYtkbuX`SooXVIEA+qZo2 zw+wZDeV+Rki9AC|fq~GPx;#=f3IcU!Cl{NiPWP)JPy3QK$Tu{0kxh|?J_T26Df>QP z%E;{OHz;cc#HaI{Gx*0l5ixxC1aj{@pQjLgFl|g?z(b5dLWcceZS>s` zhNs{wCQNtRfoo&9e2BmlNHQ4Gn;q_lX)Scz7XWVUxR4R*Wz?AIem-2D=mmtI0i;6k z2sC^^#F)VroPp&`VDFkvKB5Bve4^YEY-GUNKB(V#MUEJyX%FDPu@cP;Lw1A*fDded z!X=Qbq!H=|ilOe1-V`8(MWB+8Na5M1U~Ic%@`kV>!SV4gLCfz@g(TL?0(1@2!LD#d zc-9dvXD@$`)*H}oGnK_lC50&>J9;9sSdWTrUfdI)U^Ah%GN2_z>53%C7NnT=@ZlJ! zfwu*LRGTauTM+Oo#y}6@K%0HK0Dfq(lx}E-FxuV8w^D?c#0{TxB&3U=ja|A%>7fKx zO$EXeN5bocfiY)~x>}J()k0o7xL36_LsJ#10C_2fso2g`p1<3OS>&%+buT;4ht9;m z2e5IXH`uIfnOK!&C`7OHlMHu<_Ahm5bee!Ak5JfQ&7G~VRro9s)(@#>0C>-Q|JX$) z)z%9WQZ9k^s3l_w3<;OaLD-0jIt*{V&>4BR+x~cZyl-^Bb?a)$ z)X}L=U-}$l^1}*EPkqu@FB`hn9@I8XFea8t?U3?_Z7|Hslb)lcA2{$mgZv>DUv1>B zS5}X9O>-Ko=x6hj6Pgo@`leMaT=C>PRlrIDj5BM<;Muo4sjC~)s=h;sWY>j`0{bDfrg1j^V3HrE^8O`xfglaym$X(B(M?JmEU7)eA z(zNrtt$P?vNs7Z3RhcjJV=7CU<(UT2^Ua(DUpK(L{Af4%y*y*J#(M(Ph9d1n>itHn z{P2h=4r7ti|NQj6p-E{xY6esoqx)=Ry^tPYQP)MeHfy3RZ4-fY-e!&XB_r=Yignx5$#=oTT zNPp6Jc|(hz4yM*t_9mt_|1Cj>eC6_gLb&=*F0b~L%OiNvOn=fU0jcsg#GMB>p!luw z%_39B4b^0D&x`P#%Ol03I7`S&&x?L`3dpP5UM8Y|@a^CR_hZ2wJsoae-9BysewcA3 zeI!hYngdjp%3tSfdD9SFtSo2~62J4t)ZV~(pRF~DR9+ZSKxbIihWNEsa}Ev1rXUW+ zj0?uNn58UtzVG$#6>sjuIy+cILHcvI=H%ifDSUst)9cfrLy`CFdtR}=S}*k93by{d z((Vq(Me(X9$eH~?xoF_Fl}%^>D5u!RP%1b;(hZRexhIc!q3~SM{Q=`Q`V$_&6;h`r`4jIQ84kf&iZ=G?wAKkcR|J7QSIc+4+3sU)UMpq(%G`pxir8 zA|Zj?nlmzH()>2EKnBRUtLjO}&CKUgZd$T_PYDsKB{G5^W>HQ^1L`48vBy{_26+cW zJN)#P`_Sh!TXw}65&Yx|9fitXfPhiRiAwH!)X?NmUNvs$X`#=(0rQjiff}i%!Zs;P z$J~y|kRA~BgEw<`dFQqMj_RgW~S)K!mgtPde);4I+;YwF>uUcN7yk zUP2rpp;mYZgGk*{euNTAl4x~fjCsQhNDGl`(5ONBwth$B>G*gD(L@hsR;^;vC$_w2 z>?eaoDhV_Fs~-|dXs7RW-_3D+Yg!(GEOI;#6oqW2Wcs2WjX_6haF{FJPJC+>PtcK- z>Im@?ERBWcp@WD?LEvj#7@JOal-t9wlKgWBKgzSK8eoTI_S<$+P+@v>QfolX0A?5C zfmJGOxgl8nII?yUXwgMOb(Xs~;^mgWfB9PPePf4f-F##%XYc3T_2WXN z+8O8O5*tm8zkYn{v{vL?Y)VuAgK1Il4v0SU&?1=+yn}5wvXZ7~rHmO=AyHYy5(jo_ z40FjIM|c{7%Hkt`Xt}wknMBb=HDDyR4vmHTvw`VayNY>gM(jC~gSk)Xtg~FcC;hUn zF`zR$X8XlKUb%*Q@gt21!MaZQ&99XQd?NFD<$TEY#ZtLEypa>FB&IzHdz6V3nAJ8K zvGrxLTKU!qM^*E650%g?vjHZc(oW7wM_$;5U^=N~2`wGP=4j!3zp6S?u>u07L|CZa z^)Ob?a+EG|?nh{%m-R}?zSfB8BOHERbejmg| zU5a?mze`sbz`Ix~asm$j50tR~|f56)vs4KKjc$xhoos=p>#L|#i zoOw!?T-0Kj4daAOu@G5%9~lH{^MF(V0GucQskEDlAJS?B?oti2W7%ux}p<(C+rx zW#NHQ{Z1w`9ur|qk^S}l2E`(H$)L{FhAZa{;1lk*@AHZ~3nwYM<=Jgi!=A2|#=11c zgrVVWOIjQ^&iK=>6P`cXWMLkS#R&!gaESZ2HkJR2HbH-B)Bn(5%KH+eKY^8PU^=O? zX0;}a;7K#>jY7B zlU!y+0fE$-yux5y<^FiD(vv+E^`I{)WDJqHoZ`WX>M@;qw{F6tFoP?L&$#)~49xP7 zSFd7OsB5ZGRhM%WDMCM?NDfn*AR5X^9oW+8-~Zlk-SG~5xn09a3<+jkfX8sY)~rq& zO=u#N9q9$u4B&;9-E}V=_4907Sps;zD{no^h~=5|ntHd0Z3_?Z;1C`Oc(bu)KR}6B=NmpPT2*7U> zyPAlUamO{F)k#Mo9upOgiFs4-mxaI=tAhk9cmEX_Hl1;mr@d8bIhgE2mT?oC0L8Qc zg5c151Oa<_RqcmdL>jrNKW~~P_Ntl3M%)V~#v}m%=vD@M13eZ(m{$kzE{XnT@OQb6U9wen!WBymy0wOO;w|Tq`R{uF^v_UxTs5PEvCVbayWsJZ-ZZEIS_pRgE;%J za4?hq{>slNtHa*^U;w`Gk}8rlS`k&9j0TLu;wM**u0@4j=3v{(W?jN_?b?{>^c87n zvGklfA=28B2Sd-K!@}HHt8d}&K3hyGuj3yySB9=;I;n1OI~wOF8|LMf*FlBlb*j0-%U$O~rdxw-w*s2}8W5UI zbJ{v=_9%{Ms<^o*zL3SbA(;5Yv7VF>R34Y^WQANCH*inChYO|H+Ld^t8j*@g<^ zMuqbDF_#Yd!H2mw7)s&7Ztk&^ux?z~cFX(zB71#btA9S`DUTv;WVzpgybS;Y$TnF= z0Ud)clnI@EtY&vjEn+N+6YSJvjHTW4>P%wEC7&t(5&b?xpgy8rO4auW_)W2ynAtZU zh}eTjAI&nOYVpc4)G_q>(&m+uY~dlkkL5vG?~?7Jiy)oJG#(MNEG+ZfmnwJ@6ntZ0 zW2fSD1)@QwGrw`$Ou_W-@QtLz#upLMp%&-AtX?E~* zzs?0q(Eo~mx?9SQyru~?W#>4qZ77bWMeo%C%C_yZ6Ypb73_Bp{w7$>=AMRXjO&~ri zXx=`<`$m5mD_g)Ov9k(}eQ+BeLgg|7^qw!{GG;Hm#~a9KMDpt2SyhW)#6Mb}5k8M` z;g2kbc(_lV36(0#DX}S30fkhcTtbKMFe@u-h6lPL0?wa>VbJ zuQLMZT76MU2#xxfCu%HNv@dcKMD~3c3Wj!a^ls}jVc)6LE{W7Gb;@NdW&b#$rnecm z?$*f7y;Vbe+!ecCLAEj%?e`S{8&5k|F^e%NfE7CY9`PEX2Q&><}&^kKxW!{?AQ_$(IbVEpfPg4{e1@GElWi;NxFVsZs?+g0hmfH*PQSfw>3TQYW~U^9jDxxc*|S-!F&am^^6GN~w+G=SjKaSBdgK6v z)?~VhgdH)1kke^u1kJKmV%|I8GuZJyI+2R`Y( z)F!FF3T`>4F;h#T3IzDZvUVgS?rbR-@YflF3H+LLj3x{g}cV@kU&MyeS-+6&puQ8h%Bl#of`x2nu} zB0O_0<~dVvNXwWWlr~$akjs{%b+bryDu1((GJiXF+;E_Bq>aP8q)Ap5f~N9dlcs?d zT4AiMPKBZr=Kvp&Bmm?z)PlBTbpPJ(y#|KjNS+%^KaUpScSmj>Lq-}x1@qeFV})`E z-!Auf=!O1Sqw_Eq!v@w_UrTE)8ZvNoET^a?Q+gEqt?io3sV1q9524aE@+Nu^2jLbe zyc`Ao=HR9vAbr}03979mUN*ahdF|eF)*RS2|y8f z4}jH|>H*^!3$#>**fVv2#gc!X_ik#GOntM-aakr{1EIEHd2>aYyXz{Z(#pbtKR)gm zYc1GWm-eM)w1V)JJwS@k5=GbdgzwgsvR@!UlxEN|g6T3pCYs~pSFWapD~#16o`|$zAXfDi2O}ZW z@gXXbCtUsRLmJXrPo&;Sc0x|X07mVv#M!^#Ga5`eo{6>5IY7;dU91f3^KH*2mJp|b z?$$6{^Y*SwhPpTENkY`FUr#@m?N=KztGQG#A?OwLG;k)Y?I<5*A2OHjPDEZZuMS(W zO-vkJ(B&LyK%&&VsI$S4fagR-67f&QsN_m>uDHVsfYO{EKPo`Mnvr7*S!eynV^t1Z zki|qU^c9Dro0F7k*8E@WEDjG?9@T=Y9F^~a-s%hiKh)ob*3&eu^a;>#&0ye2XVu8Q z?bUKm2jKw(9fB-{%Jh!8Qa=~;(COm!cG~Ziw4lxc2cGZ;e!5B|`?S$g<8tW3^dRUK zUQNRYIPsFH7IrH`*-@-z4}pMvkr5He^6h*p2Eg`D1k%RC_f ze>A{vI}xn~P#4U+hYQ5P8q%wJ{W$aE$l9Cavb&x5p=V?jvX;4uzu+dN_xjL|BrV)UP9B~g( zghf%CkE3a|?Q&losGZUPtxvzrL$esiWQ778<}9*X!c@ceI@&XW#eiy1=Q6>^p z0Pe;Lh7mhj*Zev#;?47nt>`Vko(@_+^615h_z*eZ_Du5aVt^chZUFT3(ZlA&T%(1ga6&N)XHwNq4$HY9mbq;3ZsS9zRl&#J# zxvY_E`jTPv8+o$UE%=qcm7?$Xd*L>5n}9CQFmKkbGnYTKbgveY1WuwS*l>rjP1}X* z1o-|UYdk$4_~Hbu1$}T`%9u@5Sni&3JUNX)S@?DDLfQ0%Dn-zuMlH2(FcFi7Uh(|E zhnPpL@O-356C78p&Wjz3YcXUC<;jF-l!KQZ$@w=Ts1mKpOHW4YwgupTCG;T30u?J@ccUwMqM;9lD_&%N+`xG2eMJ%&W!@u5nX$iLCru_&m|yA4>ez;ZNrRIvg;%)C)U_2t8i}*$#Vto%XQhRoHzvFa zcxI;oOry244za1Ly1@yHY#+={SsOU{ytrHoei3LndWJ>y4TyoaaPhB z&j6}q)KG9wFMb2v+B@?8EpQEurlLW{DFg{J)Wgg|9t_g*WmM`x=ISdw1N!#Ogr~D5 zpP@JkC~5Qg$OL!F1Kw(q6?$Skex#lUB}CPBR#r?!%(8WL8!Mi!Aa5E>O)=V@GzfeA zgrg&_JnzX5GH!ziHb1oMvg}*OnhiE7V@YtB7D%i~>B{{^6qm~Og;ZMZ?fzh*t8ROf zbx*6TYf%HgpsW*;#q0nd^++wKYj1A32U5UY>|+i|L43-)GDgx;L&n9NLW=D!*Uoss zbVodXb}~JSW7qFX`$xWmbRUg-CT9uxye0+XtIU2{T4kysuB=i|1lqw%ijnV1(V_42 z9qo8pxi8wjhhab^o@V(8CeV6KK5aD4w{GK!|vH_ z`F3xz^MAY{X!9sqmK<-I?iuYc|8{)7aPhKvVJhfcdO(Nx1lLM#97s0i)j2x(A$hG< zwpYJ7tPyl4cd+X`SxL2BHfDi?EDpHni#2aeEk=Oq9U{E>%pMr{6LA2cGZ>O$kj1;B zs$&jov4~|dgICmp4Il}Ux=)z9t`3%SL+X?%++yKivR{bd09~i0j-6Xgn}NyMSMa>i z?GiinyX~19E;Xo|6tpOzWEs_ho5lbeJQQeu*DqxX)Otq#zCwUXE7O=gz)A5kL=)7! z14k236y1{Z^INQ8$&o%+GXQI;-Qyc!h)c9RBzNE^(IQQV_Xm|7LuJkf6s>6uEZUd- ze){b2hU#cjqF+2)@@(GD>1#7aqR_>q)dV#(x^Q-AImNWW@ z{DOk3VN=%UiG05Eo<(pWwFCC|aTzj{(P2W{%Gic)i}Wr7<^Xf5Bs*72`0&OumbYPF zn5fyN7H5_uRjOIwxJhVD(fwL(w8>P`iU0b}3^u%Mv@&JKg;H{jgB$pKmgbnc!>X&o z>~(Hs>oxqxLT21jv!)GDRqVNGUTaCHbo&;d?39TNrd7u{ZCT9sT2x22b0eG7izg*p zRM;nPlvPf$YTJ0wv+gL2D$%ZelY2AVt!7%?&0lfoNWZv zIrKK9mmjQDJctrNaIR0tl8`psG;d=Hf5Q-eE+hb8VPj*1A)j%xxZCO5H==9nWa@Oa zcf!Ddxm(^(-NAxPHAkEc7DDT9CbJ6I$Je6=Q_(3Fua#lp(FZMAHm_@nq5#B zbKmGM%>^XY0+tOL0E8NcEMlEJTGLSbV=Ns)Rw1m1y0>iAl5&35rMOh1?CtYJUg3d@ zgL%{z0z(DEcooW6(|@?A0(aVnT~AwiftQ8S_2SKQ0U}oSM&_ZLpe1Vdc1BxH$=B+?5zSb3gWt z{tSbh!T1U3BF4C;Q=^Y9cVr@=BuaOUpq~st8oOB0TkkI}t}ibXIWm``!3-Jo+5nxY zbZXnLIF968&FtbzXZC~mdzl`4?Tsp(dv@j9jh3n6&-jd4F>+;x6A*Ps6iJhI1Xk7F zPIeDN9BlW}zi#xAE_9%u*G9Nij3Q|v)%%-OczjU$qxaICH}63su;%4s^WhRl&cu}8 zjgugzV9c7yBvTf9=#b=9QDBXRV1C00AXf6#6^5)Z@?6)H#40uM z6GQTbg0oSA5=`?8=wZ>H!icn5gNPnZN9su^rV+&m7lg_}bMN7p3uWCymh<1!_JJNDhpY7ag5?KWVXn&cUTw_?J?_~dDxL+u$HD#Um+zK6lMB| zco8m~WonM=yCvktIamvaW}@oOC3HHNd}@nouYf`^MZ>GWI)9FqZWPD7EcGE=;QdIF zHimfNy2&sH`S4e9iSiSGT(YF1LCT^jnOQ0r?Wk|z+;ZbSgb1CZu18?ai=7m*kOEec ztjWsI_hnJ9IXHvaFc0Aj%A;NxiFgk*JodM#FYGW2c#L)M-KW3z53-MZI7YMcN+w-4 z8=QWmEuj+GAXQCJ(54N8Y7k3sKE}NR?C}~)CQpAdj?}{TWq9KL(Q)mI zLL}?F^ZfKtvl{uVc4itTq+2+Z`!yHbxm~cS(j<5e2#3!VsV?piy*Cd%SgGp72y)EV zk)kv&i#&`+b;mh}r5CHAbHfSQ54(nF|6ARg#n(XBY?%&g@6PT=Y;ExP;q4D?o{o=x zX^oc*ZI739&cpEj{G?7J|DIWC5gSK9I9>o!6J6OJ6Qs2KDOJ&4M9flOe7;lv2yt}} zs0s%YjIiF|$0e;F+Dez7gX0%66TpcIG%bN}1v!{{WT4c@HFY| zKZ5A~wTs8a0o%**J%yjlB`>Q4gsHWpn*>?>waJ~(K&+*3Fx{gFb#Ychv=?@2EejWg z&e-~FUBIx_iDwHhyDU{I z3@=%C#+$Sq;?3~gZoH?LaM94d<}&DxO;QQgLfkJ#UFt+!X6Q^GC_c?A)q#W*Tstu$ zL`c>N4McJx<8VbPzBNd}7OsAH^wt1@oL~4!l!yX1u~iV^8MuzV+r)}hNF#T&!w_*@ zypFNfxj7&>Ekf(8S|GZyLYUyZ1QJw%=HGV_M2%T%LIhgJ@f$SN!o>-TThx!$qXfRc zqZh|EguLWLuMBg+%9|i%k-mbo2Yd7`_OJQ~DxGWm>v>O8?T_A>JUyA6sOB)K>LP&?rXA_K}Ll7`# zeZ33KT8FwBvb!ITHvjF?VL4G)lGg4jA&Dg)m{B$&g=0bcx8?q#vYJHGd6ye9|LW)O z_G(8B4My#hcqbDBq`p%l;Pf5xBDS|odN`;&HODf5YIe?Qa}(gMynNdty=*bRHqXG6 zuqGo63f_IPb@QZh44sO~g@99{7>Pp}dR0f+3)$`}xXM#nxuu210I+1k9!_)!lk198 z-LgQv43%c)CHbjiv+;WJ`WdgrQCrU_!*5a-Wy3nW1U!XZqerW~OB|HdeJ^{<(Sg*} zi!?F0g=y=)KwwWmF5h4%=WD&^bGgfJwq!bUeJ%^T1^L^Xe>dC;-5C%r<>s}jFN}|% zJel&=3b;tJLgc2oK}G2xm?iG->swl?#zlmrZD2l~Ixg&ywkf#aeDrz5W} zh1A;#5!(ZCzo|xixy^RS$%R&M(AQ z_3kKNVt{((ZcfL78}lyY14qjl0WKDs-ON#>BWaAU?6lxqqYmP5ly1gtMTI> z2~%ddVN=c5E)WmO-&DBqFI0&5MTP$>cNEZQ9lz|WQV7MbH61VwE^*7F3BvM@8xx^r*3b*=IXf599MIrblj*_(Q5|~BhZh{ zC!q1E>kZxvkX>)Vea$&^LBqlM_Y)WsAM`^@W>!cGa@Uv_x)Df*E%rQ*R?DLJZw(n= z`pq@dK1{3N*v#i5wW8E#zxT@brvBgEXzvPgS0+tr{uKI3Uwy&?n|59}fFDo-{+NA| z;%;^r-xwJLAxR-Kc)5JC>Cr-4WDN|HLTCZ=@I(w*a?`_I0!l*$2?y=Fxi9bej02$% zd|g`!Q@sg$&h19*z}N$a1G+T64T}= zpg>n7mA4;9C7AK%=txgfbT@D~u4Tg@w(BvSXkJz|8q+fWSD=J@b08FYNz3 z+KbN=;7qW*1 za_qF)IMs_1l|+5}No}YqyY}#E-t~mLTeL7=Z^t^E4Tsi2Q=c~!dsR{%#V?fgdBfF` z&g@+L)9 z!PYzK3GlGL$&h)thO8s{dh*@+kJ_6}eRwNNUJ8+-hyHplNR9+`Wa{9TCU?#@w{LHw ze!swb;k~tVz*%TSRGRZo%{^~#bliW<4&Tuic&jv9)iyusiugo7V1tlY_X48=%J&vG z7~!rUJ4*MnR2R7?Pni>PN1j>zBIfab{84PFlwYCqIb3><=x=#E4=3{Mi%?Njj_h|p zr7!%bH#;+Qe8^Z!QQIZz1=;*dLHpceoL@oKpY~~V*}XJ(f9-ob6*@&m%kr0c^ zlzY@wUKbQJB}#XbFQT7RAHaXg#VToby6i9ZqeuF~etu*y(EC4FNe;!S~ zf3E)h%oivC;GdbVzajrj1N`kp{bxvuFBj0ye>)rS1^H(#;BUx3Cf2_#L`eVil*7

!QXg)>iNHOc*uXkYa{{qH`V { // List of relative filenames (relative to this test file). Add more entries as needed. diff --git a/tests/unit/pig-metaclasses.spec.ts b/tests/unit/pig-metaclasses.spec.ts index 597d079..59f28fc 100644 --- a/tests/unit/pig-metaclasses.spec.ts +++ b/tests/unit/pig-metaclasses.spec.ts @@ -11,7 +11,7 @@ import { XsDataType, PigItemType, PigItemTypeValue, IProperty, IAProperty, ILink, IEntity, IAnEntity, IRelationship, IARelationship, - Property, AProperty, Link, Entity, AnEntity, Relationship, ARelationship, ASourceLink, ATargetLink } from '../../src/utils/schemas/pig/pig-metaclasses'; + Property, AProperty, Link, Entity, AnEntity, Relationship, ARelationship, ASourceLink, ATargetLink } from '../../src/utils/schemas/pig/ts/pig-metaclasses'; describe("PIG Metaclasses", () => { let Property_input: IProperty; diff --git a/tests/unit/pig-package-constraints.spec.ts b/tests/unit/pig-package-constraints.spec.ts index c9e585e..5970382 100644 --- a/tests/unit/pig-package-constraints.spec.ts +++ b/tests/unit/pig-package-constraints.spec.ts @@ -4,8 +4,8 @@ * License and terms of use: Apache 2.0 (http://www.apache.org/licenses/LICENSE-2.0) */ -import { checkConstraintsForPackage } from '../../src/utils/schemas/pig/pig-package-constraints'; -import { APackage, IAPackage, PigItemType } from '../../src/utils/schemas/pig/pig-metaclasses'; +import { checkConstraintsForPackage } from '../../src/utils/schemas/pig/ts/pig-package-constraints'; +import { APackage, IAPackage, PigItemType } from '../../src/utils/schemas/pig/ts/pig-metaclasses'; describe('PIG Package Constraint Validation', () => { describe('Positive Tests - Valid Packages', () => { From 021d741f51900465a365721b57882d14c116f169 Mon Sep 17 00:00:00 2001 From: "OD-T14S-25\\PCUser" Date: Mon, 19 Jan 2026 18:49:07 +0100 Subject: [PATCH 03/26] index.html files for new server product-information-graph.org --- src/utils/schemas/pig/index.html | 477 ++++++++++++++++++++++++ src/utils/schemas/pig/jsonld/index.html | 71 ++-- src/utils/schemas/pig/jsonld/jsonld.zip | Bin 14482 -> 0 bytes 3 files changed, 515 insertions(+), 33 deletions(-) create mode 100644 src/utils/schemas/pig/index.html delete mode 100644 src/utils/schemas/pig/jsonld/jsonld.zip diff --git a/src/utils/schemas/pig/index.html b/src/utils/schemas/pig/index.html new file mode 100644 index 0000000..0a1bec9 --- /dev/null +++ b/src/utils/schemas/pig/index.html @@ -0,0 +1,477 @@ + + + + + + + + + Product Information Graph (PIG) | CASCaRA | GfSE + + + +

+
+

Product Information Graph

+

A Universal Graph Metamodel for Integrated Product Data

+
+ +
+

Product Information Graph (PIG) is a metamodel for representing and integrating product information from diverse sources into a knowledge graph. PIG enables seamless collaboration between different tools and domains throughout the entire product lifecycle.

+

This site publishes documentation and serves schemata with CORS enabled.

+ +
+

Content

+
    +
  • +

    PIG Documentation: The latest revision as agreed by the CASCaRA Submission Team.
    + • Metamodel
    + • Ontology (in preparation)
    +

    +
  • +
  • +

    JSON-LD Schemata: The versions as agreed by the CASCaRA Submission Team.
    + • Latest
    + • 2026-01-12
    +

    +
  • +
+ +
+ +
+

Key Features

+
+
    +
  • Separation of Concerns: Syntax and Semantics are separated, so that no software updates are needed, when the ontology evolves over time.
  • +
  • Design for transformation: The PIG metamodel assures loss-less transformation between OWL/RDF (Knowledge Graphs), GQL (Property Graphs) and Object-oriented Programming.
  • +
  • Federation: JSON-LD supports dataspaces with federated data under full control of the respective owners.
  • +
  • Multi-Format Support: JSON-LD, RDF/Turtle, and Property Graphs
  • +
  • Strict Validation: JSON Schema Draft-07 and SHACL-based validation
  • +
  • Multi-Language Support: Built-in support for multilingual content with IETF language tags
  • +
  • Versioning: Built-in revision control with pig:revision and pig:priorRevision
  • +
  • Specialization: Class hierarchies through pig:specializes
  • +
+
+
+ +
+

Project and Community

+

PIG is being developed as part of the CASCaRA project (Collaborative Artifact, Specification, Context and Resource Access), an initiative by:

+ +
    +
  • + GfSE e.V. +
    German Society for Systems Engineering
    +
  • +
  • + prostep ivip +
    Association for Product Development
    +
  • +
  • + OMG +
    Object Management Group - CASCaRA RFP approved (2024-12-13)
    +
  • +
+
+ +
+

News

+
    +
  • + 2026-01-12 + Metamodel Implementation +
    Complete implementation in RDF/Turtle and JSON-LD with JSON Schema. Validation with real-world examples successfully completed.
    +
  • +
  • + 2025-12-08 + CASCaRA Initial Submission +
    Initial standard submission to OMG completed. Strong interest from other OMG initiatives.
    +
  • +
  • + 2024-12-13 + OMG RFP Approved +
    Request for Proposal approved by OMG Architecture Board and Technical Committee.
    +
  • +
+
+ +
+

Contact and Contribute

+

Interested in PIG? We're looking for support from companies and software developers!

+ +
+
+

📧 Contact

+

+ Uwe Kaufmann
+ Uwe.Kaufmann@gfse.org | + LinkedIn +

+
+ +
+

📧 Technical Lead

+

+ Dr.-Ing. Oskar von Dungern
+ Oskar.Dungern@gfse.org | + LinkedIn | GitHub +

+

+ Michael Kirsch
+ Michael.Kirsch@em.ag | + LinkedIn +

+
+ +
+

🐙 Repository

+

+ GitHub: CASCaDE-Pages
+ GitHub: Validation
+ Discussions +

+
+
+
+
+ + +
+ + \ No newline at end of file diff --git a/src/utils/schemas/pig/jsonld/index.html b/src/utils/schemas/pig/jsonld/index.html index c792731..4284a17 100644 --- a/src/utils/schemas/pig/jsonld/index.html +++ b/src/utils/schemas/pig/jsonld/index.html @@ -40,11 +40,13 @@ header h1 { font-size: 2.5em; margin-bottom: 10px; + font-weight: 300; } header p { font-size: 1.1em; opacity: 0.9; + font-weight: 300; } .content { @@ -52,23 +54,24 @@ } h2 { - color: #2c3e50; - margin-bottom: 20px; - padding-bottom: 10px; - border-bottom: 2px solid #3498db; + color: #3498db; + margin: 36px 0 10px; + border-top: 2px solid #3498db; + font-weight: 400; } h3 { color: #3498db; - margin: 30px 0 15px; + margin: 24px 0 10px; + font-weight: 400; } - .schema-list { + .resources-list { list-style: none; margin: 20px 0; } - .schema-list li { + .resources-list li { margin: 10px 0; padding: 15px; background: #f8f9fa; @@ -77,19 +80,18 @@ transition: background 0.2s; } - .schema-list li:hover { + .resources-list li:hover { background: #e9ecef; } - .schema-list a { + .resources-list a { color: #2c3e50; text-decoration: none; font-weight: 500; - display: block; font-size: 1.1em; } - .schema-list a:hover { + .resources-list a:hover { color: #3498db; } @@ -119,7 +121,7 @@ } .features li { - margin: 8px 0; + margin: 9px 0; } footer { @@ -166,17 +168,18 @@

PIG JSON-LD Schemata

-

These schemata validate the JSON-LD representation of PIG items and correspond to the - PIG Metamodel. +

These schemata validate the JSON-LD representation of PIG items corresponding to the + PIG Metamodel. Each schema enforces structural constraints, data types, and cardinalities defined in the PIG metamodel, ensuring interoperability and semantic consistency across different tools and organizations.

+

Schemata

PIG Metamodel Class Items

These schemata validate PIG class definitions. Classes are derived from the ontology. In general, each concept in the ontology results in a class of either Property, Link, Entity, or Relationship. A class definition must conform to its respective schema and must have a dcterms:title and optionally a dcterms:description to convey meaning.

-
    +
    • Property.json
      @@ -226,7 +229,7 @@

      PIG Metamodel Instance Items

      conforming to the class definitions above. They include revision control, modification tracking, and properties/links as configured by their respective classes.

      -
        +
        • anEntity.json
          @@ -253,7 +256,7 @@

          PIG Package Item

          This schema validates complete PIG data packages. A package contains a subset of the product information graph bundled for specific purposes such as customer-supplier agreements, milestone deliverables, or change requests. Packages include their own context definitions and maintain referential integrity.

          -
-
+

Key Features

-
    -
  • Design for transformation: The PIG metamodel assures loss-less transformation between OWL/RDF (Knowledge Graphs), GQL (Property Graphs) and Object-oriented Programming
  • -
  • Federation: JSON-LD supports dataspaces with federated data under full control of the respective owners
  • -
  • Multi-user Operation: JSON-LD lends itself for traceable multi-user access and versioning
  • -
  • Wide technology support: Good support by many programming languages including JavaScript, Python, Java and C#
  • -
  • JSON Schema Draft-07 compliant: Industry-standard validation with wide tooling support
  • -
  • Strict validation: Additional properties are not allowed to prevent schema violations
  • -
  • Pattern-based validation: Configurable properties and links use regex patterns with negative lookahead
  • -
  • Multi-language support: IETF language tags (@language) for internationalization
  • -
  • Conditional schemata: If-then logic applies correct validation based on pig:itemType
  • -
  • Modular design: Reusable definitions for each metamodel item type
  • -
  • Package validation: Complete graph validation with both class and instance items
  • -
  • Format validation: Simple datatypes with optinal range limitation, ISO 8601 date-time, URI patterns and CURIE namespace syntax
  • -
+
+
    +
  • Separation of Concerns: Syntax and Semantics are separated, so that no software updates are needed, when the ontology evolves over time.
  • +
  • Design for transformation: The PIG metamodel assures loss-less transformation between OWL/RDF (Knowledge Graphs), GQL (Property Graphs) and Object-oriented Programming.
  • +
  • Federation: JSON-LD supports dataspaces with federated data under full control of the respective owners.
  • +
  • Multi-user Operation: JSON-LD lends itself for traceable multi-user access and versioning.
  • +
  • Wide technology support: Good support by many programming languages including JavaScript, Python, Java and C#.
  • +
  • JSON Schema Draft-07 compliant: Industry-standard validation with wide tooling support.
  • +
  • Strict validation: Additional properties are not allowed to prevent schema violations.
  • +
  • Multi-language support: IETF language tags (@language) for internationalization.
  • +
  • Modular design: Reusable definitions for each metamodel item type.
  • +
  • Package validation: Complete graph validation with both class and instance items.
  • +
  • Format validation: Simple datatypes with optinal range limitation, ISO 8601 date-time, URI patterns and CURIE namespace syntax.
  • +
+

Product Information Graph (PIG)
+ Developed by the CASCaRA (CASCaDE) Initiative
Copyright © 2025 GfSE - Gesellschaft für Systems Engineering e.V.
Licensed under Apache 2.0

- Authors: oskar.dungern@gfse.org | + Author: Oskar.Dungern@gfse.org | GitHub Repository | Report Issues

diff --git a/src/utils/schemas/pig/jsonld/jsonld.zip b/src/utils/schemas/pig/jsonld/jsonld.zip deleted file mode 100644 index 8d88c11d0908993753c58dc78df1aa8bfa5a418c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14482 zcma)j1CV6VmTlSYs_wFF+qUg4+qP}nwr#u1HoI)=SHJo5f4>(qZ|2_E88wpEo1^8(tWaVJ$;7V;~Z*Ar10u2BN^5>3!yeKKc z0)VsrwlFLX9L83r`l8m(}$N*DGT#)1pA%UkPX?RR{zA z{vm=$I~?%<#C`0J8C__9rN0%?Y2vt7IA5O>$a!^G#3iOM_@^KKV_Mq?|@N} zql^frMuv+rl(#x?A29umf5L7oU|@o1*O4cU_fwWlXgSgTj6fEb5c4;7El==5imRv| zHy+Y+f+v4Q1SE->Cp>KG>93zUjKJiSz+Joy_;en-fb6m1F*#2B(FQ*Fu$nl~Gsk%` z(qI{!@__Wtu}9*4#(K2Soa{v)O@$0VbyI!RPz~DRoT^B6=vUpz4y@O_Q#MuwH72{TemE=|*_+nN=WWf1;Zw=*u}IkmAb9U~z=tYL?%NwqOV81MN&z-$qF4mLfvf zNBub6XHya+MJ1R-xz2OR>)~%TO5EC?9#PBZFZYn#z%+~>LiQaajtUz+WyI0e$;sBn z!Yl&R>;*Vd!Y2qW7x%oojLUQ~; zy0@8N?|gTz<(0JsR%;;UqIkApcv-oEXE7D&BC8ot+ zJx0OCXV-qJZ?j;o?)q}yc2_;L$!$HYeo>AdJdfn|?#}p>a{uZLxhE%rxpnjr|3E<0 zS`$hD1ZxfVDHE(T=N0qR{j4Y}zI7B3ZZl#M{N_ZZu*q_ld;fhD*x88s8(Yk3*|uoK zd?|0K`k`ahd`no>H?GQ(VBYg{<~vnVV2x+n#|z<(C|%VJVfC8i}$Fg+S-n4G3n(3YNMeNXRdj3i3yoHh7u^+N0o!e_@#NHHIVTz3w; z?6(9H@c5=N_=p*X&=#%@vr_M|!jB3zw$Z(;Hp7E7klHHko~D|{?pj-zmAot#*FaM z0r(0J&ctgmUpMEmOzSNcR*6Ax@Ff+mUs8b@+O%>~Ntnnqd9yYABX+T!lBh?vhaW*> ze&c#)qkk{-ZqIqkuO)-)u+lapgN@aED*oBx!FMpWT%(vyYtkbuX`SooXVIEA+qZo2 zw+wZDeV+Rki9AC|fq~GPx;#=f3IcU!Cl{NiPWP)JPy3QK$Tu{0kxh|?J_T26Df>QP z%E;{OHz;cc#HaI{Gx*0l5ixxC1aj{@pQjLgFl|g?z(b5dLWcceZS>s` zhNs{wCQNtRfoo&9e2BmlNHQ4Gn;q_lX)Scz7XWVUxR4R*Wz?AIem-2D=mmtI0i;6k z2sC^^#F)VroPp&`VDFkvKB5Bve4^YEY-GUNKB(V#MUEJyX%FDPu@cP;Lw1A*fDded z!X=Qbq!H=|ilOe1-V`8(MWB+8Na5M1U~Ic%@`kV>!SV4gLCfz@g(TL?0(1@2!LD#d zc-9dvXD@$`)*H}oGnK_lC50&>J9;9sSdWTrUfdI)U^Ah%GN2_z>53%C7NnT=@ZlJ! zfwu*LRGTauTM+Oo#y}6@K%0HK0Dfq(lx}E-FxuV8w^D?c#0{TxB&3U=ja|A%>7fKx zO$EXeN5bocfiY)~x>}J()k0o7xL36_LsJ#10C_2fso2g`p1<3OS>&%+buT;4ht9;m z2e5IXH`uIfnOK!&C`7OHlMHu<_Ahm5bee!Ak5JfQ&7G~VRro9s)(@#>0C>-Q|JX$) z)z%9WQZ9k^s3l_w3<;OaLD-0jIt*{V&>4BR+x~cZyl-^Bb?a)$ z)X}L=U-}$l^1}*EPkqu@FB`hn9@I8XFea8t?U3?_Z7|Hslb)lcA2{$mgZv>DUv1>B zS5}X9O>-Ko=x6hj6Pgo@`leMaT=C>PRlrIDj5BM<;Muo4sjC~)s=h;sWY>j`0{bDfrg1j^V3HrE^8O`xfglaym$X(B(M?JmEU7)eA z(zNrtt$P?vNs7Z3RhcjJV=7CU<(UT2^Ua(DUpK(L{Af4%y*y*J#(M(Ph9d1n>itHn z{P2h=4r7ti|NQj6p-E{xY6esoqx)=Ry^tPYQP)MeHfy3RZ4-fY-e!&XB_r=Yignx5$#=oTT zNPp6Jc|(hz4yM*t_9mt_|1Cj>eC6_gLb&=*F0b~L%OiNvOn=fU0jcsg#GMB>p!luw z%_39B4b^0D&x`P#%Ol03I7`S&&x?L`3dpP5UM8Y|@a^CR_hZ2wJsoae-9BysewcA3 zeI!hYngdjp%3tSfdD9SFtSo2~62J4t)ZV~(pRF~DR9+ZSKxbIihWNEsa}Ev1rXUW+ zj0?uNn58UtzVG$#6>sjuIy+cILHcvI=H%ifDSUst)9cfrLy`CFdtR}=S}*k93by{d z((Vq(Me(X9$eH~?xoF_Fl}%^>D5u!RP%1b;(hZRexhIc!q3~SM{Q=`Q`V$_&6;h`r`4jIQ84kf&iZ=G?wAKkcR|J7QSIc+4+3sU)UMpq(%G`pxir8 zA|Zj?nlmzH()>2EKnBRUtLjO}&CKUgZd$T_PYDsKB{G5^W>HQ^1L`48vBy{_26+cW zJN)#P`_Sh!TXw}65&Yx|9fitXfPhiRiAwH!)X?NmUNvs$X`#=(0rQjiff}i%!Zs;P z$J~y|kRA~BgEw<`dFQqMj_RgW~S)K!mgtPde);4I+;YwF>uUcN7yk zUP2rpp;mYZgGk*{euNTAl4x~fjCsQhNDGl`(5ONBwth$B>G*gD(L@hsR;^;vC$_w2 z>?eaoDhV_Fs~-|dXs7RW-_3D+Yg!(GEOI;#6oqW2Wcs2WjX_6haF{FJPJC+>PtcK- z>Im@?ERBWcp@WD?LEvj#7@JOal-t9wlKgWBKgzSK8eoTI_S<$+P+@v>QfolX0A?5C zfmJGOxgl8nII?yUXwgMOb(Xs~;^mgWfB9PPePf4f-F##%XYc3T_2WXN z+8O8O5*tm8zkYn{v{vL?Y)VuAgK1Il4v0SU&?1=+yn}5wvXZ7~rHmO=AyHYy5(jo_ z40FjIM|c{7%Hkt`Xt}wknMBb=HDDyR4vmHTvw`VayNY>gM(jC~gSk)Xtg~FcC;hUn zF`zR$X8XlKUb%*Q@gt21!MaZQ&99XQd?NFD<$TEY#ZtLEypa>FB&IzHdz6V3nAJ8K zvGrxLTKU!qM^*E650%g?vjHZc(oW7wM_$;5U^=N~2`wGP=4j!3zp6S?u>u07L|CZa z^)Ob?a+EG|?nh{%m-R}?zSfB8BOHERbejmg| zU5a?mze`sbz`Ix~asm$j50tR~|f56)vs4KKjc$xhoos=p>#L|#i zoOw!?T-0Kj4daAOu@G5%9~lH{^MF(V0GucQskEDlAJS?B?oti2W7%ux}p<(C+rx zW#NHQ{Z1w`9ur|qk^S}l2E`(H$)L{FhAZa{;1lk*@AHZ~3nwYM<=Jgi!=A2|#=11c zgrVVWOIjQ^&iK=>6P`cXWMLkS#R&!gaESZ2HkJR2HbH-B)Bn(5%KH+eKY^8PU^=O? zX0;}a;7K#>jY7B zlU!y+0fE$-yux5y<^FiD(vv+E^`I{)WDJqHoZ`WX>M@;qw{F6tFoP?L&$#)~49xP7 zSFd7OsB5ZGRhM%WDMCM?NDfn*AR5X^9oW+8-~Zlk-SG~5xn09a3<+jkfX8sY)~rq& zO=u#N9q9$u4B&;9-E}V=_4907Sps;zD{no^h~=5|ntHd0Z3_?Z;1C`Oc(bu)KR}6B=NmpPT2*7U> zyPAlUamO{F)k#Mo9upOgiFs4-mxaI=tAhk9cmEX_Hl1;mr@d8bIhgE2mT?oC0L8Qc zg5c151Oa<_RqcmdL>jrNKW~~P_Ntl3M%)V~#v}m%=vD@M13eZ(m{$kzE{XnT@OQb6U9wen!WBymy0wOO;w|Tq`R{uF^v_UxTs5PEvCVbayWsJZ-ZZEIS_pRgE;%J za4?hq{>slNtHa*^U;w`Gk}8rlS`k&9j0TLu;wM**u0@4j=3v{(W?jN_?b?{>^c87n zvGklfA=28B2Sd-K!@}HHt8d}&K3hyGuj3yySB9=;I;n1OI~wOF8|LMf*FlBlb*j0-%U$O~rdxw-w*s2}8W5UI zbJ{v=_9%{Ms<^o*zL3SbA(;5Yv7VF>R34Y^WQANCH*inChYO|H+Ld^t8j*@g<^ zMuqbDF_#Yd!H2mw7)s&7Ztk&^ux?z~cFX(zB71#btA9S`DUTv;WVzpgybS;Y$TnF= z0Ud)clnI@EtY&vjEn+N+6YSJvjHTW4>P%wEC7&t(5&b?xpgy8rO4auW_)W2ynAtZU zh}eTjAI&nOYVpc4)G_q>(&m+uY~dlkkL5vG?~?7Jiy)oJG#(MNEG+ZfmnwJ@6ntZ0 zW2fSD1)@QwGrw`$Ou_W-@QtLz#upLMp%&-AtX?E~* zzs?0q(Eo~mx?9SQyru~?W#>4qZ77bWMeo%C%C_yZ6Ypb73_Bp{w7$>=AMRXjO&~ri zXx=`<`$m5mD_g)Ov9k(}eQ+BeLgg|7^qw!{GG;Hm#~a9KMDpt2SyhW)#6Mb}5k8M` z;g2kbc(_lV36(0#DX}S30fkhcTtbKMFe@u-h6lPL0?wa>VbJ zuQLMZT76MU2#xxfCu%HNv@dcKMD~3c3Wj!a^ls}jVc)6LE{W7Gb;@NdW&b#$rnecm z?$*f7y;Vbe+!ecCLAEj%?e`S{8&5k|F^e%NfE7CY9`PEX2Q&><}&^kKxW!{?AQ_$(IbVEpfPg4{e1@GElWi;NxFVsZs?+g0hmfH*PQSfw>3TQYW~U^9jDxxc*|S-!F&am^^6GN~w+G=SjKaSBdgK6v z)?~VhgdH)1kke^u1kJKmV%|I8GuZJyI+2R`Y( z)F!FF3T`>4F;h#T3IzDZvUVgS?rbR-@YflF3H+LLj3x{g}cV@kU&MyeS-+6&puQ8h%Bl#of`x2nu} zB0O_0<~dVvNXwWWlr~$akjs{%b+bryDu1((GJiXF+;E_Bq>aP8q)Ap5f~N9dlcs?d zT4AiMPKBZr=Kvp&Bmm?z)PlBTbpPJ(y#|KjNS+%^KaUpScSmj>Lq-}x1@qeFV})`E z-!Auf=!O1Sqw_Eq!v@w_UrTE)8ZvNoET^a?Q+gEqt?io3sV1q9524aE@+Nu^2jLbe zyc`Ao=HR9vAbr}03979mUN*ahdF|eF)*RS2|y8f z4}jH|>H*^!3$#>**fVv2#gc!X_ik#GOntM-aakr{1EIEHd2>aYyXz{Z(#pbtKR)gm zYc1GWm-eM)w1V)JJwS@k5=GbdgzwgsvR@!UlxEN|g6T3pCYs~pSFWapD~#16o`|$zAXfDi2O}ZW z@gXXbCtUsRLmJXrPo&;Sc0x|X07mVv#M!^#Ga5`eo{6>5IY7;dU91f3^KH*2mJp|b z?$$6{^Y*SwhPpTENkY`FUr#@m?N=KztGQG#A?OwLG;k)Y?I<5*A2OHjPDEZZuMS(W zO-vkJ(B&LyK%&&VsI$S4fagR-67f&QsN_m>uDHVsfYO{EKPo`Mnvr7*S!eynV^t1Z zki|qU^c9Dro0F7k*8E@WEDjG?9@T=Y9F^~a-s%hiKh)ob*3&eu^a;>#&0ye2XVu8Q z?bUKm2jKw(9fB-{%Jh!8Qa=~;(COm!cG~Ziw4lxc2cGZ;e!5B|`?S$g<8tW3^dRUK zUQNRYIPsFH7IrH`*-@-z4}pMvkr5He^6h*p2Eg`D1k%RC_f ze>A{vI}xn~P#4U+hYQ5P8q%wJ{W$aE$l9Cavb&x5p=V?jvX;4uzu+dN_xjL|BrV)UP9B~g( zghf%CkE3a|?Q&losGZUPtxvzrL$esiWQ778<}9*X!c@ceI@&XW#eiy1=Q6>^p z0Pe;Lh7mhj*Zev#;?47nt>`Vko(@_+^615h_z*eZ_Du5aVt^chZUFT3(ZlA&T%(1ga6&N)XHwNq4$HY9mbq;3ZsS9zRl&#J# zxvY_E`jTPv8+o$UE%=qcm7?$Xd*L>5n}9CQFmKkbGnYTKbgveY1WuwS*l>rjP1}X* z1o-|UYdk$4_~Hbu1$}T`%9u@5Sni&3JUNX)S@?DDLfQ0%Dn-zuMlH2(FcFi7Uh(|E zhnPpL@O-356C78p&Wjz3YcXUC<;jF-l!KQZ$@w=Ts1mKpOHW4YwgupTCG;T30u?J@ccUwMqM;9lD_&%N+`xG2eMJ%&W!@u5nX$iLCru_&m|yA4>ez;ZNrRIvg;%)C)U_2t8i}*$#Vto%XQhRoHzvFa zcxI;oOry244za1Ly1@yHY#+={SsOU{ytrHoei3LndWJ>y4TyoaaPhB z&j6}q)KG9wFMb2v+B@?8EpQEurlLW{DFg{J)Wgg|9t_g*WmM`x=ISdw1N!#Ogr~D5 zpP@JkC~5Qg$OL!F1Kw(q6?$Skex#lUB}CPBR#r?!%(8WL8!Mi!Aa5E>O)=V@GzfeA zgrg&_JnzX5GH!ziHb1oMvg}*OnhiE7V@YtB7D%i~>B{{^6qm~Og;ZMZ?fzh*t8ROf zbx*6TYf%HgpsW*;#q0nd^++wKYj1A32U5UY>|+i|L43-)GDgx;L&n9NLW=D!*Uoss zbVodXb}~JSW7qFX`$xWmbRUg-CT9uxye0+XtIU2{T4kysuB=i|1lqw%ijnV1(V_42 z9qo8pxi8wjhhab^o@V(8CeV6KK5aD4w{GK!|vH_ z`F3xz^MAY{X!9sqmK<-I?iuYc|8{)7aPhKvVJhfcdO(Nx1lLM#97s0i)j2x(A$hG< zwpYJ7tPyl4cd+X`SxL2BHfDi?EDpHni#2aeEk=Oq9U{E>%pMr{6LA2cGZ>O$kj1;B zs$&jov4~|dgICmp4Il}Ux=)z9t`3%SL+X?%++yKivR{bd09~i0j-6Xgn}NyMSMa>i z?GiinyX~19E;Xo|6tpOzWEs_ho5lbeJQQeu*DqxX)Otq#zCwUXE7O=gz)A5kL=)7! z14k236y1{Z^INQ8$&o%+GXQI;-Qyc!h)c9RBzNE^(IQQV_Xm|7LuJkf6s>6uEZUd- ze){b2hU#cjqF+2)@@(GD>1#7aqR_>q)dV#(x^Q-AImNWW@ z{DOk3VN=%UiG05Eo<(pWwFCC|aTzj{(P2W{%Gic)i}Wr7<^Xf5Bs*72`0&OumbYPF zn5fyN7H5_uRjOIwxJhVD(fwL(w8>P`iU0b}3^u%Mv@&JKg;H{jgB$pKmgbnc!>X&o z>~(Hs>oxqxLT21jv!)GDRqVNGUTaCHbo&;d?39TNrd7u{ZCT9sT2x22b0eG7izg*p zRM;nPlvPf$YTJ0wv+gL2D$%ZelY2AVt!7%?&0lfoNWZv zIrKK9mmjQDJctrNaIR0tl8`psG;d=Hf5Q-eE+hb8VPj*1A)j%xxZCO5H==9nWa@Oa zcf!Ddxm(^(-NAxPHAkEc7DDT9CbJ6I$Je6=Q_(3Fua#lp(FZMAHm_@nq5#B zbKmGM%>^XY0+tOL0E8NcEMlEJTGLSbV=Ns)Rw1m1y0>iAl5&35rMOh1?CtYJUg3d@ zgL%{z0z(DEcooW6(|@?A0(aVnT~AwiftQ8S_2SKQ0U}oSM&_ZLpe1Vdc1BxH$=B+?5zSb3gWt z{tSbh!T1U3BF4C;Q=^Y9cVr@=BuaOUpq~st8oOB0TkkI}t}ibXIWm``!3-Jo+5nxY zbZXnLIF968&FtbzXZC~mdzl`4?Tsp(dv@j9jh3n6&-jd4F>+;x6A*Ps6iJhI1Xk7F zPIeDN9BlW}zi#xAE_9%u*G9Nij3Q|v)%%-OczjU$qxaICH}63su;%4s^WhRl&cu}8 zjgugzV9c7yBvTf9=#b=9QDBXRV1C00AXf6#6^5)Z@?6)H#40uM z6GQTbg0oSA5=`?8=wZ>H!icn5gNPnZN9su^rV+&m7lg_}bMN7p3uWCymh<1!_JJNDhpY7ag5?KWVXn&cUTw_?J?_~dDxL+u$HD#Um+zK6lMB| zco8m~WonM=yCvktIamvaW}@oOC3HHNd}@nouYf`^MZ>GWI)9FqZWPD7EcGE=;QdIF zHimfNy2&sH`S4e9iSiSGT(YF1LCT^jnOQ0r?Wk|z+;ZbSgb1CZu18?ai=7m*kOEec ztjWsI_hnJ9IXHvaFc0Aj%A;NxiFgk*JodM#FYGW2c#L)M-KW3z53-MZI7YMcN+w-4 z8=QWmEuj+GAXQCJ(54N8Y7k3sKE}NR?C}~)CQpAdj?}{TWq9KL(Q)mI zLL}?F^ZfKtvl{uVc4itTq+2+Z`!yHbxm~cS(j<5e2#3!VsV?piy*Cd%SgGp72y)EV zk)kv&i#&`+b;mh}r5CHAbHfSQ54(nF|6ARg#n(XBY?%&g@6PT=Y;ExP;q4D?o{o=x zX^oc*ZI739&cpEj{G?7J|DIWC5gSK9I9>o!6J6OJ6Qs2KDOJ&4M9flOe7;lv2yt}} zs0s%YjIiF|$0e;F+Dez7gX0%66TpcIG%bN}1v!{{WT4c@HFY| zKZ5A~wTs8a0o%**J%yjlB`>Q4gsHWpn*>?>waJ~(K&+*3Fx{gFb#Ychv=?@2EejWg z&e-~FUBIx_iDwHhyDU{I z3@=%C#+$Sq;?3~gZoH?LaM94d<}&DxO;QQgLfkJ#UFt+!X6Q^GC_c?A)q#W*Tstu$ zL`c>N4McJx<8VbPzBNd}7OsAH^wt1@oL~4!l!yX1u~iV^8MuzV+r)}hNF#T&!w_*@ zypFNfxj7&>Ekf(8S|GZyLYUyZ1QJw%=HGV_M2%T%LIhgJ@f$SN!o>-TThx!$qXfRc zqZh|EguLWLuMBg+%9|i%k-mbo2Yd7`_OJQ~DxGWm>v>O8?T_A>JUyA6sOB)K>LP&?rXA_K}Ll7`# zeZ33KT8FwBvb!ITHvjF?VL4G)lGg4jA&Dg)m{B$&g=0bcx8?q#vYJHGd6ye9|LW)O z_G(8B4My#hcqbDBq`p%l;Pf5xBDS|odN`;&HODf5YIe?Qa}(gMynNdty=*bRHqXG6 zuqGo63f_IPb@QZh44sO~g@99{7>Pp}dR0f+3)$`}xXM#nxuu210I+1k9!_)!lk198 z-LgQv43%c)CHbjiv+;WJ`WdgrQCrU_!*5a-Wy3nW1U!XZqerW~OB|HdeJ^{<(Sg*} zi!?F0g=y=)KwwWmF5h4%=WD&^bGgfJwq!bUeJ%^T1^L^Xe>dC;-5C%r<>s}jFN}|% zJel&=3b;tJLgc2oK}G2xm?iG->swl?#zlmrZD2l~Ixg&ywkf#aeDrz5W} zh1A;#5!(ZCzo|xixy^RS$%R&M(AQ z_3kKNVt{((ZcfL78}lyY14qjl0WKDs-ON#>BWaAU?6lxqqYmP5ly1gtMTI> z2~%ddVN=c5E)WmO-&DBqFI0&5MTP$>cNEZQ9lz|WQV7MbH61VwE^*7F3BvM@8xx^r*3b*=IXf599MIrblj*_(Q5|~BhZh{ zC!q1E>kZxvkX>)Vea$&^LBqlM_Y)WsAM`^@W>!cGa@Uv_x)Df*E%rQ*R?DLJZw(n= z`pq@dK1{3N*v#i5wW8E#zxT@brvBgEXzvPgS0+tr{uKI3Uwy&?n|59}fFDo-{+NA| z;%;^r-xwJLAxR-Kc)5JC>Cr-4WDN|HLTCZ=@I(w*a?`_I0!l*$2?y=Fxi9bej02$% zd|g`!Q@sg$&h19*z}N$a1G+T64T}= zpg>n7mA4;9C7AK%=txgfbT@D~u4Tg@w(BvSXkJz|8q+fWSD=J@b08FYNz3 z+KbN=;7qW*1 za_qF)IMs_1l|+5}No}YqyY}#E-t~mLTeL7=Z^t^E4Tsi2Q=c~!dsR{%#V?fgdBfF` z&g@+L)9 z!PYzK3GlGL$&h)thO8s{dh*@+kJ_6}eRwNNUJ8+-hyHplNR9+`Wa{9TCU?#@w{LHw ze!swb;k~tVz*%TSRGRZo%{^~#bliW<4&Tuic&jv9)iyusiugo7V1tlY_X48=%J&vG z7~!rUJ4*MnR2R7?Pni>PN1j>zBIfab{84PFlwYCqIb3><=x=#E4=3{Mi%?Njj_h|p zr7!%bH#;+Qe8^Z!QQIZz1=;*dLHpceoL@oKpY~~V*}XJ(f9-ob6*@&m%kr0c^ zlzY@wUKbQJB}#XbFQT7RAHaXg#VToby6i9ZqeuF~etu*y(EC4FNe;!S~ zf3E)h%oivC;GdbVzajrj1N`kp{bxvuFBj0ye>)rS1^H(#;BUx3Cf2_#L`eVil*7

!QXg)>iNHOc*uXkYa{{qH`V Date: Mon, 19 Jan 2026 23:44:30 +0100 Subject: [PATCH 04/26] JSON-LD schemata are now loaded from schema files found in the same directory. --- .../import/jsonld/import-package-jsonld.ts | 4 +- src/utils/schemas/pig/jsonld/aPackage.json | 43 +- .../schemas/pig/jsonld/aRelationship.json | 24 +- .../schemas/pig/jsonld/pig-schemata-jsonld.ts | 910 +++++------------- .../pig-schemata-jsonld.ts.goodButReplaced | 709 ++++++++++++++ src/utils/schemas/pig/ts/pig-metaclasses.ts | 1 + .../schemas/pig/ts/pig-package-constraints.ts | 2 +- tests/unit/import-jsonld.spec.ts | 2 +- 8 files changed, 989 insertions(+), 706 deletions(-) create mode 100644 src/utils/schemas/pig/jsonld/pig-schemata-jsonld.ts.goodButReplaced diff --git a/src/utils/import/jsonld/import-package-jsonld.ts b/src/utils/import/jsonld/import-package-jsonld.ts index 66b6ada..2e010ed 100644 --- a/src/utils/import/jsonld/import-package-jsonld.ts +++ b/src/utils/import/jsonld/import-package-jsonld.ts @@ -45,9 +45,9 @@ export async function importJSONLD(source: string | File | Blob): Promise } // ✅ Validate entire JSON-LD document structure - const isValidPackage = SCH_LD.validatePackageLD(doc); + const isValidPackage = await SCH_LD.validatePackageLD(doc); if (!isValidPackage) { - const errors = SCH_LD.getValidatePackageLDErrors(); + const errors = await SCH_LD.getValidatePackageLDErrors(); logger.error('JSON-LD package validation failed:', errors); return Msg.create(697, errors); } diff --git a/src/utils/schemas/pig/jsonld/aPackage.json b/src/utils/schemas/pig/jsonld/aPackage.json index fc6604c..cbb05de 100644 --- a/src/utils/schemas/pig/jsonld/aPackage.json +++ b/src/utils/schemas/pig/jsonld/aPackage.json @@ -71,7 +71,7 @@ "dcterms:creator": { "type": "string", "description": "Optional package creator" - } + }, "@graph": { "type": "array", "minItems": 0, @@ -201,23 +201,28 @@ }, "required": [ "@context", "@graph" ], "additionalProperties": true, - "$defs": { - "languageValue": { - "type": "object", - "required": [ "@value" ], - "properties": { - "@value": { - "type": "string", - "description": "The actual text content" - }, - "@language": { - "type": "string", - "pattern": "^[a-z]{2}(-[A-Z]{2})?$", - "description": "IETF language tag (e.g., 'en', 'de', 'en-US')" - } - }, - "additionalProperties": false, - "description": "Multi-language text value with optional language tag" + "$defs": { + "idString": { + "type": "string", + "pattern": "^(?:[A-Za-z0-9_\\-]+:[^:\\s]+|https?:\\/\\/[^\\s]+)$", + "description": "Valid identifier format: namespace:name or full URI (e.g., 'pig:Property', 'http://example.org/id')" + }, + "languageValue": { + "type": "object", + "required": [ "@value" ], + "properties": { + "@value": { + "type": "string", + "description": "The actual text content" + }, + "@language": { + "type": "string", + "pattern": "^[a-z]{2}(-[A-Z]{2})?$", + "description": "IETF language tag (e.g., 'en', 'de', 'en-US')" } + }, + "additionalProperties": false, + "description": "Multi-language text value with optional language tag" } -} \ No newline at end of file + } +} diff --git a/src/utils/schemas/pig/jsonld/aRelationship.json b/src/utils/schemas/pig/jsonld/aRelationship.json index f54455e..31e9829 100644 --- a/src/utils/schemas/pig/jsonld/aRelationship.json +++ b/src/utils/schemas/pig/jsonld/aRelationship.json @@ -154,28 +154,6 @@ "@type", "dcterms:modified" ], - "anyOf": [ - { - "required": [ "dcterms:title" ], - "properties": { - "dcterms:title": { - "type": "array", - "minItems": 1 - } - }, - "description": "Must have at least one title" - }, - { - "required": [ "dcterms:description" ], - "properties": { - "dcterms:description": { - "type": "array", - "minItems": 1 - } - }, - "description": "Must have at least one description" - } - ], "additionalProperties": false, "$defs": { "idString": { @@ -201,4 +179,4 @@ "description": "Multi-language text value with optional language tag" } } -} \ No newline at end of file +} diff --git a/src/utils/schemas/pig/jsonld/pig-schemata-jsonld.ts b/src/utils/schemas/pig/jsonld/pig-schemata-jsonld.ts index be0e857..b04d805 100644 --- a/src/utils/schemas/pig/jsonld/pig-schemata-jsonld.ts +++ b/src/utils/schemas/pig/jsonld/pig-schemata-jsonld.ts @@ -10,700 +10,290 @@ * We appreciate any correction, comment or contribution as Github issue (https://github.com/GfSE/CASCaDE-Reference-Implementation/issues) * * Design decisions: + * - the JSON-LD schemata are provided in addition to the JSON schemata (pig-schemata-json.ts); + * the former validate incoming JSON-LD documents before transformation, + * and the latter are used after transformation to internal representation, before an item is instantiated. + * - this allows separate validation of incoming/outgoing JSON-LD documents * - use JSON Schema draft-07 (widely supported) * - use ajv for validation (fast, popular) * - these schemas validate JSON-LD documents (@graph, @context, @id, @type) - * - separate from internal JSON schemas (pig-schemata.ts) + * - schemata are loaded from external JSON files in the same directory * * Limitations: * - xs:datatype values are only pattern-validated here; specific accepted values are validated in code * - further constraints (e.g. maxCount >= minCount) are validated in code * - eligible values in Property only for string values; other datatypes to be implemented * - * ToDo: - * - load schemata from external files, as soon as a server with CORS enabled is available + * Schema files: + * - Property.json + * - Link.json + * - Entity.json + * - Relationship.json + * - anEntity.json + * - aRelationship.json + * - aPackage.json */ import { ajv } from '../../../../plugins/ajv'; +import { LIB } from '../../../lib/helpers'; +import * as path from 'path'; -const SCHEMA_PATH = 'http://product-information-graph.org/schema/2026-01-12/jsonld/'; -const ID_NAME_PATTERN = '^(?:[A-Za-z0-9_\\-]+:[^:\\s]+|https?:\\/\\/[^\\s]+)$'; +export const SCHEMA_PATH = 'http://product-information-graph.org/schema/2026-01-12/jsonld/'; -/* Shared JSON-LD definitions */ -const JSONLD_DEFS = { - idString: { - type: 'string', - pattern: ID_NAME_PATTERN - }, - idObject: { - type: 'object', - required: ['@id'], - properties: { - '@id': { $ref: '#/$defs/idString' } - }, - additionalProperties: false - }, - languageValue: { - type: 'object', - required: ['@value'], - properties: { - '@value': { type: 'string' }, - '@language': { type: 'string' } - }, - additionalProperties: false +// Schema file names (must match files in this directory) +const SCHEMA_FILES = { + Property: 'Property.json', + Link: 'Link.json', + Entity: 'Entity.json', + Relationship: 'Relationship.json', + AnEntity: 'anEntity.json', + ARelationship: 'aRelationship.json', + APackage: 'aPackage.json' +} as const; + +// Type for schema keys +type SchemaKey = keyof typeof SCHEMA_FILES; + +// Cache for loaded schemas +const schemaCache: Partial> = {}; + +/** + * Load a JSON schema from file + * @param schemaKey - Key identifying the schema (e.g., 'Property', 'Link') + * @returns Promise resolving to the schema object + */ +async function loadSchema(schemaKey: SchemaKey): Promise { + // Return cached schema if available + if (schemaCache[schemaKey]) { + return schemaCache[schemaKey]; } -}; -/* PROPERTY_LD_SCHEMA: validates JSON-LD representation of IProperty */ -const PROPERTY_LD_SCHEMA = { - $schema: 'http://json-schema.org/draft-07/schema#', - $id: `${SCHEMA_PATH}Property`, - type: 'object', - properties: { - '@id': { $ref: '#/$defs/idString' }, - '@type': { $ref: '#/$defs/idString' }, - 'pig:specializes': { $ref: '#/$defs/idObject' }, - 'pig:itemType': { - type: 'object', - required: ['@id'], - properties: { - '@id': { - type: 'string', - enum: ['pig:Property'], - description: 'The PigItemType for pig:Property' - } - }, - additionalProperties: false - }, - 'dcterms:title': { - type: 'array', - minItems: 1, - items: { $ref: '#/$defs/languageValue' } - }, - 'dcterms:description': { - type: 'array', - minItems: 1, - items: { $ref: '#/$defs/languageValue' } - }, - 'sh:datatype': { $ref: '#/$defs/idObject' }, - 'sh:minCount': { type: 'number' }, - 'sh:maxCount': { type: 'number' }, - 'sh:maxLength': { type: 'number' }, - 'sh:minInclusive': { type: 'number' }, - 'sh:maxInclusive': { type: 'number' }, - 'sh:pattern': { type: 'string' }, - 'pig:unit': { type: 'string' }, - 'sh:defaultValue': { type: 'string' }, - 'pig:eligibleValue': { - type: 'array', - items: { - type: 'object', - required: ['@id', 'dcterms:title'], - properties: { - '@id': { $ref: '#/$defs/idString' }, - 'dcterms:title': { - type: 'array', - minItems: 1, - items: { $ref: '#/$defs/languageValue' } - } - }, - additionalProperties: false - } - }, - 'pig:composedProperty': { - type: 'array', - items: { $ref: '#/$defs/idObject' } + const filename = SCHEMA_FILES[schemaKey]; + const schemaPath = path.join(__dirname, filename); + + try { + // Use LIB.readFileAsText to support both Node and browser + const rsp = await LIB.readFileAsText(schemaPath); + + if (!rsp.ok) { + throw new Error(`Failed to load schema ${filename}: ${rsp.statusText}`); } + + const schema = JSON.parse(rsp.response as string); + + // Cache the schema + schemaCache[schemaKey] = schema; + + return schema; + } catch (error) { + const msg = error instanceof Error ? error.message : String(error); + throw new Error(`Error loading schema ${filename}: ${msg}`); + } +} + +/** + * Load all schemas from JSON files + * @returns Promise resolving to an object with all loaded schemas + */ +async function loadAllSchemas(): Promise> { + const schemas = {} as Record; + + for (const key of Object.keys(SCHEMA_FILES) as SchemaKey[]) { + schemas[key] = await loadSchema(key); + } + + return schemas; +} + +/** + * Initialize and register all schemas with AJV + * Must be called before using any validators + */ +async function initializeSchemas(): Promise { + const schemas = await loadAllSchemas(); + + // Register all schemas with AJV + ajv.addSchema(schemas.Property); + ajv.addSchema(schemas.Link); + ajv.addSchema(schemas.Entity); + ajv.addSchema(schemas.Relationship); + ajv.addSchema(schemas.AnEntity); + ajv.addSchema(schemas.ARelationship); + ajv.addSchema(schemas.APackage); +} + +// Initialize schemas on module load +let initializationPromise: Promise | null = null; + +function ensureInitialized(): Promise { + if (!initializationPromise) { + initializationPromise = initializeSchemas(); + } + return initializationPromise; +} + +/** + * Compiled validators (lazy-loaded) + */ +let validatePropertyLD: any = null; +let validateLinkLD: any = null; +let validateEntityLD: any = null; +let validateRelationshipLD: any = null; +let validateAnEntityLD: any = null; +let validateARelationshipLD: any = null; +let validatePackageLD: any = null; + +/** + * Get or compile a validator + */ +async function getValidator(schemaKey: SchemaKey): Promise { + await ensureInitialized(); + + const schema = await loadSchema(schemaKey); + + // Check if already compiled + switch (schemaKey) { + case 'Property': + if (!validatePropertyLD) validatePropertyLD = ajv.compile(schema); + return validatePropertyLD; + case 'Link': + if (!validateLinkLD) validateLinkLD = ajv.compile(schema); + return validateLinkLD; + case 'Entity': + if (!validateEntityLD) validateEntityLD = ajv.compile(schema); + return validateEntityLD; + case 'Relationship': + if (!validateRelationshipLD) validateRelationshipLD = ajv.compile(schema); + return validateRelationshipLD; + case 'AnEntity': + if (!validateAnEntityLD) validateAnEntityLD = ajv.compile(schema); + return validateAnEntityLD; + case 'ARelationship': + if (!validateARelationshipLD) validateARelationshipLD = ajv.compile(schema); + return validateARelationshipLD; + case 'APackage': + if (!validatePackageLD) validatePackageLD = ajv.compile(schema); + return validatePackageLD; + default: + throw new Error(`Unknown schema key: ${schemaKey}`); + } +} + +/** + * Public API - returns promises that resolve to validators + */ +export const SCH_LD = { + // Lazy-loading getters for validators + async getPropertyValidator() { + return await getValidator('Property'); }, - required: ['@id', 'pig:itemType', 'dcterms:title', 'sh:datatype'], - oneOf: [ - { required: ['@type'] }, - { required: ['pig:specializes'] } - ], - additionalProperties: false, - $defs: JSONLD_DEFS -}; -/* LINK_LD_SCHEMA: validates JSON-LD representation of ILink */ -const LINK_LD_SCHEMA = { - $schema: 'http://json-schema.org/draft-07/schema#', - $id: `${SCHEMA_PATH}Link`, - type: 'object', - properties: { - '@id': { $ref: '#/$defs/idString' }, - '@type': { $ref: '#/$defs/idString' }, - 'pig:specializes': { $ref: '#/$defs/idObject' }, - 'pig:itemType': { - type: 'object', - required: ['@id'], - properties: { - '@id': { - type: 'string', - enum: ['pig:Link'], - description: 'The PigItemType for pig:Property' - } - }, - additionalProperties: false - }, - 'dcterms:title': { - type: 'array', - minItems: 1, - items: { $ref: '#/$defs/languageValue' } - }, - 'dcterms:description': { - type: 'array', - items: { $ref: '#/$defs/languageValue' } - }, - 'pig:eligibleEndpoint': { - type: 'array', - minItems: 1, - items: { $ref: '#/$defs/idObject' } - } + async getLinkValidator() { + return await getValidator('Link'); }, - required: ['@id', 'pig:itemType', 'dcterms:title', 'pig:eligibleEndpoint'], - oneOf: [ - { required: ['@type'] }, - { required: ['pig:specializes'] } - ], - additionalProperties: false, - $defs: JSONLD_DEFS -}; - -/* ENTITY_LD_SCHEMA: validates JSON-LD representation of IEntity */ -const ENTITY_LD_SCHEMA = { - $schema: 'http://json-schema.org/draft-07/schema#', - $id: `${SCHEMA_PATH}Entity`, - type: 'object', - properties: { - '@id': { $ref: '#/$defs/idString' }, - '@type': { $ref: '#/$defs/idString' }, - 'pig:specializes': { $ref: '#/$defs/idObject' }, - 'pig:itemType': { - type: 'object', - required: ['@id'], - properties: { - '@id': { - type: 'string', - enum: ['pig:Entity'], - description: 'The PigItemType for pig:Property' - } - }, - additionalProperties: false - }, - 'dcterms:title': { - type: 'array', - items: { $ref: '#/$defs/languageValue' } - }, - 'dcterms:description': { - type: 'array', - items: { $ref: '#/$defs/languageValue' } - }, - 'pig:eligibleProperty': { - type: 'array', - items: { $ref: '#/$defs/idObject' } - }, - 'pig:eligibleTargetLink': { - type: 'array', - items: { $ref: '#/$defs/idObject' } - }, - 'pig:icon': { - type: 'object', - properties: { - '@value': { type: 'string' } - } - } + async getEntityValidator() { + return await getValidator('Entity'); }, - required: ['@id', 'pig:itemType', 'dcterms:title'], - oneOf: [ - { required: ['@type'] }, - { required: ['pig:specializes'] } - ], - additionalProperties: false, - $defs: JSONLD_DEFS -}; - -/* RELATIONSHIP_LD_SCHEMA: validates JSON-LD representation of IRelationship */ -const RELATIONSHIP_LD_SCHEMA = { - $schema: 'http://json-schema.org/draft-07/schema#', - $id: `${SCHEMA_PATH}Relationship`, - type: 'object', - properties: { - '@id': { $ref: '#/$defs/idString' }, - '@type': { $ref: '#/$defs/idString' }, - 'pig:specializes': { $ref: '#/$defs/idObject' }, - 'pig:itemType': { - type: 'object', - required: ['@id'], - properties: { - '@id': { - type: 'string', - enum: ['pig:Relationship'], - description: 'The PigItemType for pig:Property' - } - }, - additionalProperties: false - }, - 'dcterms:title': { - type: 'array', - items: { $ref: '#/$defs/languageValue' } - }, - 'dcterms:description': { - type: 'array', - items: { $ref: '#/$defs/languageValue' } - }, - 'pig:eligibleProperty': { - type: 'array', - items: { $ref: '#/$defs/idObject' } - }, - 'pig:eligibleSourceLink': { $ref: '#/$defs/idObject' }, - 'pig:eligibleTargetLink': { $ref: '#/$defs/idObject' }, - 'pig:icon': { - type: 'object', - properties: { - '@value': { type: 'string' } - } - } + async getRelationshipValidator() { + return await getValidator('Relationship'); }, - required: ['@id', 'pig:itemType', 'dcterms:title'], - oneOf: [ - { required: ['@type'] }, - { required: ['pig:specializes'] } - ], - additionalProperties: false, - $defs: JSONLD_DEFS -}; - -/* ANENTITY_LD_SCHEMA: validates JSON-LD representation of IAnEntity */ -const ANENTITY_LD_SCHEMA = { - $schema: 'http://json-schema.org/draft-07/schema#', - $id: `${SCHEMA_PATH}AnEntity`, - type: 'object', - properties: { - '@id': { $ref: '#/$defs/idString' }, - '@type': { $ref: '#/$defs/idString' }, - 'pig:itemType': { - type: 'object', - required: ['@id'], - properties: { - '@id': { - type: 'string', - enum: ['pig:anEntity'], - description: 'The PigItemType for pig:anEntity' - } - }, - additionalProperties: false - }, - 'pig:revision': { type: 'string' }, - 'pig:priorRevision': { - type: 'array', - items: { type: 'string' } - }, - 'dcterms:modified': { type: 'string', format: 'date-time' }, - 'dcterms:creator': { type: 'string' }, - 'dcterms:title': { - type: 'array', - items: { $ref: '#/$defs/languageValue' } - }, - 'dcterms:description': { - type: 'array', - items: { $ref: '#/$defs/languageValue' } - } + async getAnEntityValidator() { + return await getValidator('AnEntity'); }, - patternProperties: { - '^(?!pig:itemType|pig:revision|pig:priorRevision|@id|@type|dcterms:modified|dcterms:creator|dcterms:title|dcterms:description)([A-Za-z0-9_\\-]+:[^:\\s]+|https?:\\/\\/[^\\s]+)$': { - type: 'array', - items: { - type: 'object', - properties: { - 'pig:itemType': { - type: 'object', - required: ['@id'], - properties: { - '@id': { - type: 'string', - enum: ['pig:aProperty', 'pig:aTargetLink'] - } - }, - additionalProperties: false - }, - '@value': { type: 'string' }, - '@id': { $ref: '#/$defs/idString' } - }, - required: ['pig:itemType'], - oneOf: [ - { - // aProperty with direct value: must have @value - type: 'object', - properties: { - 'pig:itemType': { - type: 'object', - properties: { - '@id': { const: 'pig:aProperty' } - } - } - }, - required: ['@value'], - not: { required: ['@id'] } - }, - { - // aProperty with enumeration reference: must have @id - type: 'object', - properties: { - 'pig:itemType': { - type: 'object', - properties: { - '@id': { const: 'pig:aProperty' } - } - } - }, - required: ['@id'], - not: { required: ['@value'] } - }, - { - // aTargetLink: must have @id - type: 'object', - properties: { - 'pig:itemType': { - type: 'object', - properties: { - '@id': { const: 'pig:aTargetLink' } - } - } - }, - required: ['@id'], - not: { required: ['@value'] } - } - ], - additionalProperties: false - } - } + async getARelationshipValidator() { + return await getValidator('ARelationship'); + }, + async getPackageValidator() { + return await getValidator('APackage'); }, - required: ['@id', 'pig:itemType', '@type', 'dcterms:modified'], - anyOf: [ - { - required: ['dcterms:title'], - properties: { 'dcterms:title': { type: 'array', minItems: 1 } } - }, - { - required: ['dcterms:description'], - properties: { 'dcterms:description': { type: 'array', minItems: 1 } } - } - ], - additionalProperties: false, - $defs: JSONLD_DEFS -}; -/* ARELATIONSHIP_LD_SCHEMA: validates JSON-LD representation of IARelationship */ -const ARELATIONSHIP_LD_SCHEMA = { - $schema: 'http://json-schema.org/draft-07/schema#', - $id: `${SCHEMA_PATH}ARelationship`, - type: 'object', - properties: { - '@id': { $ref: '#/$defs/idString' }, - '@type': { $ref: '#/$defs/idString' }, - 'pig:itemType': { - type: 'object', - required: ['@id'], - properties: { - '@id': { - type: 'string', - enum: ['pig:aRelationship'], - description: 'The PigItemType for pig:aRelationship' - } - }, - additionalProperties: false - }, - 'pig:revision': { type: 'string' }, - 'pig:priorRevision': { - type: 'array', - items: { type: 'string' } - }, - 'dcterms:modified': { type: 'string', format: 'date-time' }, - 'dcterms:creator': { type: 'string' }, - 'dcterms:title': { - type: 'array', - items: { $ref: '#/$defs/languageValue' } - }, - 'dcterms:description': { - type: 'array', - items: { $ref: '#/$defs/languageValue' } - } + // Schema getter methods (return promises) + async getPropertySchema() { + return await loadSchema('Property'); }, - patternProperties: { - // Match configurable properties and links, but exclude standard PIG properties - // Negative lookahead: don't match properties that are already defined in 'properties' - '^(?!pig:itemType|pig:revision|pig:priorRevision|@id|@type|dcterms:modified|dcterms:creator|dcterms:title|dcterms:description)([A-Za-z0-9_\\-]+:[^:\\s]+|https?:\\/\\/[^\\s]+)$': { - type: 'array', - items: { - type: 'object', - properties: { - 'pig:itemType': { - type: 'object', - required: ['@id'], - properties: { - '@id': { - type: 'string', - enum: ['pig:aProperty', 'pig:aSourceLink', 'pig:aTargetLink'] - } - }, - additionalProperties: false - }, - '@value': { type: 'string' }, - '@id': { $ref: '#/$defs/idString' } - }, - required: ['pig:itemType'], - oneOf: [ - { - // aProperty with direct value: must have @value - type: 'object', - properties: { - 'pig:itemType': { - type: 'object', - properties: { - '@id': { const: 'pig:aProperty' } - } - } - }, - required: ['@value'], - not: { required: ['@id'] } - }, - { - // aProperty with enumeration reference: must have @id - type: 'object', - properties: { - 'pig:itemType': { - type: 'object', - properties: { - '@id': { const: 'pig:aProperty' } - } - } - }, - required: ['@id'], - not: { required: ['@value'] } - }, - { - // aSourceLink or aTargetLink: must have @id - type: 'object', - properties: { - 'pig:itemType': { - type: 'object', - properties: { - '@id': { enum: ['pig:aSourceLink', 'pig:aTargetLink'] } - } - } - }, - required: ['@id'], - not: { required: ['@value'] } - } - ], - additionalProperties: false - } - } + async getLinkSchema() { + return await loadSchema('Link'); }, - required: ['@id', 'pig:itemType', '@type', 'dcterms:modified'], - additionalProperties: false, // ✅ Strict validation enabled - $defs: JSONLD_DEFS -}; - -/* APACKAGE_LD_SCHEMA: validates a complete JSON-LD document with @graph */ -const APACKAGE_LD_SCHEMA = { - $schema: 'http://json-schema.org/draft-07/schema#', - $id: `${SCHEMA_PATH}APackage`, - type: 'object', - properties: { - '@context': { - description: 'JSON-LD context', - oneOf: [ - { type: 'object' }, - { type: 'array' }, - { type: 'string' } - ] - }, - '@id': { $ref: '#/$defs/idString' }, - '@type': { $ref: '#/$defs/idString' }, - 'pig:itemType': { - type: 'object', - required: ['@id'], - properties: { - '@id': { - type: 'string', - enum: ['pig:aPackage'], - description: 'The PigItemType for pig:aPackage' - } - }, - additionalProperties: false - }, - 'dcterms:modified': { type: 'string', format: 'date-time' }, - 'dcterms:creator': { type: 'string' }, - 'dcterms:title': { - type: 'array', - items: { $ref: '#/$defs/languageValue' } - }, - 'dcterms:description': { - type: 'array', - items: { $ref: '#/$defs/languageValue' } - }, - '@graph': { - type: 'array', - minItems: 0, - items: { - type: 'object', - required: ['pig:itemType'], - properties: { - 'pig:itemType': { - type: 'object', - required: ['@id'], - properties: { - '@id': { type: 'string' } - } - } - }, - // Use if-then-else chains to apply only the matching schema based on itemType; - // test the instances first: - allOf: [ - { - if: { - type: 'object', - properties: { - 'pig:itemType': { - type: 'object', - properties: { - '@id': { const: 'pig:anEntity' } - } - } - } - }, - then: { $ref: `${SCHEMA_PATH}AnEntity` } - }, - { - if: { - type: 'object', - properties: { - 'pig:itemType': { - type: 'object', - properties: { - '@id': { const: 'pig:aRelationship' } - } - } - } - }, - then: { $ref: `${SCHEMA_PATH}ARelationship` } - }, - { - if: { - type: 'object', - properties: { - 'pig:itemType': { - type: 'object', - properties: { - '@id': { const: 'pig:Property' } - } - } - } - }, - then: { $ref: `${SCHEMA_PATH}Property` } - }, - { - if: { - type: 'object', - properties: { - 'pig:itemType': { - type: 'object', - properties: { - '@id': { const: 'pig:Link' } - } - } - } - }, - then: { $ref: `${SCHEMA_PATH}Link` } - }, - { - if: { - type: 'object', - properties: { - 'pig:itemType': { - type: 'object', - properties: { - '@id': { const: 'pig:Entity' } - } - } - } - }, - then: { $ref: `${SCHEMA_PATH}Entity` } - }, - { - if: { - type: 'object', - properties: { - 'pig:itemType': { - type: 'object', - properties: { - '@id': { const: 'pig:Relationship' } - } - } - } - }, - then: { $ref: `${SCHEMA_PATH}Relationship` } - } - ] - } - } + async getEntitySchema() { + return await loadSchema('Entity'); + }, + async getRelationshipSchema() { + return await loadSchema('Relationship'); + }, + async getAnEntitySchema() { + return await loadSchema('AnEntity'); + }, + async getARelationshipSchema() { + return await loadSchema('ARelationship'); + }, + async getPackageSchema() { + return await loadSchema('APackage'); }, - required: ['@id', '@context', '@graph'], - additionalProperties: false, - $defs: JSONLD_DEFS -}; - -// Register all schemata before compilation: -ajv.addSchema(PROPERTY_LD_SCHEMA); -ajv.addSchema(LINK_LD_SCHEMA); -ajv.addSchema(ENTITY_LD_SCHEMA); -ajv.addSchema(RELATIONSHIP_LD_SCHEMA); -ajv.addSchema(ANENTITY_LD_SCHEMA); -ajv.addSchema(ARELATIONSHIP_LD_SCHEMA); -// Compile all schemata -const validatePropertyLD = ajv.compile(PROPERTY_LD_SCHEMA); -const validateLinkLD = ajv.compile(LINK_LD_SCHEMA); -const validateEntityLD = ajv.compile(ENTITY_LD_SCHEMA); -const validateRelationshipLD = ajv.compile(RELATIONSHIP_LD_SCHEMA); -const validateAnEntityLD = ajv.compile(ANENTITY_LD_SCHEMA); -const validateARelationshipLD = ajv.compile(ARELATIONSHIP_LD_SCHEMA); -const validatePackageLD = ajv.compile(APACKAGE_LD_SCHEMA); + // Validation methods (async) + async validatePropertyLD(data: any): Promise { + const validator = await getValidator('Property'); + return validator(data); + }, + async validateLinkLD(data: any): Promise { + const validator = await getValidator('Link'); + return validator(data); + }, + async validateEntityLD(data: any): Promise { + const validator = await getValidator('Entity'); + return validator(data); + }, + async validateRelationshipLD(data: any): Promise { + const validator = await getValidator('Relationship'); + return validator(data); + }, + async validateAnEntityLD(data: any): Promise { + const validator = await getValidator('AnEntity'); + return validator(data); + }, + async validateARelationshipLD(data: any): Promise { + const validator = await getValidator('ARelationship'); + return validator(data); + }, + async validatePackageLD(data: any): Promise { + const validator = await getValidator('APackage'); + return validator(data); + }, -export const SCH_LD = { - PROPERTY_LD_SCHEMA, - validatePropertyLD, - getValidatePropertyLDErrors() { - return ajv.errorsText(validatePropertyLD.errors, { separator: '; ' }); + // Error getter methods + async getValidatePropertyLDErrors(): Promise { + const validator = await getValidator('Property'); + return ajv.errorsText(validator.errors, { separator: '; ' }); }, - LINK_LD_SCHEMA, - validateLinkLD, - getValidateLinkLDErrors() { - return ajv.errorsText(validateLinkLD.errors, { separator: '; ' }); + async getValidateLinkLDErrors(): Promise { + const validator = await getValidator('Link'); + return ajv.errorsText(validator.errors, { separator: '; ' }); }, - ENTITY_LD_SCHEMA, - validateEntityLD, - getValidateEntityLDErrors() { - return ajv.errorsText(validateEntityLD.errors, { separator: '; ' }); + async getValidateEntityLDErrors(): Promise { + const validator = await getValidator('Entity'); + return ajv.errorsText(validator.errors, { separator: '; ' }); }, - RELATIONSHIP_LD_SCHEMA, - validateRelationshipLD, - getValidateRelationshipLDErrors() { - return ajv.errorsText(validateRelationshipLD.errors, { separator: '; ' }); + async getValidateRelationshipLDErrors(): Promise { + const validator = await getValidator('Relationship'); + return ajv.errorsText(validator.errors, { separator: '; ' }); }, - ANENTITY_LD_SCHEMA, - validateAnEntityLD, - getValidateAnEntityLDErrors() { - return ajv.errorsText(validateAnEntityLD.errors, { separator: '; ' }); + async getValidateAnEntityLDErrors(): Promise { + const validator = await getValidator('AnEntity'); + return ajv.errorsText(validator.errors, { separator: '; ' }); }, - ARELATIONSHIP_LD_SCHEMA, - validateARelationshipLD, - getValidateARelationshipLDErrors() { - return ajv.errorsText(validateARelationshipLD.errors, { separator: '; ' }); + async getValidateARelationshipLDErrors(): Promise { + const validator = await getValidator('ARelationship'); + return ajv.errorsText(validator.errors, { separator: '; ' }); }, - APACKAGE_LD_SCHEMA, - validatePackageLD, - getValidatePackageLDErrors() { - return ajv.errorsText(validatePackageLD.errors, { separator: '; ' }); + async getValidatePackageLDErrors(): Promise { + const validator = await getValidator('APackage'); + return ajv.errorsText(validator.errors, { separator: '; ' }); + }, + + // Utility: Ensure all schemas are loaded + async initialize(): Promise { + await ensureInitialized(); } }; + +// Export schema path for external use +export { SCHEMA_FILES }; diff --git a/src/utils/schemas/pig/jsonld/pig-schemata-jsonld.ts.goodButReplaced b/src/utils/schemas/pig/jsonld/pig-schemata-jsonld.ts.goodButReplaced new file mode 100644 index 0000000..be0e857 --- /dev/null +++ b/src/utils/schemas/pig/jsonld/pig-schemata-jsonld.ts.goodButReplaced @@ -0,0 +1,709 @@ +/*! JSON-LD SCHEMATA for PIG items + * Copyright 2025 GfSE (https://gfse.org) + * License and terms of use: Apache 2.0 (http://www.apache.org/licenses/LICENSE-2.0) + */ +/** JSON-LD SCHEMATA for PIG items: Property, Link, Entity, Relationship, AnEntity, ARelationship + * These schemas validate the JSON-LD representation (with @id, @type, @value, etc.) + * + * Dependencies: ajv (Another JSON Schema Validator) https://ajv.js.org/ + * Authors: oskar.dungern@gfse.org, .. + * We appreciate any correction, comment or contribution as Github issue (https://github.com/GfSE/CASCaDE-Reference-Implementation/issues) + * + * Design decisions: + * - use JSON Schema draft-07 (widely supported) + * - use ajv for validation (fast, popular) + * - these schemas validate JSON-LD documents (@graph, @context, @id, @type) + * - separate from internal JSON schemas (pig-schemata.ts) + * + * Limitations: + * - xs:datatype values are only pattern-validated here; specific accepted values are validated in code + * - further constraints (e.g. maxCount >= minCount) are validated in code + * - eligible values in Property only for string values; other datatypes to be implemented + * + * ToDo: + * - load schemata from external files, as soon as a server with CORS enabled is available +*/ + +import { ajv } from '../../../../plugins/ajv'; + +const SCHEMA_PATH = 'http://product-information-graph.org/schema/2026-01-12/jsonld/'; +const ID_NAME_PATTERN = '^(?:[A-Za-z0-9_\\-]+:[^:\\s]+|https?:\\/\\/[^\\s]+)$'; + +/* Shared JSON-LD definitions */ +const JSONLD_DEFS = { + idString: { + type: 'string', + pattern: ID_NAME_PATTERN + }, + idObject: { + type: 'object', + required: ['@id'], + properties: { + '@id': { $ref: '#/$defs/idString' } + }, + additionalProperties: false + }, + languageValue: { + type: 'object', + required: ['@value'], + properties: { + '@value': { type: 'string' }, + '@language': { type: 'string' } + }, + additionalProperties: false + } +}; + +/* PROPERTY_LD_SCHEMA: validates JSON-LD representation of IProperty */ +const PROPERTY_LD_SCHEMA = { + $schema: 'http://json-schema.org/draft-07/schema#', + $id: `${SCHEMA_PATH}Property`, + type: 'object', + properties: { + '@id': { $ref: '#/$defs/idString' }, + '@type': { $ref: '#/$defs/idString' }, + 'pig:specializes': { $ref: '#/$defs/idObject' }, + 'pig:itemType': { + type: 'object', + required: ['@id'], + properties: { + '@id': { + type: 'string', + enum: ['pig:Property'], + description: 'The PigItemType for pig:Property' + } + }, + additionalProperties: false + }, + 'dcterms:title': { + type: 'array', + minItems: 1, + items: { $ref: '#/$defs/languageValue' } + }, + 'dcterms:description': { + type: 'array', + minItems: 1, + items: { $ref: '#/$defs/languageValue' } + }, + 'sh:datatype': { $ref: '#/$defs/idObject' }, + 'sh:minCount': { type: 'number' }, + 'sh:maxCount': { type: 'number' }, + 'sh:maxLength': { type: 'number' }, + 'sh:minInclusive': { type: 'number' }, + 'sh:maxInclusive': { type: 'number' }, + 'sh:pattern': { type: 'string' }, + 'pig:unit': { type: 'string' }, + 'sh:defaultValue': { type: 'string' }, + 'pig:eligibleValue': { + type: 'array', + items: { + type: 'object', + required: ['@id', 'dcterms:title'], + properties: { + '@id': { $ref: '#/$defs/idString' }, + 'dcterms:title': { + type: 'array', + minItems: 1, + items: { $ref: '#/$defs/languageValue' } + } + }, + additionalProperties: false + } + }, + 'pig:composedProperty': { + type: 'array', + items: { $ref: '#/$defs/idObject' } + } + }, + required: ['@id', 'pig:itemType', 'dcterms:title', 'sh:datatype'], + oneOf: [ + { required: ['@type'] }, + { required: ['pig:specializes'] } + ], + additionalProperties: false, + $defs: JSONLD_DEFS +}; +/* LINK_LD_SCHEMA: validates JSON-LD representation of ILink */ +const LINK_LD_SCHEMA = { + $schema: 'http://json-schema.org/draft-07/schema#', + $id: `${SCHEMA_PATH}Link`, + type: 'object', + properties: { + '@id': { $ref: '#/$defs/idString' }, + '@type': { $ref: '#/$defs/idString' }, + 'pig:specializes': { $ref: '#/$defs/idObject' }, + 'pig:itemType': { + type: 'object', + required: ['@id'], + properties: { + '@id': { + type: 'string', + enum: ['pig:Link'], + description: 'The PigItemType for pig:Property' + } + }, + additionalProperties: false + }, + 'dcterms:title': { + type: 'array', + minItems: 1, + items: { $ref: '#/$defs/languageValue' } + }, + 'dcterms:description': { + type: 'array', + items: { $ref: '#/$defs/languageValue' } + }, + 'pig:eligibleEndpoint': { + type: 'array', + minItems: 1, + items: { $ref: '#/$defs/idObject' } + } + }, + required: ['@id', 'pig:itemType', 'dcterms:title', 'pig:eligibleEndpoint'], + oneOf: [ + { required: ['@type'] }, + { required: ['pig:specializes'] } + ], + additionalProperties: false, + $defs: JSONLD_DEFS +}; + +/* ENTITY_LD_SCHEMA: validates JSON-LD representation of IEntity */ +const ENTITY_LD_SCHEMA = { + $schema: 'http://json-schema.org/draft-07/schema#', + $id: `${SCHEMA_PATH}Entity`, + type: 'object', + properties: { + '@id': { $ref: '#/$defs/idString' }, + '@type': { $ref: '#/$defs/idString' }, + 'pig:specializes': { $ref: '#/$defs/idObject' }, + 'pig:itemType': { + type: 'object', + required: ['@id'], + properties: { + '@id': { + type: 'string', + enum: ['pig:Entity'], + description: 'The PigItemType for pig:Property' + } + }, + additionalProperties: false + }, + 'dcterms:title': { + type: 'array', + items: { $ref: '#/$defs/languageValue' } + }, + 'dcterms:description': { + type: 'array', + items: { $ref: '#/$defs/languageValue' } + }, + 'pig:eligibleProperty': { + type: 'array', + items: { $ref: '#/$defs/idObject' } + }, + 'pig:eligibleTargetLink': { + type: 'array', + items: { $ref: '#/$defs/idObject' } + }, + 'pig:icon': { + type: 'object', + properties: { + '@value': { type: 'string' } + } + } + }, + required: ['@id', 'pig:itemType', 'dcterms:title'], + oneOf: [ + { required: ['@type'] }, + { required: ['pig:specializes'] } + ], + additionalProperties: false, + $defs: JSONLD_DEFS +}; + +/* RELATIONSHIP_LD_SCHEMA: validates JSON-LD representation of IRelationship */ +const RELATIONSHIP_LD_SCHEMA = { + $schema: 'http://json-schema.org/draft-07/schema#', + $id: `${SCHEMA_PATH}Relationship`, + type: 'object', + properties: { + '@id': { $ref: '#/$defs/idString' }, + '@type': { $ref: '#/$defs/idString' }, + 'pig:specializes': { $ref: '#/$defs/idObject' }, + 'pig:itemType': { + type: 'object', + required: ['@id'], + properties: { + '@id': { + type: 'string', + enum: ['pig:Relationship'], + description: 'The PigItemType for pig:Property' + } + }, + additionalProperties: false + }, + 'dcterms:title': { + type: 'array', + items: { $ref: '#/$defs/languageValue' } + }, + 'dcterms:description': { + type: 'array', + items: { $ref: '#/$defs/languageValue' } + }, + 'pig:eligibleProperty': { + type: 'array', + items: { $ref: '#/$defs/idObject' } + }, + 'pig:eligibleSourceLink': { $ref: '#/$defs/idObject' }, + 'pig:eligibleTargetLink': { $ref: '#/$defs/idObject' }, + 'pig:icon': { + type: 'object', + properties: { + '@value': { type: 'string' } + } + } + }, + required: ['@id', 'pig:itemType', 'dcterms:title'], + oneOf: [ + { required: ['@type'] }, + { required: ['pig:specializes'] } + ], + additionalProperties: false, + $defs: JSONLD_DEFS +}; + +/* ANENTITY_LD_SCHEMA: validates JSON-LD representation of IAnEntity */ +const ANENTITY_LD_SCHEMA = { + $schema: 'http://json-schema.org/draft-07/schema#', + $id: `${SCHEMA_PATH}AnEntity`, + type: 'object', + properties: { + '@id': { $ref: '#/$defs/idString' }, + '@type': { $ref: '#/$defs/idString' }, + 'pig:itemType': { + type: 'object', + required: ['@id'], + properties: { + '@id': { + type: 'string', + enum: ['pig:anEntity'], + description: 'The PigItemType for pig:anEntity' + } + }, + additionalProperties: false + }, + 'pig:revision': { type: 'string' }, + 'pig:priorRevision': { + type: 'array', + items: { type: 'string' } + }, + 'dcterms:modified': { type: 'string', format: 'date-time' }, + 'dcterms:creator': { type: 'string' }, + 'dcterms:title': { + type: 'array', + items: { $ref: '#/$defs/languageValue' } + }, + 'dcterms:description': { + type: 'array', + items: { $ref: '#/$defs/languageValue' } + } + }, + patternProperties: { + '^(?!pig:itemType|pig:revision|pig:priorRevision|@id|@type|dcterms:modified|dcterms:creator|dcterms:title|dcterms:description)([A-Za-z0-9_\\-]+:[^:\\s]+|https?:\\/\\/[^\\s]+)$': { + type: 'array', + items: { + type: 'object', + properties: { + 'pig:itemType': { + type: 'object', + required: ['@id'], + properties: { + '@id': { + type: 'string', + enum: ['pig:aProperty', 'pig:aTargetLink'] + } + }, + additionalProperties: false + }, + '@value': { type: 'string' }, + '@id': { $ref: '#/$defs/idString' } + }, + required: ['pig:itemType'], + oneOf: [ + { + // aProperty with direct value: must have @value + type: 'object', + properties: { + 'pig:itemType': { + type: 'object', + properties: { + '@id': { const: 'pig:aProperty' } + } + } + }, + required: ['@value'], + not: { required: ['@id'] } + }, + { + // aProperty with enumeration reference: must have @id + type: 'object', + properties: { + 'pig:itemType': { + type: 'object', + properties: { + '@id': { const: 'pig:aProperty' } + } + } + }, + required: ['@id'], + not: { required: ['@value'] } + }, + { + // aTargetLink: must have @id + type: 'object', + properties: { + 'pig:itemType': { + type: 'object', + properties: { + '@id': { const: 'pig:aTargetLink' } + } + } + }, + required: ['@id'], + not: { required: ['@value'] } + } + ], + additionalProperties: false + } + } + }, + required: ['@id', 'pig:itemType', '@type', 'dcterms:modified'], + anyOf: [ + { + required: ['dcterms:title'], + properties: { 'dcterms:title': { type: 'array', minItems: 1 } } + }, + { + required: ['dcterms:description'], + properties: { 'dcterms:description': { type: 'array', minItems: 1 } } + } + ], + additionalProperties: false, + $defs: JSONLD_DEFS +}; + +/* ARELATIONSHIP_LD_SCHEMA: validates JSON-LD representation of IARelationship */ +const ARELATIONSHIP_LD_SCHEMA = { + $schema: 'http://json-schema.org/draft-07/schema#', + $id: `${SCHEMA_PATH}ARelationship`, + type: 'object', + properties: { + '@id': { $ref: '#/$defs/idString' }, + '@type': { $ref: '#/$defs/idString' }, + 'pig:itemType': { + type: 'object', + required: ['@id'], + properties: { + '@id': { + type: 'string', + enum: ['pig:aRelationship'], + description: 'The PigItemType for pig:aRelationship' + } + }, + additionalProperties: false + }, + 'pig:revision': { type: 'string' }, + 'pig:priorRevision': { + type: 'array', + items: { type: 'string' } + }, + 'dcterms:modified': { type: 'string', format: 'date-time' }, + 'dcterms:creator': { type: 'string' }, + 'dcterms:title': { + type: 'array', + items: { $ref: '#/$defs/languageValue' } + }, + 'dcterms:description': { + type: 'array', + items: { $ref: '#/$defs/languageValue' } + } + }, + patternProperties: { + // Match configurable properties and links, but exclude standard PIG properties + // Negative lookahead: don't match properties that are already defined in 'properties' + '^(?!pig:itemType|pig:revision|pig:priorRevision|@id|@type|dcterms:modified|dcterms:creator|dcterms:title|dcterms:description)([A-Za-z0-9_\\-]+:[^:\\s]+|https?:\\/\\/[^\\s]+)$': { + type: 'array', + items: { + type: 'object', + properties: { + 'pig:itemType': { + type: 'object', + required: ['@id'], + properties: { + '@id': { + type: 'string', + enum: ['pig:aProperty', 'pig:aSourceLink', 'pig:aTargetLink'] + } + }, + additionalProperties: false + }, + '@value': { type: 'string' }, + '@id': { $ref: '#/$defs/idString' } + }, + required: ['pig:itemType'], + oneOf: [ + { + // aProperty with direct value: must have @value + type: 'object', + properties: { + 'pig:itemType': { + type: 'object', + properties: { + '@id': { const: 'pig:aProperty' } + } + } + }, + required: ['@value'], + not: { required: ['@id'] } + }, + { + // aProperty with enumeration reference: must have @id + type: 'object', + properties: { + 'pig:itemType': { + type: 'object', + properties: { + '@id': { const: 'pig:aProperty' } + } + } + }, + required: ['@id'], + not: { required: ['@value'] } + }, + { + // aSourceLink or aTargetLink: must have @id + type: 'object', + properties: { + 'pig:itemType': { + type: 'object', + properties: { + '@id': { enum: ['pig:aSourceLink', 'pig:aTargetLink'] } + } + } + }, + required: ['@id'], + not: { required: ['@value'] } + } + ], + additionalProperties: false + } + } + }, + required: ['@id', 'pig:itemType', '@type', 'dcterms:modified'], + additionalProperties: false, // ✅ Strict validation enabled + $defs: JSONLD_DEFS +}; + +/* APACKAGE_LD_SCHEMA: validates a complete JSON-LD document with @graph */ +const APACKAGE_LD_SCHEMA = { + $schema: 'http://json-schema.org/draft-07/schema#', + $id: `${SCHEMA_PATH}APackage`, + type: 'object', + properties: { + '@context': { + description: 'JSON-LD context', + oneOf: [ + { type: 'object' }, + { type: 'array' }, + { type: 'string' } + ] + }, + '@id': { $ref: '#/$defs/idString' }, + '@type': { $ref: '#/$defs/idString' }, + 'pig:itemType': { + type: 'object', + required: ['@id'], + properties: { + '@id': { + type: 'string', + enum: ['pig:aPackage'], + description: 'The PigItemType for pig:aPackage' + } + }, + additionalProperties: false + }, + 'dcterms:modified': { type: 'string', format: 'date-time' }, + 'dcterms:creator': { type: 'string' }, + 'dcterms:title': { + type: 'array', + items: { $ref: '#/$defs/languageValue' } + }, + 'dcterms:description': { + type: 'array', + items: { $ref: '#/$defs/languageValue' } + }, + '@graph': { + type: 'array', + minItems: 0, + items: { + type: 'object', + required: ['pig:itemType'], + properties: { + 'pig:itemType': { + type: 'object', + required: ['@id'], + properties: { + '@id': { type: 'string' } + } + } + }, + // Use if-then-else chains to apply only the matching schema based on itemType; + // test the instances first: + allOf: [ + { + if: { + type: 'object', + properties: { + 'pig:itemType': { + type: 'object', + properties: { + '@id': { const: 'pig:anEntity' } + } + } + } + }, + then: { $ref: `${SCHEMA_PATH}AnEntity` } + }, + { + if: { + type: 'object', + properties: { + 'pig:itemType': { + type: 'object', + properties: { + '@id': { const: 'pig:aRelationship' } + } + } + } + }, + then: { $ref: `${SCHEMA_PATH}ARelationship` } + }, + { + if: { + type: 'object', + properties: { + 'pig:itemType': { + type: 'object', + properties: { + '@id': { const: 'pig:Property' } + } + } + } + }, + then: { $ref: `${SCHEMA_PATH}Property` } + }, + { + if: { + type: 'object', + properties: { + 'pig:itemType': { + type: 'object', + properties: { + '@id': { const: 'pig:Link' } + } + } + } + }, + then: { $ref: `${SCHEMA_PATH}Link` } + }, + { + if: { + type: 'object', + properties: { + 'pig:itemType': { + type: 'object', + properties: { + '@id': { const: 'pig:Entity' } + } + } + } + }, + then: { $ref: `${SCHEMA_PATH}Entity` } + }, + { + if: { + type: 'object', + properties: { + 'pig:itemType': { + type: 'object', + properties: { + '@id': { const: 'pig:Relationship' } + } + } + } + }, + then: { $ref: `${SCHEMA_PATH}Relationship` } + } + ] + } + } + }, + required: ['@id', '@context', '@graph'], + additionalProperties: false, + $defs: JSONLD_DEFS +}; + +// Register all schemata before compilation: +ajv.addSchema(PROPERTY_LD_SCHEMA); +ajv.addSchema(LINK_LD_SCHEMA); +ajv.addSchema(ENTITY_LD_SCHEMA); +ajv.addSchema(RELATIONSHIP_LD_SCHEMA); +ajv.addSchema(ANENTITY_LD_SCHEMA); +ajv.addSchema(ARELATIONSHIP_LD_SCHEMA); + +// Compile all schemata +const validatePropertyLD = ajv.compile(PROPERTY_LD_SCHEMA); +const validateLinkLD = ajv.compile(LINK_LD_SCHEMA); +const validateEntityLD = ajv.compile(ENTITY_LD_SCHEMA); +const validateRelationshipLD = ajv.compile(RELATIONSHIP_LD_SCHEMA); +const validateAnEntityLD = ajv.compile(ANENTITY_LD_SCHEMA); +const validateARelationshipLD = ajv.compile(ARELATIONSHIP_LD_SCHEMA); +const validatePackageLD = ajv.compile(APACKAGE_LD_SCHEMA); + +export const SCH_LD = { + PROPERTY_LD_SCHEMA, + validatePropertyLD, + getValidatePropertyLDErrors() { + return ajv.errorsText(validatePropertyLD.errors, { separator: '; ' }); + }, + LINK_LD_SCHEMA, + validateLinkLD, + getValidateLinkLDErrors() { + return ajv.errorsText(validateLinkLD.errors, { separator: '; ' }); + }, + ENTITY_LD_SCHEMA, + validateEntityLD, + getValidateEntityLDErrors() { + return ajv.errorsText(validateEntityLD.errors, { separator: '; ' }); + }, + RELATIONSHIP_LD_SCHEMA, + validateRelationshipLD, + getValidateRelationshipLDErrors() { + return ajv.errorsText(validateRelationshipLD.errors, { separator: '; ' }); + }, + ANENTITY_LD_SCHEMA, + validateAnEntityLD, + getValidateAnEntityLDErrors() { + return ajv.errorsText(validateAnEntityLD.errors, { separator: '; ' }); + }, + ARELATIONSHIP_LD_SCHEMA, + validateARelationshipLD, + getValidateARelationshipLDErrors() { + return ajv.errorsText(validateARelationshipLD.errors, { separator: '; ' }); + }, + APACKAGE_LD_SCHEMA, + validatePackageLD, + getValidatePackageLDErrors() { + return ajv.errorsText(validatePackageLD.errors, { separator: '; ' }); + } +}; diff --git a/src/utils/schemas/pig/ts/pig-metaclasses.ts b/src/utils/schemas/pig/ts/pig-metaclasses.ts index 7cb7242..cd4331e 100644 --- a/src/utils/schemas/pig/ts/pig-metaclasses.ts +++ b/src/utils/schemas/pig/ts/pig-metaclasses.ts @@ -79,6 +79,7 @@ export const PigItemType: Record<'Property' | 'Link' | 'Entity' | 'Relationship' aRelationship: 'pig:aRelationship' };*/ export enum XsDataType { + anyType = 'xs:anyType', Boolean = 'xs:boolean', Integer = 'xs:integer', Double = 'xs:double', diff --git a/src/utils/schemas/pig/ts/pig-package-constraints.ts b/src/utils/schemas/pig/ts/pig-package-constraints.ts index a16e488..dc9c7b4 100644 --- a/src/utils/schemas/pig/ts/pig-package-constraints.ts +++ b/src/utils/schemas/pig/ts/pig-package-constraints.ts @@ -101,7 +101,7 @@ function checkUniqueIds(pkg: IAPackage): IRsp { const itemId = (item as any)['@id'] ?? (item as any).id; if (!itemId) { - logger.warn(`Item at index ${i} is missing an ID`,item); + // logger.warn(`Item at index ${i} is missing an ID`,item); return Msg.create(670, i); } diff --git a/tests/unit/import-jsonld.spec.ts b/tests/unit/import-jsonld.spec.ts index 233ebf0..78947d1 100644 --- a/tests/unit/import-jsonld.spec.ts +++ b/tests/unit/import-jsonld.spec.ts @@ -43,7 +43,7 @@ describe('importJSONLD (file system)', () => { // console.debug(`import-jsonld: `,instances); instances.forEach((itm, index) => { - console.info(`Instance ${index}:`, itm.status().statusText ?? itm.status().status); + // console.info(`Instance ${index}:`, itm.status().statusText ?? itm.status().status); // console.debug(JSON.stringify(itm.get(), null, 2)); expect(itm.status().ok).toBe(true); // each instantiated item must have a successful status From 45b85257b198d71e5ba07fa1ff637843f42e88be Mon Sep 17 00:00:00 2001 From: "OD-T14S-25\\PCUser" Date: Tue, 20 Jan 2026 19:49:32 +0100 Subject: [PATCH 05/26] Added new JSON-LD test file /11/Alice.pig.jsonld --- .../import/jsonld/import-package-jsonld.ts | 2 +- .../pig-schemata-jsonld.ts.goodButReplaced | 2 + .../ts/pig-infrastructure.ts.work-in-progress | 224 ----- src/utils/schemas/pig/ts/pig-metaclasses.ts | 1 + tests/data/JSON-LD/11/Alice.pig.jsonld | 808 ++++++++++++++++++ tests/unit/import-jsonld.spec.ts | 1 + 6 files changed, 813 insertions(+), 225 deletions(-) delete mode 100644 src/utils/schemas/pig/ts/pig-infrastructure.ts.work-in-progress create mode 100644 tests/data/JSON-LD/11/Alice.pig.jsonld diff --git a/src/utils/import/jsonld/import-package-jsonld.ts b/src/utils/import/jsonld/import-package-jsonld.ts index 2e010ed..3795def 100644 --- a/src/utils/import/jsonld/import-package-jsonld.ts +++ b/src/utils/import/jsonld/import-package-jsonld.ts @@ -35,7 +35,7 @@ export async function importJSONLD(source: string | File | Blob): Promise return rsp; const text = rsp.response as string; - logger.info('importJSONLD: loaded text length ' + text.length); + // logger.info('importJSONLD: loaded text length ' + text.length); let doc: any; try { diff --git a/src/utils/schemas/pig/jsonld/pig-schemata-jsonld.ts.goodButReplaced b/src/utils/schemas/pig/jsonld/pig-schemata-jsonld.ts.goodButReplaced index be0e857..7f64c56 100644 --- a/src/utils/schemas/pig/jsonld/pig-schemata-jsonld.ts.goodButReplaced +++ b/src/utils/schemas/pig/jsonld/pig-schemata-jsonld.ts.goodButReplaced @@ -10,6 +10,8 @@ * We appreciate any correction, comment or contribution as Github issue (https://github.com/GfSE/CASCaDE-Reference-Implementation/issues) * * Design decisions: + * - in this solution, the JSON-LD schemata are hard-coded in TypeScript + * while the preferred solution is to load them from external files. * - use JSON Schema draft-07 (widely supported) * - use ajv for validation (fast, popular) * - these schemas validate JSON-LD documents (@graph, @context, @id, @type) diff --git a/src/utils/schemas/pig/ts/pig-infrastructure.ts.work-in-progress b/src/utils/schemas/pig/ts/pig-infrastructure.ts.work-in-progress deleted file mode 100644 index 0e85ed9..0000000 --- a/src/utils/schemas/pig/ts/pig-infrastructure.ts.work-in-progress +++ /dev/null @@ -1,224 +0,0 @@ -// THIS is WORK IN PROGRESS! -// Questions: -// - Shall we create classes for Packages etc, or shall those be instances of the metaclasses? - -/** Product Information Graph (PIG) Infrastructure - standard object structure using the PIG -* Dependencies: pig-scaffold -* Authors: oskar.dungern@gfse.org, .. -* License and terms of use: Apache 2.0 (http://www.apache.org/licenses/LICENSE-2.0) -* We appreciate any correction, comment or contribution as Github issue (https://github.com/GfSE/CASCaDE-Reference-Implementation/issues) -* -* Design Decisions: -* - -*/ -import * as PigScaffold from './pig-scaffold'; -export enum PigInfraType { - Organizer = 'pig:Organizer', // is a PIG class - anOrganizer = 'pig:anOrganizer', // is a PIG instance/individual -} -interface IModelElement extends PigScaffold.IEntity { -} -abstract class ModelElement extends PigScaffold.Entity implements IModelElement { - constructor(itm: IModelElement) { - super(itm); - } - set(itm: IModelElement) { - super.set(itm); - } - get() { - return super.get(); - } -} -interface IAModelElement extends PigScaffold.IAnEntity { -} -abstract class AModelElement extends PigScaffold.AnEntity implements IAModelElement { - constructor(itm: IAModelElement) { - super(itm); - } - set(itm: IAModelElement) { - super.set(itm); - } - get() { - return super.get(); - } -} -export interface IOrganizer extends PigScaffold.IEntity { - // If the following is empty or undefined, any instantiated organizer is not constrained wrt the model element it references: - eligibleElement: PigScaffold.TPigId[]; // constraint: must be UUIDs of Element, thus of Entity, Relationship or Organizer -} -export class Organizer extends PigScaffold.Entity implements IOrganizer { - readonly type: PigScaffold.PigItemType; - eligibleElement: PigScaffold.TPigId[]; - constructor(itm: IOrganizer) { - super(itm); - this.type = PigInfraType.Organizer; - this.eligibleElement = itm.eligibleElement || []; - this.validate(itm); // here we only terminate in case of a programming error. - // Cannot return an error code, must call validate() separately upon creation. - } - set(itm: IOrganizer) { - super.set(itm); - this.eligibleElement = itm.eligibleElement || []; - } - get() { - return { - ...super.get(), - eligibleElement: this.eligibleElement - }; - } - validate(itm: IOrganizer) { - // Terminate in case of a programming error: - if (itm.type !== this.type) { - throw new Error(`Expected Organizer, but got ${itm.type}`); - }; - // Return an error code in case of invalid data: - // ToDo: implement validation logic - return 0; - } -} -export interface IAnOrganizer extends PigScaffold.IAnEntity { - hasClass: PigScaffold.TPigId; // constraint: must be UUID of Organizer - // Hierarchy elements must reference exactly one model element, but diagrams can reference ('show') one or more model elements: - hasElement: PigScaffold.TPigId[]; // constraint: must be UUIDs of objects of AnElement, thus of AnEntity, ARelationship or AnOrganizer -} -export class AnOrganizer extends PigScaffold.AnEntity implements IAnOrganizer { - readonly type: PigItemType; - hasClass!: PigScaffold.TPigId; - hasElement!: PigScaffold.TPigId[]; - constructor(itm: IAnOrganizer) { - super(itm); - this.type = PigItemType.anOrganizer; - this.hasClass = itm.hasClass; - this.hasElement = itm.hasElement; - this.validate(itm); // here we only terminate in case of a programming error. - // Cannot return an error code, must call validate() separately upon creation. - } - set(itm: IAnOrganizer) { - super.set(itm); - this.hasClass = itm.hasClass; - this.hasElement = itm.hasElement; - } - get() { - return { - ...super.get(), - hasClass: this.hasClass, - hasElement: this.hasElement, - }; - } - validate(itm: IAnOrganizer) { - // Terminate in case of a programming error: - if (itm.type !== this.type) { - throw new Error(`Expected AnOrganizer, but got ${itm.type}`); - }; - // Return an error code in case of invalid data: - // ToDo: implement validation logic - return 0; - } -} - -export interface IPackage extends IOrganizer { - namespace: PigScaffold.INamespace[]; - graph: PigScaffold.TPigItem[]; -} -export class Package extends Organizer implements IPackage { - namespace: PigScaffold.INamespace[]; - graph: PigScaffold.TPigItem[]; - constructor(itm: IPackage) { - super(itm); - this.namespace = itm.namespace || []; - this.graph = itm.graph || []; - this.validate(itm); // here we only terminate in case of a programming error. - // Cannot return an error code, must call validate() separately upon creation. - } - set(itm: IPackage) { - super.set(itm); - this.namespace = itm.namespace || []; - this.graph = itm.graph || []; - return this.validate(itm); - } - get() { - return { - ...super.get(), - namespace: this.namespace, - graph: this.graph - } // as IPackage; - } - validate(itm: IPackage) { - // Terminate in case of a programming error: - if (itm.type !== this.type) { - throw new Error(`Expected Organizer, but got ${itm.type}`); - }; - // Return an error code in case of invalid data: - // ToDo: implement validation logic - return 0; - } -} -export interface IOutline extends IOrganizer { - lists: PigScaffold.Element[]; -} -export class Outline extends Organizer implements IOutline { - lists: PigScaffold.Element[]; - constructor(itm: IOutline) { - super(itm); - this.lists = itm.lists || []; - this.validate(itm); // here we only terminate in case of a programming error. - // Cannot return an error code, must call validate() separately upon creation. - } - set(itm: IOutline) { - super.set(itm); - this.lists = itm.lists || []; - return this.validate(itm); - } - get() { - return { - ...super.get(), - lists: this.lists - } // as IDiagram; - } - validate(itm: IOutline) { - // Terminate in case of a programming error: - if (itm.type !== this.type) { - throw new Error(`Expected Organizer, but got ${itm.type}`); - }; - // Return an error code in case of invalid data: - // ToDo: implement validation logic - return 0; - } -} -export interface IDiagram extends IOrganizer { - shows: PigScaffold.Element[]; - depicts: PigScaffold.Entity; -} -export class Diagram extends Organizer implements IDiagram { - shows: PigScaffold.Element[]; - depicts: PigScaffold.Entity; - constructor(itm: IDiagram) { - super(itm); - this.shows = itm.shows || []; - this.depicts = itm.depicts; - this.validate(itm); // here we only terminate in case of a programming error. - // Cannot return an error code, must call validate() separately upon creation. - } - set(itm: IDiagram) { - super.set(itm); - this.shows = itm.shows || []; - this.depicts = itm.depicts; - return this.validate(itm); - } - get() { - return { - ...super.get(), - shows: this.shows, - depicts: this.depicts - } // as IDiagram; - } - validate(itm: IDiagram) { - // Terminate in case of a programming error: - if (itm.type !== this.type) { - throw new Error(`Expected Organizer, but got ${itm.type}`); - }; - // Return an error code in case of invalid data: - // ToDo: implement validation logic - return 0; - } -} diff --git a/src/utils/schemas/pig/ts/pig-metaclasses.ts b/src/utils/schemas/pig/ts/pig-metaclasses.ts index cd4331e..b9014a6 100644 --- a/src/utils/schemas/pig/ts/pig-metaclasses.ts +++ b/src/utils/schemas/pig/ts/pig-metaclasses.ts @@ -85,6 +85,7 @@ export enum XsDataType { Double = 'xs:double', String = 'xs:string', AnyURI = 'xs:anyURI', + Date = 'xs:date', DateTime = 'xs:dateTime', Duration = 'xs:duration', ComplexType = 'xs:complexType' diff --git a/tests/data/JSON-LD/11/Alice.pig.jsonld b/tests/data/JSON-LD/11/Alice.pig.jsonld new file mode 100644 index 0000000..b2aa39d --- /dev/null +++ b/tests/data/JSON-LD/11/Alice.pig.jsonld @@ -0,0 +1,808 @@ +{ + "@context": { + "rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#", + "rdfs": "http://www.w3.org/2000/01/rdf-schema#", + "owl": "http://www.w3.org/2002/07/owl#", + "sh": "http://www.w3.org/ns/shacl#", + "xs": "http://www.w3.org/2001/XMLSchema#", + "dcterms": "http://purl.org/dc/terms/", + "schema": "http://schema.org/", + "pig": "https://product-information-graph.org/ontology/2026-01-20/foundation#", + "o": "https://alice.org/ontology#", + "d": "https://alice.org/data#" + }, + "@id": "d:example_Alice_worksFor_ACME", + "@type": "pig:Package", + "pig:itemType": { + "@id": "pig:aPackage" + }, + "dcterms:title": [ + { + "@value": "Example: Alice works for ACME", + "@language": "en" + } + ], + "dcterms:modified": "2026-01-20T09:38:26.464Z", + "dcterms:license": "https://creativecommons.org/licenses/by-sa/4.0/", + "@graph": [ + { + "@id": "pig:Entity", + "@type": "owl:Class", + "pig:itemType": { + "@id": "pig:Entity" + }, + "dcterms:title": [ + { + "@value": "Entity", + "@language": "en" + } + ], + "dcterms:description": [ + { + "@value": "A PIG meta-model item used for entities (aka resources or artifacts).", + "@language": "en" + } + ], + "pig:eligibleProperty": [ + { + "@id": "pig:category" + }, + { + "@id": "pig:icon" + } + ] + }, + { + "@id": "pig:Organizer", + "pig:specializes": { + "@id": "pig:Entity" + }, + "pig:itemType": { + "@id": "pig:Entity" + }, + "dcterms:title": [ + { + "@value": "Organizer", + "@language": "en" + } + ], + "dcterms:description": [ + { + "@value": "An element organizing model elements. An example is a list of requirements or a diagram using a certain notation.", + "@language": "en" + } + ], + "pig:eligibleProperty": [ + { + "@id": "pig:category" + } + ] + }, + { + "@id": "pig:HierarchyRoot", + "pig:specializes": { + "@id": "pig:Organizer" + }, + "pig:itemType": { + "@id": "pig:Entity" + }, + "dcterms:title": [ + { + "@value": "Hierarchy Root", + "@language": "en" + } + ], + "dcterms:description": [ + { + "@value": "A subclass of PIG organizer serving as a root for hierarchically organized graph elements.", + "@language": "en" + } + ], + "pig:eligibleProperty": [], + "pig:eligibleTargetLink": [ + { + "@id": "pig:lists" + } + ] + }, + { + "@id": "pig:Outline", + "pig:specializes": { + "@id": "pig:Organizer" + }, + "pig:itemType": { + "@id": "pig:Entity" + }, + "dcterms:title": [ + { + "@value": "Outline", + "@language": "en" + } + ], + "dcterms:description": [ + { + "@value": "A subclass of PIG organizer comprising all information items of a human-readable document. As usual, the outline is hierarchically organized.", + "@language": "en" + } + ], + "pig:eligibleProperty": [ + { + "@id": "pig:category" + } + ], + "pig:eligibleTargetLink": [ + { + "@id": "pig:lists" + } + ] + }, + { + "@id": "pig:View", + "pig:specializes": { + "@id": "pig:Organizer" + }, + "pig:itemType": { + "@id": "pig:Entity" + }, + "dcterms:title": [ + { + "@value": "View", + "@language": "en" + } + ], + "dcterms:description": [ + { + "@value": "A subclass of PIG organizer representing a model view (diagram) using a certain notation showing selected model elements.", + "@language": "en" + } + ], + "pig:eligibleProperty": [ + { + "@id": "pig:category" + }, + { + "@id": "pig:icon" + } + ], + "pig:eligibleTargetLink": [ + { + "@id": "pig:shows" + }, + { + "@id": "pig:depicts" + } + ] + }, + { + "@id": "pig:Relationship", + "@type": "owl:Class", + "pig:itemType": { + "@id": "pig:Relationship" + }, + "dcterms:title": [ + { + "@value": "Relationship", + "@language": "en" + } + ], + "dcterms:description": [ + { + "@value": "A PIG meta-model item used for reified relationships (aka predicates).", + "@language": "en" + } + ], + "pig:eligibleProperty": [ + { + "@id": "pig:category" + }, + { + "@id": "pig:icon" + } + ], + "pig:eligibleSourceLink": { + "@id": "pig:SourceLink" + }, + "pig:eligibleTargetLink": { + "@id": "pig:TargetLink" + } + }, + { + "@id": "pig:Property", + "@type": "owl:DatatypeProperty", + "pig:itemType": { + "@id": "pig:Property" + }, + "dcterms:title": [ + { + "@value": "Property", + "@language": "en" + } + ], + "dcterms:description": [ + { + "@value": "A PIG meta-model item used for properties (aka attributes).", + "@language": "en" + } + ], + "sh:datatype": { + "@id": "xs:anyType" + } + }, + { + "@id": "pig:icon", + "pig:specializes": { + "@id": "pig:Property" + }, + "pig:itemType": { + "@id": "pig:Property" + }, + "dcterms:title": [ + { + "@value": "has icon" + } + ], + "dcterms:description": [ + { + "@value": "Specifies an icon for a model element (entity or relationship)." + } + ], + "sh:datatype": { + "@id": "xs:string" + }, + "sh:minCount": 0, + "sh:maxCount": 1 + }, + { + "@id": "pig:category", + "pig:specializes": { + "@id": "dcterms:type" + }, + "pig:itemType": { + "@id": "pig:Property" + }, + "dcterms:title": [ + { + "@value": "has category" + } + ], + "dcterms:description": [ + { + "@value": "Specifies a category for an element (entity, relationship or organizer)." + } + ], + "sh:datatype": { + "@id": "xs:string" + }, + "sh:maxLength": 32, + "sh:minCount": 0, + "sh:maxCount": 1 + }, + { + "@id": "pig:Link", + "@type": "owl:ObjectProperty", + "pig:itemType": { + "@id": "pig:Link" + }, + "pig:eligibleEndpoint": [ + { + "@id": "pig:Entity" + }, + { + "@id": "pig:Relationship" + } + ], + "dcterms:title": [ + { + "@value": "linked with", + "@language": "en" + } + ], + "dcterms:description": [ + { + "@value": "A PIG meta-model item connecting a reified relationship with its source or target. Also connects an organizer to a model element", + "@language": "en" + } + ] + }, + { + "@id": "pig:SourceLink", + "pig:specializes": { + "@id": "pig:Link" + }, + "pig:itemType": { + "@id": "pig:Link" + }, + "pig:eligibleEndpoint": [ + { + "@id": "pig:Entity" + }, + { + "@id": "pig:Relationship" + } + ], + "dcterms:title": [ + { + "@value": "to source", + "@language": "en" + } + ], + "dcterms:description": [ + { + "@value": "Connects the source of a reified relationship.", + "@language": "en" + } + ] + }, + { + "@id": "pig:TargetLink", + "pig:specializes": { + "@id": "pig:Link" + }, + "pig:itemType": { + "@id": "pig:Link" + }, + "pig:eligibleEndpoint": [ + { + "@id": "pig:Entity" + }, + { + "@id": "pig:Relationship" + } + ], + "dcterms:title": [ + { + "@value": "to target", + "@language": "en" + } + ], + "dcterms:description": [ + { + "@value": "Connects the target of a reified relationship or an organizer.", + "@language": "en" + } + ] + }, + { + "@id": "pig:lists", + "pig:specializes": { + "@id": "pig:TargetLink" + }, + "pig:itemType": { + "@id": "pig:Link" + }, + "pig:eligibleEndpoint": [ + { + "@id": "pig:Entity" + }, + { + "@id": "pig:Relationship" + }, + { + "@id": "pig:Organizer" + } + ], + "dcterms:title": [ + { + "@value": "lists", + "@language": "en" + } + ], + "dcterms:description": [ + { + "@value": "Lists an entity, a relationship or a subordinated organizer.", + "@language": "en" + } + ] + }, + { + "@id": "pig:shows", + "pig:specializes": { + "@id": "pig:TargetLink" + }, + "pig:itemType": { + "@id": "pig:Link" + }, + "pig:eligibleEndpoint": [ + { + "@id": "pig:Entity" + }, + { + "@id": "pig:Relationship" + } + ], + "dcterms:title": [ + { + "@value": "shows", + "@language": "en" + } + ], + "dcterms:description": [ + { + "@value": "Shows an entity or a relationship.", + "@language": "en" + } + ] + }, + { + "@id": "pig:depicts", + "pig:specializes": { + "@id": "pig:TargetLink" + }, + "pig:itemType": { + "@id": "pig:Link" + }, + "pig:eligibleEndpoint": [ + { + "@id": "pig:Entity" + } + ], + "dcterms:title": [ + { + "@value": "depicts", + "@language": "en" + } + ], + "dcterms:description": [ + { + "@value": "Depicts an entity; inverse of uml:ownedDiagram.", + "@language": "en" + } + ] + }, + { + "@id": "schema:Person", + "pig:specializes": { + "@id": "pig:Entity" + }, + "pig:itemType": { + "@id": "pig:Entity" + }, + "dcterms:title": [ + { + "@value": "Person", + "@language": "en" + } + ], + "dcterms:description": [ + { + "@value": "A person (alive, dead, undead, or fictional).", + "@language": "en" + } + ], + "pig:eligibleProperty": [ + { + "@id": "schema:familyName" + }, + { + "@id": "schema:givenName" + }, + { + "@id": "schema:birthDate" + } + ] + }, + { + "@id": "schema:Organization", + "pig:specializes": { + "@id": "pig:Entity" + }, + "pig:itemType": { + "@id": "pig:Entity" + }, + "dcterms:title": [ + { + "@value": "Organization", + "@language": "en" + } + ], + "dcterms:description": [ + { + "@value": "An organization such as a school, NGO, corporation, club, etc.", + "@language": "en" + } + ], + "pig:eligibleProperty": [ + { + "@id": "schema:legalName" + }, + { + "@id": "schema:taxID" + } + ] + }, + { + "@id": "schema:birthDate", + "pig:specializes": { + "@id": "pig:Property" + }, + "pig:itemType": { + "@id": "pig:Property" + }, + "dcterms:title": [ + { + "@value": "birth date", + "@language": "en" + } + ], + "dcterms:description": [ + { + "@value": "Date of birth.", + "@language": "en" + } + ], + "sh:datatype": { + "@id": "xs:date" + }, + "sh:minCount": 0, + "sh:maxCount": 1 + }, + { + "@id": "schema:familyName", + "pig:specializes": { + "@id": "pig:Property" + }, + "pig:itemType": { + "@id": "pig:Property" + }, + "dcterms:title": [ + { + "@value": "family name", + "@language": "en" + } + ], + "dcterms:description": [ + { + "@value": "Family name. In the U.S., the last name of a Person.", + "@language": "en" + } + ], + "sh:datatype": { + "@id": "xs:string" + }, + "sh:minCount": 0, + "sh:maxCount": 1 + }, + { + "@id": "schema:givenName", + "pig:specializes": { + "@id": "pig:Property" + }, + "pig:itemType": { + "@id": "pig:Property" + }, + "dcterms:title": [ + { + "@value": "given name", + "@language": "en" + } + ], + "dcterms:description": [ + { + "@value": "Given name. In the U.S., the first name of a Person.", + "@language": "en" + } + ], + "sh:datatype": { + "@id": "xs:string" + }, + "sh:minCount": 0, + "sh:maxCount": 1 + }, + { + "@id": "schema:legalName", + "pig:specializes": { + "@id": "pig:Property" + }, + "pig:itemType": { + "@id": "pig:Property" + }, + "dcterms:title": [ + { + "@value": "legal name", + "@language": "en" + } + ], + "dcterms:description": [ + { + "@value": "The official name of the organization, e.g. the registered company name.", + "@language": "en" + } + ], + "sh:datatype": { + "@id": "xs:string" + }, + "sh:minCount": 0, + "sh:maxCount": 1 + }, + { + "@id": "schema:taxID", + "pig:specializes": { + "@id": "pig:Property" + }, + "pig:itemType": { + "@id": "pig:Property" + }, + "dcterms:title": [ + { + "@value": "tax ID", + "@language": "en" + } + ], + "dcterms:description": [ + { + "@value": "The Tax / Fiscal ID of the organization or person, e.g. the TIN in the US or the CIF/NIF in Spain.", + "@language": "en" + } + ], + "sh:datatype": { + "@id": "xs:string" + }, + "sh:minCount": 0, + "sh:maxCount": 1 + }, + { + "@id": "schema:WorksFor", + "pig:specializes": { + "@id": "pig:Relationship" + }, + "pig:itemType": { + "@id": "pig:Relationship" + }, + "dcterms:title": [ + { + "@value": "works for", + "@language": "en" + } + ], + "dcterms:description": [ + { + "@value": "Organizations that the person works for.", + "@language": "en" + } + ], + "pig:eligibleProperty": [], + "pig:eligibleSourceLink": { + "@id": "o:Employee" + }, + "pig:eligibleTargetLink": { + "@id": "o:Employer" + } + }, + { + "@id": "o:Employee", + "pig:specializes": { + "@id": "pig:SourceLink" + }, + "pig:itemType": { + "@id": "pig:Link" + }, + "dcterms:title": [ + { + "@value": "employee", + "@language": "en" + } + ], + "dcterms:description": [ + { + "@value": "The employee in a 'worksFor' relationship", + "@language": "en" + } + ], + "pig:eligibleEndpoint": [ + { + "@id": "schema:Person" + } + ] + }, + { + "@id": "o:Employer", + "pig:specializes": { + "@id": "pig:TargetLink" + }, + "pig:itemType": { + "@id": "pig:Link" + }, + "dcterms:title": [ + { + "@value": "employer", + "@language": "en" + } + ], + "dcterms:description": [ + { + "@value": "The employer in a 'worksFor' relationship", + "@language": "en" + } + ], + "pig:eligibleEndpoint": [ + { + "@id": "schema:Organization" + } + ] + }, + { + "@id": "d:ACME", + "@type": "schema:Organization", + "pig:itemType": { + "@id": "pig:anEntity" + }, + "dcterms:modified": "2026-01-20T09:38:26.464Z", + "dcterms:title": [ + { + "@value": "ACME Corp.", + "@language": "en" + } + ], + "schema:legalName": [ + { + "@value": "ACME Corp.", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "schema:taxID": [ + { + "@value": "DE_123456789", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ] + }, + { + "@id": "d:Alice", + "@type": "schema:Person", + "pig:itemType": { + "@id": "pig:anEntity" + }, + "dcterms:modified": "2026-01-20T09:38:26.464Z", + "dcterms:title": [ + { + "@value": "Alice", + "@language": "en" + } + ], + "schema:familyName": [ + { + "@value": "Carpenter", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "schema:givenName": [ + { + "@value": "Alice", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ] + }, + { + "@id": "d:Alice_worksFor_ACME", + "@type": "schema:WorksFor", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "dcterms:modified": "2026-01-20T09:38:26.464Z", + "o:Employee": [ + { + "@id": "d:Alice", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "o:Employer": [ + { + "@id": "d:ACME", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/tests/unit/import-jsonld.spec.ts b/tests/unit/import-jsonld.spec.ts index 78947d1..7189360 100644 --- a/tests/unit/import-jsonld.spec.ts +++ b/tests/unit/import-jsonld.spec.ts @@ -7,6 +7,7 @@ describe('importJSONLD (file system)', () => { // List of relative filenames (relative to this test file). Add more entries as needed. const filenames:string[] = [ "../data/JSON-LD/05/Project 'Requirement with Enumerated Property'.pig.jsonld", + "../data/JSON-LD/11/Alice.pig.jsonld", "../data/JSON-LD/21/Project 'Very Simple Model (FMC) with Requirements'.pig.jsonld", "../data/JSON-LD/22/Small Autonomous Vehicle.pig.jsonld" // add more test files here, e.g. From b8e74bb3150d5f46420e87d99c485ab78e404dd7 Mon Sep 17 00:00:00 2001 From: "OD-T14S-25\\PCUser" Date: Tue, 27 Jan 2026 23:02:24 +0100 Subject: [PATCH 06/26] all tests positive - including xml import. Need still to collect the namespaces. --- .../import/jsonld/import-package-jsonld.ts | 16 +- src/utils/import/xml/import-package-xml.ts | 96 + src/utils/lib/helpers.ts | 223 ++- src/utils/lib/messages.ts | 48 +- src/utils/lib/mvf.ts | 212 +++ src/utils/schemas/pig/json/pig-schemata.ts | 6 +- src/utils/schemas/pig/ts/pig-metaclasses.ts | 1512 ++++++++++++--- .../schemas/pig/ts/pig-package-constraints.ts | 9 +- ... Model (FMC) with Requirements'.pig.jsonld | 1673 ++++++++++++++++- ...ple Model (FMC) with Requirements'.pig.xml | 4 +- ....spec.ts => import-package-jsonld.spec.ts} | 8 +- tests/unit/import-package-xml.spec.ts | 104 + tests/unit/pig-metaclasses-jsonld.spec.ts | 670 +++++++ tests/unit/pig-metaclasses-xml.spec.ts | 500 +++++ tests/unit/pig-package-constraints.spec.ts | 8 +- 15 files changed, 4628 insertions(+), 461 deletions(-) create mode 100644 src/utils/import/xml/import-package-xml.ts create mode 100644 src/utils/lib/mvf.ts rename tests/unit/{import-jsonld.spec.ts => import-package-jsonld.spec.ts} (93%) create mode 100644 tests/unit/import-package-xml.spec.ts create mode 100644 tests/unit/pig-metaclasses-jsonld.spec.ts create mode 100644 tests/unit/pig-metaclasses-xml.spec.ts diff --git a/src/utils/import/jsonld/import-package-jsonld.ts b/src/utils/import/jsonld/import-package-jsonld.ts index 3795def..78e0c25 100644 --- a/src/utils/import/jsonld/import-package-jsonld.ts +++ b/src/utils/import/jsonld/import-package-jsonld.ts @@ -41,7 +41,7 @@ export async function importJSONLD(source: string | File | Blob): Promise try { doc = JSON.parse(text); } catch (err: any) { - return Msg.create(690, err?.message ?? err); + return Msg.create(690, 'JSON-LD', err?.message ?? err); } // ✅ Validate entire JSON-LD document structure @@ -49,12 +49,18 @@ export async function importJSONLD(source: string | File | Blob): Promise if (!isValidPackage) { const errors = await SCH_LD.getValidatePackageLDErrors(); logger.error('JSON-LD package validation failed:', errors); - return Msg.create(697, errors); + return Msg.create(697, 'JSON-LD', errors); } // Instantiate APackage and load the document - const aPackage = new APackage(); - const allItems = aPackage.setJSONLD(doc); + const aPackage = new APackage().setJSONLD(doc); + + // Check if package was successfully created + if (!aPackage.status().ok) { + return aPackage.status(); + } + + const allItems = aPackage.getAllItems(); // allItems[0] is the package itself, rest are graph items // const graphItems = allItems.slice(1); @@ -66,7 +72,7 @@ export async function importJSONLD(source: string | File | Blob): Promise result = rspOK; logger.info(`importJSONLD: successfully instantiated package with all ${actualCount} items`); } else { - result = Msg.create(691, actualCount, expectedCount); + result = Msg.create(691, 'JSON-LD', actualCount, expectedCount); logger.warn(`importJSONLD: instantiated ${actualCount} of ${expectedCount} items`); } diff --git a/src/utils/import/xml/import-package-xml.ts b/src/utils/import/xml/import-package-xml.ts new file mode 100644 index 0000000..8283611 --- /dev/null +++ b/src/utils/import/xml/import-package-xml.ts @@ -0,0 +1,96 @@ +/*! Cross-environment XML importer. + * Copyright 2025 GfSE (https://gfse.org) + * License and terms of use: Apache 2.0 (http://www.apache.org/licenses/LICENSE-2.0) + */ +/** + * Cross-environment XML importer. + * - Accepts a Node file path, an http(s) URL string or a browser File/Blob. + * - Parses XML document, converts XML structure to internal keys + * and instantiates matching PIG class instances where possible. + * + * Dependencies: + * Authors: oskar.dungern@gfse.org, .. + * License and terms of use: Apache 2.0 (http://www.apache.org/licenses/LICENSE-2.0) + * We appreciate any correction, comment or contribution as Github issue (https://github.com/GfSE/CASCaDE-Reference-Implementation/issues) + * + * Usage: + * - Node: await importXML('C:/path/to/file.xml') + * - URL: await importXML('https://example/.../doc.xml') + * - Browser: await importXML(fileInput.files[0]) + */ + +import { IRsp, rspOK, Msg } from '../../lib/messages'; +import { LIB, logger } from '../../lib/helpers'; +import { APackage, TPigItem } from '../../schemas/pig/ts/pig-metaclasses'; + +/** + * Import XML document and instantiate PIG items + * @param source - File path, URL, or File/Blob object + * @returns IRsp with array of TPigItem (first item is APackage, rest are graph items) + */ +export async function importXML(source: string | File | Blob): Promise { + const rsp = await LIB.readFileAsText(source); + if (!rsp.ok) + return rsp; + + const xmlString = rsp.response as string; + // logger.info('importXML: loaded text length ' + xmlString.length); + + // ✅ Optional: Pre-validate XML syntax + let doc: Document; + try { + const parser = new DOMParser(); + doc = parser.parseFromString(xmlString, 'text/xml'); + + // Check for XML parsing errors + const parserError = doc.querySelector('parsererror'); + if (parserError) { + const errorMessage = parserError.textContent || 'Unknown XML parsing error'; + return Msg.create(690, 'XML', errorMessage); + } + } catch (err: any) { + return Msg.create(690, 'XML', err?.message ?? err); + } + /* + // ✅ Validate entire XML document structure + const isValidPackage = await SCH_XSD.validatePackageXML(doc); + if (!isValidPackage) { + const errors = await SCH_XSD.getValidatePackageXMLErrors(); + logger.error('XML package validation failed:', errors); + return Msg.create(697, 'XML', errors); + } + */ + // ✅ Instantiate APackage directly from XML string + const aPackage = new APackage().setXML(xmlString); + + // Check if package was successfully created + if (!aPackage.status().ok) { + return aPackage.status(); + } + + // allItems[0] is the package itself, rest are graph items: + const allItems = aPackage.getAllItems(); + + const graphElement = aPackage.graph; + const expectedCount = graphElement?.length || 0; + const actualCount = allItems.length - 1; + + let result: IRsp; + if (actualCount === expectedCount) { + result = rspOK; + logger.info(`importXML: successfully instantiated package with all ${actualCount} items`); + } else { + result = Msg.create(691, 'XML', actualCount, expectedCount); + logger.warn(`importXML: instantiated ${actualCount} of ${expectedCount} items`); + } + + // Return all items (package + graph items) + result.response = allItems; + result.responseType = 'json'; + + return result as IRsp; +/* + // TEMPORARY: Return not implemented message + return Msg.create(699, 'XML import'); +*/ +} diff --git a/src/utils/lib/helpers.ts b/src/utils/lib/helpers.ts index 4f8b4b4..5f82d90 100644 --- a/src/utils/lib/helpers.ts +++ b/src/utils/lib/helpers.ts @@ -2,12 +2,12 @@ * Product Information Graph (PIG) - helper routines * Copyright 2025 GfSE (https://gfse.org) * License and terms of use: Apache 2.0 (http://www.apache.org/licenses/LICENSE-2.0) + * We appreciate any correction, comment or contribution as Github issue (https://github.com/GfSE/CASCaDE-Reference-Implementation/issues) */ /** Product Information Graph (PIG) - helper routines * Dependencies: none * Authors: oskar.dungern@gfse.org, .. * License and terms of use: Apache 2.0 (http://www.apache.org/licenses/LICENSE-2.0) - * We appreciate any correction, comment or contribution as Github issue (https://github.com/GfSE/CASCaDE-Reference-Implementation/issues) * * Design Decisions: * - @@ -23,38 +23,34 @@ export type JsonValue = JsonPrimitive | JsonObject | JsonArray; export interface JsonObject { [key: string]: JsonValue; } export type JsonArray = Array -// Map PIG metamodel attributés to/from JSON-LD keys; -// all other keys are derived from the ontology and handled dynamically: -const TO_JSONLD: [string, string][] = [ - ['context', '@context'], - ['id', '@id'], - ['revision', 'pig:revision'], - ['priorRevision', 'pig:priorRevision'], - ['hasClass', '@type'], - ['specializes', 'pig:specializes'], - ['icon', 'pig:icon'], - ['value', '@value'], - ['lang', '@language'], - ['datatype', 'sh:datatype'], - ['minCount', 'sh:minCount'], - ['maxCount', 'sh:maxCount'], - ['maxLength', 'sh:maxLength'], - ['defaultValue', 'sh:defaultValue'], - ['pattern', 'sh:pattern'], - ['itemType', 'pig:itemType'], - ['eligibleProperty', 'pig:eligibleProperty'], -// ['eligibleReference', 'pig:eligibleReference'], - ['eligibleSourceLink', 'pig:eligibleSourceLink'], - ['eligibleTargetLink', 'pig:eligibleTargetLink'], - ['eligibleEndpoint', 'pig:eligibleEndpoint'], - ['eligibleValue', 'pig:eligibleValue'], - ['title', 'dcterms:title'], - ['description', 'dcterms:description'], - ['created', 'dcterms:created'], - ['modified', 'dcterms:modified'], - ['creator', 'dcterms:creator'] -]; -const FROM_JSONLD: [string, string][] = TO_JSONLD.map(([a, b]) => [b, a] as [string, string]); + +/** + * Standard XML Namespaces used in PIG XML documents + * Collected from tests/data/XML files + */ +const NAMESPACE_MAP: Record = { + 'xml': 'http://www.w3.org/XML/1998/namespace', + 'xs': 'http://www.w3.org/2001/XMLSchema#', + 'rdf': 'http://www.w3.org/1999/02/22-rdf-syntax-ns#', + 'rdfs': 'http://www.w3.org/2000/01/rdf-schema#', + 'owl': 'http://www.w3.org/2002/07/owl#', + 'dcterms': 'http://purl.org/dc/terms/', + 'FMC': 'http://fmc-modeling.org#', + 'IREB': 'https://cpre.ireb.org/en/downloads-and-resources/glossary#', + 'ReqIF': 'https://www.prostep.org/fileadmin/downloads/PSI_ImplementationGuide_ReqIF_V1-7.pdf#', + 'oslc_rm': 'http://open-services.net/ns/rm#', + 'pig': 'https://product-information-graph.org/v0.2/metamodel#', + 'SpecIF': 'https://specif.de/v1.2/schema#', + 'o': 'https://product-information-graph.org/ontology/application#', + 'd': 'https://product-information-graph.org/example#' // default example namespace +}; + +/** + * Generate XML namespace declarations string from NAMESPACE_MAP + */ +export const XML_NAMESPACES = Object.entries(NAMESPACE_MAP) + .map(([prefix, uri]) => `xmlns:${prefix}="${uri}"`) + .join('\n '); // LIB object with helper methods export const LIB = { @@ -179,85 +175,6 @@ export const LIB = { } return outObj; }, - /** - * Rename JSON object keys (tags) according to a mapping. - * - mapping may be a Record or Array<[string, string]> - * - options.mutate: if true, mutate the original object in-place; default false (returns a new object) - * - Only object keys are renamed; array elements and primitive values are preserved (but nested objects are processed) - * Usage: renameJsonTags(node, LIB.fromJSONLD) - */ - toJSONLD: TO_JSONLD, // see above - fromJSONLD: FROM_JSONLD, - renameJsonTags( - node: JsonValue, - mapping: Record | Array<[string, string]>, - options ?: { mutate?: boolean } - ): JsonValue { - const mutate = !!(options && options.mutate); - - // normalize mapping to a simple lookup object: - const mapObj: Record = Array.isArray(mapping) - ? mapping.reduce((acc, pair) => { - if (Array.isArray(pair) && pair.length >= 2) acc[pair[0]] = pair[1]; - return acc; - }, {} as Record) - : { ...mapping }; - - // 1. handle leaf and null - if (node === undefined || node === null || this.isLeaf(node)) { - return node; - } - - // 2. handle array - if (Array.isArray(node)) { - if (mutate) { - for (let i = 0; i < node.length; i++) { - const item = node[i]; - node[i] = LIB.renameJsonTags(item, mapObj, options); - } - return node; - } - const out: JsonArray = []; - for (let i = 0; i < node.length; i++) { - out[i] = LIB.renameJsonTags(node[i], mapObj, options); - } - return out; - } - - // 3. handle object - const src = node as JsonObject; - if (mutate) { - for (const key of Object.keys(src)) { - // unsafe: const mappedKey = mapObj.hasOwnProperty(key) ? mapObj[key] : key; - // es2022 safe: const mappedKey = Object.hasOwn(mapObj, key) ? mapObj[key] : key; - const mappedKey = Object.prototype.hasOwnProperty.call(mapObj, key) ? mapObj[key] : key; - const child = src[key]; - const newValue = LIB.renameJsonTags(child, mapObj, options); - if (mappedKey !== key) { - // if target key already exists we overwrite — intentional but warn in console - if (Object.prototype.hasOwnProperty.call(src, mappedKey)) { - // eslint-disable-next-line no-console - logger.warn(`renameJsonTags: overwriting key '${mappedKey}' while renaming '${key}'`); - } - src[mappedKey] = newValue; - delete src[key]; - } else { - src[key] = newValue; - } - } - return src; - } - - // logger.debug('src',src); - const out: JsonObject = {}; - for (const key of Object.keys(src)) { - // unsafe: const mappedKey = mapObj.hasOwnProperty(key) ? mapObj[key] : key; - // es2022 safe: const mappedKey = Object.hasOwn(mapObj, key) ? mapObj[key] : key; - const mappedKey = Object.prototype.hasOwnProperty.call(mapObj, key) ? mapObj[key] : key; - out[mappedKey] = LIB.renameJsonTags(src[key], mapObj, options); - } - return out; - }, /** * Convert a string to an enum member value. * - Tries to match enum values first, then (optionally) enum keys (names). @@ -326,6 +243,87 @@ export const LIB = { } return value; }, + /** + * Wrap XML fragment with root element and namespace declarations + * @param xml - XML fragment (without root wrapper) + * @param options - Optional configuration + * @returns Complete XML document with namespace declarations + */ + makeXMLDoc( + xml: string, + options?: { + rootTag?: string; // Custom root tag (default: 'pig:Package') + includeXmlDeclaration?: boolean; // Include declaration (default: false) + detectNamespaces?: boolean; // Only include namespaces actually used (default: true) + } + ): string { + const rootTag = options?.rootTag ?? 'pig:Package'; + const includeXmlDecl = options?.includeXmlDeclaration ?? false; + const detectNs = options?.detectNamespaces ?? true; + + // Detect which namespace prefixes are actually used in the XML + let namespacesToInclude: Record; + const unknownPrefixes: Set = new Set(); + + if (detectNs) { + namespacesToInclude = {}; + const foundPrefixes = new Set(); + + // Find namespace prefixes in element tags (opening and closing) + // Match: 0) { + const unknownList = Array.from(unknownPrefixes).join(', '); + logger.error( + `makeXMLDoc: Unknown namespace prefixes found: ${unknownList}. ` + + `These prefixes are not defined in NAMESPACE_MAP and will not be declared in the XML document. ` + + `Please add them to NAMESPACE_MAP in helpers.ts.` + ); + } + } else { + // Include all namespaces + namespacesToInclude = { ...NAMESPACE_MAP }; + } + + // Build namespace declarations string + const nsDeclarations = Object.entries(namespacesToInclude) + .map(([prefix, uri]) => `xmlns:${prefix}="${uri}"`) + .join('\n '); + + // Build the complete document + const xmlDeclaration = includeXmlDecl ? '\n' : ''; + const wrappedXml = `${xmlDeclaration}<${rootTag} ${nsDeclarations}>${xml}`; + + return wrappedXml; + }, // Load text from Node file path, HTTP(S) URL or browser File/Blob async readFileAsText(source: string | File | Blob): Promise> { if (typeof source === 'string') { @@ -373,7 +371,6 @@ export const LIB = { isHttpUrl(s: string): boolean { return /^https?:\/\//i.test(s); }, - isNodeEnv(): boolean { const p = (globalThis as any).process; return typeof p !== 'undefined' && !!(p.versions && p.versions.node); diff --git a/src/utils/lib/messages.ts b/src/utils/lib/messages.ts index fd349f1..2f11093 100644 --- a/src/utils/lib/messages.ts +++ b/src/utils/lib/messages.ts @@ -2,12 +2,12 @@ * Product Information Graph (PIG) - Centralized error and status messages * Copyright 2025 GfSE (https://gfse.org) * License and terms of use: Apache 2.0 (http://www.apache.org/licenses/LICENSE-2.0) + * We appreciate any correction, comment or contribution as Github issue (https://github.com/GfSE/CASCaDE-Reference-Implementation/issues) */ /** Product Information Graph (PIG) - Centralized error and status messages * Dependencies: none (self-contained) * Authors: oskar.dungern@gfse.org * License and terms of use: Apache 2.0 (http://www.apache.org/licenses/LICENSE-2.0) -* We appreciate any correction, comment or contribution as Github issue (https://github.com/GfSE/CASCaDE-Reference-Implementation/issues) * * Design Decisions: * - All PIG validation and error messages centralized here @@ -383,20 +383,20 @@ const messages: Record string>> // General errors (690-699) 690: { - en: (msg: string) => `Failed to parse JSON-LD: ${msg}`, - de: (msg: string) => `Parsing von JSON-LD fehlgeschlagen: ${msg}`, - fr: (msg: string) => `Échec de l'analyse JSON-LD: ${msg}`, - es: (msg: string) => `Error al analizar JSON-LD: ${msg}` + en: (format: string, msg: string) => `Failed to parse ${format}: ${msg}`, + de: (format: string, msg: string) => `Parsing von ${format} fehlgeschlagen: ${msg}`, + fr: (format: string, msg: string) => `Échec de l'analyse ${format}: ${msg}`, + es: (format: string, msg: string) => `Error al analizar ${format}: ${msg}` }, 691: { - en: (created: number, total: number) => - `Imported ${created} of ${total} items from JSON-LD.`, - de: (created: number, total: number) => - `${created} von ${total} Elementen aus JSON-LD importiert.`, - fr: (created: number, total: number) => - `${created} éléments sur ${total} importés depuis JSON-LD.`, - es: (created: number, total: number) => - `${created} de ${total} elementos importados desde JSON-LD.` + en: (format: string, created: number, total: number) => + `Imported ${created} of ${total} items from ${format}`, + de: (format: string, created: number, total: number) => + `${created} von ${total} Elementen aus ${format} importiert`, + fr: (format: string, created: number, total: number) => + `${created} éléments sur ${total} importés depuis ${format}`, + es: (format: string, created: number, total: number) => + `${created} de ${total} elementos importados desde ${format}` }, 692: { en: (url: string, statusText: string) => @@ -449,14 +449,20 @@ const messages: Record string>> `Tipo de fuente no compatible al leer un archivo como texto` }, 697: { - en: (errors: string) => - `JSON-LD package validation failed: ${errors}`, - de: (errors: string) => - `JSON-LD Paket-Validierung fehlgeschlagen: ${errors}`, - fr: (errors: string) => - `Échec de la validation du package JSON-LD: ${errors}`, - es: (errors: string) => - `Error en la validación del paquete JSON-LD: ${errors}` + en: (format: string, errors: string) => + `${format} package validation failed: ${errors}`, + de: (format: string, errors: string) => + `${format} Paket-Validierung fehlgeschlagen: ${errors}`, + fr: (format: string, errors: string) => + `Échec de la validation du package ${format}: ${errors}`, + es: (format: string, errors: string) => + `Error en la validación del paquete ${format}: ${errors}` + }, + 699: { + en: (func: string) => `${func} not yet implemented`, + de: (func: string) => `${func} ist noch nicht implementiert`, + fr: (func: string) => `${func} pas encore implémenté`, + es: (func: string) => `${func} aún no implementado` } }; diff --git a/src/utils/lib/mvf.ts b/src/utils/lib/mvf.ts new file mode 100644 index 0000000..501f9e2 --- /dev/null +++ b/src/utils/lib/mvf.ts @@ -0,0 +1,212 @@ +/*! + * Product Information Graph (PIG) - Multi-Vocabulary Facility (MVF) + * Copyright 2025 GfSE (https://gfse.org) + * License and terms of use: Apache 2.0 (http://www.apache.org/licenses/LICENSE-2.0) + * We appreciate any correction, comment or contribution as Github issue (https://github.com/GfSE/CASCaDE-Reference-Implementation/issues) + */ +/** Product Information Graph (PIG) - Multi-Vocabulary Facility + * Handles mapping between different vocabulary representations (JSON-LD, XML, internal format) + * Dependencies: helpers.ts (for JsonValue types and logger) + * Authors: oskar.dungern@gfse.org, .. + * License and terms of use: Apache 2.0 (http://www.apache.org/licenses/LICENSE-2.0) + */ + +import { LIB, JsonPrimitive, JsonValue, JsonObject, JsonArray, logger } from './helpers'; + +// Map PIG metamodel attributes to/from JSON-LD keys; +// all other keys are derived from the ontology and handled dynamically: +const FROM_JSONLD = new Map([ + ['@context', 'context'], + ['@id', 'id'], + ['@type', 'hasClass'], + ['@value', 'value'], + ['@language', 'lang'], + ['pig:revision', 'revision'], + ['pig:priorRevision', 'priorRevision'], + ['rdfs:subClassOf', 'specializes'], + ['rdfs:subPropertyOf', 'specializes'], + ['pig:specializes', 'specializes'], + ['pig:icon', 'icon'], + ['xs:simpleType', 'datatype'], + ['sh:datatype', 'datatype'], + ['xs:minOccurs', 'minCount'], + ['sh:minCount', 'minCount'], + ['xs:maxOccurs', 'maxCount'], + ['sh:maxCount', 'maxCount'], + ['xs:maxLength', 'maxLength'], + ['sh:maxLength', 'maxLength'], + ['xs:default', 'defaultValue'], + ['sh:defaultValue', 'defaultValue'], + ['xs:pattern', 'pattern'], + ['sh:pattern', 'pattern'], + ['pig:itemType', 'itemType'], + ['pig:eligibleProperty', 'eligibleProperty'], + ['pig:eligibleSourceLink', 'eligibleSourceLink'], + ['pig:eligibleTargetLink', 'eligibleTargetLink'], + ['pig:eligibleEndpoint', 'eligibleEndpoint'], + ['pig:eligibleValue', 'eligibleValue'], + ['dcterms:title', 'title'], + ['dcterms:description', 'description'], + ['dcterms:created', 'created'], + ['dcterms:modified', 'modified'], + ['dcterms:creator', 'creator'] +]); + +// Create Reverse-Map once +const TO_JSONLD = new Map( + Array.from(FROM_JSONLD.entries()).map(([a, b]) => [b, a]) +); + +// Map entries with the same keys: The second prevails. +const FROM_XML = new Map([ + // ['@value', 'value'], + // ['@language', 'lang'], + ['pig:revision', 'revision'], + ['pig:priorRevision', 'priorRevision'], + ['rdf:type', 'hasClass'], + ['rdfs:subClassOf', 'specializes'], + ['rdfs:subPropertyOf', 'specializes'], + ['pig:specializes', 'specializes'], + ['pig:icon', 'icon'], + ['sh:datatype', 'datatype'], + ['xs:simpleType', 'datatype'], + ['sh:minCount', 'minCount'], + ['xs:minOccurs', 'minCount'], + ['sh:maxCount', 'maxCount'], + ['xs:maxOccurs', 'maxCount'], + ['sh:maxLength', 'maxLength'], + ['xs:maxLength', 'maxLength'], + ['sh:defaultValue', 'defaultValue'], + ['xs:default', 'defaultValue'], + ['sh:pattern', 'pattern'], + ['xs:pattern', 'pattern'], + ['pig:itemType', 'itemType'], + ['pig:eligibleProperty', 'eligibleProperty'], + ['pig:eligibleSourceLink', 'eligibleSourceLink'], + ['pig:eligibleTargetLink', 'eligibleTargetLink'], + ['pig:eligibleEndpoint', 'eligibleEndpoint'], + ['pig:eligibleValue', 'eligibleValue'], + ['dcterms:title', 'title'], + ['dcterms:description', 'description'], + ['dcterms:created', 'created'], + ['dcterms:modified', 'modified'], + ['dcterms:creator', 'creator'] +]); +const TO_XML = new Map( + Array.from(FROM_XML.entries()).map(([a, b]) => [b, a]) +); + +/** + * Multi-Vocabulary Facilities object + * Provides mapping between different vocabulary representations + */ +export const MVF = { + /** + * Mapping from internal format to JSON-LD + */ + toJSONLD: TO_JSONLD, + + /** + * Mapping from JSON-LD to internal format + */ + fromJSONLD: FROM_JSONLD, + + /** + * Mapping from internal format to XML + */ + toXML: TO_XML, + + /** + * Mapping from XML to internal format + */ + fromXML: FROM_XML, + + /** + * Rename JSON object keys (tags) according to a mapping. + * - options.mutate: if true, mutate the original object in-place; default false (returns a new object) + * - Only object keys are renamed; array elements and primitive values are preserved (but nested objects are processed) + * + * Usage examples: + * - MVF.renameJsonTags(node, MVF.toJSONLD) // Convert to JSON-LD + * - MVF.renameJsonTags(node, MVF.fromJSONLD) // Convert from JSON-LD + * - MVF.renameJsonTags(node, MVF.toXML) // Convert to XML format + * - MVF.renameJsonTags(node, MVF.fromXML) // Convert from XML format + * + * ⚠️ WARNING: Use { mutate: true } only when: + * - Working with very large objects (performance critical) + * - The original object is no longer needed + * - You understand that the input will be modified + */ + renameJsonTags( + node: JsonValue, + mapping: Map, + options?: { mutate?: boolean } + ): JsonValue { + const mutate = !!(options && options.mutate); + + // 1. handle leaf and null + if (node === undefined || node === null || LIB.isLeaf(node)) { + return node; + } + + // 2. handle array + if (Array.isArray(node)) { + if (mutate) { + for (let i = 0; i < node.length; i++) { + node[i] = MVF.renameJsonTags(node[i], mapping, options); + } + return node; + } + + return node.map(item => MVF.renameJsonTags(item, mapping, options)); + } + + // 3. handle object + const src = node as JsonObject; + if (mutate) { + for (const key of Object.keys(src)) { + const mappedKey = mapping.get(key) ?? key; // ✅ ELEGANT! + const newValue = MVF.renameJsonTags(src[key], mapping, options); + + if (mappedKey !== key) { + if (Object.prototype.hasOwnProperty.call(src, mappedKey)) { + logger.warn(`renameJsonTags: overwriting key '${mappedKey}' while renaming '${key}'`); + } + src[mappedKey] = newValue; + delete src[key]; + } else { + src[key] = newValue; + } + } + return src; + } + + // Immutable version + const out: JsonObject = {}; + for (const key of Object.keys(src)) { + const mappedKey = mapping.get(key) ?? key; // ✅ ELEGANT! + out[mappedKey] = MVF.renameJsonTags(src[key], mapping, options); + } + return out; + }, + + /** + * Map a single term (primitive value) according to a mapping. + * Returns the mapped value if found in mapping, otherwise returns the original term. + * + * Usage examples: + * - MVF.mapTerm('@id', MVF.fromJSONLD) // → 'id' + * - MVF.mapTerm('unknownTerm', MVF.toJSONLD) // → 'unknownTerm' + * - MVF.mapTerm('title', MVF.toJSONLD) // → 'dcterms:title' + * + * @param term - The term to map (must be a JsonPrimitive) + * @param mapping - Mapping object or array of [key, value] pairs + * @returns Mapped value if found, otherwise original term + */ + mapTerm(term: JsonPrimitive, mapping: Map): JsonPrimitive { + if (typeof term !== 'string') { + return term; + } + return mapping.get(term) ?? term; // ✅ SUPER EINFACH! + } +}; diff --git a/src/utils/schemas/pig/json/pig-schemata.ts b/src/utils/schemas/pig/json/pig-schemata.ts index 1cf3da3..2b4cd7b 100644 --- a/src/utils/schemas/pig/json/pig-schemata.ts +++ b/src/utils/schemas/pig/json/pig-schemata.ts @@ -215,7 +215,8 @@ const ENTITY_SCHEMA = { additionalProperties: false, properties: { value: { type: 'string' } - } + }, + description: 'string or data URI of an icon representing the entity' }, title: { type: 'array', @@ -281,7 +282,8 @@ const RELATIONSHIP_SCHEMA = { additionalProperties: false, properties: { value: { type: 'string' } - } + }, + description: 'string or data URI of an icon representing the relationship' }, title: { type: 'array', diff --git a/src/utils/schemas/pig/ts/pig-metaclasses.ts b/src/utils/schemas/pig/ts/pig-metaclasses.ts index b9014a6..93c44d4 100644 --- a/src/utils/schemas/pig/ts/pig-metaclasses.ts +++ b/src/utils/schemas/pig/ts/pig-metaclasses.ts @@ -2,12 +2,12 @@ * Product Information Graph (PIG) Metaclasses * Copyright 2025 GfSE (https://gfse.org) * License and terms of use: Apache 2.0 (http://www.apache.org/licenses/LICENSE-2.0) + * We appreciate any correction, comment or contribution as Github issue (https://github.com/GfSE/CASCaDE-Reference-Implementation/issues) */ /** Product Information Graph (PIG) Metaclasses - the basic object structure representing the PIG * Dependencies: none * Authors: oskar.dungern@gfse.org, .. * License and terms of use: Apache 2.0 (http://www.apache.org/licenses/LICENSE-2.0) - * We appreciate any correction, comment or contribution as Github issue (https://github.com/GfSE/CASCaDE-Link-Implementation/issues) * * Design Decisions: * - The PIG classes contain *only *the elements in the metamodel; it could be generated from the metamodel. @@ -32,6 +32,7 @@ import { IRsp, rspOK, Msg, Rsp } from "../../../lib/messages"; import { RE } from "../../../lib/definitions"; import { LIB, logger } from "../../../lib/helpers"; +import { MVF } from "../../../lib/mvf"; import { JsonPrimitive, JsonValue, JsonArray, JsonObject } from "../../../lib/helpers"; // use central Ajv instance from the Vue plugin: import { SCH } from '../json/pig-schemata'; @@ -45,8 +46,10 @@ export type TPigElement = Entity | Relationship; export type TPigAnElement = AnEntity | ARelationship; export type TPigItem = APackage | TPigClass | TPigAnElement; export type stringHTML = string; // contains HTML code +export type stringXML = string; // contains XML code export type tagIETF = string; // contains IETF language tag export type TISODateString = string; +export type ElementXML = globalThis.Element; // DOM Element typ export const PigItemType = { aPackage: 'pig:aPackage', @@ -138,6 +141,11 @@ abstract class Item implements IItem { status(): IRsp { return this.lastStatus; } + protected validate(itm: IItem) { + if (itm.itemType !== this.itemType) + return Msg.create(600, this.itemType, itm.itemType); + return rspOK; + } protected set(itm: IItem) { this.hasClass = itm.hasClass; } @@ -147,11 +155,6 @@ abstract class Item implements IItem { hasClass: this.hasClass }; } - protected validate(itm: IItem) { - if (itm.itemType !== this.itemType) - return Msg.create(600, this.itemType, itm.itemType); - return rspOK; - } } interface IIdentifiable extends IItem { id: TPigId; // translates to @id in JSON-LD @@ -168,6 +171,28 @@ abstract class Identifiable extends Item implements IIdentifiable { protected constructor(itm: IItem) { super(itm); // actual itemType set in concrete class } + protected validate(itm: IIdentifiable) { + if (this.id && itm.id !== this.id) + return Msg.create(610, this.id, itm.id); + if (this.specializes && this.specializes !== itm.specializes) + return Msg.create(611, this.specializes, itm.specializes); + + // Runtime guards: + /* this is now checked in schema validation: */ + // Ensure title is a multi-language text (array of ILanguageText) + if (itm.title !== undefined) { + const tRes = validateMultiLanguageText(itm.title, 'title'); + if (!tRes.ok) return tRes; + } + // description is optional, but when present must be an array of ILanguageText + if (itm.description !== undefined) { + const dRes = validateMultiLanguageText(itm.description, 'description'); + if (!dRes.ok) return dRes; + } + + // ToDo: implement further validation logic + return super.validate(itm); + } protected set(itm: IIdentifiable) { // validated in concrete subclass before calling this; // also lastStatus set in concrete subclass. @@ -190,48 +215,31 @@ abstract class Identifiable extends Item implements IIdentifiable { }); } protected setJSONLD(itm: any) { - let _itm = { ...itm }; + let ld = { ...itm }; // 1. Rename JSON-LD tags to internal format - _itm = LIB.renameJsonTags(_itm as JsonValue, LIB.fromJSONLD, { mutate: false }) as any; + ld = MVF.renameJsonTags(ld as JsonValue, MVF.fromJSONLD, { mutate: false }) as any; // 2. Replace id-objects with id-strings - _itm = replaceIdObjects(_itm); + ld = replaceIdObjects(ld); // 3. Normalize multi-language texts (from abstract normalize) - _itm = { ..._itm }; - _itm.title = normalizeMultiLanguageText(_itm.title); - _itm.description = normalizeMultiLanguageText(_itm.description); + ld.title = normalizeMultiLanguageText(ld.title); + ld.description = normalizeMultiLanguageText(ld.description); // Set the normalized object in the concrete subclass - return _itm; + return ld; + // ToDo: consider to return this like in setXML() } protected getJSONLD() { - const jld = LIB.renameJsonTags(this.get() as unknown as JsonObject, LIB.toJSONLD, { mutate: false }) as JsonObject; + const jld = MVF.renameJsonTags(this.get() as unknown as JsonObject, MVF.toJSONLD, { mutate: false }) as JsonObject; // logger.debug('Identifiable.getJSONLD: ', jld); return makeIdObjects(jld) as JsonObject; } - protected validate(itm: IIdentifiable) { - if (this.id && itm.id !== this.id) - return Msg.create(610, this.id, itm.id); - if(this.specializes && this.specializes !== itm.specializes) - return Msg.create(611, this.specializes, itm.specializes); - - // Runtime guards: - /* this is now checked in schema validation: */ - // Ensure title is a multi-language text (array of ILanguageText) - if (itm.title !== undefined) { - const tRes = validateMultiLanguageText(itm.title, 'title'); - if (!tRes.ok) return tRes; - } - // description is optional, but when present must be an array of ILanguageText - if (itm.description !== undefined) { - const dRes = validateMultiLanguageText(itm.description, 'description'); - if (!dRes.ok) return dRes; - } - - // ToDo: implement further validation logic - return super.validate(itm); + protected setXML(itm: any) { + this.lastStatus = xml2json(itm); + // Set the normalized object in the concrete subclass + return this; // differently than setJSOLD(), returns this } } @@ -243,6 +251,14 @@ abstract class ALink extends Item implements IALink { constructor(itm: IItem) { super(itm); } + protected validate(itm: IALink) { + // id and itemType checked in superclass + if (!itm.hasClass) + return Msg.create(601, itm.itemType); + // ToDo: implement further validation logic + // - Check class reference; must be an existing Link URI (requires access to the cache to resolve the class -> do it through overall consistency check): + return super.validate(itm); + } protected set(itm: IALink) { super.set(itm); this.idRef = itm.idRef; @@ -255,13 +271,20 @@ abstract class ALink extends Item implements IALink { idRef: this.idRef }); } - protected validate(itm: IALink) { - // id and itemType checked in superclass - if (!itm.hasClass) - return Msg.create(601, itm.itemType); - // ToDo: implement further validation logic - // - Check class reference; must be an existing Link URI (requires access to the cache to resolve the class -> do it through overall consistency check): - return super.validate(itm); + protected setJSONLD(itm: any) { + let _itm = MVF.renameJsonTags(itm as JsonValue, MVF.fromJSONLD, { mutate: false }) as any; + _itm = replaceIdObjects(_itm); + return this.set(_itm); + } + protected getJSONLD() { + // if (!this.lastStatus.ok) return undefined; + const jld = MVF.renameJsonTags(this.get() as unknown as JsonObject, MVF.toJSONLD, { mutate: false }) as JsonObject; + return makeIdObjects(jld) as JsonObject; + } + protected setXML(itm: any) { + this.lastStatus = xml2json(itm); + // Set the normalized object in the concrete subclass + return this; } } interface IElement extends IIdentifiable { @@ -274,6 +297,15 @@ abstract class Element extends Identifiable implements IElement { protected constructor(itm: IItem) { super(itm); // actual itemType set in concrete class } +/* protected validate(itm: IElement) { + // If eligibleProperty is not present, all properties are allowed; + // if present and empty, no properties are allowed. + // This is tested via schema at concrete class level. + //const rsp = validateIdStringArray(itm.eligibleProperty, 'eligibleProperty', { canBeUndefined: true, minCount: 0 }); + //if (!rsp.ok) return rsp; + // ToDo: implement further validation logic + return super.validate(itm); + } */ protected set(itm: IElement) { // validated in concrete subclass before calling this; // also lastStatus set in concrete subclass. @@ -289,15 +321,6 @@ abstract class Element extends Identifiable implements IElement { icon: this.icon }; } - protected validate(itm: IElement) { - // If eligibleProperty is not present, all properties are allowed; - // if present and empty, no properties are allowed. - // This is tested via schema at concrete class level. - /* const rsp = validateIdStringArray(itm.eligibleProperty, 'eligibleProperty', { canBeUndefined: true, minCount: 0 }); - if (!rsp.ok) return rsp; */ - // ToDo: implement further validation logic - return super.validate(itm); - } } interface IAnElement extends IIdentifiable { @@ -359,10 +382,13 @@ abstract class AnElement extends Identifiable implements IAnElement { return addConfigurablesToJSONLD(jld, this, 'hasProperty'); } +/* protected setXML(itm: stringXML) { + return super.setXML(itm); + } protected validate(itm: IAnElement) { // ToDo: implement further validation logic return super.validate(itm); - } + } */ } ////////////////////////////////////// @@ -399,6 +425,33 @@ export class Property extends Identifiable implements IProperty { constructor() { super({itemType:PigItemType.Property}); } + validate(itm: IProperty) { + // Schema validation (AJV) - provides structural checks and reuses the idString definition + try { + const ok = SCH.validatePropertySchema(itm); + if (!ok) { + const msg = SCH.getValidatePropertyErrors(); + return Msg.create(681, 'Property', itm.id, msg); + } + } catch (err: any) { + return Msg.create(682, 'Property', itm.id, err?.message ?? String(err)); + } + + // Runtime guards: + // id and itemType checked in superclass + // const rsp = validateIdString(itm.datatype); + // if (!rsp.ok) return rsp; + // all datatypes beginning with 'xs:' are allowed, however only those defined in XsDatatypes are specifically supported, + // others shall be treated as strings (with a warning in the log): + if (!isSupportedXsDataType(itm.datatype)) { + const msg = Msg.create(680, itm.id, itm.datatype); + logger.warn(msg.statusText); + // return msg */ + } + + // ToDo: implement further validation logic + return super.validate(itm); + } set(itm: IProperty) { this.lastStatus = this.validate(itm); // logger.debug('Property.set: '+ JSON.stringify(this.lastStatus)); @@ -436,49 +489,28 @@ export class Property extends Identifiable implements IProperty { }); } setJSONLD(itm: any) { - const _itm = super.setJSONLD(itm) as any; + const ld = super.setJSONLD(itm) as any; // Normalize datatype (Property-specific) - if (_itm.datatype) { - _itm.datatype = _itm.datatype.replace(/^xsd:/, 'xs:'); + if (ld.datatype) { + ld.datatype = ld.datatype.replace(/^xsd:/, 'xs:'); } - return this.set(_itm); + return this.set(ld); } getJSONLD() { // if (!this.lastStatus.ok) return undefined; return super.getJSONLD(); } + setXML(itm: stringXML) { + super.setXML(itm); + if (this.lastStatus.ok) + return this.set(this.lastStatus.response as IProperty); + return this; + } getHTML(options?: object): stringHTML { return '

not implemented yet
'; } - validate(itm: IProperty) { - // Schema validation (AJV) - provides structural checks and reuses the idString definition - try { - const ok = SCH.validatePropertySchema(itm); - if (!ok) { - const msg = SCH.getValidatePropertyErrors(); - return Msg.create(681, 'Property', itm.id, msg); - } - } catch (err: any) { - return Msg.create(682, 'Property', itm.id, err?.message ?? String(err)); - } - - // Runtime guards: - // id and itemType checked in superclass - // const rsp = validateIdString(itm.datatype); - // if (!rsp.ok) return rsp; - // all datatypes beginning with 'xs:' are allowed, however only those defined in XsDatatypes are specifically supported, - // others shall be treated as strings (with a warning in the log): - if (!isSupportedXsDataType(itm.datatype)) { - const msg = Msg.create(680,itm.id, itm.datatype); - logger.warn(msg.statusText); - // return msg */ - } - - // ToDo: implement further validation logic - return super.validate(itm); - } } export interface ILink extends IIdentifiable { eligibleEndpoint: TPigId[]; // must be URI of an Entity or Relationship (class) @@ -488,6 +520,24 @@ export class Link extends Identifiable implements ILink { constructor() { super({ itemType: PigItemType.Link }); } + validate(itm: ILink) { + // Schema validation (AJV) - provides structural checks and reuses the idString definition + try { + const ok = SCH.validateLinkSchema(itm); + if (!ok) { + const msg = SCH.getValidateLinkErrors(); + return Msg.create(681, 'Link', itm.id, msg); + } + } catch (err: any) { + return Msg.create(682, 'Link', itm.id, err?.message ?? String(err)); + } + + /* // id and itemType checked in superclass + // At metamodel level, simple id strings are listed: + const rsp = validateIdStringArray(itm.eligibleEndpoint, 'eligibleEndpoint'); + if (!rsp.ok) return rsp; */ + return super.validate(itm); + } set(itm: ILink) { this.lastStatus = this.validate(itm); if (this.lastStatus.ok) { @@ -511,27 +561,15 @@ export class Link extends Identifiable implements ILink { // if (!this.lastStatus.ok) return undefined; return super.getJSONLD(); } + setXML(itm: stringXML) { + super.setXML(itm); + if (this.lastStatus.ok) + return this.set(this.lastStatus.response as ILink); + return this; + } getHTML(options?: object): stringHTML { return '
not implemented yet
'; } - validate(itm: ILink) { - // Schema validation (AJV) - provides structural checks and reuses the idString definition - try { - const ok = SCH.validateLinkSchema(itm); - if (!ok) { - const msg = SCH.getValidateLinkErrors(); - return Msg.create(681, 'Link', itm.id, msg); - } - } catch (err: any) { - return Msg.create(682, 'Link', itm.id, err?.message ?? String(err)); - } - - /* // id and itemType checked in superclass - // At metamodel level, simple id strings are listed: - const rsp = validateIdStringArray(itm.eligibleEndpoint, 'eligibleEndpoint'); - if (!rsp.ok) return rsp; */ - return super.validate(itm); - } } export interface IEntity extends IElement { @@ -542,6 +580,30 @@ export class Entity extends Element implements IEntity { constructor() { super({ itemType: PigItemType.Entity }); } + validate(itm: IEntity) { + // Schema validation (AJV) - provides structural checks and reuses the idString definition + // ... only at the lowest subclass level: + try { + const ok = SCH.validateEntitySchema(itm); + if (!ok) { + const msg = SCH.getValidateEntityErrors(); + return Msg.create(682, 'Entity', itm.id, msg); + } + } catch (err: any) { + return Msg.create(683, 'Entity', itm.id, err?.message ?? String(err)); + } + + // Runtime guards: + // id and itemType checked in superclass + // check whether specializes is another Entity URI is done in overall consistency check + + /* // If eligibleTarget is not present, all references are allowed; + // if present and empty, no references are allowed: + const rsp = validateIdStringArray(itm.eligibleTargetLink, 'eligibleTargetLink', { canBeUndefined: true, minCount: 0 }); + if (!rsp.ok) return rsp; */ + // ToDo: implement further validation logic + return super.validate(itm); + } set(itm: IEntity) { this.lastStatus = this.validate(itm); if (this.lastStatus.ok) { @@ -565,42 +627,50 @@ export class Entity extends Element implements IEntity { // if (!this.lastStatus.ok) return undefined; return super.getJSONLD(); } - validate(itm: IEntity) { + setXML(itm: stringXML) { + super.setXML(itm); + if (this.lastStatus.ok) + return this.set(this.lastStatus.response as ILink); + return this; + } +} + +export interface IRelationship extends IElement { + eligibleSourceLink?: TPigId; // must hold Link URI + eligibleTargetLink?: TPigId; // must hold Link URI +} +export class Relationship extends Element implements IRelationship { + eligibleSourceLink?: TPigId; + eligibleTargetLink?: TPigId; + constructor() { + super({ itemType: PigItemType.Relationship }); + } + validate(itm: IRelationship) { // Schema validation (AJV) - provides structural checks and reuses the idString definition // ... only at the lowest subclass level: try { - const ok = SCH.validateEntitySchema(itm); + const ok = SCH.validateRelationshipSchema(itm); if (!ok) { - const msg = SCH.getValidateEntityErrors(); - return Msg.create(682, 'Entity', itm.id, msg); + const msg = SCH.getValidateRelationshipErrors(); + return Msg.create(681, 'Relationship', itm.id, msg); } } catch (err: any) { - return Msg.create(683, 'Entity', itm.id, err?.message ?? String(err)); + return Msg.create(682, 'Relationship', itm.id, err?.message ?? String(err)); } // Runtime guards: // id and itemType checked in superclass - // check whether specializes is another Entity URI is done in overall consistency check + // check whether specializes is another Relationship URI is done in overall consistency check - /* // If eligibleTarget is not present, all references are allowed; - // if present and empty, no references are allowed: - const rsp = validateIdStringArray(itm.eligibleTargetLink, 'eligibleTargetLink', { canBeUndefined: true, minCount: 0 }); - if (!rsp.ok) return rsp; */ + /* // If eligibleSource/eligibleTarget are not present, sources resp. targets of all classes are allowed; + // if present, at least one entry must be there, because a relationship without source or target makes no sense: + let rsp = validateIdStringArray(itm.eligibleSourceLink, 'eligibleSourceLink', { canBeUndefined: true, minCount: 1 }); + if (!rsp.ok) return rsp; + rsp = validateIdStringArray(itm.eligibleTargetLink, 'eligibleTargetLink', { canBeUndefined: true, minCount: 1 }); + if (!rsp.ok) return rsp; */ // ToDo: implement further validation logic return super.validate(itm); } -} - -export interface IRelationship extends IElement { - eligibleSourceLink?: TPigId; // must hold Link URI - eligibleTargetLink?: TPigId; // must hold Link URI -} -export class Relationship extends Element implements IRelationship { - eligibleSourceLink?: TPigId; - eligibleTargetLink?: TPigId; - constructor() { - super({ itemType: PigItemType.Relationship }); - } set(itm: IRelationship) { this.lastStatus = this.validate(itm); if (this.lastStatus.ok) { @@ -626,31 +696,13 @@ export class Relationship extends Element implements IRelationship { // if (!this.lastStatus.ok) return undefined; return super.getJSONLD(); } - validate(itm: IRelationship) { - // Schema validation (AJV) - provides structural checks and reuses the idString definition - // ... only at the lowest subclass level: - try { - const ok = SCH.validateRelationshipSchema(itm); - if (!ok) { - const msg = SCH.getValidateRelationshipErrors(); - return Msg.create(681, 'Relationship', itm.id, msg); - } - } catch (err: any) { - return Msg.create(682, 'Relationship', itm.id, err?.message ?? String(err)); - } - - // Runtime guards: - // id and itemType checked in superclass - // check whether specializes is another Relationship URI is done in overall consistency check - - /* // If eligibleSource/eligibleTarget are not present, sources resp. targets of all classes are allowed; - // if present, at least one entry must be there, because a relationship without source or target makes no sense: - let rsp = validateIdStringArray(itm.eligibleSourceLink, 'eligibleSourceLink', { canBeUndefined: true, minCount: 1 }); - if (!rsp.ok) return rsp; - rsp = validateIdStringArray(itm.eligibleTargetLink, 'eligibleTargetLink', { canBeUndefined: true, minCount: 1 }); - if (!rsp.ok) return rsp; */ - // ToDo: implement further validation logic - return super.validate(itm); + setXML(itm: stringXML) { + super.setXML(itm); + if (this.lastStatus.ok) + return this.set(this.lastStatus.response as ILink); + return this; + /* this.lastStatus = Msg.create(699, 'setXML'); + return this; */ } } @@ -667,6 +719,14 @@ export class AProperty extends Item implements IAProperty { constructor() { super({ itemType: PigItemType.aProperty }); } + validate(itm: IAProperty) { + // itemType checked in superclass + if (!itm.hasClass) + return Msg.create(601, PigItemType.aProperty); + // ToDo: implement further validation logic + // - Check class reference; must be an existing Property URI (requires access to the cache to resolve the class -> do it through overall consistency check): + return super.validate(itm); + } set(itm: IAProperty) { this.lastStatus = this.validate(itm); if (this.lastStatus.ok) { @@ -686,40 +746,38 @@ export class AProperty extends Item implements IAProperty { idRef: this.idRef }); } -/* setJSONLD(itm: any) { - const _itm = { ...itm }; - return this.set(_itm); - } - getJSONLD() { - return this.get(); - } */ setJSONLD(itm: any) { - let _itm = LIB.renameJsonTags(itm as JsonValue, LIB.fromJSONLD, { mutate: false }) as any; + let _itm = MVF.renameJsonTags(itm as JsonValue, MVF.fromJSONLD, { mutate: false }) as any; _itm = replaceIdObjects(_itm); return this.set(_itm); } getJSONLD() { // if (!this.lastStatus.ok) return undefined; - const jld = LIB.renameJsonTags(this.get() as unknown as JsonObject, LIB.toJSONLD, { mutate: false }) as JsonObject; + const jld = MVF.renameJsonTags(this.get() as unknown as JsonObject, MVF.toJSONLD, { mutate: false }) as JsonObject; return makeIdObjects(jld) as JsonObject; } +/* setXML(itm: stringXML) { + this.lastStatus = Msg.create(699, 'setXML'); + return this; + // return itm; + } */ getHTML(options?: object): stringHTML { // ToDo: implement a HTML snippet with the property value return '
not implemented yet
'; } - validate(itm: IAProperty) { +} +export class ASourceLink extends ALink implements IALink { + constructor() { + super({ itemType: PigItemType.aSourceLink }); + } + validate(itm: IALink) { // itemType checked in superclass if (!itm.hasClass) - return Msg.create(601, PigItemType.aProperty); + return Msg.create(601, PigItemType.aSourceLink); // ToDo: implement further validation logic // - Check class reference; must be an existing Property URI (requires access to the cache to resolve the class -> do it through overall consistency check): return super.validate(itm); } -} -export class ASourceLink extends ALink implements IALink { - constructor() { - super({ itemType: PigItemType.aSourceLink }); - } set(itm: IALink) { this.lastStatus = this.validate(itm); if (this.lastStatus.ok) { @@ -731,29 +789,31 @@ export class ASourceLink extends ALink implements IALink { if (!this.lastStatus.ok) return undefined; return super.get(); } - setJSONLD(itm: any) { - let _itm = LIB.renameJsonTags(itm as JsonValue, LIB.fromJSONLD, { mutate: false }) as any; - _itm = replaceIdObjects(_itm); - return this.set(_itm); +/* setJSONLD(itm: any) { + return super.setJSONLD(itm); } getJSONLD() { - // if (!this.lastStatus.ok) return undefined; - const jld = LIB.renameJsonTags(this.get() as unknown as JsonObject, LIB.toJSONLD, { mutate: false }) as JsonObject; - return makeIdObjects(jld) as JsonObject; + return super.getJSONLD(); + } + setXML(itm: stringXML) { + super.setXML(itm); + if (this.lastStatus.ok) + return this.set(this.lastStatus.response as IALink); + return this; + } */ +} +export class ATargetLink extends ALink implements IALink { + constructor() { + super({ itemType: PigItemType.aTargetLink }); } validate(itm: IALink) { // itemType checked in superclass if (!itm.hasClass) - return Msg.create(601, PigItemType.aSourceLink); + return Msg.create(601, PigItemType.aTargetLink); // ToDo: implement further validation logic // - Check class reference; must be an existing Property URI (requires access to the cache to resolve the class -> do it through overall consistency check): return super.validate(itm); } -} -export class ATargetLink extends ALink implements IALink { - constructor() { - super({ itemType: PigItemType.aTargetLink }); - } set(itm: IALink) { this.lastStatus = this.validate(itm); if (this.lastStatus.ok) { @@ -765,31 +825,18 @@ export class ATargetLink extends ALink implements IALink { if (!this.lastStatus.ok) return undefined; return super.get(); } - setJSONLD(itm: any) { - let _itm = LIB.renameJsonTags(itm as JsonValue, LIB.fromJSONLD, { mutate: false }) as any; - _itm = replaceIdObjects(_itm); - return this.set(_itm); - } - getJSONLD() { - // if (!this.lastStatus.ok) return undefined; - const jld = LIB.renameJsonTags(this.get() as unknown as JsonObject, LIB.toJSONLD, { mutate: false }) as JsonObject; - return makeIdObjects(jld) as JsonObject; - } /* setJSONLD(itm: any) { - const _itm = { ...itm }; - return this.set(_itm); + return super.setJSONLD(itm); } getJSONLD() { - return this.get(); - } */ - validate(itm: IALink) { - // itemType checked in superclass - if (!itm.hasClass) - return Msg.create(601, PigItemType.aTargetLink); - // ToDo: implement further validation logic - // - Check class reference; must be an existing Property URI (requires access to the cache to resolve the class -> do it through overall consistency check): - return super.validate(itm); + return super.getJSONLD(); } + setXML(itm: stringXML) { + super.setXML(itm); + if (this.lastStatus.ok) + return this.set(this.lastStatus.response as IALink); + return this; + } */ } export interface IAnEntity extends IAnElement { @@ -800,6 +847,27 @@ export class AnEntity extends AnElement implements IAnEntity { constructor() { super({ itemType: PigItemType.anEntity }); } + validate(itm: IAnEntity) { + // Schema validation (AJV) - provides structural checks and reuses the idString definition + // ... only at the lowest subclass level: + try { + const ok = SCH.validateAnEntitySchema(itm); + if (!ok) { + const msg = SCH.getValidateAnEntityErrors(); + return Msg.create(681, 'anEntity', itm.id, msg); + } + } catch (err: any) { + return Msg.create(682, 'anEntity', itm.id, err?.message ?? String(err)); + } + + // Runtime guards: + // id and itemType checked in superclass + if (!itm.hasClass) + return Msg.create(601, PigItemType.anEntity); + // ToDo: implement further validation logic + // - Check class reference; must be an existing Entity URI (requires access to the cache to resolve the class -> do it through overall consistency check): + return super.validate(itm); + } set(itm: IAnEntity) { const _itm:IAnEntity = LIB.stripUndefined( itm ); // logger.debug('AnEntity.set():', _itm); @@ -836,43 +904,49 @@ export class AnEntity extends AnElement implements IAnEntity { // logger.debug('AnEntity.getJSONLD: ', out); return jld; } + setXML(itm: stringXML) { + super.setXML(itm); + if (this.lastStatus.ok) + return this.set(this.lastStatus.response as IAnEntity); + return this; + } getHTML(options?: object): stringHTML { // ToDo: implement a HTML representation of the entity including its properties return '
not implemented yet
'; } - validate(itm: IAnEntity) { +} + +export interface IARelationship extends IAnElement { + hasSourceLink: IALink[]; + hasTargetLink: IALink[]; +} +export class ARelationship extends AnElement implements IARelationship { + hasSourceLink!: ASourceLink[]; + hasTargetLink!: ATargetLink[]; + constructor() { + super({ itemType: PigItemType.aRelationship }); + } + validate(itm: IARelationship) { // Schema validation (AJV) - provides structural checks and reuses the idString definition // ... only at the lowest subclass level: try { - const ok = SCH.validateAnEntitySchema(itm); + const ok = SCH.validateARelationshipSchema(itm); if (!ok) { - const msg = SCH.getValidateAnEntityErrors(); - return Msg.create(681, 'anEntity', itm.id, msg); + const msg = SCH.getValidateARelationshipErrors(); + return Msg.create(681, 'aRelationship', itm.id, msg); } } catch (err: any) { - return Msg.create(682, 'anEntity', itm.id, err?.message ?? String(err)); + return Msg.create(682, 'aRelationship', itm.id, err?.message ?? String(err)); } // Runtime guards: // id and itemType checked in superclass if (!itm.hasClass) - return Msg.create(601, PigItemType.anEntity); + return Msg.create(601, PigItemType.aRelationship); // ToDo: implement further validation logic - // - Check class reference; must be an existing Entity URI (requires access to the cache to resolve the class -> do it through overall consistency check): + // - Check class reference; must be an existing Relationship URI (requires access to the cache to resolve the class -> do it through overall consistency check): return super.validate(itm); } -} - -export interface IARelationship extends IAnElement { - hasSourceLink: IALink[]; - hasTargetLink: IALink[]; -} -export class ARelationship extends AnElement implements IARelationship { - hasSourceLink!: ASourceLink[]; - hasTargetLink!: ATargetLink[]; - constructor() { - super({ itemType: PigItemType.aRelationship }); - } set(itm: IARelationship) { const _itm: IARelationship = LIB.stripUndefined(itm); //logger.debug('ARelationship.set():', _itm); @@ -909,31 +983,16 @@ export class ARelationship extends AnElement implements IARelationship { // logger.debug('AnEntity.getJSONLD: ', out); return jld; } + setXML(itm: stringXML) { + super.setXML(itm); + if (this.lastStatus.ok) + return this.set(this.lastStatus.response as IARelationship); + return this; + } getHTML(options?: object): stringHTML { // ToDo: implement a HTML representation of the relationship including its properties return '
not implemented yet
'; } - validate(itm: IARelationship) { - // Schema validation (AJV) - provides structural checks and reuses the idString definition - // ... only at the lowest subclass level: - try { - const ok = SCH.validateARelationshipSchema(itm); - if (!ok) { - const msg = SCH.getValidateARelationshipErrors(); - return Msg.create(681, 'aRelationship', itm.id, msg); - } - } catch (err: any) { - return Msg.create(682, 'aRelationship', itm.id, err?.message ?? String(err)); - } - - // Runtime guards: - // id and itemType checked in superclass - if (!itm.hasClass) - return Msg.create(601, PigItemType.aRelationship); - // ToDo: implement further validation logic - // - Check class reference; must be an existing Relationship URI (requires access to the cache to resolve the class -> do it through overall consistency check): - return super.validate(itm); - } } // For packages: export interface IAPackage extends IIdentifiable { @@ -952,6 +1011,29 @@ export class APackage extends Identifiable implements IAPackage { super({ itemType: PigItemType.aPackage }); } + validate(itm: IAPackage): IRsp { + // graph must be present and be an array + if (!Array.isArray(itm.graph) || itm.graph.length < 1) { + return Msg.create(630, 'graph'); + } + + // Call parent validation + let rsp = super.validate(itm); + if (!rsp.ok) { + return rsp; + } + + rsp = checkConstraintsForPackage(itm); + // if (itm.id == 'd:test-invalid-prop') + // logger.debug(`APackage.validate: validating package `, itm, rsp); + + if (!rsp.ok) { + return rsp; + } + + return rspOK; + } + set(itm: IAPackage): APackage { this.lastStatus = this.validate(itm); if (this.lastStatus.ok) { @@ -982,38 +1064,122 @@ export class APackage extends Identifiable implements IAPackage { return LIB.stripUndefined(pkg); } - setJSONLD(doc: any): TPigItem[] { + setJSONLD(doc: any): APackage { // Extract @context - const ctx = this.extractContext(doc); + const ctx = this.extractContextJSONLD(doc); // Extract package metadata - const meta = this.extractMetadata(doc); + const meta = this.extractMetadataJSONLD(doc); // Extract and process @graph - let graph: any[] = Array.isArray(doc['@graph']) - ? doc['@graph'] - : (Array.isArray(doc.graph) ? doc.graph : []); + let graph: any[] = Array.isArray(doc['@graph']) + ? doc['@graph'] + : (Array.isArray(doc.graph) ? doc.graph : []); + + if (graph.length === 0) { + logger.warn('APackage.setJSONLD: empty @graph'); + } + + graph = graph.map( + item => { + const instance = this.instantiateItemJSONLD(item); + if (instance) { + // logger.debug(`APackage.set: `, instance); + return instance; + } + else + logger.warn(`APackage.setJSONLD: could not instantiate item ${JSON.stringify(item, null, 2)}`); + } + ); + + // logger.debug(`APackage.setJSONLD: processing ${graph.length} items from package ${meta.id || 'unnamed'}`); + // logger.debug('APackage.setJSONLD: extracted context:', ctx); + // logger.debug('APackage.setJSONLD: extracted metadata:', meta); + + // Set default modified timestamp if not present + if (!this.modified) { + this.modified = new Date().toISOString(); + } + + // Call set to validate and return all items including package + this.set({ + itemType: PigItemType.aPackage, + id: meta.id, + title: meta.title, + description: meta.description, + context: ctx, + graph: graph, + modified: meta.modified, + creator: meta.creator + } as IAPackage); + + // return the instantiated graph with instantiated graph items: + return this; + } + +/* getJSONLD(): string { + if (!this.lastStatus.ok) + return JSON.stringify({ error: this.lastStatus.statusText }); + + // Start with parent's JSON-LD representation + const jld = super.getJSONLD() as JsonObject; + + // Add @context + if (this.context) { + jld['@context'] = buildContextForJSONLD(this.context); + } + + // Add @graph with full items (using their getJSONLD methods) + jld['@graph'] = this.items.map(item => { + if ('getJSONLD' in item && typeof item.getJSONLD === 'function') { + const itemJLD = item.getJSONLD(); + // If getJSONLD returns a string, parse it back to object + return typeof itemJLD === 'string' ? JSON.parse(itemJLD) : itemJLD; + } + return { '@id': (item as any).id }; + }); + + // Add metadata + if (this.modified) { + jld['dcterms:modified'] = this.modified; + } + if (this.creator) { + jld['dcterms:creator'] = this.creator; + } + + // Return stringified JSON-LD + return JSON.stringify(jld, null, 4); + } */ +/* setXML(doc: any) { + // Extract namespaces +// const ctx = this.extractContextXML(doc); + + // Extract package metadata +// const meta = this.extractMetadataXML(doc); + + // Extract and process @graph + let graph: any[] = Array.isArray(doc.graph) ? doc.graph : []; if (graph.length === 0) { - logger.warn('APackage.setJSONLD: empty @graph'); + logger.warn('APackage.setXML: empty graph'); } graph = graph.map( item => { - const instance = this.instantiateItem(item); + const instance = this.instantiateItemXML(item); if (instance) { // logger.debug(`APackage.set: `, instance); return instance; } else - logger.warn(`APackage.setJSONLD: could not instantiate item ${JSON.stringify(item)}`); + logger.warn(`APackage.setXML: could not instantiate item ${JSON.stringify(item)}`); } ); - /* logger.debug(`APackage.setJSONLD: processing ${graph.length} items from package ${meta.id || 'unnamed'}`); - logger.debug('APackage.setJSONLD: extracted context:', ctx); - logger.debug('APackage.setJSONLD: extracted metadata:', meta); - */ + // logger.debug(`APackage.setXML: processing ${graph.length} items from package ${meta.id || 'unnamed'}`); + // logger.debug('APackage.setXML: extracted context:', ctx); + // logger.debug('APackage.setXML: extracted metadata:', meta); + // Set default modified timestamp if not present if (!this.modified) { this.modified = new Date().toISOString(); @@ -1022,74 +1188,163 @@ export class APackage extends Identifiable implements IAPackage { // Call set to validate and return all items including package this.set({ itemType: PigItemType.aPackage, - id: meta.id, - title: meta.title, - description: meta.description, - context: ctx, + // id: meta.id, + // title: meta.title, + // description: meta.description, + // context: ctx, graph: graph, - modified: meta.modified, - creator: meta.creator + // modified: meta.modified, + // creator: meta.creator } as IAPackage); // return the instantiated graph and graph items: - return [this as TPigItem].concat(this.graph); - } + return this; + // this.lastStatus = Msg.create(699, 'setXML'); + // return this; + // return super.setXML(itm); + } */ + setXML(xmlString: stringXML) { + // 1. Parse XML string to JSON + const parsed = xml2json(xmlString); + logger.debug('APackage.setXML: parsed XML to JSON', JSON.stringify(parsed,null,2)); + + if (!parsed.ok) { + this.lastStatus = parsed; + logger.error(`APackage.setXML: XML parsing failed: ${parsed.statusText}`); + return this; + } -/* getJSONLD(): string { - if (!this.lastStatus.ok) - return JSON.stringify({ error: this.lastStatus.statusText }); + const doc = parsed.response as JsonObject; + logger.debug('APackage.setXML: parsed XML to JSON', doc); - // Start with parent's JSON-LD representation - const jld = super.getJSONLD() as JsonObject; + // 2. Extract namespaces (if needed in future) + // const ctx = this.extractContextXML(doc); - // Add @context - if (this.context) { - jld['@context'] = buildContextForJSONLD(this.context); - } + // 3. Extract package metadata (if available in XML) + // const meta = this.extractMetadataXML(doc); - // Add @graph with full items (using their getJSONLD methods) - jld['@graph'] = this.items.map(item => { - if ('getJSONLD' in item && typeof item.getJSONLD === 'function') { - const itemJLD = item.getJSONLD(); - // If getJSONLD returns a string, parse it back to object - return typeof itemJLD === 'string' ? JSON.parse(itemJLD) : itemJLD; - } - return { '@id': (item as any).id }; - }); + // 4. Extract and process graph items + const graph: any[] = Array.isArray(doc.graph) ? doc.graph : []; - // Add metadata - if (this.modified) { - jld['dcterms:modified'] = this.modified; + if (graph.length === 0) { + logger.warn('APackage.setXML: empty graph'); } - if (this.creator) { - jld['dcterms:creator'] = this.creator; + + // 5. Instantiate each graph item from parsed JSON + const instantiatedGraph = graph + .map(item => { + const instance = this.instantiateItemXML(item); + if (instance) { + return instance; + } else { + logger.warn(`APackage.setXML: could not instantiate item ${JSON.stringify(item,null,2)}`); + return undefined; + } + }) + .filter((item): item is TPigItem => item !== undefined); // ✅ Type-safe filter + + // logger.debug(`APackage.setXML: successfully instantiated ${instantiatedGraph.length} of ${graph.length} items`); + + // 6. Set default modified timestamp if not present + if (!this.modified) { + this.modified = new Date().toISOString(); } - // Return stringified JSON-LD - return JSON.stringify(jld, null, 4); - } */ + // 7. Build and validate package + this.set({ + itemType: PigItemType.aPackage, + id: doc.id, + title: doc.title, + description: doc.description, + // context: ctx, + graph: instantiatedGraph, + modified: doc.modified, + creator: doc.creator + } as unknown as IAPackage); + + logger.debug(`APackage.setXML: package ${JSON.stringify(this,null,2)} set with status`, this.lastStatus); + return this; + } + /** + * Extract all items from an instantiated APackage with status validation + * Returns an array with the package as first element (if valid), followed by all valid graph items + * Invalid items (with lastStatus.ok === false) are filtered out and logged as warnings + * + * @param pkg - Instantiated APackage with graph items + * @returns Array with [APackage?, ...validGraphItems] - may be empty if package is invalid + * + * @example + * const pkg = new APackage().setJSONLD(jsonldDoc); + * const allItems = LIB.allItems(pkg); + * // allItems[0] === pkg (if valid) + * // allItems[1..n] === all valid graph items + */ + getAllItems(): TPigItem[] { + // Validate package structure - validate(itm: IAPackage): IRsp { - // graph must be present and be an array - if (!Array.isArray(itm.graph) || itm.graph.length<1) { - return Msg.create(630, 'graph'); + if (!Array.isArray(this.graph)) { + logger.warn('LIB.allItems: APackage has no valid graph array'); + return []; } - // Call parent validation - let rsp = super.validate(itm); - if (!rsp.ok) { - return rsp; + const result: TPigItem[] = []; + + // Check package status + const pkgStatus = this.status(); + if (!pkgStatus || !pkgStatus.ok) { + logger.warn( + `LIB.allItems: APackage '${this.id || 'unknown'}' has invalid status: ${pkgStatus?.statusText || 'unknown error'}` + ); + return []; + } + else { + // Package is valid, add it as first element + result.push(this as TPigItem); } - rsp = checkConstraintsForPackage(itm); - // if (itm.id == 'd:test-invalid-prop') - // logger.debug(`APackage.validate: validating package `, itm, rsp); + // Filter and validate graph items + let validCount = 0; + let invalidCount = 0; - if (!rsp.ok) { - return rsp; + for (const item of this.graph) { + if (!item || typeof item !== 'object') { + logger.warn('LIB.allItems: encountered invalid graph item (not an object)'); + invalidCount++; + continue; + } + + // Check if item has status() method + if (typeof (item as any).status !== 'function') { + logger.warn( + `LIB.allItems: graph item '${(item as any).id || 'unknown'}' has no status() method` + ); + invalidCount++; + continue; + } + + // Check item status + const itemStatus = (item as any).status(); + if (!itemStatus || !itemStatus.ok) { + logger.warn( + `LIB.allItems: graph item '${(item as any).id || 'unknown'}' (${(item as any).itemType || 'unknown type'}) has invalid status: ${itemStatus?.statusText || 'unknown error'}` + ); + invalidCount++; + continue; + } + + // Item is valid, add it + result.push(item); + validCount++; } - return rspOK; + // Summary log + if (invalidCount > 0) { + logger.warn( + `LIB.allItems: filtered out ${invalidCount} invalid item(s), kept ${validCount} valid item(s) from package '${this.id || 'unknown'}'` + ); + } + + return result; } /** @@ -1097,9 +1352,9 @@ export class APackage extends Identifiable implements IAPackage { * @param doc - Parsed JSON-LD document * @returns Context as INamespace[], string, Record, or undefined */ - private extractContext(doc: any): INamespace[] | string | Record | undefined { + private extractContextJSONLD(doc: any): INamespace[] | string | Record | undefined { const ctx = doc['@context'] || doc.context; - // logger.debug('extractContext (1): ',ctx); + // logger.debug('extractContextJSONLD (1): ',ctx); if (!ctx) { logger.warn('APackage: no @context found in document'); @@ -1146,7 +1401,7 @@ export class APackage extends Identifiable implements IAPackage { * @param doc - Parsed JSON-LD document * @returns Metadata object with id, modified, creator, title, and description */ - private extractMetadata(doc: any): { + private extractMetadataJSONLD(doc: any): { id?: TPigId; modified?: TISODateString; creator?: string; @@ -1200,7 +1455,7 @@ export class APackage extends Identifiable implements IAPackage { /** * Instantiate a single PIG item from JSON-LD */ - private instantiateItem(item: any): TPigItem | undefined { + private instantiateItemJSONLD(item: any): TPigItem | undefined { // Validate item has required pig:itemType if (!item['pig:itemType'] || !item['pig:itemType']['@id']) { logger.error('APackage: @graph element missing pig:itemType, skipping ' + (item['@id'] || item.id || 'unknown')); @@ -1230,9 +1485,60 @@ export class APackage extends Identifiable implements IAPackage { logger.error(`APackage: failed to populate instance with itemType '${itype}': ${err?.message ?? err}`); } } + /** + * Instantiate a single PIG item from XML (already converted to JSON) + */ + private instantiateItemXML(item: any): TPigItem | undefined { + // Validate item has required itemType + if (!item.itemType) { + logger.error('APackage.instantiateItemXML: element missing itemType, skipping ' + (item.id || 'unknown')); + return; + } + + const itype: any = item.itemType; + + // Filter allowed item types + if (!this.isAllowedItemType(itype)) { + logger.error(`APackage.instantiateItemXML: skipping item type '${itype}' which is not allowed in a graph`); + return; + } + + const instance = this.createInstance(itype); + + if (!instance) { + logger.error(`APackage.instantiateItemXML: unable to create instance for itemType '${itype}'`); + return; + } + + try { + // When transforming individual items, use setXML which internally calls xml2json and then set(); + // but here we already have JSON from xml2json, so call set() directly: + (instance as any).set(item); + + // Check if instantiation was successful + const status = (instance as any).status(); + if (!status || !status.ok) { + logger.error( + `APackage.instantiateItemXML: ${itype} '${item.id || 'unknown'}' failed validation: ${status?.statusText || 'unknown error'}` + ); + return; + } + + // logger.debug(`APackage.instantiateItemXML: successfully instantiated ${itype} with id ${item.id}`); + return instance; + } catch (err: any) { + logger.error(`APackage.instantiateItemXML: failed to populate instance with itemType '${itype}': ${err?.message ?? err}`); + } + } /** - * Check if item type is allowed for instantiation + * Check if item type is allowed for instantiation. + * The following types are not allowed in a graph: + PigItemType.aPackage, // Packages cannot be nested + PigItemType.aProperty, // Embedded in anEntity/aRelationship + PigItemType.aSourceLink, // Embedded in aRelationship + PigItemType.aTargetLink // Embedded in anEntity/aRelationship + */ private isAllowedItemType(itype: any): boolean { return [ @@ -1610,8 +1916,8 @@ function collectConfigurablesFromJSONLD(obj: any, itype: PigItemTypeValue): IAPr const properties: IAProperty[] = []; // Standard PIG fields that should NOT be collected as properties; - // the tags have already been renamed with LIB.renameJsonTags( ..., LIB.fromJSONLD): - const skipKeys = new Set(LIB.toJSONLD.map(([key]) => key)); + // the tags have already been renamed with MVF.renameJsonTags( ..., MVF.fromJSONLD): + const skipKeys = new Set(MVF.toJSONLD.keys()); //logger.debug('collect 1',obj,itype); for (const key of Object.keys(obj)) { @@ -1728,6 +2034,600 @@ function addConfigurablesToJSONLD( delete jld[hasX]; return jld; } +// const xmlParser = new DOMParser(); +/** + * Parse XML string and convert to JSON object + * Recursively traverses the XML structure without assuming specific tag names + * Hybrid approach: tries parsing without wrapper first, falls back to wrapper if needed + * @param xml - XML string to parse + * @returns IRsp with JsonObject on success, error message on failure + */ +function xml2json(xml: stringXML): IRsp { + try { + const parser = new DOMParser(); + + // Try 1: Parse without wrapper + const doc = parser.parseFromString(xml, 'text/xml'); + const parserError = doc.querySelector('parsererror'); + + if (!parserError && doc.documentElement) { + // Success without wrapper + const result = xmlElementToJson(doc.documentElement); + // logger.debug('xml2json: successfully parsed XML without wrapper'); + + return { + ...rspOK, + response: result as JsonObject, + responseType: 'json' + }; + } + + // Try 2: Parse with wrapper (for namespace issues) + // logger.debug('xml2json: first attempt failed, trying with wrapper'); + const wrapped = LIB.makeXMLDoc(xml); + const wrappedDoc = parser.parseFromString(wrapped, 'text/xml'); + + const wrappedError = wrappedDoc.querySelector('parsererror'); + if (wrappedError) { + const errorMessage = wrappedError.textContent || 'Unknown XML parsing error'; + logger.error('xml2json: XML parsing failed even with wrapper:', errorMessage); + return Msg.create(690, 'XML', errorMessage); + } + + const rootElement = wrappedDoc.documentElement; + if (!rootElement || !rootElement.firstElementChild) { + return Msg.create(690, 'XML', 'No valid element found in wrapped XML'); + } + + // Extract the actual content (skip the wrapper) + const actualElement = rootElement.firstElementChild as ElementXML; + const result = xmlElementToJson(actualElement); + + // logger.debug('xml2json: successfully parsed XML with wrapper',result); + + return { + ...rspOK, + response: result as JsonObject, + responseType: 'json' + }; + + } catch (err: any) { + logger.error('xml2json: exception:', err); + return Msg.create(690, 'XML', err?.message ?? String(err)); + } +} +/** + * Convert an XML DOM Element to a JSON object recursively + * Handles: + * - PIG classes (Property, Link, Entity, Relationship) + * - PIG instances (anEntity, aRelationship) + * - Configurable properties (pig:aProperty) + * - Configurable links (pig:aSourceLink, pig:aTargetLink) + * + * @param xmlElement - XML DOM Element to convert + * @returns JSON representation of the element + */ +function xmlElementToJson(xmlElement: ElementXML): JsonObject { + const result: JsonObject = {}; + + // 1. Extract itemType from element tag name (only for valid PIG types) + const tagName = xmlElement.tagName; + let currentItemType: string | undefined; + if (Object.values(PigItemType).includes(tagName as PigItemTypeValue)) { + result.itemType = tagName; + currentItemType = tagName; + } + + // 2. Extract all attributes as properties + for (const attr of Array.from(xmlElement.attributes)) { + const attrName = attr.name; + const attrValue = attr.value; + + if (attrName === 'id') { + result.id = attrValue; + } else if (attrName === 'rdf:type' || attrName === 'type') { + result.hasClass = attrValue; + } else { + result[attrName] = attrValue; + } + } + + // 3. Process child elements + const childElementsByTag = new Map(); + const textContent: string[] = []; + + // Collections for configurable properties and links + const configurableProperties: JsonObject[] = []; + const configurableSourceLinks: JsonObject[] = []; + const configurableTargetLinks: JsonObject[] = []; + + for (const child of Array.from(xmlElement.childNodes)) { + if (child.nodeType === Node.ELEMENT_NODE) { + const childElement = child as ElementXML; + const childTagName = childElement.tagName; + + // Special handling for configurable properties and links + if (childTagName === 'pig:aProperty') { + configurableProperties.push(processConfigurableProperty(childElement)); + continue; + } + if (childTagName === 'pig:aSourceLink') { + configurableSourceLinks.push(processConfigurableLink(childElement, PigItemType.aSourceLink)); + continue; + } + if (childTagName === 'pig:aTargetLink') { + configurableTargetLinks.push(processConfigurableLink(childElement, PigItemType.aTargetLink)); + continue; + } + + // Group regular child elements by tag name + if (!childElementsByTag.has(childTagName)) { + childElementsByTag.set(childTagName, []); + } + childElementsByTag.get(childTagName)!.push(childElement); + + } else if (child.nodeType === Node.TEXT_NODE) { + const text = child.textContent?.trim(); + if (text) { + textContent.push(text); + } + } + } + + // 4. Convert grouped child elements to JSON + for (const [tagName, elements] of childElementsByTag) { + + // ✅ Special handling for 'graph' - always array of heterogeneous items + if (tagName === 'graph' || tagName === 'pig:graph') { + result.graph = elements.flatMap(graphContainer => { + // Get all direct children of container + return Array.from(graphContainer.children) + .map(childElement => xmlElementToJson(childElement as ElementXML)); + }); + continue; + } + + // Special handling for xs:simpleType + if (tagName === 'xs:simpleType' || tagName === 'simpleType') { + xSimpleType(elements[0], result); + continue; + } + + // Map XML tag to internal property name + const propertyName = MVF.mapTerm(tagName, MVF.fromXML) as string; + + // Check if this property is a multi-language text field + const isMultiLang = isMultiLanguageText(propertyName); + + // Check if this property needs IText wrapping (icon) + const needsTextWrapper = requiresIText(propertyName); + + // Pass parent itemType for context-aware array detection + const mustBeArray = requiresArray(propertyName, currentItemType); + + if (elements.length === 1 && !mustBeArray) { + // Single element (and not forced to be array) + const elem = elements[0]; + const childText = getXmlElementText(elem); + const langAttr = elem.getAttribute('xml:lang') || elem.getAttribute('lang'); + + // Multi-language field check FIRST + if (isMultiLang || langAttr) { + result[propertyName] = [{ + value: childText, + ...(langAttr && { lang: langAttr }) + }]; + } + // IText wrapper for icon + else if (needsTextWrapper) { + result[propertyName] = { value: childText }; + } + // Regular fields + else { + const hasChildElements = Array.from(elem.childNodes).some( + node => node.nodeType === Node.ELEMENT_NODE + ); + + if (!hasChildElements && childText) { + result[propertyName] = childText; + } else { + result[propertyName] = xmlElementToJson(elem); + } + } + } else { + // Multiple elements OR single element that must be array + result[propertyName] = elements.map(elem => { + const childText = getXmlElementText(elem); + const langAttr = elem.getAttribute('xml:lang') || elem.getAttribute('lang'); + + if (isMultiLang || langAttr) { + return { + value: childText, + ...(langAttr && { lang: langAttr }) + }; + } else { + const hasChildElements = Array.from(elem.childNodes).some( + node => node.nodeType === Node.ELEMENT_NODE + ); + + if (!hasChildElements && childText) { + return childText; + } else { + return xmlElementToJson(elem); + } + } + }); + } + } + + // 5. If element has only text content and no child elements, add as value + if (childElementsByTag.size === 0 && textContent.length > 0) { + result.value = textContent.join(' '); + } + + // 6. Add collected configurable properties and links + if (configurableProperties.length > 0) { + result.hasProperty = configurableProperties; + } + if (configurableSourceLinks.length > 0) { + result.hasSourceLink = configurableSourceLinks; + } + if (configurableTargetLinks.length > 0) { + result.hasTargetLink = configurableTargetLinks; + } + + return result; +} +/** + * Check if a property must always be represented as an array + * Even when only a single element is present in XML + * + * Note: Some properties are context-dependent: + * - eligibleTargetLink: array for Entity, string for Relationship + * - eligibleSourceLink: always string (Relationship only) + * + * Context detection is done via the parent element's itemType + */ +function requiresArray(propertyName: string, parentItemType?: string): boolean { + // Remove namespace prefix for checking + const localName = propertyName.includes(':') ? propertyName.split(':')[1] : propertyName; + + // Properties that ALWAYS require arrays + const alwaysArrayProps = new Set([ + 'eligibleValue', // Property.eligibleValue: IEligibleValue[] + 'eligibleEndpoint', // Link.eligibleEndpoint: TPigId[] + 'eligibleProperty', // Entity/Relationship.eligibleProperty?: TPigId[] + 'composedProperty', // Property.composedProperty?: TPigId[] + 'priorRevision' // AnElement.priorRevision?: TRevision[] + ]); + + if (alwaysArrayProps.has(localName) || alwaysArrayProps.has(propertyName)) { + return true; + } + + // Context-dependent: eligibleTargetLink + if (localName === 'eligibleTargetLink' || propertyName === 'eligibleTargetLink') { + // Entity: eligibleTargetLink?: TPigId[] (array) + // Relationship: eligibleTargetLink?: TPigId (string) + return parentItemType === PigItemType.Entity || parentItemType === 'pig:Entity'; + } + + // Context-dependent: eligibleSourceLink + if (localName === 'eligibleSourceLink' || propertyName === 'eligibleSourceLink') { + // Relationship: eligibleSourceLink?: TPigId (string) + return false; // Never an array + } + + return false; +} +/** + * ✅ NEW: Process pig:aProperty element + * Extracts: + * - rdf:type → hasClass + * - → value + * - itemType → pig:aProperty + */ +function processConfigurableProperty(elem: ElementXML): JsonObject { + const prop: JsonObject = { + itemType: PigItemType.aProperty + }; + + // Extract rdf:type as hasClass + const rdfType = elem.getAttribute('rdf:type') || elem.getAttribute('type'); + if (rdfType) { + prop.hasClass = rdfType; + } + + // Extract child elements + for (const child of Array.from(elem.childNodes)) { + if (child.nodeType === Node.ELEMENT_NODE) { + const childElement = child as ElementXML; + const childTagName = childElement.tagName; + + if (childTagName === 'value') { + prop.value = getXmlElementText(childElement); + } else if (childTagName === 'idRef') { + prop.idRef = childElement.textContent?.trim() as JsonValue; + } else if (childTagName === 'aComposedProperty') { + if (!prop.aComposedProperty) { + prop.aComposedProperty = []; + } + (prop.aComposedProperty as string[]).push(childElement.textContent?.trim() || ''); + } + } + } + + return prop; +} + +/** + * ✅ NEW: Process pig:aSourceLink or pig:aTargetLink element + * Extracts: + * - rdf:type → hasClass + * - → idRef + * - itemType → pig:aSourceLink or pig:aTargetLink + */ +function processConfigurableLink(elem: ElementXML, itemType: PigItemTypeValue): JsonObject { + const link: JsonObject = { + itemType: itemType + }; + + // Extract rdf:type as hasClass + const rdfType = elem.getAttribute('rdf:type') || elem.getAttribute('type'); + if (rdfType) { + link.hasClass = rdfType; + } + + // Extract child elements + for (const child of Array.from(elem.childNodes)) { + if (child.nodeType === Node.ELEMENT_NODE) { + const childElement = child as ElementXML; + const childTagName = childElement.tagName; + + if (childTagName === 'idRef') { + link.idRef = childElement.textContent?.trim() as JsonValue; + } + } + } + + return link; +} + +/** + * ✅ NEW: Check if a property name needs IText wrapper ({ value: "..." }) + * Currently only 'icon' according to IElement interface + */ +function requiresIText(propertyName: string): boolean { + const localName = propertyName.includes(':') ? propertyName.split(':')[1] : propertyName; + + // Fields that need IText wrapper: { value: string } + const textWrapperFields = new Set([ + 'icon' // pig:icon in Entity/Relationship classes + ]); + + return textWrapperFields.has(localName) || textWrapperFields.has(propertyName); +} + +/** + * Transform xs:simpleType element and extract datatype constraints + * From: + * + * + * + * 1 + * + * + * To: + * datatype: "xs:string" + * maxLength: 256 + * maxCount: 1 + */ +function xSimpleType(simpleTypeElement: ElementXML, result: JsonObject): void { + // Find xs:restriction element + const restriction = Array.from(simpleTypeElement.children).find( + child => child.tagName === 'xs:restriction' || child.tagName === 'restriction' + ) as ElementXML | undefined; + + if (!restriction) return; + + // Extract base attribute as datatype + const baseAttr = restriction.getAttribute('base'); + if (baseAttr) { + result.datatype = baseAttr; + } + + // Process restriction children + for (const child of Array.from(restriction.children)) { + const tagName = child.tagName; + const localName = tagName.includes(':') ? tagName.split(':')[1] : tagName; + + // Extract value attribute or text content + const value = child.getAttribute('value') || child.textContent?.trim(); + if (!value) continue; + + // Map XSD constraints to PIG properties + switch (localName) { + case 'maxLength': + result.maxLength = parseInt(value, 10); + break; + case 'minLength': + result.minLength = parseInt(value, 10); + break; + case 'maxOccurs': + result.maxCount = parseInt(value, 10); + break; + case 'minOccurs': + result.minCount = parseInt(value, 10); + break; + case 'pattern': + result.pattern = value; + break; + case 'minInclusive': + result.minInclusive = parseFloat(value); + break; + case 'maxInclusive': + result.maxInclusive = parseFloat(value); + break; + case 'minExclusive': + result.minExclusive = parseFloat(value); + break; + case 'maxExclusive': + result.maxExclusive = parseFloat(value); + break; + default: + // Unknown constraint - log warning + logger.warn(`processSimpleType: unknown constraint '${localName}' with value '${value}'`); + } + } +} + +/** + * Get the text content of an XML DOM element, handling both simple text and HTML content + * @param xmlElement - XML DOM Element + * @returns Text content, preserving HTML if present + */ +function getXmlElementText(xmlElement: ElementXML): string { + // Check if element contains HTML elements (p, div, span, etc.) + const hasHtmlContent = Array.from(xmlElement.childNodes).some(node => + node.nodeType === Node.ELEMENT_NODE && + ['p', 'div', 'span', 'small', 'i', 'a', 'object'].includes((node as ElementXML).tagName.toLowerCase()) + ); + + if (hasHtmlContent) { + // Return innerHTML to preserve HTML structure + return xmlElement.innerHTML.trim(); + } else { + // Return plain text content + return xmlElement.textContent?.trim() || ''; + } +} +/** + * Check if a property name represents a multi-language text field + * These fields must always be arrays of ILanguageText objects according to pig-schemata.ts + * + * Multi-language fields found in schemas: + * - Property: title, description, eligibleValue.title // the latter is handled through recursive iteration + * - Link: title, description + * - Entity: title, description + * - Relationship: title, description + * - AnEntity: title, description + * - ARelationship: title, description + * + * ToDo: multiLanguageText also occurs in instances aProperty of configurable Property with datatype = 'string' + */ +function isMultiLanguageText(propertyName: string): boolean { + // Remove namespace prefix for checking + const localName = propertyName.includes(':') ? propertyName.split(':')[1] : propertyName; + + // All multi-language fields from PIG schemas that use LanguageText[] + const multiLangFields = new Set([ + // Common fields across all PIG classes and instances + 'title', // dcterms:title - used in Property, Link, Entity, Relationship, AnEntity, ARelationship + 'description' // dcterms:description - used in Property, Link, Entity, Relationship, AnEntity, ARelationship + + // Note: eligibleValue.title is handled separately in xmlElementToJson() + // because it's nested within eligibleValue objects + ]); + + return multiLangFields.has(localName) || multiLangFields.has(propertyName); +} + +/** + * Parse XML string and convert to JSON object + * @param xml - XML string to parse + * @returns IRsp with JsonObject on success, error message on failure + * +function xml2json(xml: stringXML): IRsp { + try { + logger.debug('xml2json: parsing ',xml); + + // Parse XML string + const parser = new DOMParser(); + const doc = parser.parseFromString(xml, 'text/xml'); + + // Check for parsing errors + const parserError = doc.querySelector('parsererror'); + if (parserError) { + const errorMessage = parserError.textContent || 'Unknown XML parsing error'; + logger.error('xml2json: XML parsing failed:', errorMessage); + return Msg.create(690, 'XML', errorMessage); + } + + // Get root element + const rootElement = doc.documentElement; + if (!rootElement) { + return Msg.create(690, 'XML', 'No root element found in XML'); + } + + // Extract data from XML element + const result: any = {}; + + // Extract id from attribute + if (rootElement.hasAttribute('id')) { + result.id = rootElement.getAttribute('id'); + } + + // Extract itemType from element name (e.g., pig:Property -> pig:Property) + const tagName = rootElement.tagName; + if (tagName.includes(':')) { + result.itemType = tagName; + } else { + result.itemType = tagName; + } + + // Extract rdf:type attribute if present (for hasClass) + if (rootElement.hasAttribute('rdf:type')) { + result.hasClass = rootElement.getAttribute('rdf:type'); + } + + // Extract specializes from rdfs:subClassOf or rdfs:subPropertyOf + const subClassOf = rootElement.querySelector('rdfs\\:subClassOf, [*|subClassOf]'); + if (subClassOf && subClassOf.textContent) { + result.specializes = subClassOf.textContent.trim(); + } + const subPropertyOf = rootElement.querySelector('rdfs\\:subPropertyOf, [*|subPropertyOf]'); + if (subPropertyOf && subPropertyOf.textContent) { + result.specializes = subPropertyOf.textContent.trim(); + } + + // Extract multi-language title elements + const titleElements = rootElement.querySelectorAll('dcterms\\:title, [*|title]'); + if (titleElements.length > 0) { + result.title = Array.from(titleElements).map(el => { + const langAttr = el.getAttribute('xml:lang') || el.getAttribute('lang'); + return { + value: el.textContent?.trim() || '', + ...(langAttr && { lang: langAttr }) + }; + }); + } + + // Extract multi-language description elements + const descriptionElements = rootElement.querySelectorAll('dcterms\\:description, [*|description]'); + if (descriptionElements.length > 0) { + result.description = Array.from(descriptionElements).map(el => { + const langAttr = el.getAttribute('xml:lang') || el.getAttribute('lang'); + return { + value: el.textContent?.trim() || '', + ...(langAttr && { lang: langAttr }) + }; + }); + } + + logger.debug('xml2json: successfully parsed XML'); + + // Return success with parsed result + return { + ...rspOK, + response: result as JsonObject, + responseType: 'json' + }; + + } catch (err: any) { + logger.error('xml2json: exception:', err); + return Msg.create(690, 'XML', err?.message ?? String(err)); + } +} */ /** * Replace top-level string values that are valid id-strings with id-objects. * - Non-recursive (flat): only replaces direct properties of the provided object. diff --git a/src/utils/schemas/pig/ts/pig-package-constraints.ts b/src/utils/schemas/pig/ts/pig-package-constraints.ts index dc9c7b4..6c76ecf 100644 --- a/src/utils/schemas/pig/ts/pig-package-constraints.ts +++ b/src/utils/schemas/pig/ts/pig-package-constraints.ts @@ -20,7 +20,7 @@ * To be discussed: * - Handling (error responses vs log messages) * - Old thinking: The whole package is rejected if any constraint fails (current approach). - * - New thinking --> 'Permissive Computing: Report all issues but return the package with a valid subgraph; + * - New thinking --> 'Permissive Computing': Report all issues but return the package with a valid subgraph; * sometimes there may be 2 or more choices of valid subgraphs when constraints fail. * Partial data is better than no data. * @@ -41,7 +41,7 @@ * Cyclic specialization detection * Cyclic composed property detection * Property value constraints - * Required properties check + * Required properties check --> done by schema validation! * Relationship structure * Phase 4 (optional): * Orphaned items (warnings) @@ -128,7 +128,7 @@ function buildItemTypeMap(pkg: IAPackage): Map { const itemId = (item as any)['@id'] ?? (item as any).id; const itemType = (item as any).itemType; // if (pkg.id == 'd:test-invalid-prop') - // logger.debug(`buildItemTypeMap (3): `, item, itemId, itemType); + // logger.debug(`buildItemTypeMap (3): `, item, itemId, itemType); if (itemId && itemType) { itemTypeMap.set(itemId, itemType); } @@ -207,6 +207,9 @@ function validatePropertyHasClass( return Msg.create(672, parentId, propIndex, 'missing hasClass'); } + // logger.debug(`validatePropertyHasClass: checking hasClass ${JSON.stringify(prop, null, 2)} for property at index ${propIndex} of parent ${parentId}`); + // logger.debug(`validatePropertyHasClass: itemTypeMap = ${JSON.stringify(Array.from(itemTypeMap.entries()), null, 2)}`); + const targetType = itemTypeMap.get(prop.hasClass); if (!targetType) { return Msg.create(673, parentId, propIndex, prop.hasClass, 'not found in package'); diff --git a/tests/data/JSON-LD/21/Project 'Very Simple Model (FMC) with Requirements'.pig.jsonld b/tests/data/JSON-LD/21/Project 'Very Simple Model (FMC) with Requirements'.pig.jsonld index 06d6e64..a627c33 100644 --- a/tests/data/JSON-LD/21/Project 'Very Simple Model (FMC) with Requirements'.pig.jsonld +++ b/tests/data/JSON-LD/21/Project 'Very Simple Model (FMC) with Requirements'.pig.jsonld @@ -1 +1,1672 @@ -{"@context":{"o":"https://product-information-graph.org/v0.2/ontology#","d":"https://product-information-graph.org/examples/09_Very-Simple-Model-FMC-with-Requirements.specif.zip#","rdf":"http://www.w3.org/1999/02/22-rdf-syntax-ns#","owl":"http://www.w3.org/2002/07/owl#","sh":"http://www.w3.org/ns/shacl#","xs":"http://www.w3.org/2001/XMLSchema#","dcterms":"http://purl.org/dc/terms/","FMC":"http://fmc-modeling.org#","IREB":"https://cpre.ireb.org/en/downloads-and-resources/glossary#","ReqIF":"https://www.prostep.org/fileadmin/downloads/PSI_ImplementationGuide_ReqIF_V1-7.pdf#","oslc_rm":"http://open-services.net/ns/rm#","pig":"https://product-information-graph.org/v0.2/metamodel#","SpecIF":"https://specif.de/v1.2/schema#"},"@id":"d:ACP-Very-Simple-Model-FMC-with-Requirements","@type":"pig:Package","dcterms:title":[{"@value":"Project 'Very Simple Model (FMC) with Requirements'"}],"dcterms:modified":"2026-01-17T22:38:19.595Z","@graph":[{"@id":"pig:Entity","@type":"owl:Class","pig:itemType":{"@id":"pig:Entity"},"dcterms:title":[{"@value":"Entity"}],"dcterms:description":[{"@value":"A PIG meta-model element used for entities (aka resources or artifacts)."}],"pig:eligibleProperty":[{"@id":"pig:category"},{"@id":"pig:icon"}]},{"@id":"pig:Organizer","pig:specializes":{"@id":"pig:Entity"},"pig:itemType":{"@id":"pig:Entity"},"dcterms:title":[{"@value":"Organizer"}],"dcterms:description":[{"@value":"An element organizing model elements. An example is a list of requirements or a diagram using a certain notation."}],"pig:eligibleProperty":[{"@id":"pig:category"}]},{"@id":"pig:HierarchyRoot","pig:specializes":{"@id":"pig:Organizer"},"pig:itemType":{"@id":"pig:Entity"},"dcterms:title":[{"@value":"Hierarchy Root"}],"dcterms:description":[{"@value":"A subclass of PIG organizer serving as a root for hierarchically organized graph elements."}],"pig:eligibleProperty":[],"pig:eligibleTargetLink":[{"@id":"pig:lists"}]},{"@id":"pig:Outline","pig:specializes":{"@id":"pig:Organizer"},"pig:itemType":{"@id":"pig:Entity"},"dcterms:title":[{"@value":"Outline"}],"dcterms:description":[{"@value":"A subclass of PIG organizer comprising all information items of a human-readable document. As usual, the outline is hierarchically organized."}],"pig:eligibleProperty":[{"@id":"pig:category"}],"pig:eligibleTargetLink":[{"@id":"pig:lists"}]},{"@id":"pig:View","pig:specializes":{"@id":"pig:Organizer"},"pig:itemType":{"@id":"pig:Entity"},"dcterms:title":[{"@value":"View"}],"dcterms:description":[{"@value":"A subclass of PIG organizer representing a model view (diagram) using a certain notation showing selected model elements."}],"pig:eligibleProperty":[{"@id":"pig:category"},{"@id":"pig:icon"}],"pig:eligibleTargetLink":[{"@id":"pig:shows"},{"@id":"pig:depicts"}]},{"@id":"pig:Relationship","@type":"owl:Class","pig:itemType":{"@id":"pig:Relationship"},"dcterms:title":[{"@value":"Relationship"}],"dcterms:description":[{"@value":"A PIG meta-model element used for reified relationships (aka predicates)."}],"pig:eligibleProperty":[{"@id":"pig:category"},{"@id":"pig:icon"}],"pig:eligibleSourceLink":{"@id":"pig:SourceLink"},"pig:eligibleTargetLink":{"@id":"pig:TargetLink"}},{"@id":"pig:Property","@type":"owl:DatatypeProperty","pig:itemType":{"@id":"pig:Property"},"dcterms:title":[{"@value":"Property"}],"dcterms:description":[{"@value":"A PIG meta-model element used for properties (aka attributes)."}],"sh:datatype":{"@id":"xs:anyType"}},{"@id":"pig:icon","pig:specializes":{"@id":"pig:Property"},"pig:itemType":{"@id":"pig:Property"},"dcterms:title":[{"@value":"has icon"}],"dcterms:description":[{"@value":"Specifies an icon for a model element (entity or relationship)."}],"sh:datatype":{"@id":"xs:string"},"sh:minCount":0,"sh:maxCount":1},{"@id":"pig:category","pig:specializes":{"@id":"dcterms:type"},"pig:itemType":{"@id":"pig:Property"},"dcterms:title":[{"@value":"has category"}],"dcterms:description":[{"@value":"Specifies a category for an element (entity, relationship or organizer)."}],"sh:datatype":{"@id":"xs:string"},"sh:maxLength":32,"sh:minCount":0,"sh:maxCount":1},{"@id":"pig:Link","@type":"owl:ObjectProperty","pig:itemType":{"@id":"pig:Link"},"pig:eligibleEndpoint":[{"@id":"pig:Entity"},{"@id":"pig:Relationship"}],"dcterms:title":[{"@value":"linked with"}],"dcterms:description":[{"@value":"Connects a reified relationship with its source or target. Also connects an organizer to a model element"}]},{"@id":"pig:SourceLink","pig:specializes":{"@id":"pig:Link"},"pig:itemType":{"@id":"pig:Link"},"pig:eligibleEndpoint":[{"@id":"pig:Entity"},{"@id":"pig:Relationship"}],"dcterms:title":[{"@value":"to source"}],"dcterms:description":[{"@value":"Connects the source of a reified relationship."}]},{"@id":"pig:TargetLink","pig:specializes":{"@id":"pig:Link"},"pig:itemType":{"@id":"pig:Link"},"pig:eligibleEndpoint":[{"@id":"pig:Entity"},{"@id":"pig:Relationship"}],"dcterms:title":[{"@value":"to target"}],"dcterms:description":[{"@value":"Connects the target of a reified relationship or an organizer."}]},{"@id":"pig:lists","pig:specializes":{"@id":"pig:TargetLink"},"pig:itemType":{"@id":"pig:Link"},"pig:eligibleEndpoint":[{"@id":"pig:Entity"},{"@id":"pig:Relationship"},{"@id":"pig:Organizer"}],"dcterms:title":[{"@value":"lists"}],"dcterms:description":[{"@value":"Lists an entity, a relationship or a subordinated organizer."}]},{"@id":"pig:shows","pig:specializes":{"@id":"pig:TargetLink"},"pig:itemType":{"@id":"pig:Link"},"pig:eligibleEndpoint":[{"@id":"pig:Entity"},{"@id":"pig:Relationship"}],"dcterms:title":[{"@value":"shows"}],"dcterms:description":[{"@value":"Shows an entity or a relationship."}]},{"@id":"pig:depicts","pig:specializes":{"@id":"pig:TargetLink"},"pig:itemType":{"@id":"pig:Link"},"pig:eligibleEndpoint":[{"@id":"pig:Entity"}],"dcterms:title":[{"@value":"depicts"}],"dcterms:description":[{"@value":"Depicts an entity; inverse of uml:ownedDiagram."}]},{"@id":"dcterms:title","dcterms:title":[{"@value":"Title","@language":"en"},{"@value":"Titel","@language":"de"},{"@value":"Titre","@language":"fr"}],"dcterms:description":[{"@value":"

A name given to the resource. (source: DCMI)

Title (reference: Dublin Core) of the resource represented as rich text in XHTML content. SHOULD include only content that is valid inside an XHTML 'span' element. (source: OSLC)

","@language":"en"}],"@type":"owl:DatatypeProperty","pig:itemType":{"@id":"pig:Property"},"sh:datatype":{"@id":"xs:string"},"sh:maxCount":1,"sh:maxLength":256},{"@id":"dcterms:description","dcterms:title":[{"@value":"Description","@language":"en"},{"@value":"Beschreibung","@language":"de"},{"@value":"Description","@language":"fr"}],"dcterms:description":[{"@value":"

An account of the resource. (source: DCMI)

Descriptive text (reference: Dublin Core) about resource represented as rich text in XHTML content. SHOULD include only content that is valid and suitable inside an XHTML 'div' element. (source: OSLC)

","@language":"en"}],"@type":"owl:DatatypeProperty","pig:itemType":{"@id":"pig:Property"},"sh:datatype":{"@id":"xs:string"},"sh:maxCount":1},{"@id":"SpecIF:Diagram","dcterms:title":[{"@value":"Diagram","@language":"en"},{"@value":"Diagramm","@language":"de"},{"@value":"Diagramme","@language":"fr"}],"dcterms:description":[{"@value":"A diagram illustrating the resource or a link to a diagram.","@language":"en"}],"@type":"owl:DatatypeProperty","pig:itemType":{"@id":"pig:Property"},"sh:datatype":{"@id":"xs:string"}},{"@id":"SpecIF:Priority","dcterms:title":[{"@value":"Priority","@language":"en"},{"@value":"Priorität","@language":"de"},{"@value":"Priorité","@language":"fr"}],"dcterms:description":[{"@value":"Enumerated values for the 'Priority' of the resource.","@language":"en"}],"@type":"owl:ObjectProperty","pig:itemType":{"@id":"pig:Property"},"sh:datatype":{"@id":"xs:string"},"pig:eligibleValue":[{"@id":"SpecIF:priorityHigh","dcterms:title":[{"@value":"high","@language":"en"},{"@value":"hoch","@language":"de"},{"@value":"haut","@language":"fr"}]},{"@id":"SpecIF:priorityMedium","dcterms:title":[{"@value":"medium","@language":"en"},{"@value":"mittel","@language":"de"},{"@value":"moyen","@language":"fr"}]},{"@id":"SpecIF:priorityLow","dcterms:title":[{"@value":"low","@language":"en"},{"@value":"niedrig","@language":"de"},{"@value":"bas","@language":"fr"}]}]},{"@id":"SpecIF:Paragraph","dcterms:title":[{"@value":"Paragraph","@language":"en"},{"@value":"Textabsatz","@language":"de"},{"@value":"Paragraphe","@language":"fr"}],"dcterms:description":[{"@value":"

A 'Paragraph' is an unspecified information in a document at any level.

","@language":"en"},{"@value":"

Ein 'Textabschnitt' in einem Dokument auf beliebiger Ebene.

","@language":"de"}],"pig:specializes":{"@id":"pig:Entity"},"pig:eligibleProperty":[{"@id":"SpecIF:Diagram"},{"@id":"pig:category"}],"pig:eligibleTargetLink":[],"pig:itemType":{"@id":"pig:Entity"}},{"@id":"FMC:Actor","dcterms:title":[{"@value":"Actor","@language":"en"},{"@value":"Akteur","@language":"de"},{"@value":"Acteur","@language":"fr"}],"dcterms:description":[{"@value":"

An 'Actor' is a fundamental model element type representing an active entity, be it an activity, a process step, a function, a system component or a role.

The particular use or original type is specified with a [[dcterms:type]] property of the 'FMC:Actor'. A value of that property should be an ontology-term, such as [[bpmn:processStep]].

","@language":"en"},{"@value":"

Ein 'Akteur' ist ein fundamentaler Modellelementtyp, der eine aktive Entität darstellt, sei es eine Aktivität, ein Prozessschritt, eine Funktion, eine Systemkomponente oder eine Rolle.

Die spezielle Verwendung oder der ursprüngliche Typ wird mit einer [[dcterms:type]] Eigenschaft von 'FMC:Actor' spezifiziert. Die Werte dieser Eigenschaft können Ontologiebegriffe sein, wie z.B. [[bpmn:timer]].

","@language":"de"},{"@value":"

Un 'Acteur' est un type d'élément de modèle fondamental représentant une entité active, qu'il s'agisse d'une activité, d'une étape de processus, d'une fonction, d'un composant de système ou d'un rôle.

L'utilisation particulière ou le type original est spécifié avec une propriété [[dcterms:type]] de 'FMC:Actor'. Les valeurs de cette propriété peuvent être des termes d'ontologie, tels que [[bpmn:timer]].

","@language":"fr"}],"pig:specializes":{"@id":"pig:Entity"},"pig:icon":{"@value":"□"},"pig:eligibleProperty":[{"@id":"pig:category"}],"pig:eligibleTargetLink":[],"pig:itemType":{"@id":"pig:Entity"}},{"@id":"FMC:State","dcterms:title":[{"@value":"State","@language":"en"},{"@value":"Zustand","@language":"de"},{"@value":"État","@language":"fr"}],"dcterms:description":[{"@value":"

A 'State' is a fundamental model element type representing a passive entity, be it a value, a condition, an information storage or even a physical shape.

The particular use or the original type is specified with a [[dcterms:type]] property of the 'FMC:State'. A value of that property should bean ontology-term, such as [[bpmn:dataObject]].

","@language":"en"},{"@value":"

Ein 'Zustand' ist ein fundamentaler Modellelementtyp, der eine passive Entität darstellt, sei es ein Wert, ein Dokument, ein Informationsspeicher, eine Bedingung oder eine physische Beschaffenheit.

Die spezielle Verwendung oder der ursprüngliche Typ wird mit einer [[dcterms:type]] Eigenschaft von 'FMC:State' spezifiziert. Die Werte dieser Eigenschaft können Ontologiebegriffe sein, wie z.B. [[ArchiMate:DataObject]].

","@language":"de"},{"@value":"

Un 'État' est un type d'élément de modèle fondamental représentant une entité passive, qu'il s'agisse d'une valeur, d'une condition, d'un stockage d'informations ou même d'une forme physique.

L'utilisation particulière ou le type original est spécifié avec une propriété [[dcterms:type]] de 'FMC:State'. Les valeurs de cette propriété peuvent être des termes d'ontologie, tels que [[ArchiMate:DataObject]].

","@language":"fr"}],"pig:specializes":{"@id":"pig:Entity"},"pig:icon":{"@value":"○"},"pig:eligibleProperty":[{"@id":"pig:category"}],"pig:eligibleTargetLink":[],"pig:itemType":{"@id":"pig:Entity"}},{"@id":"FMC:Event","dcterms:title":[{"@value":"Event","@language":"en"},{"@value":"Ereignis","@language":"de"},{"@value":"Évenement","@language":"fr"}],"dcterms:description":[{"@value":"

An 'Event' is a fundamental model element type representing a time reference, a change in condition/value or more generally a synchronization primitive.

The particular use or the original type is specified with a [[dcterms:type]] property of the 'FMC:Event'. A value of that property should be an ontology-term, such as [[bpmn:startEvent]].

","@language":"en"},{"@value":"

Ein 'Ereignis' ist ein fundamentaler Modellelementtyp, der eine Zeitreferenz, eine Änderung einer Bedingung/eines Wertes oder allgemeiner ein Synchronisationsmittel darstellt.

Die spezielle Verwendung oder der ursprüngliche Typ wird mit einer [[dcterms:type]] Eigenschaft von 'FMC:Event' spezifiziert. Die Werte dieser Eigenschaft sollen Ontologiebegriffe sein, wie z.B. [[bpmn:startEvent]].

","@language":"de"},{"@value":"

Un 'Événement' est un type d'élément de modèle fondamental représentant une référence temporelle, un changement de condition/valeur ou plus généralement une primitive de synchronisation.

L'utilisation particulière ou le type original est spécifié avec une propriété [[dcterms:type]] de 'FMC:Event'. Les valeurs de cette propriété peuvent être des termes d'ontologie, tels que [[bpmn:startEvent]].

","@language":"fr"}],"pig:specializes":{"@id":"pig:Entity"},"pig:icon":{"@value":"♢"},"pig:eligibleProperty":[{"@id":"pig:category"}],"pig:eligibleTargetLink":[],"pig:itemType":{"@id":"pig:Entity"}},{"@id":"IREB:Requirement","dcterms:title":[{"@value":"Requirement","@language":"en"},{"@value":"Anforderung","@language":"de"},{"@value":"Exigence","@language":"fr"}],"dcterms:description":[{"@value":"

A 'Requirement' is a singular documented physical and functional need that a particular design, product or process must be able to perform. (source: Wikipedia)

Definition:

  1. A condition or capability needed by a user to solve a problem or achieve an objective.
  2. A condition or capability that must be met or possessed by a system or system component to satisfy a contract, standard, specification, or other formally imposed documents.
  3. A documented representation of a condition or capability as in (1) or (2).

Note: The definition above is the classic one from IEEE Std 610.12 of 1990. Alternatively, we also give a more modern definition:

  1. A need perceived by a stakeholder.
  2. A capability or property that a system shall have.
  3. A documented representation of a need, capability or property.
","@language":"en"},{"@value":"

Eine 'Anforderung' ist ein einzelnes dokumentiertes physisches und funktionales Bedürfnis, das ein bestimmter Entwurf, ein Produkt oder ein Prozess erfüllen muss. (source: Wikipedia)

Definition:

  1. Eine Bedingung oder Fähigkeit, die ein Benutzer benötigt, um ein Problem zu lösen oder ein Ziel zu erreichen.
  2. Eine Bedingung oder Fähigkeit, die ein System oder eine Systemkomponente erfüllen oder besitzen muss, um einen Vertrag, eine Norm, eine Spezifikation oder ein anderes formal vorgeschriebenes Dokument zu erfüllen.
  3. Eine dokumentierte Darstellung einer Bedingung oder Fähigkeit wie in (1) oder (2).

Anmerkung: Die obige Definition ist die klassische Definition aus IEEE Std 610.12 von 1990. Alternativ geben wir auch eine modernere Definition an:

  1. Ein von einem Stakeholder wahrgenommener Bedarf.
  2. Eine Fähigkeit oder Eigenschaft, die ein System haben soll.
  3. Eine dokumentierte Darstellung eines Bedarfs, einer Fähigkeit oder Eigenschaft.
","@language":"de"},{"@value":"

Une 'Exigence' est un besoin physique et fonctionnel unique et documenté qu'une conception, un produit ou un processus particulier doit pouvoir satisfaire. (source: Wikipedia)

Définition:

  1. Condition ou capacité dont un utilisateur a besoin pour résoudre un problème ou atteindre un objectif.
  2. Condition ou capacité qui doit être remplie ou possédée par un système ou un composant de système pour satisfaire à un contrat, à une norme, à une spécification ou à d'autres documents imposés officiellement.
  3. Une représentation documentée d'une condition ou d'une capacité comme dans (1) ou (2).

Remarque: La définition ci-dessus est la définition classique de la norme IEEE 610.12 de 1990. Nous donnons également une définition plus moderne:

  1. Un besoin perçu par une partie prenante;
  2. Une capacité ou une propriété qu'un système doit avoir.
  3. Une représentation documentée d'un besoin, d'une capacité ou d'une propriété.
","@language":"fr"}],"pig:specializes":{"@id":"pig:Entity"},"pig:icon":{"@value":"↯"},"pig:eligibleProperty":[{"@id":"SpecIF:Priority"}],"pig:eligibleTargetLink":[],"pig:itemType":{"@id":"pig:Entity"}},{"@id":"SpecIF:writes","dcterms:title":[{"@value":"writes","@language":"en"},{"@value":"schreibt","@language":"de"},{"@value":"écrit","@language":"fr"}],"dcterms:description":[{"@value":"A [[FMC:Actor]] 'writes' (changes) a [[FMC:State]].","@language":"en"}],"pig:specializes":{"@id":"pig:Relationship"},"pig:eligibleProperty":[],"pig:itemType":{"@id":"pig:Relationship"},"pig:eligibleSourceLink":{"@id":"SpecIF:writes-toSource"},"pig:eligibleTargetLink":{"@id":"SpecIF:writes-toTarget"}},{"@id":"SpecIF:writes-toSource","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:SourceLink"},"dcterms:title":[{"@value":"SpecIF:writes to source"}],"dcterms:description":[{"@value":"Connects the source of SpecIF:writes"}],"pig:eligibleEndpoint":[{"@id":"FMC:Actor"}]},{"@id":"SpecIF:writes-toTarget","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:TargetLink"},"dcterms:title":[{"@value":"SpecIF:writes to target"}],"dcterms:description":[{"@value":"Connects the target of SpecIF:writes"}],"pig:eligibleEndpoint":[{"@id":"FMC:State"}]},{"@id":"SpecIF:reads","dcterms:title":[{"@value":"reads","@language":"en"},{"@value":"liest","@language":"de"},{"@value":"lit","@language":"fr"}],"dcterms:description":[{"@value":"A [[FMC:Actor]] 'reads' a [[FMC:State]].","@language":"en"}],"pig:specializes":{"@id":"pig:Relationship"},"pig:eligibleProperty":[],"pig:itemType":{"@id":"pig:Relationship"},"pig:eligibleSourceLink":{"@id":"SpecIF:reads-toSource"},"pig:eligibleTargetLink":{"@id":"SpecIF:reads-toTarget"}},{"@id":"SpecIF:reads-toSource","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:SourceLink"},"dcterms:title":[{"@value":"SpecIF:reads to source"}],"dcterms:description":[{"@value":"Connects the source of SpecIF:reads"}],"pig:eligibleEndpoint":[{"@id":"FMC:Actor"}]},{"@id":"SpecIF:reads-toTarget","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:TargetLink"},"dcterms:title":[{"@value":"SpecIF:reads to target"}],"dcterms:description":[{"@value":"Connects the target of SpecIF:reads"}],"pig:eligibleEndpoint":[{"@id":"FMC:State"}]},{"@id":"oslc_rm:satisfies","dcterms:title":[{"@value":"satisfies","@language":"en"},{"@value":"erfüllt","@language":"de"},{"@value":"satisfait","@language":"fr"}],"dcterms:description":[{"@value":"

The object is satisfied by the subject. (source: OSLC)

SpecIF suggests that the subject is confined to a model element, e.g, a [[FMC:Actor]] or [[FMC:State]], and the object is confined to a [[IREB:Requirement]]. More concretely, an example for this type of statement is 'Component-X satisfies 'Requirement-4711'.

","@language":"en"}],"pig:specializes":{"@id":"pig:Relationship"},"pig:eligibleProperty":[],"pig:itemType":{"@id":"pig:Relationship"},"pig:eligibleSourceLink":{"@id":"oslc_rm:satisfies-toSource"},"pig:eligibleTargetLink":{"@id":"oslc_rm:satisfies-toTarget"}},{"@id":"oslc_rm:satisfies-toSource","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:SourceLink"},"dcterms:title":[{"@value":"oslc_rm:satisfies to source"}],"dcterms:description":[{"@value":"Connects the source of oslc_rm:satisfies"}],"pig:eligibleEndpoint":[{"@id":"FMC:Actor"},{"@id":"FMC:State"}]},{"@id":"oslc_rm:satisfies-toTarget","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:TargetLink"},"dcterms:title":[{"@value":"oslc_rm:satisfies to target"}],"dcterms:description":[{"@value":"Connects the target of oslc_rm:satisfies"}],"pig:eligibleEndpoint":[{"@id":"IREB:Requirement"}]},{"@id":"d:Req-1a8016e2872e78ecadc50feddc00029b","@type":"IREB:Requirement","dcterms:modified":"2020-10-17T10:00:00+01:00","dcterms:title":[{"@value":"Data Volume"}],"dcterms:description":[{"@value":"

The data store MUST support a total volume up to 850 GB.

"}],"SpecIF:Priority":[{"@id":"SpecIF:priorityHigh","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:Req-0Z7916e2872e78ecadc50feddc00918a","@type":"IREB:Requirement","dcterms:modified":"2020-10-17T10:00:00+01:00","dcterms:title":[{"@value":"Consistency"}],"dcterms:description":[{"@value":"

The data store MUST be consistent at all times.

"}],"SpecIF:Priority":[{"@id":"SpecIF:priorityHigh","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:Req-2b9016e2872e78ecadc50feddc0013Ac","@type":"IREB:Requirement","dcterms:modified":"2020-10-17T10:00:00+01:00","dcterms:title":[{"@value":"Response Time"}],"dcterms:description":[{"@value":"

The system SHOULD respond on user queries within 300 ms.

"}],"SpecIF:Priority":[{"@id":"SpecIF:priorityMedium","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:Diagram-aec0df7900010000017001eaf53e8876","@type":"pig:View","dcterms:modified":"2020-03-06T08:32:00+01:00","dcterms:title":[{"@value":"IT-Integration: FiCo-Application and FiCo-Data"}],"SpecIF:Diagram":[{"@value":"

Model Diagram:

Notation: FMC Block Diagram

","pig:itemType":{"@id":"pig:aProperty"}}],"pig:category":[{"@value":"FMC Block Diagram","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"},"pig:shows":[{"@id":"d:MEl-50fbfe8f0029b1a8016ea86245a9d83a","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:MEl-50feddc00029b1a8016e2872e78ecadc","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:SWri-50fbfe8f0029b1a8016ea86245a9d83a-50feddc00029b1a8016e2872e78ecadc","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:SRea-50fbfe8f0029b1a8016ea86245a9d83a-50feddc00029b1a8016e2872e78ecadc","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:MEl-50fbfe8f0029b1a8016ea86245a9d83a","@type":"FMC:Actor","dcterms:modified":"2020-03-06T09:04:00+01:00","dcterms:title":[{"@value":"FiCo-Application"}],"dcterms:description":[{"@value":"

IT-Application for Finance and Controlling.

"}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:MEl-50feddc00029b1a8016e2872e78ecadc","@type":"FMC:State","dcterms:modified":"2020-03-06T09:03:00+01:00","dcterms:title":[{"@value":"FiCo-Data"}],"dcterms:description":[{"@value":"

Finance and Controlling Data, such as cost-units per project with budget, accrued cost etc.

"}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:SWri-50fbfe8f0029b1a8016ea86245a9d83a-50feddc00029b1a8016e2872e78ecadc","@type":"SpecIF:writes","dcterms:modified":"2020-03-06T09:05:00+01:00","dcterms:description":[{"@value":"'FiCo-Application' writes 'FiCo-Data'"}],"pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:writes-toSource":[{"@id":"d:MEl-50fbfe8f0029b1a8016ea86245a9d83a","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:writes-toTarget":[{"@id":"d:MEl-50feddc00029b1a8016e2872e78ecadc","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:SRea-50fbfe8f0029b1a8016ea86245a9d83a-50feddc00029b1a8016e2872e78ecadc","@type":"SpecIF:reads","dcterms:modified":"2020-03-06T09:05:00+01:00","dcterms:description":[{"@value":"'FiCo-Application' reads 'FiCo-Data'"}],"pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:reads-toSource":[{"@id":"d:MEl-50fbfe8f0029b1a8016ea86245a9d83a","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:reads-toTarget":[{"@id":"d:MEl-50feddc00029b1a8016e2872e78ecadc","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:Ssat-50feddc00029b1a8016e2872e78ecadc-1a8016e2872e78ecadc50feddc00029b","@type":"oslc_rm:satisfies","dcterms:modified":"2020-10-17T10:00:00+01:00","dcterms:description":[{"@value":"'FiCo-Data' satisfies 'Data Volume'"}],"pig:itemType":{"@id":"pig:aRelationship"},"oslc_rm:satisfies-toSource":[{"@id":"d:MEl-50feddc00029b1a8016e2872e78ecadc","pig:itemType":{"@id":"pig:aSourceLink"}}],"oslc_rm:satisfies-toTarget":[{"@id":"d:Req-1a8016e2872e78ecadc50feddc00029b","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:Ssat-50feddc00029b1a8016e2872e78ecadc-0Z7916e2872e78ecadc50feddc00918a","@type":"oslc_rm:satisfies","dcterms:modified":"2020-10-17T10:00:00+01:00","dcterms:description":[{"@value":"'FiCo-Data' satisfies 'Consistency'"}],"pig:itemType":{"@id":"pig:aRelationship"},"oslc_rm:satisfies-toSource":[{"@id":"d:MEl-50feddc00029b1a8016e2872e78ecadc","pig:itemType":{"@id":"pig:aSourceLink"}}],"oslc_rm:satisfies-toTarget":[{"@id":"d:Req-0Z7916e2872e78ecadc50feddc00918a","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:Ssat-50fbfe8f0029b1a8016ea86245a9d83a-2b9016e2872e78ecadc50feddc0013Ac","@type":"oslc_rm:satisfies","dcterms:modified":"2020-10-17T10:00:00+01:00","dcterms:description":[{"@value":"'FiCo-Application' satisfies 'Response Time'"}],"pig:itemType":{"@id":"pig:aRelationship"},"oslc_rm:satisfies-toSource":[{"@id":"d:MEl-50fbfe8f0029b1a8016ea86245a9d83a","pig:itemType":{"@id":"pig:aSourceLink"}}],"oslc_rm:satisfies-toTarget":[{"@id":"d:Req-2b9016e2872e78ecadc50feddc0013Ac","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:HierarchyRoot-ACP-Very-Simple-Model-FMC-with-Requirements","@type":"pig:HierarchyRoot","pig:itemType":{"@id":"pig:anEntity"},"dcterms:modified":"2026-01-17T22:38:20.041Z","dcterms:title":[{"@value":"Hierarchy Root"}],"dcterms:description":[{"@value":"... anchoring all hierarchies of this graph (package)"}],"pig:lists":[{"@id":"d:HR-Folder-Introduction","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:HR-Folder-Requirements","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:HR-Folder-SystemModel","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:HR-FolderGlossary-10875487071","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:Folder-Introduction","@type":"pig:Outline","dcterms:modified":"2025-02-07T08:32:00+01:00","dcterms:title":[{"@value":"Introduction"}],"dcterms:description":[{"@value":"

This is a minimal showcase for a model with model-elements and related requirements. It covers pretty much all characteristics neeeded in such cases (including 'statements on statements'), so that transformations and expressive power of other data formats can be evaluated. The example and its representation in SpecIF format is discussed in Tutorial 6: Very Simple Model (FMC) and Tutorial 9: Very Simple Model (FMC) with Requirements.

"}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:HR-Folder-Introduction","@type":"pig:Outline","dcterms:modified":"2026-01-17T22:38:19.821Z","dcterms:title":[{"@value":"Project 'Very Simple Model (FMC) with Requirements'"}],"pig:category":[{"@value":"ReqIF:HierarchyRoot","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"},"pig:lists":[{"@id":"d:Folder-Introduction","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:Folder-Requirements","@type":"pig:Outline","dcterms:modified":"2020-03-06T08:32:00+01:00","dcterms:title":[{"@value":"Requirements"}],"pig:itemType":{"@id":"pig:anEntity"},"pig:lists":[{"@id":"d:Req-1a8016e2872e78ecadc50feddc00029b","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:Req-0Z7916e2872e78ecadc50feddc00918a","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:Req-2b9016e2872e78ecadc50feddc0013Ac","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:HR-Folder-Requirements","@type":"pig:Outline","dcterms:modified":"2026-01-17T22:38:19.821Z","dcterms:title":[{"@value":"Project 'Very Simple Model (FMC) with Requirements'"}],"pig:category":[{"@value":"ReqIF:HierarchyRoot","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"},"pig:lists":[{"@id":"d:Folder-Requirements","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:Folder-SystemModel","@type":"pig:Outline","dcterms:modified":"2020-03-06T08:32:00+01:00","dcterms:title":[{"@value":"System Model"}],"pig:itemType":{"@id":"pig:anEntity"},"pig:lists":[{"@id":"d:Diagram-aec0df7900010000017001eaf53e8876","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:HR-Folder-SystemModel","@type":"pig:Outline","dcterms:modified":"2026-01-17T22:38:19.821Z","dcterms:title":[{"@value":"Project 'Very Simple Model (FMC) with Requirements'"}],"pig:category":[{"@value":"ReqIF:HierarchyRoot","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"},"pig:lists":[{"@id":"d:Folder-SystemModel","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:FolderGlossary-10875487071","@type":"pig:Outline","dcterms:modified":"2026-01-17T22:38:13.953Z","dcterms:title":[{"@value":"Model Elements (Glossary)"}],"pig:category":[{"@value":"SpecIF:Glossary","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"},"pig:lists":[{"@id":"d:MEl-50fbfe8f0029b1a8016ea86245a9d83a","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:MEl-50feddc00029b1a8016e2872e78ecadc","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:HR-FolderGlossary-10875487071","@type":"pig:Outline","dcterms:modified":"2026-01-17T22:38:19.821Z","dcterms:title":[{"@value":"Project 'Very Simple Model (FMC) with Requirements'"}],"pig:category":[{"@value":"ReqIF:HierarchyRoot","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"},"pig:lists":[{"@id":"d:FolderGlossary-10875487071","pig:itemType":{"@id":"pig:aTargetLink"}}]}]} \ No newline at end of file +{ + "@context": { + "o": "https://product-information-graph.org/v0.2/ontology#", + "d": "https://product-information-graph.org/examples/09_Very-Simple-Model-FMC-with-Requirements.specif.zip#", + "rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#", + "owl": "http://www.w3.org/2002/07/owl#", + "sh": "http://www.w3.org/ns/shacl#", + "xs": "http://www.w3.org/2001/XMLSchema#", + "dcterms": "http://purl.org/dc/terms/", + "FMC": "http://fmc-modeling.org#", + "IREB": "https://cpre.ireb.org/en/downloads-and-resources/glossary#", + "ReqIF": "https://www.prostep.org/fileadmin/downloads/PSI_ImplementationGuide_ReqIF_V1-7.pdf#", + "oslc_rm": "http://open-services.net/ns/rm#", + "pig": "https://product-information-graph.org/v0.2/metamodel#", + "SpecIF": "https://specif.de/v1.2/schema#" + }, + "@id": "d:ACP-Very-Simple-Model-FMC-with-Requirements", + "@type": "pig:Package", + "dcterms:title": [ + { + "@value": "Project 'Very Simple Model (FMC) with Requirements'" + } + ], + "dcterms:modified": "2026-01-17T22:38:19.595Z", + "@graph": [ + { + "@id": "pig:Entity", + "@type": "owl:Class", + "pig:itemType": { + "@id": "pig:Entity" + }, + "dcterms:title": [ + { + "@value": "Entity" + } + ], + "dcterms:description": [ + { + "@value": "A PIG meta-model element used for entities (aka resources or artifacts)." + } + ], + "pig:eligibleProperty": [ + { + "@id": "pig:category" + }, + { + "@id": "pig:icon" + } + ] + }, + { + "@id": "pig:Organizer", + "pig:specializes": { + "@id": "pig:Entity" + }, + "pig:itemType": { + "@id": "pig:Entity" + }, + "dcterms:title": [ + { + "@value": "Organizer" + } + ], + "dcterms:description": [ + { + "@value": "An element organizing model elements. An example is a list of requirements or a diagram using a certain notation." + } + ], + "pig:eligibleProperty": [ + { + "@id": "pig:category" + } + ] + }, + { + "@id": "pig:HierarchyRoot", + "pig:specializes": { + "@id": "pig:Organizer" + }, + "pig:itemType": { + "@id": "pig:Entity" + }, + "dcterms:title": [ + { + "@value": "Hierarchy Root" + } + ], + "dcterms:description": [ + { + "@value": "A subclass of PIG organizer serving as a root for hierarchically organized graph elements." + } + ], + "pig:eligibleProperty": [ + ], + "pig:eligibleTargetLink": [ + { + "@id": "pig:lists" + } + ] + }, + { + "@id": "pig:Outline", + "pig:specializes": { + "@id": "pig:Organizer" + }, + "pig:itemType": { + "@id": "pig:Entity" + }, + "dcterms:title": [ + { + "@value": "Outline" + } + ], + "dcterms:description": [ + { + "@value": "A subclass of PIG organizer comprising all information items of a human-readable document. As usual, the outline is hierarchically organized." + } + ], + "pig:eligibleProperty": [ + { + "@id": "pig:category" + } + ], + "pig:eligibleTargetLink": [ + { + "@id": "pig:lists" + } + ] + }, + { + "@id": "pig:View", + "pig:specializes": { + "@id": "pig:Organizer" + }, + "pig:itemType": { + "@id": "pig:Entity" + }, + "dcterms:title": [ + { + "@value": "View" + } + ], + "dcterms:description": [ + { + "@value": "A subclass of PIG organizer representing a model view (diagram) using a certain notation showing selected model elements." + } + ], + "pig:eligibleProperty": [ + { + "@id": "pig:category" + }, + { + "@id": "pig:icon" + } + ], + "pig:eligibleTargetLink": [ + { + "@id": "pig:shows" + }, + { + "@id": "pig:depicts" + } + ] + }, + { + "@id": "pig:Relationship", + "@type": "owl:Class", + "pig:itemType": { + "@id": "pig:Relationship" + }, + "dcterms:title": [ + { + "@value": "Relationship" + } + ], + "dcterms:description": [ + { + "@value": "A PIG meta-model element used for reified relationships (aka predicates)." + } + ], + "pig:eligibleProperty": [ + { + "@id": "pig:category" + }, + { + "@id": "pig:icon" + } + ], + "pig:eligibleSourceLink": { + "@id": "pig:SourceLink" + }, + "pig:eligibleTargetLink": { + "@id": "pig:TargetLink" + } + }, + { + "@id": "pig:Property", + "@type": "owl:DatatypeProperty", + "pig:itemType": { + "@id": "pig:Property" + }, + "dcterms:title": [ + { + "@value": "Property" + } + ], + "dcterms:description": [ + { + "@value": "A PIG meta-model element used for properties (aka attributes)." + } + ], + "sh:datatype": { + "@id": "xs:anyType" + } + }, + { + "@id": "pig:icon", + "pig:specializes": { + "@id": "pig:Property" + }, + "pig:itemType": { + "@id": "pig:Property" + }, + "dcterms:title": [ + { + "@value": "has icon" + } + ], + "dcterms:description": [ + { + "@value": "Specifies an icon for a model element (entity or relationship)." + } + ], + "sh:datatype": { + "@id": "xs:string" + }, + "sh:minCount": 0, + "sh:maxCount": 1 + }, + { + "@id": "pig:category", + "pig:specializes": { + "@id": "dcterms:type" + }, + "pig:itemType": { + "@id": "pig:Property" + }, + "dcterms:title": [ + { + "@value": "has category" + } + ], + "dcterms:description": [ + { + "@value": "Specifies a category for an element (entity, relationship or organizer)." + } + ], + "sh:datatype": { + "@id": "xs:string" + }, + "sh:maxLength": 32, + "sh:minCount": 0, + "sh:maxCount": 1 + }, + { + "@id": "pig:Link", + "@type": "owl:ObjectProperty", + "pig:itemType": { + "@id": "pig:Link" + }, + "pig:eligibleEndpoint": [ + { + "@id": "pig:Entity" + }, + { + "@id": "pig:Relationship" + } + ], + "dcterms:title": [ + { + "@value": "linked with" + } + ], + "dcterms:description": [ + { + "@value": "Connects a reified relationship with its source or target. Also connects an organizer to a model element" + } + ] + }, + { + "@id": "pig:SourceLink", + "pig:specializes": { + "@id": "pig:Link" + }, + "pig:itemType": { + "@id": "pig:Link" + }, + "pig:eligibleEndpoint": [ + { + "@id": "pig:Entity" + }, + { + "@id": "pig:Relationship" + } + ], + "dcterms:title": [ + { + "@value": "to source" + } + ], + "dcterms:description": [ + { + "@value": "Connects the source of a reified relationship." + } + ] + }, + { + "@id": "pig:TargetLink", + "pig:specializes": { + "@id": "pig:Link" + }, + "pig:itemType": { + "@id": "pig:Link" + }, + "pig:eligibleEndpoint": [ + { + "@id": "pig:Entity" + }, + { + "@id": "pig:Relationship" + } + ], + "dcterms:title": [ + { + "@value": "to target" + } + ], + "dcterms:description": [ + { + "@value": "Connects the target of a reified relationship or an organizer." + } + ] + }, + { + "@id": "pig:lists", + "pig:specializes": { + "@id": "pig:TargetLink" + }, + "pig:itemType": { + "@id": "pig:Link" + }, + "pig:eligibleEndpoint": [ + { + "@id": "pig:Entity" + }, + { + "@id": "pig:Relationship" + }, + { + "@id": "pig:Organizer" + } + ], + "dcterms:title": [ + { + "@value": "lists" + } + ], + "dcterms:description": [ + { + "@value": "Lists an entity, a relationship or a subordinated organizer." + } + ] + }, + { + "@id": "pig:shows", + "pig:specializes": { + "@id": "pig:TargetLink" + }, + "pig:itemType": { + "@id": "pig:Link" + }, + "pig:eligibleEndpoint": [ + { + "@id": "pig:Entity" + }, + { + "@id": "pig:Relationship" + } + ], + "dcterms:title": [ + { + "@value": "shows" + } + ], + "dcterms:description": [ + { + "@value": "Shows an entity or a relationship." + } + ] + }, + { + "@id": "pig:depicts", + "pig:specializes": { + "@id": "pig:TargetLink" + }, + "pig:itemType": { + "@id": "pig:Link" + }, + "pig:eligibleEndpoint": [ + { + "@id": "pig:Entity" + } + ], + "dcterms:title": [ + { + "@value": "depicts" + } + ], + "dcterms:description": [ + { + "@value": "Depicts an entity; inverse of uml:ownedDiagram." + } + ] + }, + { + "@id": "dcterms:title", + "dcterms:title": [ + { + "@value": "Title", + "@language": "en" + }, + { + "@value": "Titel", + "@language": "de" + }, + { + "@value": "Titre", + "@language": "fr" + } + ], + "dcterms:description": [ + { + "@value": "

A name given to the resource. (source: DCMI)

Title (reference: Dublin Core) of the resource represented as rich text in XHTML content. SHOULD include only content that is valid inside an XHTML 'span' element. (source: OSLC)

", + "@language": "en" + } + ], + "@type": "owl:DatatypeProperty", + "pig:itemType": { + "@id": "pig:Property" + }, + "sh:datatype": { + "@id": "xs:string" + }, + "sh:maxCount": 1, + "sh:maxLength": 256 + }, + { + "@id": "dcterms:description", + "dcterms:title": [ + { + "@value": "Description", + "@language": "en" + }, + { + "@value": "Beschreibung", + "@language": "de" + }, + { + "@value": "Description", + "@language": "fr" + } + ], + "dcterms:description": [ + { + "@value": "

An account of the resource. (source: DCMI)

Descriptive text (reference: Dublin Core) about resource represented as rich text in XHTML content. SHOULD include only content that is valid and suitable inside an XHTML 'div' element. (source: OSLC)

", + "@language": "en" + } + ], + "@type": "owl:DatatypeProperty", + "pig:itemType": { + "@id": "pig:Property" + }, + "sh:datatype": { + "@id": "xs:string" + }, + "sh:maxCount": 1 + }, + { + "@id": "SpecIF:Diagram", + "dcterms:title": [ + { + "@value": "Diagram", + "@language": "en" + }, + { + "@value": "Diagramm", + "@language": "de" + }, + { + "@value": "Diagramme", + "@language": "fr" + } + ], + "dcterms:description": [ + { + "@value": "A diagram illustrating the resource or a link to a diagram.", + "@language": "en" + } + ], + "@type": "owl:DatatypeProperty", + "pig:itemType": { + "@id": "pig:Property" + }, + "sh:datatype": { + "@id": "xs:string" + } + }, + { + "@id": "SpecIF:Priority", + "dcterms:title": [ + { + "@value": "Priority", + "@language": "en" + }, + { + "@value": "Priorität", + "@language": "de" + }, + { + "@value": "Priorité", + "@language": "fr" + } + ], + "dcterms:description": [ + { + "@value": "Enumerated values for the 'Priority' of the resource.", + "@language": "en" + } + ], + "@type": "owl:ObjectProperty", + "pig:itemType": { + "@id": "pig:Property" + }, + "sh:datatype": { + "@id": "xs:string" + }, + "pig:eligibleValue": [ + { + "@id": "SpecIF:priorityHigh", + "dcterms:title": [ + { + "@value": "high", + "@language": "en" + }, + { + "@value": "hoch", + "@language": "de" + }, + { + "@value": "haut", + "@language": "fr" + } + ] + }, + { + "@id": "SpecIF:priorityMedium", + "dcterms:title": [ + { + "@value": "medium", + "@language": "en" + }, + { + "@value": "mittel", + "@language": "de" + }, + { + "@value": "moyen", + "@language": "fr" + } + ] + }, + { + "@id": "SpecIF:priorityLow", + "dcterms:title": [ + { + "@value": "low", + "@language": "en" + }, + { + "@value": "niedrig", + "@language": "de" + }, + { + "@value": "bas", + "@language": "fr" + } + ] + } + ] + }, + { + "@id": "SpecIF:Paragraph", + "dcterms:title": [ + { + "@value": "Paragraph", + "@language": "en" + }, + { + "@value": "Textabsatz", + "@language": "de" + }, + { + "@value": "Paragraphe", + "@language": "fr" + } + ], + "dcterms:description": [ + { + "@value": "

A 'Paragraph' is an unspecified information in a document at any level.

", + "@language": "en" + }, + { + "@value": "

Ein 'Textabschnitt' in einem Dokument auf beliebiger Ebene.

", + "@language": "de" + } + ], + "pig:specializes": { + "@id": "pig:Entity" + }, + "pig:eligibleProperty": [ + { + "@id": "SpecIF:Diagram" + }, + { + "@id": "pig:category" + } + ], + "pig:eligibleTargetLink": [ + ], + "pig:itemType": { + "@id": "pig:Entity" + } + }, + { + "@id": "FMC:Actor", + "dcterms:title": [ + { + "@value": "Actor", + "@language": "en" + }, + { + "@value": "Akteur", + "@language": "de" + }, + { + "@value": "Acteur", + "@language": "fr" + } + ], + "dcterms:description": [ + { + "@value": "

An 'Actor' is a fundamental model element type representing an active entity, be it an activity, a process step, a function, a system component or a role.

The particular use or original type is specified with a [[dcterms:type]] property of the 'FMC:Actor'. A value of that property should be an ontology-term, such as [[bpmn:processStep]].

", + "@language": "en" + }, + { + "@value": "

Ein 'Akteur' ist ein fundamentaler Modellelementtyp, der eine aktive Entität darstellt, sei es eine Aktivität, ein Prozessschritt, eine Funktion, eine Systemkomponente oder eine Rolle.

Die spezielle Verwendung oder der ursprüngliche Typ wird mit einer [[dcterms:type]] Eigenschaft von 'FMC:Actor' spezifiziert. Die Werte dieser Eigenschaft können Ontologiebegriffe sein, wie z.B. [[bpmn:timer]].

", + "@language": "de" + }, + { + "@value": "

Un 'Acteur' est un type d'élément de modèle fondamental représentant une entité active, qu'il s'agisse d'une activité, d'une étape de processus, d'une fonction, d'un composant de système ou d'un rôle.

L'utilisation particulière ou le type original est spécifié avec une propriété [[dcterms:type]] de 'FMC:Actor'. Les valeurs de cette propriété peuvent être des termes d'ontologie, tels que [[bpmn:timer]].

", + "@language": "fr" + } + ], + "pig:specializes": { + "@id": "pig:Entity" + }, + "pig:icon": { + "@value": "□" + }, + "pig:eligibleProperty": [ + { + "@id": "pig:category" + } + ], + "pig:eligibleTargetLink": [ + ], + "pig:itemType": { + "@id": "pig:Entity" + } + }, + { + "@id": "FMC:State", + "dcterms:title": [ + { + "@value": "State", + "@language": "en" + }, + { + "@value": "Zustand", + "@language": "de" + }, + { + "@value": "État", + "@language": "fr" + } + ], + "dcterms:description": [ + { + "@value": "

A 'State' is a fundamental model element type representing a passive entity, be it a value, a condition, an information storage or even a physical shape.

The particular use or the original type is specified with a [[dcterms:type]] property of the 'FMC:State'. A value of that property should bean ontology-term, such as [[bpmn:dataObject]].

", + "@language": "en" + }, + { + "@value": "

Ein 'Zustand' ist ein fundamentaler Modellelementtyp, der eine passive Entität darstellt, sei es ein Wert, ein Dokument, ein Informationsspeicher, eine Bedingung oder eine physische Beschaffenheit.

Die spezielle Verwendung oder der ursprüngliche Typ wird mit einer [[dcterms:type]] Eigenschaft von 'FMC:State' spezifiziert. Die Werte dieser Eigenschaft können Ontologiebegriffe sein, wie z.B. [[ArchiMate:DataObject]].

", + "@language": "de" + }, + { + "@value": "

Un 'État' est un type d'élément de modèle fondamental représentant une entité passive, qu'il s'agisse d'une valeur, d'une condition, d'un stockage d'informations ou même d'une forme physique.

L'utilisation particulière ou le type original est spécifié avec une propriété [[dcterms:type]] de 'FMC:State'. Les valeurs de cette propriété peuvent être des termes d'ontologie, tels que [[ArchiMate:DataObject]].

", + "@language": "fr" + } + ], + "pig:specializes": { + "@id": "pig:Entity" + }, + "pig:icon": { + "@value": "○" + }, + "pig:eligibleProperty": [ + { + "@id": "pig:category" + } + ], + "pig:eligibleTargetLink": [ + ], + "pig:itemType": { + "@id": "pig:Entity" + } + }, + { + "@id": "FMC:Event", + "dcterms:title": [ + { + "@value": "Event", + "@language": "en" + }, + { + "@value": "Ereignis", + "@language": "de" + }, + { + "@value": "Évenement", + "@language": "fr" + } + ], + "dcterms:description": [ + { + "@value": "

An 'Event' is a fundamental model element type representing a time reference, a change in condition/value or more generally a synchronization primitive.

The particular use or the original type is specified with a [[dcterms:type]] property of the 'FMC:Event'. A value of that property should be an ontology-term, such as [[bpmn:startEvent]].

", + "@language": "en" + }, + { + "@value": "

Ein 'Ereignis' ist ein fundamentaler Modellelementtyp, der eine Zeitreferenz, eine Änderung einer Bedingung/eines Wertes oder allgemeiner ein Synchronisationsmittel darstellt.

Die spezielle Verwendung oder der ursprüngliche Typ wird mit einer [[dcterms:type]] Eigenschaft von 'FMC:Event' spezifiziert. Die Werte dieser Eigenschaft sollen Ontologiebegriffe sein, wie z.B. [[bpmn:startEvent]].

", + "@language": "de" + }, + { + "@value": "

Un 'Événement' est un type d'élément de modèle fondamental représentant une référence temporelle, un changement de condition/valeur ou plus généralement une primitive de synchronisation.

L'utilisation particulière ou le type original est spécifié avec une propriété [[dcterms:type]] de 'FMC:Event'. Les valeurs de cette propriété peuvent être des termes d'ontologie, tels que [[bpmn:startEvent]].

", + "@language": "fr" + } + ], + "pig:specializes": { + "@id": "pig:Entity" + }, + "pig:icon": { + "@value": "♢" + }, + "pig:eligibleProperty": [ + { + "@id": "pig:category" + } + ], + "pig:eligibleTargetLink": [ + ], + "pig:itemType": { + "@id": "pig:Entity" + } + }, + { + "@id": "IREB:Requirement", + "dcterms:title": [ + { + "@value": "Requirement", + "@language": "en" + }, + { + "@value": "Anforderung", + "@language": "de" + }, + { + "@value": "Exigence", + "@language": "fr" + } + ], + "dcterms:description": [ + { + "@value": "

A 'Requirement' is a singular documented physical and functional need that a particular design, product or process must be able to perform. (source: Wikipedia)

Definition:

  1. A condition or capability needed by a user to solve a problem or achieve an objective.
  2. A condition or capability that must be met or possessed by a system or system component to satisfy a contract, standard, specification, or other formally imposed documents.
  3. A documented representation of a condition or capability as in (1) or (2).

Note: The definition above is the classic one from IEEE Std 610.12 of 1990. Alternatively, we also give a more modern definition:

  1. A need perceived by a stakeholder.
  2. A capability or property that a system shall have.
  3. A documented representation of a need, capability or property.
", + "@language": "en" + }, + { + "@value": "

Eine 'Anforderung' ist ein einzelnes dokumentiertes physisches und funktionales Bedürfnis, das ein bestimmter Entwurf, ein Produkt oder ein Prozess erfüllen muss. (source: Wikipedia)

Definition:

  1. Eine Bedingung oder Fähigkeit, die ein Benutzer benötigt, um ein Problem zu lösen oder ein Ziel zu erreichen.
  2. Eine Bedingung oder Fähigkeit, die ein System oder eine Systemkomponente erfüllen oder besitzen muss, um einen Vertrag, eine Norm, eine Spezifikation oder ein anderes formal vorgeschriebenes Dokument zu erfüllen.
  3. Eine dokumentierte Darstellung einer Bedingung oder Fähigkeit wie in (1) oder (2).

Anmerkung: Die obige Definition ist die klassische Definition aus IEEE Std 610.12 von 1990. Alternativ geben wir auch eine modernere Definition an:

  1. Ein von einem Stakeholder wahrgenommener Bedarf.
  2. Eine Fähigkeit oder Eigenschaft, die ein System haben soll.
  3. Eine dokumentierte Darstellung eines Bedarfs, einer Fähigkeit oder Eigenschaft.
", + "@language": "de" + }, + { + "@value": "

Une 'Exigence' est un besoin physique et fonctionnel unique et documenté qu'une conception, un produit ou un processus particulier doit pouvoir satisfaire. (source: Wikipedia)

Définition:

  1. Condition ou capacité dont un utilisateur a besoin pour résoudre un problème ou atteindre un objectif.
  2. Condition ou capacité qui doit être remplie ou possédée par un système ou un composant de système pour satisfaire à un contrat, à une norme, à une spécification ou à d'autres documents imposés officiellement.
  3. Une représentation documentée d'une condition ou d'une capacité comme dans (1) ou (2).

Remarque: La définition ci-dessus est la définition classique de la norme IEEE 610.12 de 1990. Nous donnons également une définition plus moderne:

  1. Un besoin perçu par une partie prenante;
  2. Une capacité ou une propriété qu'un système doit avoir.
  3. Une représentation documentée d'un besoin, d'une capacité ou d'une propriété.
", + "@language": "fr" + } + ], + "pig:specializes": { + "@id": "pig:Entity" + }, + "pig:icon": { + "@value": "↯" + }, + "pig:eligibleProperty": [ + { + "@id": "SpecIF:Priority" + } + ], + "pig:eligibleTargetLink": [ + ], + "pig:itemType": { + "@id": "pig:Entity" + } + }, + { + "@id": "SpecIF:writes", + "dcterms:title": [ + { + "@value": "writes", + "@language": "en" + }, + { + "@value": "schreibt", + "@language": "de" + }, + { + "@value": "écrit", + "@language": "fr" + } + ], + "dcterms:description": [ + { + "@value": "A [[FMC:Actor]] 'writes' (changes) a [[FMC:State]].", + "@language": "en" + } + ], + "pig:specializes": { + "@id": "pig:Relationship" + }, + "pig:eligibleProperty": [ + ], + "pig:itemType": { + "@id": "pig:Relationship" + }, + "pig:eligibleSourceLink": { + "@id": "SpecIF:writes-toSource" + }, + "pig:eligibleTargetLink": { + "@id": "SpecIF:writes-toTarget" + } + }, + { + "@id": "SpecIF:writes-toSource", + "pig:itemType": { + "@id": "pig:Link" + }, + "pig:specializes": { + "@id": "pig:SourceLink" + }, + "dcterms:title": [ + { + "@value": "SpecIF:writes to source" + } + ], + "dcterms:description": [ + { + "@value": "Connects the source of SpecIF:writes" + } + ], + "pig:eligibleEndpoint": [ + { + "@id": "FMC:Actor" + } + ] + }, + { + "@id": "SpecIF:writes-toTarget", + "pig:itemType": { + "@id": "pig:Link" + }, + "pig:specializes": { + "@id": "pig:TargetLink" + }, + "dcterms:title": [ + { + "@value": "SpecIF:writes to target" + } + ], + "dcterms:description": [ + { + "@value": "Connects the target of SpecIF:writes" + } + ], + "pig:eligibleEndpoint": [ + { + "@id": "FMC:State" + } + ] + }, + { + "@id": "SpecIF:reads", + "dcterms:title": [ + { + "@value": "reads", + "@language": "en" + }, + { + "@value": "liest", + "@language": "de" + }, + { + "@value": "lit", + "@language": "fr" + } + ], + "dcterms:description": [ + { + "@value": "A [[FMC:Actor]] 'reads' a [[FMC:State]].", + "@language": "en" + } + ], + "pig:specializes": { + "@id": "pig:Relationship" + }, + "pig:eligibleProperty": [ + ], + "pig:itemType": { + "@id": "pig:Relationship" + }, + "pig:eligibleSourceLink": { + "@id": "SpecIF:reads-toSource" + }, + "pig:eligibleTargetLink": { + "@id": "SpecIF:reads-toTarget" + } + }, + { + "@id": "SpecIF:reads-toSource", + "pig:itemType": { + "@id": "pig:Link" + }, + "pig:specializes": { + "@id": "pig:SourceLink" + }, + "dcterms:title": [ + { + "@value": "SpecIF:reads to source" + } + ], + "dcterms:description": [ + { + "@value": "Connects the source of SpecIF:reads" + } + ], + "pig:eligibleEndpoint": [ + { + "@id": "FMC:Actor" + } + ] + }, + { + "@id": "SpecIF:reads-toTarget", + "pig:itemType": { + "@id": "pig:Link" + }, + "pig:specializes": { + "@id": "pig:TargetLink" + }, + "dcterms:title": [ + { + "@value": "SpecIF:reads to target" + } + ], + "dcterms:description": [ + { + "@value": "Connects the target of SpecIF:reads" + } + ], + "pig:eligibleEndpoint": [ + { + "@id": "FMC:State" + } + ] + }, + { + "@id": "oslc_rm:satisfies", + "dcterms:title": [ + { + "@value": "satisfies", + "@language": "en" + }, + { + "@value": "erfüllt", + "@language": "de" + }, + { + "@value": "satisfait", + "@language": "fr" + } + ], + "dcterms:description": [ + { + "@value": "

The object is satisfied by the subject. (source: OSLC)

SpecIF suggests that the subject is confined to a model element, e.g, a [[FMC:Actor]] or [[FMC:State]], and the object is confined to a [[IREB:Requirement]]. More concretely, an example for this type of statement is 'Component-X satisfies 'Requirement-4711'.

", + "@language": "en" + } + ], + "pig:specializes": { + "@id": "pig:Relationship" + }, + "pig:eligibleProperty": [ + ], + "pig:itemType": { + "@id": "pig:Relationship" + }, + "pig:eligibleSourceLink": { + "@id": "oslc_rm:satisfies-toSource" + }, + "pig:eligibleTargetLink": { + "@id": "oslc_rm:satisfies-toTarget" + } + }, + { + "@id": "oslc_rm:satisfies-toSource", + "pig:itemType": { + "@id": "pig:Link" + }, + "pig:specializes": { + "@id": "pig:SourceLink" + }, + "dcterms:title": [ + { + "@value": "oslc_rm:satisfies to source" + } + ], + "dcterms:description": [ + { + "@value": "Connects the source of oslc_rm:satisfies" + } + ], + "pig:eligibleEndpoint": [ + { + "@id": "FMC:Actor" + }, + { + "@id": "FMC:State" + } + ] + }, + { + "@id": "oslc_rm:satisfies-toTarget", + "pig:itemType": { + "@id": "pig:Link" + }, + "pig:specializes": { + "@id": "pig:TargetLink" + }, + "dcterms:title": [ + { + "@value": "oslc_rm:satisfies to target" + } + ], + "dcterms:description": [ + { + "@value": "Connects the target of oslc_rm:satisfies" + } + ], + "pig:eligibleEndpoint": [ + { + "@id": "IREB:Requirement" + } + ] + }, + { + "@id": "d:Req-1a8016e2872e78ecadc50feddc00029b", + "@type": "IREB:Requirement", + "dcterms:modified": "2020-10-17T10:00:00+01:00", + "dcterms:title": [ + { + "@value": "Data Volume" + } + ], + "dcterms:description": [ + { + "@value": "

The data store MUST support a total volume up to 850 GB.

" + } + ], + "SpecIF:Priority": [ + { + "@id": "SpecIF:priorityHigh", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:Req-0Z7916e2872e78ecadc50feddc00918a", + "@type": "IREB:Requirement", + "dcterms:modified": "2020-10-17T10:00:00+01:00", + "dcterms:title": [ + { + "@value": "Consistency" + } + ], + "dcterms:description": [ + { + "@value": "

The data store MUST be consistent at all times.

" + } + ], + "SpecIF:Priority": [ + { + "@id": "SpecIF:priorityHigh", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:Req-2b9016e2872e78ecadc50feddc0013Ac", + "@type": "IREB:Requirement", + "dcterms:modified": "2020-10-17T10:00:00+01:00", + "dcterms:title": [ + { + "@value": "Response Time" + } + ], + "dcterms:description": [ + { + "@value": "

The system SHOULD respond on user queries within 300 ms.

" + } + ], + "SpecIF:Priority": [ + { + "@id": "SpecIF:priorityMedium", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:Diagram-aec0df7900010000017001eaf53e8876", + "@type": "pig:View", + "dcterms:modified": "2020-03-06T08:32:00+01:00", + "dcterms:title": [ + { + "@value": "IT-Integration: FiCo-Application and FiCo-Data" + } + ], + "SpecIF:Diagram": [ + { + "@value": "

Model Diagram:

Notation: FMC Block Diagram

", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:category": [ + { + "@value": "FMC Block Diagram", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + }, + "pig:shows": [ + { + "@id": "d:MEl-50fbfe8f0029b1a8016ea86245a9d83a", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:MEl-50feddc00029b1a8016e2872e78ecadc", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:SWri-50fbfe8f0029b1a8016ea86245a9d83a-50feddc00029b1a8016e2872e78ecadc", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:SRea-50fbfe8f0029b1a8016ea86245a9d83a-50feddc00029b1a8016e2872e78ecadc", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:MEl-50fbfe8f0029b1a8016ea86245a9d83a", + "@type": "FMC:Actor", + "dcterms:modified": "2020-03-06T09:04:00+01:00", + "dcterms:title": [ + { + "@value": "FiCo-Application" + } + ], + "dcterms:description": [ + { + "@value": "

IT-Application for Finance and Controlling.

" + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:MEl-50feddc00029b1a8016e2872e78ecadc", + "@type": "FMC:State", + "dcterms:modified": "2020-03-06T09:03:00+01:00", + "dcterms:title": [ + { + "@value": "FiCo-Data" + } + ], + "dcterms:description": [ + { + "@value": "

Finance and Controlling Data, such as cost-units per project with budget, accrued cost etc.

" + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:SWri-50fbfe8f0029b1a8016ea86245a9d83a-50feddc00029b1a8016e2872e78ecadc", + "@type": "SpecIF:writes", + "dcterms:modified": "2020-03-06T09:05:00+01:00", + "dcterms:description": [ + { + "@value": "'FiCo-Application' writes 'FiCo-Data'" + } + ], + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "SpecIF:writes-toSource": [ + { + "@id": "d:MEl-50fbfe8f0029b1a8016ea86245a9d83a", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "SpecIF:writes-toTarget": [ + { + "@id": "d:MEl-50feddc00029b1a8016e2872e78ecadc", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:SRea-50fbfe8f0029b1a8016ea86245a9d83a-50feddc00029b1a8016e2872e78ecadc", + "@type": "SpecIF:reads", + "dcterms:modified": "2020-03-06T09:05:00+01:00", + "dcterms:description": [ + { + "@value": "'FiCo-Application' reads 'FiCo-Data'" + } + ], + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "SpecIF:reads-toSource": [ + { + "@id": "d:MEl-50fbfe8f0029b1a8016ea86245a9d83a", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "SpecIF:reads-toTarget": [ + { + "@id": "d:MEl-50feddc00029b1a8016e2872e78ecadc", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:Ssat-50feddc00029b1a8016e2872e78ecadc-1a8016e2872e78ecadc50feddc00029b", + "@type": "oslc_rm:satisfies", + "dcterms:modified": "2020-10-17T10:00:00+01:00", + "dcterms:description": [ + { + "@value": "'FiCo-Data' satisfies 'Data Volume'" + } + ], + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "oslc_rm:satisfies-toSource": [ + { + "@id": "d:MEl-50feddc00029b1a8016e2872e78ecadc", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "oslc_rm:satisfies-toTarget": [ + { + "@id": "d:Req-1a8016e2872e78ecadc50feddc00029b", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:Ssat-50feddc00029b1a8016e2872e78ecadc-0Z7916e2872e78ecadc50feddc00918a", + "@type": "oslc_rm:satisfies", + "dcterms:modified": "2020-10-17T10:00:00+01:00", + "dcterms:description": [ + { + "@value": "'FiCo-Data' satisfies 'Consistency'" + } + ], + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "oslc_rm:satisfies-toSource": [ + { + "@id": "d:MEl-50feddc00029b1a8016e2872e78ecadc", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "oslc_rm:satisfies-toTarget": [ + { + "@id": "d:Req-0Z7916e2872e78ecadc50feddc00918a", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:Ssat-50fbfe8f0029b1a8016ea86245a9d83a-2b9016e2872e78ecadc50feddc0013Ac", + "@type": "oslc_rm:satisfies", + "dcterms:modified": "2020-10-17T10:00:00+01:00", + "dcterms:description": [ + { + "@value": "'FiCo-Application' satisfies 'Response Time'" + } + ], + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "oslc_rm:satisfies-toSource": [ + { + "@id": "d:MEl-50fbfe8f0029b1a8016ea86245a9d83a", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "oslc_rm:satisfies-toTarget": [ + { + "@id": "d:Req-2b9016e2872e78ecadc50feddc0013Ac", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:HierarchyRoot-ACP-Very-Simple-Model-FMC-with-Requirements", + "@type": "pig:HierarchyRoot", + "pig:itemType": { + "@id": "pig:anEntity" + }, + "dcterms:modified": "2026-01-17T22:38:20.041Z", + "dcterms:title": [ + { + "@value": "Hierarchy Root" + } + ], + "dcterms:description": [ + { + "@value": "... anchoring all hierarchies of this graph (package)" + } + ], + "pig:lists": [ + { + "@id": "d:HR-Folder-Introduction", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:HR-Folder-Requirements", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:HR-Folder-SystemModel", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:HR-FolderGlossary-10875487071", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:Folder-Introduction", + "@type": "pig:Outline", + "dcterms:modified": "2025-02-07T08:32:00+01:00", + "dcterms:title": [ + { + "@value": "Introduction" + } + ], + "dcterms:description": [ + { + "@value": "

This is a minimal showcase for a model with model-elements and related requirements. It covers pretty much all characteristics neeeded in such cases (including 'statements on statements'), so that transformations and expressive power of other data formats can be evaluated. The example and its representation in SpecIF format is discussed in Tutorial 6: Very Simple Model (FMC) and Tutorial 9: Very Simple Model (FMC) with Requirements.

" + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:HR-Folder-Introduction", + "@type": "pig:Outline", + "dcterms:modified": "2026-01-17T22:38:19.821Z", + "dcterms:title": [ + { + "@value": "Project 'Very Simple Model (FMC) with Requirements'" + } + ], + "pig:category": [ + { + "@value": "ReqIF:HierarchyRoot", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + }, + "pig:lists": [ + { + "@id": "d:Folder-Introduction", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:Folder-Requirements", + "@type": "pig:Outline", + "dcterms:modified": "2020-03-06T08:32:00+01:00", + "dcterms:title": [ + { + "@value": "Requirements" + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + }, + "pig:lists": [ + { + "@id": "d:Req-1a8016e2872e78ecadc50feddc00029b", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:Req-0Z7916e2872e78ecadc50feddc00918a", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:Req-2b9016e2872e78ecadc50feddc0013Ac", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:HR-Folder-Requirements", + "@type": "pig:Outline", + "dcterms:modified": "2026-01-17T22:38:19.821Z", + "dcterms:title": [ + { + "@value": "Project 'Very Simple Model (FMC) with Requirements'" + } + ], + "pig:category": [ + { + "@value": "ReqIF:HierarchyRoot", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + }, + "pig:lists": [ + { + "@id": "d:Folder-Requirements", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:Folder-SystemModel", + "@type": "pig:Outline", + "dcterms:modified": "2020-03-06T08:32:00+01:00", + "dcterms:title": [ + { + "@value": "System Model" + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + }, + "pig:lists": [ + { + "@id": "d:Diagram-aec0df7900010000017001eaf53e8876", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:HR-Folder-SystemModel", + "@type": "pig:Outline", + "dcterms:modified": "2026-01-17T22:38:19.821Z", + "dcterms:title": [ + { + "@value": "Project 'Very Simple Model (FMC) with Requirements'" + } + ], + "pig:category": [ + { + "@value": "ReqIF:HierarchyRoot", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + }, + "pig:lists": [ + { + "@id": "d:Folder-SystemModel", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:FolderGlossary-10875487071", + "@type": "pig:Outline", + "dcterms:modified": "2026-01-17T22:38:13.953Z", + "dcterms:title": [ + { + "@value": "Model Elements (Glossary)" + } + ], + "pig:category": [ + { + "@value": "SpecIF:Glossary", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + }, + "pig:lists": [ + { + "@id": "d:MEl-50fbfe8f0029b1a8016ea86245a9d83a", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:MEl-50feddc00029b1a8016e2872e78ecadc", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:HR-FolderGlossary-10875487071", + "@type": "pig:Outline", + "dcterms:modified": "2026-01-17T22:38:19.821Z", + "dcterms:title": [ + { + "@value": "Project 'Very Simple Model (FMC) with Requirements'" + } + ], + "pig:category": [ + { + "@value": "ReqIF:HierarchyRoot", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + }, + "pig:lists": [ + { + "@id": "d:FolderGlossary-10875487071", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/tests/data/XML/21/Project 'Very Simple Model (FMC) with Requirements'.pig.xml b/tests/data/XML/21/Project 'Very Simple Model (FMC) with Requirements'.pig.xml index 000da85..2f4d5d5 100644 --- a/tests/data/XML/21/Project 'Very Simple Model (FMC) with Requirements'.pig.xml +++ b/tests/data/XML/21/Project 'Very Simple Model (FMC) with Requirements'.pig.xml @@ -1,5 +1,5 @@ -
- + diff --git a/tests/unit/import-jsonld.spec.ts b/tests/unit/import-package-jsonld.spec.ts similarity index 93% rename from tests/unit/import-jsonld.spec.ts rename to tests/unit/import-package-jsonld.spec.ts index 7189360..d67eceb 100644 --- a/tests/unit/import-jsonld.spec.ts +++ b/tests/unit/import-package-jsonld.spec.ts @@ -6,10 +6,10 @@ import { TPigItem } from '../../src/utils/schemas/pig/ts/pig-metaclasses'; describe('importJSONLD (file system)', () => { // List of relative filenames (relative to this test file). Add more entries as needed. const filenames:string[] = [ - "../data/JSON-LD/05/Project 'Requirement with Enumerated Property'.pig.jsonld", - "../data/JSON-LD/11/Alice.pig.jsonld", + //"../data/JSON-LD/05/Project 'Requirement with Enumerated Property'.pig.jsonld", + //"../data/JSON-LD/11/Alice.pig.jsonld", "../data/JSON-LD/21/Project 'Very Simple Model (FMC) with Requirements'.pig.jsonld", - "../data/JSON-LD/22/Small Autonomous Vehicle.pig.jsonld" + //"../data/JSON-LD/22/Small Autonomous Vehicle.pig.jsonld" // add more test files here, e.g. // "../data/JSON-LD/another-sample.pig.jsonld" ]; @@ -32,7 +32,7 @@ describe('importJSONLD (file system)', () => { // expect(rsp.ok).toBe(true); // expect(rsp.status).toSatisfy((status: number) => [0, 691].includes(status)); ... needs jest-extended // expect(rsp.status).toBeOneOf([0, 691]); ... needs jest-extended - expect([0, 691]).toContain(rsp.status); // some or all items have been processed + expect(rsp.status === 0 || rsp.status === 691).toBe(true); // some or all items have been processed processedCount++; const instances = rsp.response as TPigItem[]; diff --git a/tests/unit/import-package-xml.spec.ts b/tests/unit/import-package-xml.spec.ts new file mode 100644 index 0000000..a8d59ae --- /dev/null +++ b/tests/unit/import-package-xml.spec.ts @@ -0,0 +1,104 @@ +import * as fs from 'fs'; +import * as path from 'path'; +import { importXML } from '../../src/utils/import/xml/import-package-xml'; +import { TPigItem } from '../../src/utils/schemas/pig/ts/pig-metaclasses'; + +describe('importXML (file system)', () => { + // List of relative filenames (relative to this test file). Add more entries as needed. + const filenames: string[] = [ + //"../data/XML/05/Project 'Requirement with Enumerated Property'.pig.xml", + //"../data/XML/11/Alice.pig.xml", + "../data/XML/21/Project 'Very Simple Model (FMC) with Requirements'.pig.xml", + //"../data/XML/22/Small Autonomous Vehicle.pig.xml" + // add more test files here, e.g. + // "../data/XML/another-sample.pig.xml" + ]; + let processedCount = 0; + + // Create a separate Jest test for each filename. + // If a file is missing we use test.skip so CI/test run remains stable. + filenames.forEach((filenameRel) => { + // console.debug('filenameRel', filenameRel); + const testFile = path.resolve(__dirname, filenameRel); + const testName = path.basename(testFile); + const runner = fs.existsSync(testFile) ? test : test.skip; + // console.debug('testFile', testFile, testName, runner); + + runner(`imports ${testName} and instantiates PIG classes`, async () => { + // import and test + const rsp = await importXML(testFile); + if (!rsp.ok) + console.warn('importXML', rsp.status, rsp.statusText); + // expect(rsp.ok).toBe(true); + // expect(rsp.status).toSatisfy((status: number) => [0, 691].includes(status)); ... needs jest-extended + // expect(rsp.status).toBeOneOf([0, 691]); ... needs jest-extended + expect(rsp.status === 0 || rsp.status === 691).toBe(true); // some or all items have been processed + processedCount++; + + const instances = rsp.response as TPigItem[]; + // console.debug('instances', instances); + + // basic expectations + expect(Array.isArray(instances)).toBe(true); + expect(instances.length).toBeGreaterThan(0); + + // console.debug(`import-xml: `,instances); + instances.forEach((itm, index) => { + // console.info(`Instance ${index}:`, itm.status().statusText ?? itm.status().status); + // console.debug(JSON.stringify(itm.get(), null, 2)); + expect(itm.status().ok).toBe(true); + // each instantiated item must have a successful status + // additional per-item assertions can be added here + // expect(itm).toBeInstanceOf(Property); + // expect(inst.id).toBe('dcterms:type'); + // expect(inst.title).toEqual({ value: 'The type or category', lang: 'en' }); + // expect(inst.datatype).toBe('xs:string'); + }); + }); + }); + test('Check the number of files processed', () => { + // Ensure that all files were processed: + expect(processedCount).toBe(filenames.length); + }); + + /* test('reads XML from multiple files and instantiates PIG classes', async () => { + let processedCount = 0; + + for (const filenameRel of filenames) { + const testFile = path.resolve(__dirname, filenameRel); + if (!fs.existsSync(testFile)) { + // Skip missing test files but warn so missing data is visible in CI logs + // eslint-disable-next-line no-console + console.warn(`import-xml test: file not found, skipping: ${testFile}`); + continue; + } + // console.debug('testFile', testFile); + + // import and test + // awaits the importer for each file in sequence + const rsp = await importXML(testFile); + const instances = rsp.response as TPigItem[]; + console.debug('instances', instances); + + // basic expectations + expect(Array.isArray(instances)).toBe(true); + expect(instances.length).toBeGreaterThan(0); + + instances.forEach((itm, index) => { + // each instantiated item must have a successful status + expect(itm.status().ok).toBe(true); + // further per-item assertions can be added here + // expect(itm).toBeInstanceOf(Property); + // expect(inst.id).toBe('dcterms:type'); + // expect(inst.title).toEqual({ value: 'The type or category', lang: 'en' }); + // expect(inst.datatype).toBe('xs:string'); + console.debug(`Instance ${index}:`, itm); + }); + + processedCount++; + } + + // Ensure that all files were processed: + expect(processedCount).toBe(filenames.length); + }); */ +}); diff --git a/tests/unit/pig-metaclasses-jsonld.spec.ts b/tests/unit/pig-metaclasses-jsonld.spec.ts new file mode 100644 index 0000000..0ff6d3a --- /dev/null +++ b/tests/unit/pig-metaclasses-jsonld.spec.ts @@ -0,0 +1,670 @@ +/*! + * Unit tests for PIG metaclasses JSON-LD methods + * Copyright 2025 GfSE (https://gfse.org) + * License and terms of use: Apache 2.0 (http://www.apache.org/licenses/LICENSE-2.0) + */ + +import { + Property, + Link, + Entity, + Relationship, + AnEntity, + ARelationship +} from '../../src/utils/schemas/pig/ts/pig-metaclasses'; + +describe('PIG Metaclasses JSON-LD Import', () => { + describe('Property.setJSONLD()', () => { + it('should import dcterms:title property', () => { + const jsonldInput = { + '@id': 'dcterms:title', + 'dcterms:title': [ + { '@value': 'Title', '@language': 'en' }, + { '@value': 'Titel', '@language': 'de' }, + { '@value': 'Titre', '@language': 'fr' } + ], + 'dcterms:description': [ + { + '@value': '

A name given to the resource. (source: DCMI)

Title (reference: Dublin Core) of the resource represented as rich text in XHTML content. SHOULD include only content that is valid inside an XHTML \'span\' element. (source: OSLC)

', + '@language': 'en' + } + ], + '@type': 'owl:DatatypeProperty', + 'pig:itemType': { '@id': 'pig:Property' }, + 'sh:datatype': { '@id': 'xs:string' }, + 'sh:maxCount': 1, + 'sh:maxLength': 256 + }; + + const prop = new Property().setJSONLD(jsonldInput); + + // check the attribute values upon creation: + if (!prop.status().ok) + console.error('status:', prop.status()); + expect(prop.status().ok).toBe(true); + }); + + it('should import dcterms:description property', () => { + const jsonldInput = { + '@id': 'dcterms:description', + 'dcterms:title': [ + { '@value': 'Description', '@language': 'en' }, + { '@value': 'Beschreibung', '@language': 'de' }, + { '@value': 'Description', '@language': 'fr' } + ], + 'dcterms:description': [ + { + '@value': '

An account of the resource. (source: DCMI)

Descriptive text (reference: Dublin Core) about resource represented as rich text in XHTML content. SHOULD include only content that is valid and suitable inside an XHTML \'div\' element. (source: OSLC)

', + '@language': 'en' + } + ], + '@type': 'owl:DatatypeProperty', + 'pig:itemType': { '@id': 'pig:Property' }, + 'sh:datatype': { '@id': 'xs:string' }, + 'sh:maxCount': 1 + }; + + const prop = new Property().setJSONLD(jsonldInput); + + // check the attribute values upon creation: + if (!prop.status().ok) + console.error('status:', prop.status()); + expect(prop.status().ok).toBe(true); + }); + + it('should import SpecIF:Priority property with eligibleValues', () => { + const jsonldInput = { + '@id': 'SpecIF:Priority', + 'dcterms:title': [ + { '@value': 'Priority', '@language': 'en' }, + { '@value': 'Priorität', '@language': 'de' }, + { '@value': 'Priorité', '@language': 'fr' } + ], + 'dcterms:description': [ + { '@value': "Enumerated values for the 'Priority' of the resource.", '@language': 'en' } + ], + '@type': 'owl:ObjectProperty', + 'pig:itemType': { '@id': 'pig:Property' }, + 'sh:datatype': { '@id': 'xs:string' }, + 'pig:eligibleValue': [ + { + '@id': 'SpecIF:priorityHigh', + 'dcterms:title': [ + { '@value': 'high', '@language': 'en' }, + { '@value': 'hoch', '@language': 'de' }, + { '@value': 'haut', '@language': 'fr' } + ] + }, + { + '@id': 'SpecIF:priorityMedium', + 'dcterms:title': [ + { '@value': 'medium', '@language': 'en' }, + { '@value': 'mittel', '@language': 'de' }, + { '@value': 'moyen', '@language': 'fr' } + ] + }, + { + '@id': 'SpecIF:priorityLow', + 'dcterms:title': [ + { '@value': 'low', '@language': 'en' }, + { '@value': 'niedrig', '@language': 'de' }, + { '@value': 'bas', '@language': 'fr' } + ] + } + ] + }; + + const prop = new Property().setJSONLD(jsonldInput); + + // check the attribute values upon creation: + if (!prop.status().ok) + console.error('status:', prop.status()); + expect(prop.status().ok).toBe(true); + + // Get the property data + const propData = prop.get(); + + // Verify eligibleValue structure exists + expect(propData?.eligibleValue).toBeDefined(); + expect(Array.isArray(propData?.eligibleValue)).toBe(true); + expect(propData?.eligibleValue?.length).toBe(3); + + // Find SpecIF:priorityHigh + const priorityHigh = propData?.eligibleValue?.find((ev: any) => ev.id === 'SpecIF:priorityHigh'); + expect(priorityHigh).toBeDefined(); + + // Verify title structure + expect(priorityHigh?.title).toBeDefined(); + expect(Array.isArray(priorityHigh?.title)).toBe(true); + + // Find German title + const germanTitle = priorityHigh?.title?.find((t: any) => t.lang === 'de'); + expect(germanTitle).toBeDefined(); + expect(germanTitle?.value).toBe('hoch'); + }); + + it('should import pig:icon property', () => { + const jsonldInput = { + '@id': 'pig:icon', + 'pig:specializes': { '@id': 'pig:Property' }, + 'pig:itemType': { '@id': 'pig:Property' }, + 'dcterms:title': [ + { '@value': 'has icon' } + ], + 'dcterms:description': [ + { '@value': 'Specifies an icon for a model element (entity or relationship).' } + ], + 'sh:datatype': { '@id': 'xs:string' }, + 'sh:minCount': 0, + 'sh:maxCount': 1 + }; + + const prop = new Property().setJSONLD(jsonldInput); + + // check the attribute values upon creation: + if (!prop.status().ok) + console.error('status:', prop.status()); + expect(prop.status().ok).toBe(true); + }); + + it('should import SpecIF:Diagram property', () => { + const jsonldInput = { + '@id': 'SpecIF:Diagram', + 'dcterms:title': [ + { '@value': 'Diagram', '@language': 'en' }, + { '@value': 'Diagramm', '@language': 'de' }, + { '@value': 'Diagramme', '@language': 'fr' } + ], + 'dcterms:description': [ + { '@value': 'A diagram illustrating the resource or a link to a diagram.', '@language': 'en' } + ], + '@type': 'owl:DatatypeProperty', + 'pig:itemType': { '@id': 'pig:Property' }, + 'sh:datatype': { '@id': 'xs:string' } + }; + + const prop = new Property().setJSONLD(jsonldInput); + + // check the attribute values upon creation: + if (!prop.status().ok) + console.error('status:', prop.status()); + expect(prop.status().ok).toBe(true); + }); + }); + + describe('Link.setJSONLD()', () => { + it('should import pig:Link', () => { + const jsonldInput = { + '@id': 'pig:Link', + '@type': 'owl:ObjectProperty', + 'pig:itemType': { '@id': 'pig:Link' }, + 'pig:eligibleEndpoint': [ + { '@id': 'pig:Entity' }, + { '@id': 'pig:Relationship' } + ], + 'dcterms:title': [ + { '@value': 'linked with' } + ], + 'dcterms:description': [ + { '@value': 'Connects a reified relationship with its source or target. Also connects an organizer to a model element' } + ] + }; + + const link = new Link().setJSONLD(jsonldInput); + + // check the attribute values upon creation: + if (!link.status().ok) + console.error('status:', link.status()); + expect(link.status().ok).toBe(true); + }); + + it('should import pig:SourceLink', () => { + const jsonldInput = { + '@id': 'pig:SourceLink', + 'pig:specializes': { '@id': 'pig:Link' }, + 'pig:itemType': { '@id': 'pig:Link' }, + 'pig:eligibleEndpoint': [ + { '@id': 'pig:Entity' }, + { '@id': 'pig:Relationship' } + ], + 'dcterms:title': [ + { '@value': 'to source' } + ], + 'dcterms:description': [ + { '@value': 'Connects the source of a reified relationship.' } + ] + }; + + const link = new Link().setJSONLD(jsonldInput); + + // check the attribute values upon creation: + if (!link.status().ok) + console.error('status:', link.status()); + expect(link.status().ok).toBe(true); + }); + + it('should import SpecIF:writes-toSource', () => { + const jsonldInput = { + '@id': 'SpecIF:writes-toSource', + 'pig:itemType': { '@id': 'pig:Link' }, + 'pig:specializes': { '@id': 'pig:SourceLink' }, + 'dcterms:title': [ + { '@value': 'SpecIF:writes to source' } + ], + 'dcterms:description': [ + { '@value': 'Connects the source of SpecIF:writes' } + ], + 'pig:eligibleEndpoint': [ + { '@id': 'FMC:Actor' } + ] + }; + + const link = new Link().setJSONLD(jsonldInput); + + // check the attribute values upon creation: + if (!link.status().ok) + console.error('status:', link.status()); + expect(link.status().ok).toBe(true); + }); + + it('should import pig:lists', () => { + const jsonldInput = { + '@id': 'pig:lists', + 'pig:specializes': { '@id': 'pig:TargetLink' }, + 'pig:itemType': { '@id': 'pig:Link' }, + 'pig:eligibleEndpoint': [ + { '@id': 'pig:Entity' }, + { '@id': 'pig:Relationship' }, + { '@id': 'pig:Organizer' } + ], + 'dcterms:title': [ + { '@value': 'lists' } + ], + 'dcterms:description': [ + { '@value': 'Lists an entity, a relationship or a subordinated organizer.' } + ] + }; + + const link = new Link().setJSONLD(jsonldInput); + + // check the attribute values upon creation: + if (!link.status().ok) + console.error('status:', link.status()); + expect(link.status().ok).toBe(true); + }); + }); + + describe('Entity.setJSONLD()', () => { + it('should import pig:Entity', () => { + const jsonldInput = { + '@id': 'pig:Entity', + '@type': 'owl:Class', + 'pig:itemType': { '@id': 'pig:Entity' }, + 'dcterms:title': [ + { '@value': 'Entity' } + ], + 'dcterms:description': [ + { '@value': 'A PIG meta-model element used for entities (aka resources or artifacts).' } + ], + 'pig:eligibleProperty': [ + { '@id': 'pig:category' }, + { '@id': 'pig:icon' } + ] + }; + + const entity = new Entity().setJSONLD(jsonldInput); + + // check the attribute values upon creation: + if (!entity.status().ok) + console.error('status:', entity.status()); + expect(entity.status().ok).toBe(true); + }); + + it('should import pig:HierarchyRoot', () => { + const jsonldInput = { + '@id': 'pig:HierarchyRoot', + 'pig:specializes': { '@id': 'pig:Organizer' }, + 'pig:itemType': { '@id': 'pig:Entity' }, + 'dcterms:title': [ + { '@value': 'Hierarchy Root' } + ], + 'dcterms:description': [ + { '@value': 'A subclass of PIG organizer serving as a root for hierarchically organized graph elements.' } + ], + 'pig:eligibleProperty': [], + 'pig:eligibleTargetLink': [ + { '@id': 'pig:lists' } + ] + }; + + const entity = new Entity().setJSONLD(jsonldInput); + + // check the attribute values upon creation: + if (!entity.status().ok) + console.error('status:', entity.status()); + expect(entity.status().ok).toBe(true); + }); + + it('should import FMC:Actor', () => { + const jsonldInput = { + '@id': 'FMC:Actor', + 'dcterms:title': [ + { '@value': 'Actor', '@language': 'en' }, + { '@value': 'Akteur', '@language': 'de' }, + { '@value': 'Acteur', '@language': 'fr' } + ], + 'dcterms:description': [ + { + '@value': "

An 'Actor' is a fundamental model element type representing an active entity, be it an activity, a process step, a function, a system component or a role.

The particular use or original type is specified with a [[dcterms:type]] property of the 'FMC:Actor'. A value of that property should be an ontology-term, such as [[bpmn:processStep]].

", + '@language': 'en' + }, + { + '@value': "

Ein 'Akteur' ist ein fundamentaler Modellelementtyp, der eine aktive Entität darstellt, sei es eine Aktivität, ein Prozessschritt, eine Funktion, eine Systemkomponente oder eine Rolle.

Die spezielle Verwendung oder der ursprüngliche Typ wird mit einer [[dcterms:type]] Eigenschaft von 'FMC:Actor' spezifiziert. Die Werte dieser Eigenschaft können Ontologiebegriffe sein, wie z.B. [[bpmn:timer]].

", + '@language': 'de' + }, + { + '@value': "

Un 'Acteur' est un type d'élément de modèle fondamental représentant une entité active, qu'il s'agisse d'une activité, d'une étape de processus, d'une fonction, d'un composant de système ou d'un rôle.

L'utilisation particulière ou le type original est spécifié avec une propriété [[dcterms:type]] de 'FMC:Actor'. Les valeurs de cette propriété peuvent être des termes d'ontologie, tels que [[bpmn:timer]].

", + '@language': 'fr' + } + ], + 'pig:specializes': { '@id': 'pig:Entity' }, + 'pig:icon': { '@value': '□' }, + 'pig:eligibleProperty': [ + { '@id': 'pig:category' } + ], + 'pig:eligibleTargetLink': [], + 'pig:itemType': { '@id': 'pig:Entity' } + }; + + const entity = new Entity().setJSONLD(jsonldInput); + + // check the attribute values upon creation: + if (!entity.status().ok) + console.error('status:', entity.status()); + expect(entity.status().ok).toBe(true); + }); + + it('should import IREB:Requirement', () => { + const jsonldInput = { + '@id': 'IREB:Requirement', + 'dcterms:title': [ + { '@value': 'Requirement', '@language': 'en' }, + { '@value': 'Anforderung', '@language': 'de' }, + { '@value': 'Exigence', '@language': 'fr' } + ], + 'dcterms:description': [ + { + '@value': "

A 'Requirement' is a singular documented physical and functional need that a particular design, product or process must be able to perform. (source: Wikipedia)

Definition:

  1. A condition or capability needed by a user to solve a problem or achieve an objective.
  2. A condition or capability that must be met or possessed by a system or system component to satisfy a contract, standard, specification, or other formally imposed documents.
  3. A documented representation of a condition or capability as in (1) or (2).

Note: The definition above is the classic one from IEEE Std 610.12 of 1990. Alternatively, we also give a more modern definition:

  1. A need perceived by a stakeholder.
  2. A capability or property that a system shall have.
  3. A documented representation of a need, capability or property.
", + '@language': 'en' + } + ], + 'pig:specializes': { '@id': 'pig:Entity' }, + 'pig:icon': { '@value': '↯' }, + 'pig:eligibleProperty': [ + { '@id': 'SpecIF:Priority' } + ], + 'pig:eligibleTargetLink': [], + 'pig:itemType': { '@id': 'pig:Entity' } + }; + + const entity = new Entity().setJSONLD(jsonldInput); + + // check the attribute values upon creation: + if (!entity.status().ok) + console.error('status:', entity.status()); + expect(entity.status().ok).toBe(true); + }); + }); + + describe('Relationship.setJSONLD()', () => { + it('should import pig:Relationship', () => { + const jsonldInput = { + '@id': 'pig:Relationship', + '@type': 'owl:Class', + 'pig:itemType': { '@id': 'pig:Relationship' }, + 'dcterms:title': [ + { '@value': 'Relationship' } + ], + 'dcterms:description': [ + { '@value': 'A PIG meta-model element used for reified relationships (aka predicates).' } + ], + 'pig:eligibleProperty': [ + { '@id': 'pig:category' }, + { '@id': 'pig:icon' } + ], + 'pig:eligibleSourceLink': { '@id': 'pig:SourceLink' }, + 'pig:eligibleTargetLink': { '@id': 'pig:TargetLink' } + }; + + const rel = new Relationship().setJSONLD(jsonldInput); + + // check the attribute values upon creation: + if (!rel.status().ok) + console.error('status:', rel.status()); + expect(rel.status().ok).toBe(true); + }); + + it('should import SpecIF:writes', () => { + const jsonldInput = { + '@id': 'SpecIF:writes', + 'dcterms:title': [ + { '@value': 'writes', '@language': 'en' }, + { '@value': 'schreibt', '@language': 'de' }, + { '@value': 'écrit', '@language': 'fr' } + ], + 'dcterms:description': [ + { '@value': "A [[FMC:Actor]] 'writes' (changes) a [[FMC:State]].", '@language': 'en' } + ], + 'pig:specializes': { '@id': 'pig:Relationship' }, + 'pig:eligibleProperty': [], + 'pig:itemType': { '@id': 'pig:Relationship' }, + 'pig:eligibleSourceLink': { '@id': 'SpecIF:writes-toSource' }, + 'pig:eligibleTargetLink': { '@id': 'SpecIF:writes-toTarget' } + }; + + const rel = new Relationship().setJSONLD(jsonldInput); + + // check the attribute values upon creation: + if (!rel.status().ok) + console.error('status:', rel.status()); + expect(rel.status().ok).toBe(true); + }); + + it('should import oslc_rm:satisfies', () => { + const jsonldInput = { + '@id': 'oslc_rm:satisfies', + 'dcterms:title': [ + { '@value': 'satisfies', '@language': 'en' }, + { '@value': 'erfüllt', '@language': 'de' }, + { '@value': 'satisfait', '@language': 'fr' } + ], + 'dcterms:description': [ + { + '@value': "

The object is satisfied by the subject. (source: OSLC)

SpecIF suggests that the subject is confined to a model element, e.g, a [[FMC:Actor]] or [[FMC:State]], and the object is confined to a [[IREB:Requirement]]. More concretely, an example for this type of statement is 'Component-X satisfies 'Requirement-4711'.

", + '@language': 'en' + } + ], + 'pig:specializes': { '@id': 'pig:Relationship' }, + 'pig:eligibleProperty': [], + 'pig:itemType': { '@id': 'pig:Relationship' }, + 'pig:eligibleSourceLink': { '@id': 'oslc_rm:satisfies-toSource' }, + 'pig:eligibleTargetLink': { '@id': 'oslc_rm:satisfies-toTarget' } + }; + + const rel = new Relationship().setJSONLD(jsonldInput); + + // check the attribute values upon creation: + if (!rel.status().ok) + console.error('status:', rel.status()); + expect(rel.status().ok).toBe(true); + }); + }); + + describe('AnEntity.setJSONLD()', () => { + it('should import requirement entity with property', () => { + const jsonldInput = { + '@id': 'd:Req-1a8016e2872e78ecadc50feddc00029b', + '@type': 'IREB:Requirement', + 'dcterms:modified': '2020-10-17T10:00:00+01:00', + 'dcterms:title': [ + { '@value': 'Data Volume' } + ], + 'dcterms:description': [ + { '@value': '

The data store MUST support a total volume up to 850 GB.

' } + ], + 'SpecIF:Priority': [ + { + '@id': 'SpecIF:priorityHigh', + 'pig:itemType': { '@id': 'pig:aProperty' } + } + ], + 'pig:itemType': { '@id': 'pig:anEntity' } + }; + + const anEntity = new AnEntity().setJSONLD(jsonldInput); + + // check the attribute values upon creation: + if (!anEntity.status().ok) + console.error('status:', anEntity.status()); + expect(anEntity.status().ok).toBe(true); + }); + + it('should import diagram entity with properties and links', () => { + const jsonldInput = { + '@id': 'd:Diagram-aec0df7900010000017001eaf53e8876', + '@type': 'pig:View', + 'dcterms:modified': '2020-03-06T08:32:00+01:00', + 'dcterms:title': [ + { '@value': 'IT-Integration: FiCo-Application and FiCo-Data' } + ], + 'SpecIF:Diagram': [ + { + '@value': '

Model Diagram:

Notation: FMC Block Diagram

', + 'pig:itemType': { '@id': 'pig:aProperty' } + } + ], + 'pig:category': [ + { + '@value': 'FMC Block Diagram', + 'pig:itemType': { '@id': 'pig:aProperty' } + } + ], + 'pig:itemType': { '@id': 'pig:anEntity' }, + 'pig:shows': [ + { + '@id': 'd:MEl-50fbfe8f0029b1a8016ea86245a9d83a', + 'pig:itemType': { '@id': 'pig:aTargetLink' } + }, + { + '@id': 'd:MEl-50feddc00029b1a8016e2872e78ecadc', + 'pig:itemType': { '@id': 'pig:aTargetLink' } + }, + { + '@id': 'd:SWri-50fbfe8f0029b1a8016ea86245a9d83a-50feddc00029b1a8016e2872e78ecadc', + 'pig:itemType': { '@id': 'pig:aTargetLink' } + }, + { + '@id': 'd:SRea-50fbfe8f0029b1a8016ea86245a9d83a-50feddc00029b1a8016e2872e78ecadc', + 'pig:itemType': { '@id': 'pig:aTargetLink' } + } + ] + }; + + const anEntity = new AnEntity().setJSONLD(jsonldInput); + + // check the attribute values upon creation: + if (!anEntity.status().ok) + console.error('status:', anEntity.status()); + expect(anEntity.status().ok).toBe(true); + + expect(anEntity.hasProperty?.length).toBe(2); + expect(anEntity.hasProperty[1].hasClass).toBe('pig:category'); + }); + + it('should import FMC:Actor entity', () => { + const jsonldInput = { + '@id': 'd:MEl-50fbfe8f0029b1a8016ea86245a9d83a', + '@type': 'FMC:Actor', + 'dcterms:modified': '2020-03-06T09:04:00+01:00', + 'dcterms:title': [ + { '@value': 'FiCo-Application' } + ], + 'dcterms:description': [ + { '@value': '

IT-Application for Finance and Controlling.

' } + ], + 'pig:itemType': { '@id': 'pig:anEntity' } + }; + + const anEntity = new AnEntity().setJSONLD(jsonldInput); + + // check the attribute values upon creation: + if (!anEntity.status().ok) + console.error('status:', anEntity.status()); + expect(anEntity.status().ok).toBe(true); + }); + }); + + describe('ARelationship.setJSONLD()', () => { + it('should import SpecIF:writes relationship', () => { + const jsonldInput = { + '@id': 'd:SWri-50fbfe8f0029b1a8016ea86245a9d83a-50feddc00029b1a8016e2872e78ecadc', + '@type': 'SpecIF:writes', + 'dcterms:modified': '2020-03-06T09:05:00+01:00', + 'dcterms:description': [ + { '@value': "'FiCo-Application' writes 'FiCo-Data'" } + ], + 'pig:itemType': { '@id': 'pig:aRelationship' }, + 'SpecIF:writes-toSource': [ + { + '@id': 'd:MEl-50fbfe8f0029b1a8016ea86245a9d83a', + 'pig:itemType': { '@id': 'pig:aSourceLink' } + } + ], + 'SpecIF:writes-toTarget': [ + { + '@id': 'd:MEl-50feddc00029b1a8016e2872e78ecadc', + 'pig:itemType': { '@id': 'pig:aTargetLink' } + } + ] + }; + + const aRel = new ARelationship().setJSONLD(jsonldInput); + + // check the attribute values upon creation: + if (!aRel.status().ok) + console.error('status:', aRel.status()); + expect(aRel.status().ok).toBe(true); + }); + + it('should import oslc_rm:satisfies relationship', () => { + const jsonldInput = { + '@id': 'd:Ssat-50feddc00029b1a8016e2872e78ecadc-1a8016e2872e78ecadc50feddc00029b', + '@type': 'oslc_rm:satisfies', + 'dcterms:modified': '2020-10-17T10:00:00+01:00', + 'dcterms:description': [ + { '@value': "'FiCo-Data' satisfies 'Data Volume'" } + ], + 'pig:itemType': { '@id': 'pig:aRelationship' }, + 'oslc_rm:satisfies-toSource': [ + { + '@id': 'd:MEl-50feddc00029b1a8016e2872e78ecadc', + 'pig:itemType': { '@id': 'pig:aSourceLink' } + } + ], + 'oslc_rm:satisfies-toTarget': [ + { + '@id': 'd:Req-1a8016e2872e78ecadc50feddc00029b', + 'pig:itemType': { '@id': 'pig:aTargetLink' } + } + ] + }; + + const aRel = new ARelationship().setJSONLD(jsonldInput); + + // check the attribute values upon creation: + if (!aRel.status().ok) + console.error('status:', aRel.status()); + expect(aRel.status().ok).toBe(true); + }); + }); +}); diff --git a/tests/unit/pig-metaclasses-xml.spec.ts b/tests/unit/pig-metaclasses-xml.spec.ts new file mode 100644 index 0000000..cb1c865 --- /dev/null +++ b/tests/unit/pig-metaclasses-xml.spec.ts @@ -0,0 +1,500 @@ +/*! + * Unit tests for PIG metaclasses XML methods + * Copyright 2025 GfSE (https://gfse.org) + * License and terms of use: Apache 2.0 (http://www.apache.org/licenses/LICENSE-2.0) + */ + +import { + Property, + Link, + Entity, + Relationship, + AnEntity, + ARelationship +} from '../../src/utils/schemas/pig/ts/pig-metaclasses'; + +describe('PIG Metaclasses XML Import', () => { + describe('Property.setXML()', () => { + it('should import dcterms:title property', () => { + const xmlInput = ` + + Title + Titel + Titre + +

A name given to the resource. (source: DCMI)

+
+ + + + 1 + + +
+ `; + + const prop = new Property().setXML(xmlInput); + + // check the attribute values upon creation: + if (!prop.status().ok) + console.error('status:', prop.status()); + expect(prop.status().ok).toBe(true); + }); + + it('should import dcterms:description property', () => { + const xmlInput = ` + + Description + Beschreibung + Description + + + 1 + + + + `; + + const prop = new Property().setXML(xmlInput); + + // check the attribute values upon creation: + if (!prop.status().ok) + console.error('status:', prop.status()); + expect(prop.status().ok).toBe(true); + }); + + it('should import SpecIF:Priority property with eligibleValues', () => { + const xmlInput = ` + + Priority + Priorität + Priorité + Enumerated values for the 'Priority' of the resource. + + + + + high + hoch + haut + + + medium + mittel + moyen + + + low + niedrig + bas + + + `; + + const prop = new Property().setXML(xmlInput); + + // check the attribute values upon creation: + if (!prop.status().ok) + console.error('status:', prop.status()); + expect(prop.status().ok).toBe(true); + + // Get the property data + const propData = prop.get(); + + // Verify eligibleValue structure exists + expect(propData?.eligibleValue).toBeDefined(); + expect(Array.isArray(propData?.eligibleValue)).toBe(true); + expect(propData?.eligibleValue?.length).toBe(3); + + // Find SpecIF:priorityHigh + const priorityHigh = propData?.eligibleValue?.find((ev:any) => ev.id === 'SpecIF:priorityHigh'); + expect(priorityHigh).toBeDefined(); + + // Verify title structure + expect(priorityHigh?.title).toBeDefined(); + expect(Array.isArray(priorityHigh?.title)).toBe(true); + + // Find German title + const germanTitle = priorityHigh?.title?.find((t:any) => t.lang === 'de'); + expect(germanTitle).toBeDefined(); + expect(germanTitle?.value).toBe('hoch'); + }); + + it('should import pig:icon property', () => { + const xmlInput = ` + + pig:Property + has icon + Specifies an icon for a model element (entity or relationship). + + + 0 + 1 + + + + `; + + const prop = new Property().setXML(xmlInput); + + // check the attribute values upon creation: + if (!prop.status().ok) + console.error('status:', prop.status()); + expect(prop.status().ok).toBe(true); + }); + }); + + describe('Link.setXML()', () => { + it('should import pig:Link', () => { + const xmlInput = ` + + pig:Entity + pig:Relationship + linked with + Connects a reified relationship with its source or target. Also connects an organizer to a model element + + `; + + const link = new Link().setXML(xmlInput); + + // check the attribute values upon creation: + if (!link.status().ok) + console.error('status:', link.status()); + expect(link.status().ok).toBe(true); + }); + + it('should import pig:SourceLink', () => { + const xmlInput = ` + + pig:Link + pig:Entity + pig:Relationship + to source + Connects the source of a reified relationship. + + `; + + const link = new Link().setXML(xmlInput); + + // check the attribute values upon creation: + if (!link.status().ok) + console.error('status:', link.status()); + expect(link.status().ok).toBe(true); + }); + + it('should import SpecIF:writes-toSource', () => { + const xmlInput = ` + + pig:SourceLink + SpecIF:writes to source + Connects the source of SpecIF:writes + FMC:Actor + + `; + + const link = new Link().setXML(xmlInput); + + // check the attribute values upon creation: + if (!link.status().ok) + console.error('status:', link.status()); + expect(link.status().ok).toBe(true); + }); + + it('should import pig:lists', () => { + const xmlInput = ` + + pig:TargetLink + pig:Entity + pig:Relationship + pig:Organizer + lists + Lists an entity, a relationship or a subordinated organizer. + + `; + + const link = new Link().setXML(xmlInput); + + // check the attribute values upon creation: + if (!link.status().ok) + console.error('status:', link.status()); + expect(link.status().ok).toBe(true); + }); + }); + + describe('Entity.setXML()', () => { + it('should import pig:Entity', () => { + const xmlInput = ` + + Entity + A PIG meta-model element used for entities (aka resources or artifacts). + pig:category + pig:icon + + `; + + const entity = new Entity().setXML(xmlInput); + + // check the attribute values upon creation: + if (!entity.status().ok) + console.error('status:', entity.status()); + expect(entity.status().ok).toBe(true); + }); + + it('should import pig:HierarchyRoot', () => { + const xmlInput = ` + + pig:Organizer + Hierarchy Root + A subclass of PIG organizer serving as a root for hierarchically organized graph elements. + pig:lists + + `; + + const entity = new Entity().setXML(xmlInput); + + // check the attribute values upon creation: + if (!entity.status().ok) + console.error('status:', entity.status()); + expect(entity.status().ok).toBe(true); + }); + + it('should import FMC:Actor', () => { + const xmlInput = ` + + Actor + Akteur + Acteur + +

An 'Actor' is a fundamental model element type representing an active entity, be it an activity, a process step, a function, a system component or a role.

+
+ pig:Entity + + pig:category +
+ `; + + const entity = new Entity().setXML(xmlInput); + + // check the attribute values upon creation: + if (!entity.status().ok) + console.error('status:', entity.status()); + expect(entity.status().ok).toBe(true); + }); + + it('should import IREB:Requirement', () => { + const xmlInput = ` + + Requirement + Anforderung + Exigence + +

A 'Requirement' is a singular documented physical and functional need that a particular design, product or process must be able to perform.

+
+ pig:Entity + + SpecIF:Priority +
+ `; + + const entity = new Entity().setXML(xmlInput); + + // check the attribute values upon creation: + if (!entity.status().ok) + console.error('status:', entity.status()); + expect(entity.status().ok).toBe(true); + }); + }); + + describe('Relationship.setXML()', () => { + it('should import pig:Relationship', () => { + const xmlInput = ` + + Relationship + A PIG meta-model element used for reified relationships (aka predicates). + pig:category + pig:icon + pig:SourceLink + pig:TargetLink + + `; + + const rel = new Relationship().setXML(xmlInput); + + // check the attribute values upon creation: + if (!rel.status().ok) + console.error('status:', rel.status()); + expect(rel.status().ok).toBe(true); + }); + + it('should import SpecIF:writes', () => { + const xmlInput = ` + + writes + schreibt + écrit + A [[FMC:Actor]] 'writes' (changes) a [[FMC:State]]. + pig:Relationship + SpecIF:writes-toSource + SpecIF:writes-toTarget + + `; + + const rel = new Relationship().setXML(xmlInput); + + // check the attribute values upon creation: + if (!rel.status().ok) + console.error('status:', rel.status()); + expect(rel.status().ok).toBe(true); + }); + + it('should import oslc_rm:satisfies', () => { + const xmlInput = ` + + satisfies + erfüllt + satisfait + +

The object is satisfied by the subject.

+
+ pig:Relationship + oslc_rm:satisfies-toSource + oslc_rm:satisfies-toTarget +
+ `; + + const rel = new Relationship().setXML(xmlInput); + + // check the attribute values upon creation: + if (!rel.status().ok) + console.error('status:', rel.status()); + expect(rel.status().ok).toBe(true); + }); + }); + + describe('AnEntity.setXML()', () => { + it('should import requirement entity with property', () => { + const xmlInput = ` + + 2020-10-17T10:00:00+01:00 + Data Volume + +

The data store MUST support a total volume up to 850 GB.

+
+ + SpecIF:priorityHigh + +
+ `; + + const anEntity = new AnEntity().setXML(xmlInput); + + // check the attribute values upon creation: + if (!anEntity.status().ok) + console.error('status:', anEntity.status()); + expect(anEntity.status().ok).toBe(true); + }); + + it('should import diagram entity with properties and links', () => { + const xmlInput = ` + + 2020-03-06T08:32:00+01:00 + IT-Integration: FiCo-Application and FiCo-Data + + +

Model Diagram:

+

+ Notation: FMC Block Diagram +

+
+
+ + FMC Block Diagram + + + d:MEl-50fbfe8f0029b1a8016ea86245a9d83a + + + d:MEl-50feddc00029b1a8016e2872e78ecadc + +
+ `; + + const anEntity = new AnEntity().setXML(xmlInput); + console.debug('anEntity', JSON.stringify(anEntity,null,2)); + + // check the attribute values upon creation: + if (!anEntity.status().ok) + console.error('status:', anEntity.status()); + expect(anEntity.status().ok).toBe(true); + + expect(anEntity.hasProperty?.length).toBe(2); + expect(anEntity.hasProperty[1].hasClass).toBe('pig:category'); + + }); + + it('should import FMC:Actor entity', () => { + const xmlInput = ` + + 2020-03-06T09:04:00+01:00 + FiCo-Application + +

IT-Application for Finance and Controlling.

+
+
+ `; + + const anEntity = new AnEntity().setXML(xmlInput); + + // check the attribute values upon creation: + if (!anEntity.status().ok) + console.error('status:', anEntity.status()); + expect(anEntity.status().ok).toBe(true); + }); + }); + + describe('ARelationship.setXML()', () => { + it('should import SpecIF:writes relationship', () => { + const xmlInput = ` + + 2020-03-06T09:05:00+01:00 + 'FiCo-Application' writes 'FiCo-Data' + + d:MEl-50fbfe8f0029b1a8016ea86245a9d83a + + + d:MEl-50feddc00029b1a8016e2872e78ecadc + + + `; + + const aRel = new ARelationship().setXML(xmlInput); + + // check the attribute values upon creation: + if (!aRel.status().ok) + console.error('status:', aRel.status()); + expect(aRel.status().ok).toBe(true); + }); + + it('should import oslc_rm:satisfies relationship', () => { + const xmlInput = ` + + 2020-10-17T10:00:00+01:00 + 'FiCo-Data' satisfies 'Data Volume' + + d:MEl-50feddc00029b1a8016e2872e78ecadc + + + d:Req-1a8016e2872e78ecadc50feddc00029b + + + `; + + const aRel = new ARelationship().setXML(xmlInput); + + // check the attribute values upon creation: + if (!aRel.status().ok) + console.error('status:', aRel.status()); + expect(aRel.status().ok).toBe(true); + }); + }); +}); diff --git a/tests/unit/pig-package-constraints.spec.ts b/tests/unit/pig-package-constraints.spec.ts index 5970382..ac37c9f 100644 --- a/tests/unit/pig-package-constraints.spec.ts +++ b/tests/unit/pig-package-constraints.spec.ts @@ -85,8 +85,8 @@ describe('PIG Package Constraint Validation', () => { ] }; - const pkg = new APackage(); - const items = pkg.setJSONLD(validPackageJsonLd); + const pkg = new APackage().setJSONLD(validPackageJsonLd); + const items = pkg.getAllItems(); expect(pkg.status().ok).toBe(true); expect(items.length).toBe(6); @@ -208,8 +208,8 @@ describe('PIG Package Constraint Validation', () => { ] }; - const pkg = new APackage(); - const items = pkg.setJSONLD(packageWithRelationship); + const pkg = new APackage().setJSONLD(packageWithRelationship); + const items = pkg.getAllItems(); expect(pkg.status().ok).toBe(true); expect(items.length).toBe(9); From cb0b7e7e2ce6125484e4ed4af1407bc09ecbb5e0 Mon Sep 17 00:00:00 2001 From: "OD-T14S-25\\PCUser" Date: Tue, 27 Jan 2026 23:46:27 +0100 Subject: [PATCH 07/26] now the namespaces = context are extracted from XML, as well. All transformations from XML are thus done. Still missing is the XML schema check. --- src/utils/schemas/pig/ts/pig-metaclasses.ts | 71 +++++++++++++++++++-- 1 file changed, 65 insertions(+), 6 deletions(-) diff --git a/src/utils/schemas/pig/ts/pig-metaclasses.ts b/src/utils/schemas/pig/ts/pig-metaclasses.ts index 93c44d4..e404987 100644 --- a/src/utils/schemas/pig/ts/pig-metaclasses.ts +++ b/src/utils/schemas/pig/ts/pig-metaclasses.ts @@ -1113,6 +1113,7 @@ export class APackage extends Identifiable implements IAPackage { creator: meta.creator } as IAPackage); + // logger.debug(`APackage.setJSONLD: package ${JSON.stringify(this, null, 2)} set with status`, this.lastStatus); // return the instantiated graph with instantiated graph items: return this; } @@ -1206,7 +1207,7 @@ export class APackage extends Identifiable implements IAPackage { setXML(xmlString: stringXML) { // 1. Parse XML string to JSON const parsed = xml2json(xmlString); - logger.debug('APackage.setXML: parsed XML to JSON', JSON.stringify(parsed,null,2)); + // logger.debug('APackage.setXML: parsed XML to JSON', JSON.stringify(parsed,null,2)); if (!parsed.ok) { this.lastStatus = parsed; @@ -1215,10 +1216,10 @@ export class APackage extends Identifiable implements IAPackage { } const doc = parsed.response as JsonObject; - logger.debug('APackage.setXML: parsed XML to JSON', doc); + // logger.debug('APackage.setXML: parsed XML to JSON', doc); // 2. Extract namespaces (if needed in future) - // const ctx = this.extractContextXML(doc); + const ctx = extractContextXML(xmlString); // 3. Extract package metadata (if available in XML) // const meta = this.extractMetadataXML(doc); @@ -1256,13 +1257,13 @@ export class APackage extends Identifiable implements IAPackage { id: doc.id, title: doc.title, description: doc.description, - // context: ctx, + context: ctx, graph: instantiatedGraph, modified: doc.modified, creator: doc.creator } as unknown as IAPackage); - logger.debug(`APackage.setXML: package ${JSON.stringify(this,null,2)} set with status`, this.lastStatus); + // logger.debug(`APackage.setXML: package ${JSON.stringify(this,null,2)} set with status`, this.lastStatus); return this; } /** @@ -2096,6 +2097,62 @@ function xml2json(xml: stringXML): IRsp { return Msg.create(690, 'XML', err?.message ?? String(err)); } } +/** + * Extract XML namespaces from XML string and group them in a context object + * Compatible with JSON-LD @context format + * + * @param xmlString - XML string containing namespace declarations + * @returns Context as INamespace[], string, Record, or undefined + * + * @example + * Input XML: + * + * + * Output: + * [ + * { tag: "pig:", uri: "https://pig.gfse.org/" }, + * { tag: "dcterms:", uri: "http://purl.org/dc/terms/" }, + * { tag: "@vocab", uri: "http://default.org/" } + * ] + */ +function extractContextXML(xmlString: stringXML): INamespace[] | string | Record | undefined { + const namespaces: INamespace[] = []; + + // Global regex to find all xmlns declarations + // Matches both xmlns:prefix="uri" and xmlns="uri" + const xmlnsRegex = /xmlns(?::([a-zA-Z0-9_-]+))?=["']([^"']+)["']/g; + + let match; + while ((match = xmlnsRegex.exec(xmlString)) !== null) { + const prefix = match[1]; // undefined for default namespace + const uri = match[2]; + + if (prefix) { + // Prefixed namespace: xmlns:prefix="uri" + namespaces.push({ + tag: prefix.endsWith(':') ? prefix : prefix + ':', + uri: uri + }); + } else { + // Default namespace: xmlns="uri" + // Use '@vocab' as tag for default namespace (JSON-LD convention) + namespaces.push({ + tag: '@vocab', + uri: uri + }); + } + } + + if (namespaces.length === 0) { + logger.warn('extractContextXML: no namespaces found in XML'); + return undefined; + } + + // logger.debug(`extractContextXML: extracted ${namespaces.length} namespace(s)`); + return namespaces; +} /** * Convert an XML DOM Element to a JSON object recursively * Handles: @@ -2123,7 +2180,9 @@ function xmlElementToJson(xmlElement: ElementXML): JsonObject { const attrName = attr.name; const attrValue = attr.value; - if (attrName === 'id') { + if (attrName.startsWith('xmlns')) { + continue; // skip namespace declarations + } else if (attrName === 'id') { result.id = attrValue; } else if (attrName === 'rdf:type' || attrName === 'type') { result.hasClass = attrValue; From 030ca8ae1bcb1b292bf7b7fd9fe432a7cc664266 Mon Sep 17 00:00:00 2001 From: "OD-T14S-25\\PCUser" Date: Wed, 28 Jan 2026 18:07:52 +0100 Subject: [PATCH 08/26] Completed import of .pig.xml. No checks with XML schema or schematron, as this is not at hand when using JavaScript. --- src/utils/lib/messages.ts | 54 ++- src/utils/schemas/pig/ts/pig-metaclasses.ts | 307 +++++++++--------- .../schemas/pig/ts/pig-package-constraints.ts | 7 +- ...ple Model (FMC) with Requirements'.pig.xml | 50 +-- tests/unit/import-package-jsonld.spec.ts | 2 +- tests/unit/pig-package-constraints.spec.ts | 118 ++++--- 6 files changed, 286 insertions(+), 252 deletions(-) diff --git a/src/utils/lib/messages.ts b/src/utils/lib/messages.ts index 2f11093..46353f3 100644 --- a/src/utils/lib/messages.ts +++ b/src/utils/lib/messages.ts @@ -103,8 +103,8 @@ const messages: Record string>> `'${itemType}' debe tener una referencia hasClass` }, - // Identifiable validation (610-619) - 610: { + // Identifiable validation + 602: { en: (fromId: string, toId: string) => `Cannot change the id of an item (tried to change from ${fromId} to ${toId})`, de: (fromId: string, toId: string) => @@ -114,7 +114,7 @@ const messages: Record string>> es: (fromId: string, toId: string) => `No se puede cambiar el id de un elemento (intento de ${fromId} a ${toId})` }, - 611: { + 603: { en: (fromSpec: string, toSpec: string) => `Cannot change the specialization (tried to change from ${fromSpec} to ${toSpec})`, de: (fromSpec: string, toSpec: string) => @@ -146,7 +146,7 @@ const messages: Record string>> }, 623: { en: (fieldName: string) => `${fieldName} is missing id`, - de: (fieldName: string) => `${fieldName} fehlt die ID`, + de: (fieldName: string) => `${fieldName} fehlt der id`, fr: (fieldName: string) => `${fieldName} manque l'id`, es: (fieldName: string) => `${fieldName} falta el id` }, @@ -287,6 +287,42 @@ const messages: Record string>> `Entrada ${fieldName}[${index}]: 'lang' debe ser una cadena no vacía` }, + // Item instantiation and validation (650-659) + 650: { + en: (op: string, field: string, id: string) => `${op}: Missing required field "${field}" in item with id "${id}"`, + de: (op: string, field: string, id: string) => `${op}: Pflichtfeld "${field}" fehlt bei Item mit ID "${id}"`, + fr: (op: string, field: string, id: string) => `${op}: Champ obligatoire "${field}" manquant dans l'élément avec id "${id}"`, + es: (op: string, field: string, id: string) => `${op}: Falta el campo obligatorio "${field}" en el elemento con id "${id}"` + }, + + 651: { + en: (op: string, field: string) => `${op}: Item type "${field}" is not allowed in package graph`, + de: (op: string, field: string) => `${op}: Elementtyp "${field}" ist im Package-Graph nicht erlaubt`, + fr: (op: string, field: string) => `${op}: Le type d'élément "${field}" n'est pas autorisé dans le graphe de package`, + es: (op: string, field: string) => `${op}: El tipo de elemento "${field}" no está permitido en el grafo del paquete` + }, + + 652: { + en: (op: string, field: string) => `${op}: Unable to create instance for itemType "${field}"`, + de: (op: string, field: string) => `${op}: Instanz für itemType "${field}" kann nicht erstellt werden`, + fr: (op: string, field: string) => `${op}: Impossible de créer une instance pour itemType "${field}"`, + es: (op: string, field: string) => `${op}: No se puede crear una instancia para itemType "${field}"` + }, + + 653: { + en: (op: string, field: string, id: string) => `${op}: Validation failed for ${field} with id "${id}"`, + de: (op: string, field: string, id: string) => `${op}: Validierung fehlgeschlagen für ${field} mit ID "${id}"`, + fr: (op: string, field: string, id: string) => `${op}: Échec de validation pour ${field} avec id "${id}"`, + es: (op: string, field: string, id: string) => `${op}: Falló la validación para ${field} con id "${id}"` + }, + + 654: { + en: (op: string, field: string, err: string) => `${op}: Failed to instantiate ${field}: ${err}`, + de: (op: string, field: string, err: string) => `${op}: Instanziierung von ${field} fehlgeschlagen: ${err}`, + fr: (op: string, field: string, err: string) => `${op}: Échec d'instanciation de ${field}: ${err}`, + es: (op: string, field: string, err: string) => `${op}: Fallo al instanciar ${field}: ${err}` + }, + // Package constraint validation (670-679) 670: { en: (index: number) => @@ -348,6 +384,16 @@ const messages: Record string>> es: (parentId: string, linkIndex: number, linkArrayName: string, hasClass: string, msg: string) => `Error en la validación del paquete: elemento '${parentId}' ${linkArrayName}[${linkIndex}].hasClass='${hasClass}' - ${msg}` }, + 679: { + en: (op: string, act: number, exp: number) => + `${op}: Created ${act} of ${exp} graph items`, + de: (op: string, act: number, exp: number) => + `${op}: ${act} von ${exp} Graph-Elementen erstellt`, + fr: (op: string, act: number, exp: number) => + `${op}: ${act} éléments de graphe créés sur ${exp}`, + es: (op: string, act: number, exp: number) => + `${op}: Se crearon ${act} de ${exp} elementos del grafo` + }, // Schema validation (680-689) 680: { diff --git a/src/utils/schemas/pig/ts/pig-metaclasses.ts b/src/utils/schemas/pig/ts/pig-metaclasses.ts index e404987..1d6459b 100644 --- a/src/utils/schemas/pig/ts/pig-metaclasses.ts +++ b/src/utils/schemas/pig/ts/pig-metaclasses.ts @@ -173,9 +173,9 @@ abstract class Identifiable extends Item implements IIdentifiable { } protected validate(itm: IIdentifiable) { if (this.id && itm.id !== this.id) - return Msg.create(610, this.id, itm.id); + return Msg.create(602, this.id, itm.id); if (this.specializes && this.specializes !== itm.specializes) - return Msg.create(611, this.specializes, itm.specializes); + return Msg.create(603, this.specializes, itm.specializes); // Runtime guards: /* this is now checked in schema validation: */ @@ -583,6 +583,7 @@ export class Entity extends Element implements IEntity { validate(itm: IEntity) { // Schema validation (AJV) - provides structural checks and reuses the idString definition // ... only at the lowest subclass level: + logger.debug('Entity.validate: ', itm); try { const ok = SCH.validateEntitySchema(itm); if (!ok) { @@ -1072,7 +1073,7 @@ export class APackage extends Identifiable implements IAPackage { const meta = this.extractMetadataJSONLD(doc); // Extract and process @graph - let graph: any[] = Array.isArray(doc['@graph']) + const graph: any[] = Array.isArray(doc['@graph']) ? doc['@graph'] : (Array.isArray(doc.graph) ? doc.graph : []); @@ -1080,17 +1081,27 @@ export class APackage extends Identifiable implements IAPackage { logger.warn('APackage.setJSONLD: empty @graph'); } - graph = graph.map( - item => { - const instance = this.instantiateItemJSONLD(item); - if (instance) { - // logger.debug(`APackage.set: `, instance); - return instance; - } - else - logger.warn(`APackage.setJSONLD: could not instantiate item ${JSON.stringify(item, null, 2)}`); + // Instantiate each graph item + const instantiatedGraph: TPigItem[] = []; + const errors: string[] = []; + + for (const item of graph) { + const result = this.instantiateItemJSONLD(item); + + if (result.ok && result.response) { + instantiatedGraph.push(result.response as TPigItem); + } else { + const errorMsg = result.statusText || 'Unknown instantiation error'; + errors.push(errorMsg); + logger.warn(`APackage.setJSONLD: ${errorMsg}`); } - ); + } + + if (errors.length > 0) { + logger.warn(`APackage.setJSONLD: ${errors.length} item(s) failed instantiation`); + this.lastStatus = Msg.create(679, 'JSON-LD Package Import', instantiatedGraph.length, graph.length); + return this; + } // logger.debug(`APackage.setJSONLD: processing ${graph.length} items from package ${meta.id || 'unnamed'}`); // logger.debug('APackage.setJSONLD: extracted context:', ctx); @@ -1108,7 +1119,7 @@ export class APackage extends Identifiable implements IAPackage { title: meta.title, description: meta.description, context: ctx, - graph: graph, + graph: instantiatedGraph, modified: meta.modified, creator: meta.creator } as IAPackage); @@ -1151,61 +1162,9 @@ export class APackage extends Identifiable implements IAPackage { // Return stringified JSON-LD return JSON.stringify(jld, null, 4); } */ -/* setXML(doc: any) { - // Extract namespaces -// const ctx = this.extractContextXML(doc); - - // Extract package metadata -// const meta = this.extractMetadataXML(doc); - - // Extract and process @graph - let graph: any[] = Array.isArray(doc.graph) ? doc.graph : []; - - if (graph.length === 0) { - logger.warn('APackage.setXML: empty graph'); - } - - graph = graph.map( - item => { - const instance = this.instantiateItemXML(item); - if (instance) { - // logger.debug(`APackage.set: `, instance); - return instance; - } - else - logger.warn(`APackage.setXML: could not instantiate item ${JSON.stringify(item)}`); - } - ); - - // logger.debug(`APackage.setXML: processing ${graph.length} items from package ${meta.id || 'unnamed'}`); - // logger.debug('APackage.setXML: extracted context:', ctx); - // logger.debug('APackage.setXML: extracted metadata:', meta); - - // Set default modified timestamp if not present - if (!this.modified) { - this.modified = new Date().toISOString(); - } - - // Call set to validate and return all items including package - this.set({ - itemType: PigItemType.aPackage, - // id: meta.id, - // title: meta.title, - // description: meta.description, - // context: ctx, - graph: graph, - // modified: meta.modified, - // creator: meta.creator - } as IAPackage); - - // return the instantiated graph and graph items: - return this; - // this.lastStatus = Msg.create(699, 'setXML'); - // return this; - // return super.setXML(itm); - } */ setXML(xmlString: stringXML) { // 1. Parse XML string to JSON + // The context is skipped here, as it is extracted separately below. const parsed = xml2json(xmlString); // logger.debug('APackage.setXML: parsed XML to JSON', JSON.stringify(parsed,null,2)); @@ -1219,10 +1178,10 @@ export class APackage extends Identifiable implements IAPackage { // logger.debug('APackage.setXML: parsed XML to JSON', doc); // 2. Extract namespaces (if needed in future) - const ctx = extractContextXML(xmlString); + const ctx = this.extractContextXML(xmlString); - // 3. Extract package metadata (if available in XML) - // const meta = this.extractMetadataXML(doc); + // 3. Extract package metadata + // ... can be obtained directly from parsed JSON. // 4. Extract and process graph items const graph: any[] = Array.isArray(doc.graph) ? doc.graph : []; @@ -1232,17 +1191,26 @@ export class APackage extends Identifiable implements IAPackage { } // 5. Instantiate each graph item from parsed JSON - const instantiatedGraph = graph - .map(item => { - const instance = this.instantiateItemXML(item); - if (instance) { - return instance; - } else { - logger.warn(`APackage.setXML: could not instantiate item ${JSON.stringify(item,null,2)}`); - return undefined; - } - }) - .filter((item): item is TPigItem => item !== undefined); // ✅ Type-safe filter + const instantiatedGraph: TPigItem[] = []; + const errors: string[] = []; + + for (const item of graph) { + const result = this.instantiateItemXML(item); + + if (result.ok && result.response) { + instantiatedGraph.push(result.response as TPigItem); + } else { + const errorMsg = result.statusText || 'Unknown instantiation error'; + errors.push(errorMsg); + logger.warn(`APackage.setXML: ${errorMsg}`); + } + } + + if (errors.length > 0) { + logger.warn(`APackage.setXML: ${errors.length} item(s) failed instantiation`); + this.lastStatus = Msg.create(679, 'XML Package Import', instantiatedGraph.length, graph.length); + return this; + } // logger.debug(`APackage.setXML: successfully instantiated ${instantiatedGraph.length} of ${graph.length} items`); @@ -1397,6 +1365,62 @@ export class APackage extends Identifiable implements IAPackage { logger.warn('APackage: unsupported @context format'); return undefined; } + /** + * Extract XML namespaces from XML string and group them in a context object + * Compatible with JSON-LD @context format + * + * @param xmlString - XML string containing namespace declarations + * @returns Context as INamespace[], string, Record, or undefined + * + * @example + * Input XML: + * + * + * Output: + * [ + * { tag: "pig:", uri: "https://pig.gfse.org/" }, + * { tag: "dcterms:", uri: "http://purl.org/dc/terms/" }, + * { tag: "@vocab", uri: "http://default.org/" } + * ] + */ + private extractContextXML(xmlString: stringXML): INamespace[] | string | Record | undefined { + const namespaces: INamespace[] = []; + + // Global regex to find all xmlns declarations + // Matches both xmlns:prefix="uri" and xmlns="uri" + const xmlnsRegex = /xmlns(?::([a-zA-Z0-9_-]+))?=["']([^"']+)["']/g; + + let match; + while ((match = xmlnsRegex.exec(xmlString)) !== null) { + const prefix = match[1]; // undefined for default namespace + const uri = match[2]; + + if (prefix) { + // Prefixed namespace: xmlns:prefix="uri" + namespaces.push({ + tag: prefix.endsWith(':') ? prefix : prefix + ':', + uri: uri + }); + } else { + // Default namespace: xmlns="uri" + // Use '@vocab' as tag for default namespace (JSON-LD convention) + namespaces.push({ + tag: '@vocab', + uri: uri + }); + } + } + + if (namespaces.length === 0) { + logger.warn('extractContextXML: no namespaces found in XML'); + return undefined; + } + + // logger.debug(`extractContextXML: extracted ${namespaces.length} namespace(s)`); + return namespaces; + } /** * Extract package metadata from JSON-LD document * @param doc - Parsed JSON-LD document @@ -1455,45 +1479,66 @@ export class APackage extends Identifiable implements IAPackage { /** * Instantiate a single PIG item from JSON-LD + * @param item - JSON-LD object + * @returns IRsp with instantiated TPigItem in response, or error status */ - private instantiateItemJSONLD(item: any): TPigItem | undefined { + private instantiateItemJSONLD(item: any): IRsp { // Validate item has required pig:itemType if (!item['pig:itemType'] || !item['pig:itemType']['@id']) { - logger.error('APackage: @graph element missing pig:itemType, skipping ' + (item['@id'] || item.id || 'unknown')); - return; + const id = item['@id'] || item.id || 'unknown'; + logger.error(`APackage.instantiateItemJSONLD: @graph element missing pig:itemType, skipping ${id}`); + return Msg.create(650, 'Instantiation from JSON-LD', 'pig:itemType', id); } const itype: any = item['pig:itemType']['@id']; // Filter allowed item types if (!this.isAllowedItemType(itype)) { - logger.error(`APackage: skipping unknown item type '${itype}'`); - return; + logger.error(`APackage.instantiateItemJSONLD: skipping item type '${itype}' which is not allowed in a graph`); + return Msg.create(651, 'Instantiation from JSON-LD', itype); } const instance = this.createInstance(itype); - + if (!instance) { - logger.error(`APackage: unable to create instance for itemType '${itype}'`); - return; + logger.error(`APackage.instantiateItemJSONLD: unable to create instance for itemType '${itype}'`); + return Msg.create(652, 'Instantiation from JSON-LD', itype); } try { (instance as any).setJSONLD(item); - // logger.debug(`APackage: successfully instantiated ${itype} with id ${item['@id']}`); - return instance; + + // Check if instantiation was successful + const status = (instance as any).status(); + if (!status || !status.ok) { + logger.error( + `APackage.instantiateItemJSONLD: ${itype} '${item['@id'] || item.id || 'unknown'}' failed validation: ${status?.statusText || 'unknown error'}` + ); + return status || Msg.create(653, 'Instantiation from JSON-LD', itype, item['@id'] || item.id || 'unknown'); + } + + // logger.debug(`APackage.instantiateItemJSONLD: successfully instantiated ${itype} with id ${item['@id']}`); + return { + ...rspOK, + response: instance + }; } catch (err: any) { - logger.error(`APackage: failed to populate instance with itemType '${itype}': ${err?.message ?? err}`); + const errorMsg = `APackage.instantiateItemJSONLD: failed to populate instance with itemType '${itype}': ${err?.message ?? err}`; + logger.error(errorMsg); + return Msg.create(654, 'Instantiation from JSON-LD', itype, err?.message ?? String(err)); } } /** * Instantiate a single PIG item from XML (already converted to JSON) + * @param item - JSON object from xml2json conversion + * @returns IRsp with instantiated TPigItem in response, or error status */ - private instantiateItemXML(item: any): TPigItem | undefined { + private instantiateItemXML(item: any): IRsp { // Validate item has required itemType if (!item.itemType) { - logger.error('APackage.instantiateItemXML: element missing itemType, skipping ' + (item.id || 'unknown')); - return; + const id = item.id || 'unknown'; + logger.error(`APackage.instantiateItemXML: element missing itemType, skipping ${id}`); + return Msg.create(650, 'Instantiation from XML', 'itemType', id); } const itype: any = item.itemType; @@ -1501,14 +1546,14 @@ export class APackage extends Identifiable implements IAPackage { // Filter allowed item types if (!this.isAllowedItemType(itype)) { logger.error(`APackage.instantiateItemXML: skipping item type '${itype}' which is not allowed in a graph`); - return; + return Msg.create(651, 'Instantiation from XML', itype); } const instance = this.createInstance(itype); if (!instance) { logger.error(`APackage.instantiateItemXML: unable to create instance for itemType '${itype}'`); - return; + return Msg.create(652, 'Instantiation from XML', itype); } try { @@ -1522,16 +1567,20 @@ export class APackage extends Identifiable implements IAPackage { logger.error( `APackage.instantiateItemXML: ${itype} '${item.id || 'unknown'}' failed validation: ${status?.statusText || 'unknown error'}` ); - return; + return status || Msg.create(653, 'Instantiation from XML', itype, item.id || 'unknown'); } // logger.debug(`APackage.instantiateItemXML: successfully instantiated ${itype} with id ${item.id}`); - return instance; + return { + ...rspOK, + response: instance + }; } catch (err: any) { - logger.error(`APackage.instantiateItemXML: failed to populate instance with itemType '${itype}': ${err?.message ?? err}`); + const errorMsg = `APackage.instantiateItemXML: failed to populate instance with itemType '${itype}': ${err?.message ?? err}`; + logger.error(errorMsg); + return Msg.create(654, 'Instantiation from XML', itype, err?.message ?? String(err)); } } - /** * Check if item type is allowed for instantiation. * The following types are not allowed in a graph: @@ -2097,62 +2146,6 @@ function xml2json(xml: stringXML): IRsp { return Msg.create(690, 'XML', err?.message ?? String(err)); } } -/** - * Extract XML namespaces from XML string and group them in a context object - * Compatible with JSON-LD @context format - * - * @param xmlString - XML string containing namespace declarations - * @returns Context as INamespace[], string, Record, or undefined - * - * @example - * Input XML: - * - * - * Output: - * [ - * { tag: "pig:", uri: "https://pig.gfse.org/" }, - * { tag: "dcterms:", uri: "http://purl.org/dc/terms/" }, - * { tag: "@vocab", uri: "http://default.org/" } - * ] - */ -function extractContextXML(xmlString: stringXML): INamespace[] | string | Record | undefined { - const namespaces: INamespace[] = []; - - // Global regex to find all xmlns declarations - // Matches both xmlns:prefix="uri" and xmlns="uri" - const xmlnsRegex = /xmlns(?::([a-zA-Z0-9_-]+))?=["']([^"']+)["']/g; - - let match; - while ((match = xmlnsRegex.exec(xmlString)) !== null) { - const prefix = match[1]; // undefined for default namespace - const uri = match[2]; - - if (prefix) { - // Prefixed namespace: xmlns:prefix="uri" - namespaces.push({ - tag: prefix.endsWith(':') ? prefix : prefix + ':', - uri: uri - }); - } else { - // Default namespace: xmlns="uri" - // Use '@vocab' as tag for default namespace (JSON-LD convention) - namespaces.push({ - tag: '@vocab', - uri: uri - }); - } - } - - if (namespaces.length === 0) { - logger.warn('extractContextXML: no namespaces found in XML'); - return undefined; - } - - // logger.debug(`extractContextXML: extracted ${namespaces.length} namespace(s)`); - return namespaces; -} /** * Convert an XML DOM Element to a JSON object recursively * Handles: diff --git a/src/utils/schemas/pig/ts/pig-package-constraints.ts b/src/utils/schemas/pig/ts/pig-package-constraints.ts index 6c76ecf..340b792 100644 --- a/src/utils/schemas/pig/ts/pig-package-constraints.ts +++ b/src/utils/schemas/pig/ts/pig-package-constraints.ts @@ -33,13 +33,14 @@ * Entity and Relationship specializes references * @type consistency * Phase 2 (important): + * namespace prefixes are defined in the context + * Enumeration value references * eligibleProperty references * eligibleEndpoint references * Link endpoint compliance - * Enumeration value references * Phase 3 (useful): - * Cyclic specialization detection - * Cyclic composed property detection + * No cyclic specialization + * No cyclic composition of properties * Property value constraints * Required properties check --> done by schema validation! * Relationship structure diff --git a/tests/data/XML/21/Project 'Very Simple Model (FMC) with Requirements'.pig.xml b/tests/data/XML/21/Project 'Very Simple Model (FMC) with Requirements'.pig.xml index 2f4d5d5..6782008 100644 --- a/tests/data/XML/21/Project 'Very Simple Model (FMC) with Requirements'.pig.xml +++ b/tests/data/XML/21/Project 'Very Simple Model (FMC) with Requirements'.pig.xml @@ -27,21 +27,21 @@ - pig:Entity + pig:Entity Organizer An element organizing model elements. An example is a list of requirements or a diagram using a certain notation. pig:category - pig:Organizer + pig:Organizer Hierarchy Root A subclass of PIG organizer serving as a root for hierarchically organized graph elements. pig:lists - pig:Organizer + pig:Organizer Outline A subclass of PIG organizer comprising all information items of a human-readable document. As usual, the outline is hierarchically organized. pig:category @@ -49,7 +49,7 @@ - pig:Organizer + pig:Organizer View A subclass of PIG organizer representing a model view (diagram) using a certain notation showing selected model elements. pig:category @@ -78,7 +78,7 @@ - pig:Property + pig:Property has icon Specifies an icon for a model element (entity or relationship). @@ -90,7 +90,7 @@ - dcterms:type + dcterms:type has category Specifies a category for an element (entity, relationship or organizer). @@ -111,7 +111,7 @@ - pig:Link + pig:Link pig:Entity pig:Relationship to source @@ -119,7 +119,7 @@ - pig:Link + pig:Link pig:Entity pig:Relationship to target @@ -127,7 +127,7 @@ - pig:TargetLink + pig:TargetLink pig:Entity pig:Relationship pig:Organizer @@ -136,7 +136,7 @@ - pig:TargetLink + pig:TargetLink pig:Entity pig:Relationship shows @@ -144,7 +144,7 @@ - pig:TargetLink + pig:TargetLink pig:Entity depicts Depicts an entity; inverse of uml:ownedDiagram. @@ -253,7 +253,7 @@

Ein 'Textabschnitt' in einem Dokument auf beliebiger Ebene.

- pig:Entity + pig:Entity SpecIF:Diagram pig:category
@@ -274,7 +274,7 @@

Un 'Acteur' est un type d'élément de modèle fondamental représentant une entité active, qu'il s'agisse d'une activité, d'une étape de processus, d'une fonction, d'un composant de système ou d'un rôle.

L'utilisation particulière ou le type original est spécifié avec une propriété [[dcterms:type]] de 'FMC:Actor'. Les valeurs de cette propriété peuvent être des termes d'ontologie, tels que [[bpmn:timer]].

- pig:Entity + pig:Entity pig:category @@ -295,7 +295,7 @@

Un 'État' est un type d'élément de modèle fondamental représentant une entité passive, qu'il s'agisse d'une valeur, d'une condition, d'un stockage d'informations ou même d'une forme physique.

L'utilisation particulière ou le type original est spécifié avec une propriété [[dcterms:type]] de 'FMC:State'. Les valeurs de cette propriété peuvent être des termes d'ontologie, tels que [[ArchiMate:DataObject]].

- pig:Entity + pig:Entity pig:category @@ -316,7 +316,7 @@

Un 'Événement' est un type d'élément de modèle fondamental représentant une référence temporelle, un changement de condition/valeur ou plus généralement une primitive de synchronisation.

L'utilisation particulière ou le type original est spécifié avec une propriété [[dcterms:type]] de 'FMC:Event'. Les valeurs de cette propriété peuvent être des termes d'ontologie, tels que [[bpmn:startEvent]].

- pig:Entity + pig:Entity pig:category @@ -388,7 +388,7 @@
  • Une représentation documentée d'un besoin, d'une capacité ou d'une propriété.
  • - pig:Entity + pig:Entity SpecIF:Priority @@ -399,20 +399,20 @@ schreibt écrit A [[FMC:Actor]] 'writes' (changes) a [[FMC:State]]. - pig:Relationship + pig:Relationship SpecIF:writes-toSource SpecIF:writes-toTarget - pig:SourceLink + pig:SourceLink SpecIF:writes to source Connects the source of SpecIF:writes FMC:Actor - pig:TargetLink + pig:TargetLink SpecIF:writes to target Connects the target of SpecIF:writes FMC:State @@ -423,20 +423,20 @@ liest lit A [[FMC:Actor]] 'reads' a [[FMC:State]]. - pig:Relationship + pig:Relationship SpecIF:reads-toSource SpecIF:reads-toTarget - pig:SourceLink + pig:SourceLink SpecIF:reads to source Connects the source of SpecIF:reads FMC:Actor - pig:TargetLink + pig:TargetLink SpecIF:reads to target Connects the target of SpecIF:reads FMC:State @@ -458,13 +458,13 @@ SpecIF suggests that the subject is confined to a model element, e.g, a [[FMC:Actor]] or [[FMC:State]], and the object is confined to a [[IREB:Requirement]]. More concretely, an example for this type of statement is 'Component-X satisfies 'Requirement-4711'.

    - pig:Relationship + pig:Relationship oslc_rm:satisfies-toSource oslc_rm:satisfies-toTarget - pig:SourceLink + pig:SourceLink oslc_rm:satisfies to source Connects the source of oslc_rm:satisfies FMC:Actor @@ -472,7 +472,7 @@ - pig:TargetLink + pig:TargetLink oslc_rm:satisfies to target Connects the target of oslc_rm:satisfies IREB:Requirement diff --git a/tests/unit/import-package-jsonld.spec.ts b/tests/unit/import-package-jsonld.spec.ts index d67eceb..32573b5 100644 --- a/tests/unit/import-package-jsonld.spec.ts +++ b/tests/unit/import-package-jsonld.spec.ts @@ -8,7 +8,7 @@ describe('importJSONLD (file system)', () => { const filenames:string[] = [ //"../data/JSON-LD/05/Project 'Requirement with Enumerated Property'.pig.jsonld", //"../data/JSON-LD/11/Alice.pig.jsonld", - "../data/JSON-LD/21/Project 'Very Simple Model (FMC) with Requirements'.pig.jsonld", + //"../data/JSON-LD/21/Project 'Very Simple Model (FMC) with Requirements'.pig.jsonld", //"../data/JSON-LD/22/Small Autonomous Vehicle.pig.jsonld" // add more test files here, e.g. // "../data/JSON-LD/another-sample.pig.jsonld" diff --git a/tests/unit/pig-package-constraints.spec.ts b/tests/unit/pig-package-constraints.spec.ts index ac37c9f..3ecc8b2 100644 --- a/tests/unit/pig-package-constraints.spec.ts +++ b/tests/unit/pig-package-constraints.spec.ts @@ -24,7 +24,7 @@ describe('PIG Package Constraint Validation', () => { '@graph': [ { '@id': 'o:Property_Status', - '@type': 'pig:Property', + 'pig:specializes': 'pig:Property', 'pig:itemType': { '@id': 'pig:Property' }, 'dcterms:title': [ { '@value': 'Status', '@language': 'en' } @@ -33,7 +33,7 @@ describe('PIG Package Constraint Validation', () => { }, { '@id': 'o:Link_RefersTo', - '@type': 'pig:Link', + 'pig:specializes': 'pig:Link', 'pig:itemType': { '@id': 'pig:Link' }, 'dcterms:title': [ { '@value': 'Refers To', '@language': 'en' } @@ -44,7 +44,7 @@ describe('PIG Package Constraint Validation', () => { }, { '@id': 'o:Entity_Requirement', - '@type': 'pig:Entity', + 'pig:specializes': 'pig:Entity', 'pig:itemType': { '@id': 'pig:Entity' }, 'dcterms:title': [ { '@value': 'Requirement', '@language': 'en' } @@ -91,10 +91,10 @@ describe('PIG Package Constraint Validation', () => { expect(pkg.status().ok).toBe(true); expect(items.length).toBe(6); - const result = checkConstraintsForPackage(pkg.get() as IAPackage); + const rsp = checkConstraintsForPackage(pkg.get() as IAPackage); - expect(result.ok).toBe(true); - expect(result.status).toBe(0); + expect(rsp.ok).toBe(true); + expect(rsp.status).toBe(0); }); test('should validate package with relationship containing source and target links', () => { @@ -112,7 +112,7 @@ describe('PIG Package Constraint Validation', () => { '@graph': [ { '@id': 'o:Property_Rationale', - '@type': 'pig:Property', + 'pig:specializes': 'pig:Property', 'pig:itemType': { '@id': 'pig:Property' }, 'dcterms:title': [ { '@value': 'Rationale', '@language': 'en' } @@ -121,7 +121,7 @@ describe('PIG Package Constraint Validation', () => { }, { '@id': 'o:Link_Source', - '@type': 'pig:Link', + 'pig:specializes': 'pig:Link', 'pig:itemType': { '@id': 'pig:Link' }, 'dcterms:title': [ { '@value': 'Source', '@language': 'en' } @@ -132,7 +132,7 @@ describe('PIG Package Constraint Validation', () => { }, { '@id': 'o:Link_Target', - '@type': 'pig:Link', + 'pig:specializes': 'pig:Link', 'pig:itemType': { '@id': 'pig:Link' }, 'dcterms:title': [ { '@value': 'Target', '@language': 'en' } @@ -143,7 +143,7 @@ describe('PIG Package Constraint Validation', () => { }, { '@id': 'o:Relationship_Trace', - '@type': 'pig:Relationship', + 'pig:specializes': 'pig:Relationship', 'pig:itemType': { '@id': 'pig:Relationship' }, 'dcterms:title': [ { '@value': 'Trace', '@language': 'en' } @@ -151,7 +151,7 @@ describe('PIG Package Constraint Validation', () => { }, { '@id': 'o:Entity_Requirement', - '@type': 'pig:Entity', + 'pig:specializes': 'pig:Entity', 'pig:itemType': { '@id': 'pig:Entity' }, 'dcterms:title': [ { '@value': 'Requirement', '@language': 'en' } @@ -214,10 +214,10 @@ describe('PIG Package Constraint Validation', () => { expect(pkg.status().ok).toBe(true); expect(items.length).toBe(9); - const result = checkConstraintsForPackage(pkg.get() as IAPackage); + const rsp = checkConstraintsForPackage(pkg.get() as IAPackage); - expect(result.ok).toBe(true); - expect(result.status).toBe(0); + expect(rsp.ok).toBe(true); + expect(rsp.status).toBe(0); }); }); @@ -237,7 +237,7 @@ describe('PIG Package Constraint Validation', () => { '@graph': [ { '@id': 'o:Property_Status', - '@type': 'pig:Property', + 'pig:specializes': 'pig:Property', 'pig:itemType': { '@id': 'pig:Property' }, 'dcterms:title': [ { '@value': 'Status', '@language': 'en' } @@ -246,7 +246,7 @@ describe('PIG Package Constraint Validation', () => { }, { '@id': 'o:Entity_duplicateId_nok', - '@type': 'pig:Entity', + 'pig:specializes': 'pig:Entity', 'pig:itemType': { '@id': 'pig:Entity' }, 'dcterms:title': [ { '@value': 'Requirement', '@language': 'en' } @@ -254,7 +254,7 @@ describe('PIG Package Constraint Validation', () => { }, { '@id': 'o:Entity_duplicateId_nok', // ❌ Duplicate ID - '@type': 'pig:Entity', + 'pig:specializes': 'pig:Entity', 'pig:itemType': { '@id': 'pig:Entity' }, 'dcterms:title': [ { '@value': 'Another Entity', '@language': 'en' } @@ -272,12 +272,12 @@ describe('PIG Package Constraint Validation', () => { expect(pkg.status().ok).toBe(false); expect(pkg.status().status).toBe(671); // Duplicate ID error code - /* const result = pkg.get() as IAPackage; + /* const rsp = pkg.get() as IAPackage; - expect(result.ok).toBe(false); - expect(result.status).toBe(671); // Duplicate ID error code - expect(result.statusText).toContain('duplicate ID'); - expect(result.statusText).toContain('o:Entity_Requirement'); */ + expect(rsp.ok).toBe(false); + expect(rsp.status).toBe(671); // Duplicate ID error code + expect(rsp.statusText).toContain('duplicate ID'); + expect(rsp.statusText).toContain('o:Entity_Requirement'); */ }); test('should reject package with an item missing ID', () => { @@ -295,7 +295,7 @@ describe('PIG Package Constraint Validation', () => { '@graph': [ { '@id': 'o:Property_Status', - '@type': 'pig:Property', + 'pig:specializes': 'pig:Property', 'pig:itemType': { '@id': 'pig:Property' }, 'dcterms:title': [ { '@value': 'Status', '@language': 'en' } @@ -304,7 +304,7 @@ describe('PIG Package Constraint Validation', () => { }, { // ❌ Missing @id - '@type': 'pig:Entity', + 'pig:specializes': 'pig:Entity', 'pig:itemType': { '@id': 'pig:Entity' }, 'dcterms:title': [ { '@value': 'Entity Without ID', '@language': 'en' } @@ -320,13 +320,7 @@ describe('PIG Package Constraint Validation', () => { /* if (pck.status().ok) console.error('status:', pck.status()); */ expect(pkg.status().ok).toBe(false); - expect(pkg.status().status).toBe(670); // Missing ID error code - - /* const result = pkg.get() as IAPackage; - - expect(result.ok).toBe(false); - expect(result.status).toBe(670); // Missing ID error code - expect(result.statusText).toContain('missing id'); */ + expect(pkg.status().status).toBe(679); // Error code for one or more failed item instantiations }); }); @@ -346,7 +340,7 @@ describe('PIG Package Constraint Validation', () => { '@graph': [ { '@id': 'o:Entity_Requirement', - '@type': 'pig:Entity', + 'pig:specializes': 'pig:Entity', 'pig:itemType': { '@id': 'pig:Entity' }, 'dcterms:title': [ { '@value': 'Requirement', '@language': 'en' } @@ -380,13 +374,13 @@ describe('PIG Package Constraint Validation', () => { expect(pkg.status().ok).toBe(false); expect(pkg.status().status).toBe(673); // Invalid hasClass reference - /* const result = pkg.get() as IAPackage; + /* const rsp = pkg.get() as IAPackage; - expect(result.ok).toBe(false); - expect(result.status).toBe(673); // Invalid hasClass reference - expect(result.statusText).toContain('hasProperty[0].hasClass'); - expect(result.statusText).toContain('o:Property_NonExistent'); - expect(result.statusText).toContain('not found in package'); */ + expect(rsp.ok).toBe(false); + expect(rsp.status).toBe(673); // Invalid hasClass reference + expect(rsp.statusText).toContain('hasProperty[0].hasClass'); + expect(rsp.statusText).toContain('o:Property_NonExistent'); + expect(rsp.statusText).toContain('not found in package'); */ }); test('should reject aProperty referencing wrong type (Link instead of Property)', () => { @@ -404,7 +398,7 @@ describe('PIG Package Constraint Validation', () => { '@graph': [ { '@id': 'o:Link_RefersTo', // This is a Link, not a Property! - '@type': 'pig:Link', + 'pig:specializes': 'pig:Link', 'pig:itemType': { '@id': 'pig:Link' }, 'dcterms:title': [ { '@value': 'Refers To', '@language': 'en' } @@ -415,7 +409,7 @@ describe('PIG Package Constraint Validation', () => { }, { '@id': 'o:Entity_Requirement', - '@type': 'pig:Entity', + 'pig:specializes': 'pig:Entity', 'pig:itemType': { '@id': 'pig:Entity' }, 'dcterms:title': [ { '@value': 'Requirement', '@language': 'en' } @@ -449,13 +443,13 @@ describe('PIG Package Constraint Validation', () => { expect(pkg.status().ok).toBe(false); expect(pkg.status().status).toBe(673); // Invalid hasClass type - /* const result = pkg.get() as IAPackage; + /* const rsp = pkg.get() as IAPackage; - expect(result.ok).toBe(false); - expect(result.status).toBe(673); - expect(result.statusText).toContain('hasProperty[0].hasClass'); - expect(result.statusText).toContain('o:Link_RefersTo'); - expect(result.statusText).toContain('expected pig:Property, found pig:Link'); */ + expect(rsp.ok).toBe(false); + expect(rsp.status).toBe(673); + expect(rsp.statusText).toContain('hasProperty[0].hasClass'); + expect(rsp.statusText).toContain('o:Link_RefersTo'); + expect(rsp.statusText).toContain('expected pig:Property, found pig:Link'); */ }); }); @@ -535,13 +529,13 @@ describe('PIG Package Constraint Validation', () => { expect(pkg.status().ok).toBe(false); expect(pkg.status().status).toBe(675); // Invalid hasClass reference - /* const result = pkg.get() as IAPackage; + /* const rsp = pkg.get() as IAPackage; - expect(result.ok).toBe(false); - expect(result.status).toBe(675); // Invalid link hasClass reference - expect(result.statusText).toContain('hasTargetLink[0].hasClass'); - expect(result.statusText).toContain('o:Link_NonExistent'); - expect(result.statusText).toContain('not found in package'); */ + expect(rsp.ok).toBe(false); + expect(rsp.status).toBe(675); // Invalid link hasClass reference + expect(rsp.statusText).toContain('hasTargetLink[0].hasClass'); + expect(rsp.statusText).toContain('o:Link_NonExistent'); + expect(rsp.statusText).toContain('not found in package'); */ }); test('should reject aSourceLink referencing wrong type (Property instead of Link)', () => { @@ -559,7 +553,7 @@ describe('PIG Package Constraint Validation', () => { '@graph': [ { '@id': 'o:Property_Rationale', - '@type': 'pig:Property', + 'pig:specializes': 'pig:Property', 'pig:itemType': { '@id': 'pig:Property' }, 'dcterms:title': [ { '@value': 'Rationale', '@language': 'en' } @@ -568,7 +562,7 @@ describe('PIG Package Constraint Validation', () => { }, { '@id': 'o:Link_Source', - '@type': 'pig:Link', + 'pig:specializes': 'pig:Link', 'pig:itemType': { '@id': 'pig:Link' }, 'dcterms:title': [ { '@value': 'Source', '@language': 'en' } @@ -579,7 +573,7 @@ describe('PIG Package Constraint Validation', () => { }, { '@id': 'o:Link_Target', - '@type': 'pig:Link', + 'pig:specializes': 'pig:Link', 'pig:itemType': { '@id': 'pig:Link' }, 'dcterms:title': [ { '@value': 'Target', '@language': 'en' } @@ -598,7 +592,7 @@ describe('PIG Package Constraint Validation', () => { }, { '@id': 'o:Entity_Requirement', - '@type': 'pig:Entity', + 'pig:specializes': 'pig:Entity', 'pig:itemType': { '@id': 'pig:Entity' }, 'dcterms:title': [ { '@value': 'Requirement', '@language': 'en' } @@ -658,13 +652,13 @@ describe('PIG Package Constraint Validation', () => { expect(pkg.status().ok).toBe(false); expect(pkg.status().status).toBe(675); // Invalid hasClass type - /* const result = pkg.get() as IAPackage; + /* const rsp = pkg.get() as IAPackage; - expect(result.ok).toBe(false); - expect(result.status).toBe(675); - expect(result.statusText).toContain('hasSourceLink[0].hasClass'); - expect(result.statusText).toContain('o:Property_Status'); - expect(result.statusText).toContain('expected pig:Link, found pig:Property'); */ + expect(rsp.ok).toBe(false); + expect(rsp.status).toBe(675); + expect(rsp.statusText).toContain('hasSourceLink[0].hasClass'); + expect(rsp.statusText).toContain('o:Property_Status'); + expect(rsp.statusText).toContain('expected pig:Link, found pig:Property'); */ }); }); }); From 4d44961a91ee74b8b3700c986577f4ab939a2278 Mon Sep 17 00:00:00 2001 From: Oskar von Dungern Date: Wed, 28 Jan 2026 23:49:44 +0100 Subject: [PATCH 09/26] Update src/utils/schemas/pig/index.html Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/utils/schemas/pig/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/schemas/pig/index.html b/src/utils/schemas/pig/index.html index 0a1bec9..1e580e9 100644 --- a/src/utils/schemas/pig/index.html +++ b/src/utils/schemas/pig/index.html @@ -3,7 +3,7 @@ - + Product Information Graph (PIG) | CASCaRA | GfSE From 57dca733931567a1aeeb4603a917be8c2da18901 Mon Sep 17 00:00:00 2001 From: Oskar von Dungern Date: Wed, 28 Jan 2026 23:51:22 +0100 Subject: [PATCH 10/26] Update src/utils/lib/messages.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/utils/lib/messages.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/lib/messages.ts b/src/utils/lib/messages.ts index 46353f3..c9f323f 100644 --- a/src/utils/lib/messages.ts +++ b/src/utils/lib/messages.ts @@ -146,7 +146,7 @@ const messages: Record string>> }, 623: { en: (fieldName: string) => `${fieldName} is missing id`, - de: (fieldName: string) => `${fieldName} fehlt der id`, + de: (fieldName: string) => `${fieldName} fehlt die ID`, fr: (fieldName: string) => `${fieldName} manque l'id`, es: (fieldName: string) => `${fieldName} falta el id` }, From 1affaca3bdca1ff88d433308f79b11f5b3017b53 Mon Sep 17 00:00:00 2001 From: Oskar von Dungern Date: Thu, 29 Jan 2026 00:24:21 +0100 Subject: [PATCH 11/26] Update src/utils/import/ReqIF/reqif2pig.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/utils/import/ReqIF/reqif2pig.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/utils/import/ReqIF/reqif2pig.ts b/src/utils/import/ReqIF/reqif2pig.ts index 4516eaa..ea5241a 100644 --- a/src/utils/import/ReqIF/reqif2pig.ts +++ b/src/utils/import/ReqIF/reqif2pig.ts @@ -11,7 +11,6 @@ */ import { IRsp } from '../../lib/messages'; -import { IEntity, IRelationship, IProperty, IAnEntity, IARelationship } from '../../schemas/pig/ts/pig-metaclasses'; export class reqif2pig { private validate(xml: Document): boolean { From ebdc40f9ebf9a6e876f586ffdb951d29d3661109 Mon Sep 17 00:00:00 2001 From: Oskar von Dungern Date: Thu, 29 Jan 2026 00:24:56 +0100 Subject: [PATCH 12/26] Update src/utils/lib/mvf.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/utils/lib/mvf.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/lib/mvf.ts b/src/utils/lib/mvf.ts index 501f9e2..3f23411 100644 --- a/src/utils/lib/mvf.ts +++ b/src/utils/lib/mvf.ts @@ -11,7 +11,7 @@ * License and terms of use: Apache 2.0 (http://www.apache.org/licenses/LICENSE-2.0) */ -import { LIB, JsonPrimitive, JsonValue, JsonObject, JsonArray, logger } from './helpers'; +import { LIB, JsonPrimitive, JsonValue, JsonObject, logger } from './helpers'; // Map PIG metamodel attributes to/from JSON-LD keys; // all other keys are derived from the ontology and handled dynamically: From 4a456114faeec79cafd5695c3ae1f255738187a1 Mon Sep 17 00:00:00 2001 From: "OD-T14S-25\\PCUser" Date: Thu, 29 Jan 2026 00:33:03 +0100 Subject: [PATCH 13/26] changes following suggestions of Copilot merge review. --- .../import-package-jsonld.ts.goodButReplaced | 142 ------------------ src/utils/import/xml/import-package-xml.ts | 4 - src/utils/schemas/pig/index.html | 4 +- src/utils/schemas/pig/jsonld/Entity.json | 13 +- .../schemas/pig/jsonld/Relationship.json | 121 +++++++-------- src/utils/schemas/pig/jsonld/aPackage.json | 2 + .../schemas/pig/jsonld/aRelationship.json | 2 + tests/unit/pig-metaclasses-xml.spec.ts | 2 +- 8 files changed, 75 insertions(+), 215 deletions(-) delete mode 100644 src/utils/import/jsonld/import-package-jsonld.ts.goodButReplaced diff --git a/src/utils/import/jsonld/import-package-jsonld.ts.goodButReplaced b/src/utils/import/jsonld/import-package-jsonld.ts.goodButReplaced deleted file mode 100644 index 3a9b2ce..0000000 --- a/src/utils/import/jsonld/import-package-jsonld.ts.goodButReplaced +++ /dev/null @@ -1,142 +0,0 @@ -/*! Cross-environment JSON-LD importer. - * Copyright 2025 GfSE (https://gfse.org) - * License and terms of use: Apache 2.0 (http://www.apache.org/licenses/LICENSE-2.0) - */ -/** - * Cross-environment JSON-LD importer. - * - Accepts a Node file path, an http(s) URL string or a browser File/Blob. - * - Extracts elements from '@graph' (or 'graph'), converts JSON-LD keys to internal keys - * and instantiates matching PIG class instances where possible. - * - * Dependencies: - * Authors: oskar.dungern@gfse.org, .. - * License and terms of use: Apache 2.0 (http://www.apache.org/licenses/LICENSE-2.0) - * We appreciate any correction, comment or contribution as Github issue (https://github.com/GfSE/CASCaDE-Reference-Implementation/issues) - * - * Usage: - * - Node: await importJsonLd('C:/path/to/file.jsonld') - * - URL: await importJsonLd('https://example/.../doc.jsonld') - * - Browser: await importJsonLd(fileInput.files[0]) - */ - -import { IRsp, rspOK, Msg } from "../../lib/messages"; -import { LIB, logger } from "../../lib/helpers"; -import { - Property, Link, Entity, Relationship, - AProperty, ASourceLink, ATargetLink, AnEntity, ARelationship, PigItemType, - TPigItem -} from '../../schemas/pig/pig-metaclasses'; -import { SCH_LD } from '../../schemas/pig/pig-schemata-jsonld'; - -export async function importJSONLD(source: string | File | Blob): Promise { - const rsp = await LIB.readFileAsText(source); - if (!rsp.ok) - return rsp; - - const text = rsp.response as string; - logger.info('importJSONLD: loaded text length ' + text.length); - - let doc: any; - try { - doc = JSON.parse(text); - } catch (err: any) { - return Msg.create(690, err?.message ?? err); - } - - // ✅ Validate entire JSON-LD document structure - const isValidPackage = SCH_LD.validatePackageLD(doc); - if (!isValidPackage) { - const errors = SCH_LD.getValidatePackageLDErrors(); - logger.error('JSON-LD package validation failed:', errors); - return Msg.create(697, errors); - } - - // logger.debug('importJSONLD: parsed ', doc); - return instantiateFromDoc(doc); -} - -// Instantiate objects from parsed JSON-LD document -function instantiateFromDoc(doc: any): IRsp { - const created: TPigItem[] = []; - const graph: any[] = Array.isArray(doc['@graph']) ? doc['@graph'] : (Array.isArray(doc.graph) ? doc.graph : []); - // logger.debug('importJSONLD: @graph', graph); - for (const item of graph) { - /* // convert JSON-LD keys to internal keys (immutable) - let obj = LIB.renameJsonTags(item as JsonValue, LIB.fromJSONLD, { mutate: false }) as JsonObject; - obj = LIB.replaceIdObjects(obj) as JsonObject; */ - - if (!item['pig:itemType'] || !item['pig:itemType']['@id']) { - logger.warn('importJSONLD: @graph element missing pig:itemType, skipping '+ item.id); - continue; - } - - // determine itemType - const itype: any = item['pig:itemType']['@id'] as any; - - // temporary filter to allow development step by step per itemType: - if (![PigItemType.Property, PigItemType.Link, PigItemType.Entity, PigItemType.Relationship, - PigItemType.anEntity, PigItemType.aRelationship ].includes(itype)) - continue; - // logger.debug('importJSONLD: @graph renamed', item, itype); - - let instance: any = null; - try { - switch (itype) { - case PigItemType.Property: - instance = new Property(); - break; - case PigItemType.Link: - instance = new Link(); - break; - case PigItemType.Entity: - instance = new Entity(); - break; - case PigItemType.Relationship: - instance = new Relationship(); - break; - case PigItemType.aProperty: - instance = new AProperty(); - break; - case PigItemType.aSourceLink: - instance = new ASourceLink(); - break; - case PigItemType.aTargetLink: - instance = new ATargetLink(); - break; - case PigItemType.anEntity: - instance = new AnEntity(); - break; - case PigItemType.aRelationship: - instance = new ARelationship(); - break; - default: - instance = null; - } - } catch { - instance = null; - } - - if (instance) { - try { - (instance as any).setJSONLD(item, created); - created.push(instance); - } catch (err) { - // do not abort: keep partially populated instance for inspection - // eslint-disable-next-line no-console - logger.warn(`Warning: failed to populate instance with itemType '${itype}': ${err}`); - } - /* } else { - // fallback: push converted plain object - created.push(obj); */ - } - } - let res: IRsp; - if (created.length === graph.length) - res = rspOK; - else - res = Msg.create(691, created.length, graph.length); - - res.response = created; - res.responseType = 'json'; - return res as IRsp; -} diff --git a/src/utils/import/xml/import-package-xml.ts b/src/utils/import/xml/import-package-xml.ts index 8283611..eb58958 100644 --- a/src/utils/import/xml/import-package-xml.ts +++ b/src/utils/import/xml/import-package-xml.ts @@ -89,8 +89,4 @@ export async function importXML(source: string | File | Blob): Promise { result.responseType = 'json'; return result as IRsp; -/* - // TEMPORARY: Return not implemented message - return Msg.create(699, 'XML import'); -*/ } diff --git a/src/utils/schemas/pig/index.html b/src/utils/schemas/pig/index.html index 0a1bec9..dd6dff9 100644 --- a/src/utils/schemas/pig/index.html +++ b/src/utils/schemas/pig/index.html @@ -3,7 +3,7 @@ - + Product Information Graph (PIG) | CASCaRA | GfSE @@ -474,4 +474,4 @@

    🐙 Repository

    - \ No newline at end of file + diff --git a/src/utils/schemas/pig/jsonld/Entity.json b/src/utils/schemas/pig/jsonld/Entity.json index c4e980c..0da274a 100644 --- a/src/utils/schemas/pig/jsonld/Entity.json +++ b/src/utils/schemas/pig/jsonld/Entity.json @@ -33,12 +33,13 @@ "$ref": "#/$defs/languageValue" } }, - "dcterms:description": { - "type": "array", - "items": { - "$ref": "#/$defs/languageValue" - } - }, + "dcterms:description": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/$defs/languageValue" + } + }, "pig:eligibleProperty": { "type": "array", "description": "Array of Property class references that can be used with this Entity", diff --git a/src/utils/schemas/pig/jsonld/Relationship.json b/src/utils/schemas/pig/jsonld/Relationship.json index a627689..f3f7884 100644 --- a/src/utils/schemas/pig/jsonld/Relationship.json +++ b/src/utils/schemas/pig/jsonld/Relationship.json @@ -4,68 +4,69 @@ "title": "PIG Relationship JSON-LD Schema", "description": "Validates Relationship class definitions for directed connections between entities. Configures which properties (pig:eligibleProperty), source links (pig:eligibleSourceLink) and target links (pig:eligibleTargetLink) are allowed. Relationships are reified connections that can carry their own properties, enabling rich traceability and dependency modeling (e.g., 'Refinement' relationships with rationale and traceability status). Relationships classify meaningful statements including a subject and an object, where both the subject and the object is an entity or relationship instance. Supports specialization hierarchies and optional icons.", "type": "object", - "properties": { + "properties": { + "@id": { + "$ref": "#/$defs/idString" + }, + "@type": { + "$ref": "#/$defs/idString" + }, + "pig:specializes": { + "$ref": "#/$defs/idObject" + }, + "pig:itemType": { + "type": "object", + "required": [ "@id" ], + "properties": { "@id": { - "$ref": "#/$defs/idString" - }, - "@type": { - "$ref": "#/$defs/idString" - }, - "pig:specializes": { - "$ref": "#/$defs/idObject" - }, - "pig:itemType": { - "type": "object", - "required": [ "@id" ], - "properties": { - "@id": { - "type": "string", - "enum": [ "pig:Relationship" ], - "description": "The PigItemType for pig:Relationship" - } - }, - "additionalProperties": false - }, - "dcterms:title": { - "type": "array", - "minItems": 1, - "items": { - "$ref": "#/$defs/languageValue" - } - }, - "dcterms:description": { - "type": "array", - "items": { - "$ref": "#/$defs/languageValue" - } - }, - "pig:eligibleProperty": { - "type": "array", - "description": "Array of Property class references that can be used with this Relationship", - "items": { - "$ref": "#/$defs/idObject" - } - }, - "pig:eligibleSourceLink": { - "$ref": "#/$defs/idObject", - "description": "Link class reference that defines the source endpoint of this Relationship" - }, - "pig:eligibleTargetLink": { - "$ref": "#/$defs/idObject", - "description": "Link class reference that defines the target endpoint of this Relationship" - }, - "pig:icon": { - "type": "object", - "description": "Optional icon representation for this Relationship type", - "properties": { - "@value": { - "type": "string", - "description": "Icon identifier or path" - } - }, - "additionalProperties": false + "type": "string", + "enum": [ "pig:Relationship" ], + "description": "The PigItemType for pig:Relationship" } + }, + "additionalProperties": false + }, + "dcterms:title": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/$defs/languageValue" + } + }, + "dcterms:description": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/$defs/languageValue" + } + }, + "pig:eligibleProperty": { + "type": "array", + "description": "Array of Property class references that can be used with this Relationship", + "items": { + "$ref": "#/$defs/idObject" + } }, + "pig:eligibleSourceLink": { + "$ref": "#/$defs/idObject", + "description": "Link class reference that defines the source endpoint of this Relationship" + }, + "pig:eligibleTargetLink": { + "$ref": "#/$defs/idObject", + "description": "Link class reference that defines the target endpoint of this Relationship" + }, + "pig:icon": { + "type": "object", + "description": "Optional icon representation for this Relationship type", + "properties": { + "@value": { + "type": "string", + "description": "Icon identifier or path" + } + }, + "additionalProperties": false + } + }, "required": [ "@id", "pig:itemType", @@ -117,4 +118,4 @@ "description": "Multi-language text value with optional language tag" } } -} \ No newline at end of file +} diff --git a/src/utils/schemas/pig/jsonld/aPackage.json b/src/utils/schemas/pig/jsonld/aPackage.json index cbb05de..70299e6 100644 --- a/src/utils/schemas/pig/jsonld/aPackage.json +++ b/src/utils/schemas/pig/jsonld/aPackage.json @@ -52,6 +52,7 @@ "dcterms:title": { "type": "array", "description": "Optional package title", + "minItems": 1, "items": { "$ref": "#/$defs/languageValue" } @@ -59,6 +60,7 @@ "dcterms:description": { "type": "array", "description": "Optional package description", + "minItems": 1, "items": { "$ref": "#/$defs/languageValue" } diff --git a/src/utils/schemas/pig/jsonld/aRelationship.json b/src/utils/schemas/pig/jsonld/aRelationship.json index 31e9829..277be77 100644 --- a/src/utils/schemas/pig/jsonld/aRelationship.json +++ b/src/utils/schemas/pig/jsonld/aRelationship.json @@ -47,6 +47,7 @@ "dcterms:title": { "type": "array", "description": "Multi-language titles", + "minItems": 1, "items": { "$ref": "#/$defs/languageValue" } @@ -54,6 +55,7 @@ "dcterms:description": { "type": "array", "description": "Multi-language descriptions", + "minItems": 1, "items": { "$ref": "#/$defs/languageValue" } diff --git a/tests/unit/pig-metaclasses-xml.spec.ts b/tests/unit/pig-metaclasses-xml.spec.ts index cb1c865..d9b8af2 100644 --- a/tests/unit/pig-metaclasses-xml.spec.ts +++ b/tests/unit/pig-metaclasses-xml.spec.ts @@ -420,7 +420,7 @@ describe('PIG Metaclasses XML Import', () => { `; const anEntity = new AnEntity().setXML(xmlInput); - console.debug('anEntity', JSON.stringify(anEntity,null,2)); + // console.debug('anEntity', JSON.stringify(anEntity,null,2)); // check the attribute values upon creation: if (!anEntity.status().ok) From 8d3e6811d670b33c61b1bd83af6fdf126bd4081d Mon Sep 17 00:00:00 2001 From: "OD-T14S-25\\PCUser" Date: Thu, 29 Jan 2026 18:08:49 +0100 Subject: [PATCH 14/26] add a getHTML stub with 'not implenmented yet' to class aPackage. --- src/utils/schemas/pig/ts/pig-metaclasses.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/utils/schemas/pig/ts/pig-metaclasses.ts b/src/utils/schemas/pig/ts/pig-metaclasses.ts index 1d6459b..b4b85b6 100644 --- a/src/utils/schemas/pig/ts/pig-metaclasses.ts +++ b/src/utils/schemas/pig/ts/pig-metaclasses.ts @@ -1234,6 +1234,9 @@ export class APackage extends Identifiable implements IAPackage { // logger.debug(`APackage.setXML: package ${JSON.stringify(this,null,2)} set with status`, this.lastStatus); return this; } + getHTML(options?: object): stringHTML[] { + return ['
    not implemented yet
    ']; + } /** * Extract all items from an instantiated APackage with status validation * Returns an array with the package as first element (if valid), followed by all valid graph items @@ -1249,7 +1252,6 @@ export class APackage extends Identifiable implements IAPackage { * // allItems[1..n] === all valid graph items */ getAllItems(): TPigItem[] { - // Validate package structure if (!Array.isArray(this.graph)) { logger.warn('LIB.allItems: APackage has no valid graph array'); From 615c3ef4e234e80ae9d723306c1aff5d4cea4f65 Mon Sep 17 00:00:00 2001 From: "OD-T14S-25\\PCUser" Date: Fri, 30 Jan 2026 10:50:26 +0100 Subject: [PATCH 15/26] getHTML() for anEntity and aPackage implemented. With all probability, the styles must be refined and perhaps the content as well. --- src/utils/schemas/pig/ts/pig-metaclasses.ts | 77 ++++++++++++++++++++- 1 file changed, 74 insertions(+), 3 deletions(-) diff --git a/src/utils/schemas/pig/ts/pig-metaclasses.ts b/src/utils/schemas/pig/ts/pig-metaclasses.ts index b4b85b6..18c258f 100644 --- a/src/utils/schemas/pig/ts/pig-metaclasses.ts +++ b/src/utils/schemas/pig/ts/pig-metaclasses.ts @@ -912,8 +912,48 @@ export class AnEntity extends AnElement implements IAnEntity { return this; } getHTML(options?: object): stringHTML { - // ToDo: implement a HTML representation of the entity including its properties - return '
    not implemented yet
    '; + if (!this.lastStatus.ok) return '
    Invalid entity
    '; + + const titleText = this.title?.[0]?.value || ''; + const descText = this.description?.[0]?.value || ''; + + // Build properties HTML + let propertiesHTML = ''; + if (this.hasProperty && this.hasProperty.length > 0) { + propertiesHTML = '

    Properties

    '; + for (const prop of this.hasProperty) { + const propData = prop.get(); + if (propData && propData.hasClass) { + const propValue = propData.value || propData.idRef || '—'; + propertiesHTML += `
    ${propData.hasClass}
    ${propValue}
    `; + } + } + propertiesHTML += '
    '; + } + + // Build metadata HTML + const metadataHTML = ``; + + return `
    +
    + ${titleText ? `

    ${titleText}

    ` : ''} + ${descText ? `
    ${descText}
    ` : ''} +
    +
    + ${propertiesHTML} + ${metadataHTML} +
    +
    `; } } @@ -1235,7 +1275,38 @@ export class APackage extends Identifiable implements IAPackage { return this; } getHTML(options?: object): stringHTML[] { - return ['
    not implemented yet
    ']; + if (!this.lastStatus.ok) { + return ['
    Invalid package
    ']; + } + + const result: stringHTML[] = []; + + // 1. Package metadata as first element + const titleText = this.title?.[0]?.value || 'Untitled Package'; + const descText = this.description?.[0]?.value || ''; + + const packageMetadata = ``; + + result.push(packageMetadata); + + // 2. Add HTML for all anEntity items + for (const item of this.graph) { + if (item.itemType === PigItemType.anEntity) { + const entityHTML = (item as AnEntity).getHTML(options); + result.push(entityHTML); + } + } + + return result; } /** * Extract all items from an instantiated APackage with status validation From 50ff4246fbdcbce3ae3ba6967521ec3d03d1a5fa Mon Sep 17 00:00:00 2001 From: "OD-T14S-25\\PCUser" Date: Fri, 30 Jan 2026 11:13:50 +0100 Subject: [PATCH 16/26] now with test-suite for aPackage.getHTML. --- tests/unit/pig-package-gethtml.spec.ts | 343 +++++++++++++++++++++++++ 1 file changed, 343 insertions(+) create mode 100644 tests/unit/pig-package-gethtml.spec.ts diff --git a/tests/unit/pig-package-gethtml.spec.ts b/tests/unit/pig-package-gethtml.spec.ts new file mode 100644 index 0000000..fca4c8f --- /dev/null +++ b/tests/unit/pig-package-gethtml.spec.ts @@ -0,0 +1,343 @@ +/*! + * JEST Test Suite for PIG Package getHTML() Method + * Copyright 2025 GfSE (https://gfse.org) + * License and terms of use: Apache 2.0 (http://www.apache.org/licenses/LICENSE-2.0) + */ + +import { APackage, PigItemType } from '../../src/utils/schemas/pig/ts/pig-metaclasses'; + +describe('PIG Package getHTML() Method', () => { + describe('Valid Package with Single Entity', () => { + test('should return array of HTML strings with package metadata and entity', () => { + const validPackageWithEntity = { + '@context': { + 'pig': 'https://product-information-graph.gfse.org/', + 'dcterms': 'http://purl.org/dc/terms/', + 'sh': 'http://www.w3.org/ns/shacl#', + 'o': 'https://example.org/ontology/', + 'd': 'https://example.org/data/' + }, + '@id': 'd:test-package-html', + 'pig:itemType': { '@id': 'pig:aPackage' }, + 'dcterms:title': [ + { '@value': 'Test Package', '@language': 'en' } + ], + 'dcterms:description': [ + { '@value': 'A test package for HTML generation', '@language': 'en' } + ], + 'dcterms:modified': '2025-01-30T10:00:00Z', + 'dcterms:creator': 'Test Creator', + '@graph': [ + { + '@id': 'o:Property_Status', + 'pig:specializes': 'pig:Property', + 'pig:itemType': { '@id': 'pig:Property' }, + 'dcterms:title': [ + { '@value': 'Status', '@language': 'en' } + ], + 'sh:datatype': { '@id': 'xs:string' } + }, + { + '@id': 'o:Entity_Requirement', + 'pig:specializes': 'pig:Entity', + 'pig:itemType': { '@id': 'pig:Entity' }, + 'dcterms:title': [ + { '@value': 'Requirement', '@language': 'en' } + ] + }, + { + '@id': 'd:REQ-001', + '@type': 'o:Entity_Requirement', + 'pig:itemType': { '@id': 'pig:anEntity' }, + 'pig:revision': '1.0', + 'dcterms:modified': '2025-01-30T10:00:00Z', + 'dcterms:creator': 'John Doe', + 'dcterms:title': [ + { '@value': 'System shall be secure', '@language': 'en' } + ], + 'dcterms:description': [ + { '@value': 'The system must implement security measures', '@language': 'en' } + ], + 'o:Property_Status': [ + { + 'pig:itemType': { '@id': 'pig:aProperty' }, + '@value': 'Draft' + } + ] + } + ] + }; + + const pkg = new APackage().setJSONLD(validPackageWithEntity); + + expect(pkg.status().ok).toBe(true); + + const htmlList = pkg.getHTML(); + + // Should return an array + expect(Array.isArray(htmlList)).toBe(true); + + // Should have 2 elements: package metadata + 1 entity + expect(htmlList.length).toBe(2); + + // First element: Package metadata + const packageHTML = htmlList[0]; + expect(typeof packageHTML).toBe('string'); + expect(packageHTML).toContain('pig-package-metadata'); + expect(packageHTML).toContain('Test Package'); + expect(packageHTML).toContain('A test package for HTML generation'); + expect(packageHTML).toContain('d:test-package-html'); + expect(packageHTML).toContain('Test Creator'); + expect(packageHTML).toContain('Items in Graph'); + expect(packageHTML).toContain('3'); // 1 Property + 1 Entity + 1 anEntity + + // Should NOT contain context + expect(packageHTML).not.toContain('@context'); + expect(packageHTML).not.toContain('https://product-information-graph.gfse.org/'); + + // Second element: Entity HTML + const entityHTML = htmlList[1]; + expect(typeof entityHTML).toBe('string'); + expect(entityHTML).toContain('pig-entity'); + expect(entityHTML).toContain('System shall be secure'); + expect(entityHTML).toContain('The system must implement security measures'); + expect(entityHTML).toContain('d:REQ-001'); + expect(entityHTML).toContain('o:Entity_Requirement'); + expect(entityHTML).toContain('1.0'); // revision + expect(entityHTML).toContain('John Doe'); + expect(entityHTML).toContain('o:Property_Status'); + expect(entityHTML).toContain('Draft'); + }); + + test('should return only package metadata when no entities present', () => { + const packageWithoutEntities = { + '@context': { + 'pig': 'https://product-information-graph.gfse.org/', + 'dcterms': 'http://purl.org/dc/terms/', + 'sh': 'http://www.w3.org/ns/shacl#', + 'o': 'https://example.org/ontology/' + }, + '@id': 'd:package-no-entities', + 'pig:itemType': { '@id': 'pig:aPackage' }, + 'dcterms:title': [ + { '@value': 'Empty Package', '@language': 'en' } + ], + 'dcterms:modified': '2025-01-30T10:00:00Z', + '@graph': [ + { + '@id': 'o:Property_Name', + 'pig:specializes': 'pig:Property', + 'pig:itemType': { '@id': 'pig:Property' }, + 'dcterms:title': [ + { '@value': 'Name', '@language': 'en' } + ], + 'sh:datatype': { '@id': 'xs:string' } + } + ] + }; + + const pkg = new APackage().setJSONLD(packageWithoutEntities); + + expect(pkg.status().ok).toBe(true); + + const htmlList = pkg.getHTML(); + + // Should have only 1 element (package metadata) + expect(htmlList.length).toBe(1); + + const packageHTML = htmlList[0]; + expect(packageHTML).toContain('Empty Package'); + expect(packageHTML).toContain('Items in Graph'); + expect(packageHTML).toContain('1'); // Only 1 Property + }); + + test('should ignore non-entity items (Property, Link, Relationship)', () => { + const packageWithMixedItems = { + '@context': { + 'pig': 'https://product-information-graph.gfse.org/', + 'dcterms': 'http://purl.org/dc/terms/', + 'sh': 'http://www.w3.org/ns/shacl#', + 'o': 'https://example.org/ontology/', + 'd': 'https://example.org/data/' + }, + '@id': 'd:package-mixed', + 'pig:itemType': { '@id': 'pig:aPackage' }, + 'dcterms:title': [ + { '@value': 'Mixed Package', '@language': 'en' } + ], + 'dcterms:modified': '2025-01-30T10:00:00Z', + '@graph': [ + { + '@id': 'o:Property_Status', + 'pig:specializes': 'pig:Property', + 'pig:itemType': { '@id': 'pig:Property' }, + 'dcterms:title': [ + { '@value': 'Status', '@language': 'en' } + ], + 'sh:datatype': { '@id': 'xs:string' } + }, + { + '@id': 'o:Link_RefersTo', + 'pig:specializes': 'pig:Link', + 'pig:itemType': { '@id': 'pig:Link' }, + 'dcterms:title': [ + { '@value': 'Refers To', '@language': 'en' } + ], + 'pig:eligibleEndpoint': [ + { '@id': 'o:Entity_Requirement' } + ] + }, + { + '@id': 'o:Entity_Requirement', + 'pig:specializes': 'pig:Entity', + 'pig:itemType': { '@id': 'pig:Entity' }, + 'dcterms:title': [ + { '@value': 'Requirement', '@language': 'en' } + ] + }, + { + '@id': 'o:Relationship_Trace', + 'pig:specializes': 'pig:Relationship', + 'pig:itemType': { '@id': 'pig:Relationship' }, + 'dcterms:title': [ + { '@value': 'Trace', '@language': 'en' } + ] + }, + { + '@id': 'd:REQ-002', + '@type': 'o:Entity_Requirement', + 'pig:itemType': { '@id': 'pig:anEntity' }, + 'pig:revision': '1.0', + 'dcterms:modified': '2025-01-30T10:00:00Z', + 'dcterms:title': [ + { '@value': 'Test Entity', '@language': 'en' } + ] + } + ] + }; + + const pkg = new APackage().setJSONLD(packageWithMixedItems); + + expect(pkg.status().ok).toBe(true); + + const htmlList = pkg.getHTML(); + + // Package metadata + 1 entity (ignoring Property, Link, Entity class, Relationship) + expect(htmlList.length).toBe(2); + + expect(htmlList[0]).toContain('Mixed Package'); + expect(htmlList[1]).toContain('d:REQ-002'); + expect(htmlList[1]).toContain('Test Entity'); + }); + }); + + describe('Invalid Package', () => { + test('should return error HTML for invalid package', () => { + const invalidPackage = { + '@context': { + 'pig': 'https://product-information-graph.gfse.org/' + }, + '@id': 'd:invalid-package', + 'pig:itemType': { '@id': 'pig:aPackage' }, + '@graph': [] // Empty graph - invalid! + }; + + const pkg = new APackage().setJSONLD(invalidPackage); + + expect(pkg.status().ok).toBe(false); + + const htmlList = pkg.getHTML(); + + expect(htmlList.length).toBe(1); + expect(htmlList[0]).toContain('pig-error'); + expect(htmlList[0]).toContain('Invalid package'); + }); + }); + + describe('Multiple Entities', () => { + test('should return HTML for all entities in package', () => { + const packageWithMultipleEntities = { + '@context': { + 'pig': 'https://product-information-graph.gfse.org/', + 'dcterms': 'http://purl.org/dc/terms/', + 'sh': 'http://www.w3.org/ns/shacl#', + 'o': 'https://example.org/ontology/', + 'd': 'https://example.org/data/' + }, + '@id': 'd:package-multiple', + 'pig:itemType': { '@id': 'pig:aPackage' }, + 'dcterms:title': [ + { '@value': 'Multi-Entity Package', '@language': 'en' } + ], + 'dcterms:modified': '2025-01-30T10:00:00Z', + '@graph': [ + { + '@id': 'o:Entity_Requirement', + 'pig:specializes': 'pig:Entity', + 'pig:itemType': { '@id': 'pig:Entity' }, + 'dcterms:title': [ + { '@value': 'Requirement', '@language': 'en' } + ] + }, + { + '@id': 'd:REQ-001', + '@type': 'o:Entity_Requirement', + 'pig:itemType': { '@id': 'pig:anEntity' }, + 'pig:revision': '1.0', + 'dcterms:modified': '2025-01-30T10:00:00Z', + 'dcterms:title': [ + { '@value': 'First Requirement', '@language': 'en' } + ] + }, + { + '@id': 'd:REQ-002', + '@type': 'o:Entity_Requirement', + 'pig:itemType': { '@id': 'pig:anEntity' }, + 'pig:revision': '1.1', + 'dcterms:modified': '2025-01-30T11:00:00Z', + 'dcterms:title': [ + { '@value': 'Second Requirement', '@language': 'en' } + ] + }, + { + '@id': 'd:REQ-003', + '@type': 'o:Entity_Requirement', + 'pig:itemType': { '@id': 'pig:anEntity' }, + 'pig:revision': '2.0', + 'dcterms:modified': '2025-01-30T12:00:00Z', + 'dcterms:title': [ + { '@value': 'Third Requirement', '@language': 'en' } + ] + } + ] + }; + + const pkg = new APackage().setJSONLD(packageWithMultipleEntities); + + expect(pkg.status().ok).toBe(true); + + const htmlList = pkg.getHTML(); + + // 1 package metadata + 3 entities + expect(htmlList.length).toBe(4); + + // Check package metadata + expect(htmlList[0]).toContain('Multi-Entity Package'); + expect(htmlList[0]).toContain('Items in Graph'); + expect(htmlList[0]).toContain('4'); // 1 Entity class + 3 anEntity instances + + // Check entities + expect(htmlList[1]).toContain('First Requirement'); + expect(htmlList[1]).toContain('d:REQ-001'); + expect(htmlList[1]).toContain('1.0'); + + expect(htmlList[2]).toContain('Second Requirement'); + expect(htmlList[2]).toContain('d:REQ-002'); + expect(htmlList[2]).toContain('1.1'); + + expect(htmlList[3]).toContain('Third Requirement'); + expect(htmlList[3]).toContain('d:REQ-003'); + expect(htmlList[3]).toContain('2.0'); + }); + }); +}); From e79a6d701270b0714d2ca176b419bf9902f26de8 Mon Sep 17 00:00:00 2001 From: Oskar von Dungern Date: Fri, 30 Jan 2026 11:30:54 +0100 Subject: [PATCH 17/26] Update src/utils/schemas/pig/ts/pig-metaclasses.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/utils/schemas/pig/ts/pig-metaclasses.ts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/utils/schemas/pig/ts/pig-metaclasses.ts b/src/utils/schemas/pig/ts/pig-metaclasses.ts index 18c258f..bff7400 100644 --- a/src/utils/schemas/pig/ts/pig-metaclasses.ts +++ b/src/utils/schemas/pig/ts/pig-metaclasses.ts @@ -945,15 +945,15 @@ export class AnEntity extends AnElement implements IAnEntity { `; return `
    -
    - ${titleText ? `

    ${titleText}

    ` : ''} - ${descText ? `
    ${descText}
    ` : ''} -
    -
    - ${propertiesHTML} - ${metadataHTML} -
    -
    `; +
    + ${titleText ? `

    ${titleText}

    ` : ''} + ${descText ? `
    ${descText}
    ` : ''} +
    +
    + ${propertiesHTML} + ${metadataHTML} +
    + `; } } From 274e03665cc1fe4af957fe46eda2f8da2059528f Mon Sep 17 00:00:00 2001 From: Oskar von Dungern Date: Fri, 30 Jan 2026 11:32:36 +0100 Subject: [PATCH 18/26] Update tests/unit/pig-package-gethtml.spec.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- tests/unit/pig-package-gethtml.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/pig-package-gethtml.spec.ts b/tests/unit/pig-package-gethtml.spec.ts index fca4c8f..c723acf 100644 --- a/tests/unit/pig-package-gethtml.spec.ts +++ b/tests/unit/pig-package-gethtml.spec.ts @@ -4,7 +4,7 @@ * License and terms of use: Apache 2.0 (http://www.apache.org/licenses/LICENSE-2.0) */ -import { APackage, PigItemType } from '../../src/utils/schemas/pig/ts/pig-metaclasses'; +import { APackage } from '../../src/utils/schemas/pig/ts/pig-metaclasses'; describe('PIG Package getHTML() Method', () => { describe('Valid Package with Single Entity', () => { From 7c06780b78920c381693976973f7f53b48dfbb1c Mon Sep 17 00:00:00 2001 From: "OD-T14S-25\\PCUser" Date: Fri, 30 Jan 2026 16:51:52 +0100 Subject: [PATCH 19/26] Reworked getHTML following Review suggestions. --- src/utils/lib/helpers.ts | 10 +- src/utils/schemas/pig/ts/pig-metaclasses.ts | 281 +++++++++++--------- tests/unit/pig-package-gethtml.spec.ts | 4 +- 3 files changed, 155 insertions(+), 140 deletions(-) diff --git a/src/utils/lib/helpers.ts b/src/utils/lib/helpers.ts index 5f82d90..729f3e1 100644 --- a/src/utils/lib/helpers.ts +++ b/src/utils/lib/helpers.ts @@ -54,15 +54,6 @@ export const XML_NAMESPACES = Object.entries(NAMESPACE_MAP) // LIB object with helper methods export const LIB = { -/* createRsp(status: number, statusText?: string, response?: T, responseType?: XMLHttpRequestResponseType): IRsp { - return { - status: status, - statusText: statusText, - response: response, - responseType: responseType, - ok: status > 199 && status < 300 || status === 0 - }; - }, */ isLeaf(node: JsonValue): boolean { return (typeof node === 'string' || typeof node === 'number' || typeof node === 'boolean'); @@ -243,6 +234,7 @@ export const LIB = { } return value; }, + /** * Wrap XML fragment with root element and namespace declarations * @param xml - XML fragment (without root wrapper) diff --git a/src/utils/schemas/pig/ts/pig-metaclasses.ts b/src/utils/schemas/pig/ts/pig-metaclasses.ts index bff7400..0afdd57 100644 --- a/src/utils/schemas/pig/ts/pig-metaclasses.ts +++ b/src/utils/schemas/pig/ts/pig-metaclasses.ts @@ -110,6 +110,11 @@ export interface ILanguageText { export interface IText { value: string; } +export interface IOptionsHTML { + widthLeft?: string; // e.g. '150px' or '67%' + itemType?: PigItemTypeValue[]; + lang?: tagIETF; +} ////////////////////////////////////// // The abstract classes: @@ -583,7 +588,7 @@ export class Entity extends Element implements IEntity { validate(itm: IEntity) { // Schema validation (AJV) - provides structural checks and reuses the idString definition // ... only at the lowest subclass level: - logger.debug('Entity.validate: ', itm); + // logger.debug('Entity.validate: ', itm); try { const ok = SCH.validateEntitySchema(itm); if (!ok) { @@ -911,11 +916,15 @@ export class AnEntity extends AnElement implements IAnEntity { return this.set(this.lastStatus.response as IAnEntity); return this; } - getHTML(options?: object): stringHTML { + getHTML(options?: IOptionsHTML): stringHTML { if (!this.lastStatus.ok) return '
    Invalid entity
    '; - const titleText = this.title?.[0]?.value || ''; - const descText = this.description?.[0]?.value || ''; + // Extract language preference from options, default to 'en-US' + const lang = options?.lang || 'en-US'; + const widthLeft = options?.widthLeft || '67%'; + + const titleText = getLocalText(this.title, lang); + const descText = getLocalText(this.description, lang); // Build properties HTML let propertiesHTML = ''; @@ -924,36 +933,36 @@ export class AnEntity extends AnElement implements IAnEntity { for (const prop of this.hasProperty) { const propData = prop.get(); if (propData && propData.hasClass) { - const propValue = propData.value || propData.idRef || '—'; - propertiesHTML += `
    ${propData.hasClass}
    ${propValue}
    `; + const propValue = passifyHTML(propData.value || propData.idRef || '—'); + const propClass = passifyHTML(propData.hasClass); + propertiesHTML += `
    ${propClass}
    ${propValue}
    `; } } propertiesHTML += ''; } - // Build metadata HTML + // Build metadata HTML with localized date const metadataHTML = ``; - return `
    -
    - ${titleText ? `

    ${titleText}

    ` : ''} - ${descText ? `
    ${descText}
    ` : ''} -
    -
    - ${propertiesHTML} - ${metadataHTML} -
    -
    `; + return `
    +
    + ${titleText ? `

    ${titleText}

    ` : ''} + ${descText ? `
    ${descText}
    ` : ''} +
    +
    + ${propertiesHTML} + ${metadataHTML} +
    +
    `; } } @@ -1274,31 +1283,49 @@ export class APackage extends Identifiable implements IAPackage { // logger.debug(`APackage.setXML: package ${JSON.stringify(this,null,2)} set with status`, this.lastStatus); return this; } - getHTML(options?: object): stringHTML[] { + getHTML(options?: IOptionsHTML): stringHTML[] { if (!this.lastStatus.ok) { - return ['
    Invalid package
    ']; + return [`
    Invalid package; status: (${this.lastStatus.status}) ${passifyHTML(this.lastStatus.statusText || '')}
    `]; } const result: stringHTML[] = []; - // 1. Package metadata as first element - const titleText = this.title?.[0]?.value || 'Untitled Package'; - const descText = this.description?.[0]?.value || ''; - - const packageMetadata = ``; */ - result.push(packageMetadata); - - // 2. Add HTML for all anEntity items + // 2. Add HTML for all anEntity items (options are passed through) for (const item of this.graph) { if (item.itemType === PigItemType.anEntity) { const entityHTML = (item as AnEntity).getHTML(options); @@ -2657,102 +2684,98 @@ function isMultiLanguageText(propertyName: string): boolean { return multiLangFields.has(localName) || multiLangFields.has(propertyName); } -/** - * Parse XML string and convert to JSON object - * @param xml - XML string to parse - * @returns IRsp with JsonObject on success, error message on failure - * -function xml2json(xml: stringXML): IRsp { - try { - logger.debug('xml2json: parsing ',xml); +// Helper function to get localized text from multi-language array +function getLocalText(texts?: ILanguageText[], lang?: TISODateString): string { + if (!texts || texts.length === 0) return ''; - // Parse XML string - const parser = new DOMParser(); - const doc = parser.parseFromString(xml, 'text/xml'); - - // Check for parsing errors - const parserError = doc.querySelector('parsererror'); - if (parserError) { - const errorMessage = parserError.textContent || 'Unknown XML parsing error'; - logger.error('xml2json: XML parsing failed:', errorMessage); - return Msg.create(690, 'XML', errorMessage); - } - - // Get root element - const rootElement = doc.documentElement; - if (!rootElement) { - return Msg.create(690, 'XML', 'No root element found in XML'); - } + lang = lang ?? 'en-US'; - // Extract data from XML element - const result: any = {}; + // Try to find exact language match + const exact = texts.find(t => t.lang === lang); + if (exact) return passifyHTML(exact.value); - // Extract id from attribute - if (rootElement.hasAttribute('id')) { - result.id = rootElement.getAttribute('id'); - } - - // Extract itemType from element name (e.g., pig:Property -> pig:Property) - const tagName = rootElement.tagName; - if (tagName.includes(':')) { - result.itemType = tagName; - } else { - result.itemType = tagName; - } + // Try to find language prefix match (e.g., 'en' for 'en-US') + const langPrefix = lang.split('-')[0]; + const prefixMatch = texts.find(t => t.lang?.startsWith(langPrefix)); + if (prefixMatch) return passifyHTML(prefixMatch.value); - // Extract rdf:type attribute if present (for hasClass) - if (rootElement.hasAttribute('rdf:type')) { - result.hasClass = rootElement.getAttribute('rdf:type'); - } - - // Extract specializes from rdfs:subClassOf or rdfs:subPropertyOf - const subClassOf = rootElement.querySelector('rdfs\\:subClassOf, [*|subClassOf]'); - if (subClassOf && subClassOf.textContent) { - result.specializes = subClassOf.textContent.trim(); - } - const subPropertyOf = rootElement.querySelector('rdfs\\:subPropertyOf, [*|subPropertyOf]'); - if (subPropertyOf && subPropertyOf.textContent) { - result.specializes = subPropertyOf.textContent.trim(); - } - - // Extract multi-language title elements - const titleElements = rootElement.querySelectorAll('dcterms\\:title, [*|title]'); - if (titleElements.length > 0) { - result.title = Array.from(titleElements).map(el => { - const langAttr = el.getAttribute('xml:lang') || el.getAttribute('lang'); - return { - value: el.textContent?.trim() || '', - ...(langAttr && { lang: langAttr }) - }; - }); - } - - // Extract multi-language description elements - const descriptionElements = rootElement.querySelectorAll('dcterms\\:description, [*|description]'); - if (descriptionElements.length > 0) { - result.description = Array.from(descriptionElements).map(el => { - const langAttr = el.getAttribute('xml:lang') || el.getAttribute('lang'); - return { - value: el.textContent?.trim() || '', - ...(langAttr && { lang: langAttr }) - }; - }); - } - - logger.debug('xml2json: successfully parsed XML'); - - // Return success with parsed result - return { - ...rspOK, - response: result as JsonObject, - responseType: 'json' - }; + // Fallback to first available text + return passifyHTML(texts[0].value); +} - } catch (err: any) { - logger.error('xml2json: exception:', err); - return Msg.create(690, 'XML', err?.message ?? String(err)); +// Format date using the specified locale +function getLocalDate(dateStr: string, lang?: TISODateString): string { + try { + return new Date(dateStr).toLocaleString(lang ?? 'en-US'); + } catch { + return dateStr; } -} */ +} +/** + * Sanitize HTML by removing dangerous elements and attributes that could execute code + * Preserves safe XHTML formatting (p, div, span, strong, em, etc.) + * Removes: '; + * const safe = passifyHTML(unsafe); + * // Returns: '

    Text

    ' + */ +function passifyHTML(html: string): string { + if (!html || typeof html !== 'string') return ''; + + let passified = html; + + // 1. Remove dangerous tags including their content + const dangerousTags = [ + 'script', + 'style', + 'embed', + 'iframe', + // 'object', + 'link', + 'meta', + 'base', + 'form' + ]; + + dangerousTags.forEach(tag => { + // Remove tags with any attributes (case-insensitive, multiline, greedy) + const regex = new RegExp(`<${tag}[^>]*>.*?<\\/${tag}>`, 'gis'); + passified = passified.replace(regex, ''); + // Remove self-closing tags + const selfClosing = new RegExp(`<${tag}[^>]*\\/?>`, 'gi'); + passified = passified.replace(selfClosing, ''); + }); + + // 2. Remove event handler attributes (onXYZ="...") + // Matches on followed by word characters, capturing until the closing quote + passified = passified.replace(/\s+on\w+\s*=\s*["'][^"']*["']/gi, ''); + + // 3. Remove dangerous protocols from href and src attributes + // Replace javascript: and data: with # (safer than removing the attribute) + passified = passified.replace(/\s+(href|src)\s*=\s*["']\s*(javascript|data):[^"']*["']/gi, ' $1="#"'); + + // 4. Remove dangerous attributes + const dangerousAttrs = [ + 'formaction', + 'action', + 'dynsrc', + 'lowsrc' + ]; + + dangerousAttrs.forEach(attr => { + const regex = new RegExp(`\\s+${attr}\\s*=\\s*["'][^"']*["']`, 'gi'); + passified = passified.replace(regex, ''); + }); + + return passified; +} /** * Replace top-level string values that are valid id-strings with id-objects. * - Non-recursive (flat): only replaces direct properties of the provided object. diff --git a/tests/unit/pig-package-gethtml.spec.ts b/tests/unit/pig-package-gethtml.spec.ts index c723acf..3a12c10 100644 --- a/tests/unit/pig-package-gethtml.spec.ts +++ b/tests/unit/pig-package-gethtml.spec.ts @@ -83,7 +83,7 @@ describe('PIG Package getHTML() Method', () => { // First element: Package metadata const packageHTML = htmlList[0]; expect(typeof packageHTML).toBe('string'); - expect(packageHTML).toContain('pig-package-metadata'); + expect(packageHTML).toContain('pig-apackage'); expect(packageHTML).toContain('Test Package'); expect(packageHTML).toContain('A test package for HTML generation'); expect(packageHTML).toContain('d:test-package-html'); @@ -98,7 +98,7 @@ describe('PIG Package getHTML() Method', () => { // Second element: Entity HTML const entityHTML = htmlList[1]; expect(typeof entityHTML).toBe('string'); - expect(entityHTML).toContain('pig-entity'); + expect(entityHTML).toContain('pig-anentity'); expect(entityHTML).toContain('System shall be secure'); expect(entityHTML).toContain('The system must implement security measures'); expect(entityHTML).toContain('d:REQ-001'); From dfffea883553fcd80280a6e0251dafd35fbd1691 Mon Sep 17 00:00:00 2001 From: "OD-T14S-25\\PCUser" Date: Fri, 30 Jan 2026 19:14:16 +0100 Subject: [PATCH 20/26] minor change in comment --- src/utils/schemas/pig/ts/pig-package-constraints.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/utils/schemas/pig/ts/pig-package-constraints.ts b/src/utils/schemas/pig/ts/pig-package-constraints.ts index 340b792..3ac8e24 100644 --- a/src/utils/schemas/pig/ts/pig-package-constraints.ts +++ b/src/utils/schemas/pig/ts/pig-package-constraints.ts @@ -31,7 +31,6 @@ * ✅ aLink.hasClass → Link * anEntity and aRelationship class references * Entity and Relationship specializes references - * @type consistency * Phase 2 (important): * namespace prefixes are defined in the context * Enumeration value references From 1b170c8ab4e97939d4c6c9f5613229947a8ba8f6 Mon Sep 17 00:00:00 2001 From: "OD-T14S-25\\PCUser" Date: Mon, 2 Feb 2026 11:44:33 +0100 Subject: [PATCH 21/26] - Added constraint checks on anEntity and aRelationship hasClass references - Can enable every single constraint check --- .../import/jsonld/import-package-jsonld.ts | 13 +- src/utils/import/xml/import-package-xml.ts | 16 +- src/utils/lib/messages.ts | 32 +- src/utils/schemas/pig/ts/pig-metaclasses.ts | 68 ++- .../schemas/pig/ts/pig-package-constraints.ts | 300 +++++++++++- tests/unit/import-package-jsonld.spec.ts | 2 +- tests/unit/pig-package-constraints.spec.ts | 448 +++++++++++++++++- tests/unit/pig-package-gethtml.spec.ts | 11 +- 8 files changed, 799 insertions(+), 91 deletions(-) diff --git a/src/utils/import/jsonld/import-package-jsonld.ts b/src/utils/import/jsonld/import-package-jsonld.ts index 78e0c25..761f4a4 100644 --- a/src/utils/import/jsonld/import-package-jsonld.ts +++ b/src/utils/import/jsonld/import-package-jsonld.ts @@ -23,6 +23,7 @@ import { IRsp, rspOK, Msg } from "../../lib/messages"; import { LIB, logger } from "../../lib/helpers"; import { APackage, TPigItem } from '../../schemas/pig/ts/pig-metaclasses'; import { SCH_LD } from '../../schemas/pig/jsonld/pig-schemata-jsonld'; +import { ConstraintCheckType } from '../../schemas/pig/ts/pig-package-constraints'; /** * Import JSON-LD document and instantiate PIG items @@ -53,7 +54,17 @@ export async function importJSONLD(source: string | File | Blob): Promise } // Instantiate APackage and load the document - const aPackage = new APackage().setJSONLD(doc); + const aPackage = new APackage().setJSONLD( + doc, + // some examples are incomplete, so we skip the tests for specializes: + [ + ConstraintCheckType.UniqueIds, + ConstraintCheckType.aPropertyHasClass, + ConstraintCheckType.aLinkHasClass, + ConstraintCheckType.anEntityHasClass, + ConstraintCheckType.aRelationshipHasClass, + ] + ); // Check if package was successfully created if (!aPackage.status().ok) { diff --git a/src/utils/import/xml/import-package-xml.ts b/src/utils/import/xml/import-package-xml.ts index eb58958..f35128c 100644 --- a/src/utils/import/xml/import-package-xml.ts +++ b/src/utils/import/xml/import-package-xml.ts @@ -22,6 +22,7 @@ import { IRsp, rspOK, Msg } from '../../lib/messages'; import { LIB, logger } from '../../lib/helpers'; import { APackage, TPigItem } from '../../schemas/pig/ts/pig-metaclasses'; +import { ConstraintCheckType } from '../../schemas/pig/ts/pig-package-constraints'; /** * Import XML document and instantiate PIG items @@ -60,8 +61,19 @@ export async function importXML(source: string | File | Blob): Promise { return Msg.create(697, 'XML', errors); } */ - // ✅ Instantiate APackage directly from XML string - const aPackage = new APackage().setXML(xmlString); + + // Instantiate APackage directly from XML string + const aPackage = new APackage().setXML( + xmlString, + // some examples are incomplete, so we skip the tests for specializes: + [ + ConstraintCheckType.UniqueIds, + ConstraintCheckType.aPropertyHasClass, + ConstraintCheckType.aLinkHasClass, + ConstraintCheckType.anEntityHasClass, + ConstraintCheckType.aRelationshipHasClass, + ] + ); // Check if package was successfully created if (!aPackage.status().ok) { diff --git a/src/utils/lib/messages.ts b/src/utils/lib/messages.ts index c9f323f..4598454 100644 --- a/src/utils/lib/messages.ts +++ b/src/utils/lib/messages.ts @@ -365,24 +365,24 @@ const messages: Record string>> `Error en la validación del paquete: elemento '${parentId}' hasProperty[${propIndex}].hasClass='${hasClass}' - ${msg}` }, 674: { - en: (parentId: string, linkIndex: number, linkArrayName: string, msg: string) => - `Package validation failed: item '${parentId}' ${linkArrayName}[${linkIndex}] has ${msg}`, - de: (parentId: string, linkIndex: number, linkArrayName: string, msg: string) => - `Paket-Validierung fehlgeschlagen: Element '${parentId}' ${linkArrayName}[${linkIndex}] hat ${msg}`, - fr: (parentId: string, linkIndex: number, linkArrayName: string, msg: string) => - `Échec de la validation du package: élément '${parentId}' ${linkArrayName}[${linkIndex}] a ${msg}`, - es: (parentId: string, linkIndex: number, linkArrayName: string, msg: string) => - `Error en la validación del paquete: elemento '${parentId}' ${linkArrayName}[${linkIndex}] tiene ${msg}` + en: (parentId: string, index: number, prpName: string, msg: string) => + `Package validation failed: item '${parentId}' graph[${index}] ${prpName} - ${msg}`, + de: (parentId: string, index: number, prpName: string, msg: string) => + `Paket-Validierung fehlgeschlagen: Element '${parentId}' graph[${index}] ${prpName} - ${msg}`, + fr: (parentId: string, index: number, prpName: string, msg: string) => + `Échec de la validation du package: élément '${parentId}' graph[${index}] ${prpName} - ${msg}`, + es: (parentId: string, index: number, prpName: string, msg: string) => + `Error en la validación del paquete: elemento '${parentId}' graph[${index}] ${prpName} - ${msg}` }, 675: { - en: (parentId: string, linkIndex: number, linkArrayName: string, hasClass: string, msg: string) => - `Package validation failed: item '${parentId}' ${linkArrayName}[${linkIndex}].hasClass='${hasClass}' - ${msg}`, - de: (parentId: string, linkIndex: number, linkArrayName: string, hasClass: string, msg: string) => - `Paket-Validierung fehlgeschlagen: Element '${parentId}' ${linkArrayName}[${linkIndex}].hasClass='${hasClass}' - ${msg}`, - fr: (parentId: string, linkIndex: number, linkArrayName: string, hasClass: string, msg: string) => - `Échec de la validation du package: élément '${parentId}' ${linkArrayName}[${linkIndex}].hasClass='${hasClass}' - ${msg}`, - es: (parentId: string, linkIndex: number, linkArrayName: string, hasClass: string, msg: string) => - `Error en la validación del paquete: elemento '${parentId}' ${linkArrayName}[${linkIndex}].hasClass='${hasClass}' - ${msg}` + en: (parentId: string, index: number, prpName: string, prpVal: string, msg: string) => + `Package validation failed: item '${parentId}' graph[${index}] ${prpName}: ${prpVal} - ${msg}`, + de: (parentId: string, index: number, prpName: string, prpVal: string, msg: string) => + `Paket-Validierung fehlgeschlagen: Element '${parentId}' graph[${index}] ${prpName}: ${prpVal} - ${msg}`, + fr: (parentId: string, index: number, prpName: string, prpVal: string, msg: string) => + `Échec de la validation du package: élément '${parentId}' graph[${index}] ${prpName}: ${prpVal} - ${msg}`, + es: (parentId: string, index: number, prpName: string, prpVal: string, msg: string) => + `Error en la validación del paquete: elemento '${parentId}' graph[${index}] ${prpName}: ${prpVal} - ${msg}` }, 679: { en: (op: string, act: number, exp: number) => diff --git a/src/utils/schemas/pig/ts/pig-metaclasses.ts b/src/utils/schemas/pig/ts/pig-metaclasses.ts index 0afdd57..4ab6a57 100644 --- a/src/utils/schemas/pig/ts/pig-metaclasses.ts +++ b/src/utils/schemas/pig/ts/pig-metaclasses.ts @@ -36,7 +36,7 @@ import { MVF } from "../../../lib/mvf"; import { JsonPrimitive, JsonValue, JsonArray, JsonObject } from "../../../lib/helpers"; // use central Ajv instance from the Vue plugin: import { SCH } from '../json/pig-schemata'; -import { checkConstraintsForPackage } from './pig-package-constraints'; +import { checkConstraintsForPackage, ConstraintCheckType } from './pig-package-constraints'; // optional: import type for better TS typing where needed export type TPigId = string; // an URI, typically a UUID with namespace (e.g. 'ns:123e4567-e89b-12d3-a456-426614174000') or a URL @@ -111,8 +111,8 @@ export interface IText { value: string; } export interface IOptionsHTML { - widthLeft?: string; // e.g. '150px' or '67%' - itemType?: PigItemTypeValue[]; + widthMain?: string; // width of the main column, e.g. '150px' or '67%' + itemType?: PigItemTypeValue[]; // itemTypes to include lang?: tagIETF; } @@ -921,7 +921,7 @@ export class AnEntity extends AnElement implements IAnEntity { // Extract language preference from options, default to 'en-US' const lang = options?.lang || 'en-US'; - const widthLeft = options?.widthLeft || '67%'; + const widthMain = options?.widthMain || '67%'; const titleText = getLocalText(this.title, lang); const descText = getLocalText(this.description, lang); @@ -954,7 +954,7 @@ export class AnEntity extends AnElement implements IAnEntity { `; return `
    -
    +
    ${titleText ? `

    ${titleText}

    ` : ''} ${descText ? `
    ${descText}
    ` : ''}
    @@ -1061,7 +1061,7 @@ export class APackage extends Identifiable implements IAPackage { super({ itemType: PigItemType.aPackage }); } - validate(itm: IAPackage): IRsp { + validate(itm: IAPackage, checks?: ConstraintCheckType[] ): IRsp { // graph must be present and be an array if (!Array.isArray(itm.graph) || itm.graph.length < 1) { return Msg.create(630, 'graph'); @@ -1073,7 +1073,7 @@ export class APackage extends Identifiable implements IAPackage { return rsp; } - rsp = checkConstraintsForPackage(itm); + rsp = checkConstraintsForPackage(itm,checks); // if (itm.id == 'd:test-invalid-prop') // logger.debug(`APackage.validate: validating package `, itm, rsp); @@ -1084,8 +1084,8 @@ export class APackage extends Identifiable implements IAPackage { return rspOK; } - set(itm: IAPackage): APackage { - this.lastStatus = this.validate(itm); + set(itm: IAPackage, checks?: ConstraintCheckType[]): APackage { + this.lastStatus = this.validate(itm,checks); if (this.lastStatus.ok) { super.set(itm); this.context = itm.context; @@ -1114,7 +1114,7 @@ export class APackage extends Identifiable implements IAPackage { return LIB.stripUndefined(pkg); } - setJSONLD(doc: any): APackage { + setJSONLD(doc: any, checks?: ConstraintCheckType[]): APackage { // Extract @context const ctx = this.extractContextJSONLD(doc); @@ -1171,7 +1171,7 @@ export class APackage extends Identifiable implements IAPackage { graph: instantiatedGraph, modified: meta.modified, creator: meta.creator - } as IAPackage); + } as IAPackage, checks); // logger.debug(`APackage.setJSONLD: package ${JSON.stringify(this, null, 2)} set with status`, this.lastStatus); // return the instantiated graph with instantiated graph items: @@ -1211,7 +1211,7 @@ export class APackage extends Identifiable implements IAPackage { // Return stringified JSON-LD return JSON.stringify(jld, null, 4); } */ - setXML(xmlString: stringXML) { + setXML(xmlString: stringXML, checks?: ConstraintCheckType[]) { // 1. Parse XML string to JSON // The context is skipped here, as it is extracted separately below. const parsed = xml2json(xmlString); @@ -1278,7 +1278,7 @@ export class APackage extends Identifiable implements IAPackage { graph: instantiatedGraph, modified: doc.modified, creator: doc.creator - } as unknown as IAPackage); + } as unknown as IAPackage, checks); // logger.debug(`APackage.setXML: package ${JSON.stringify(this,null,2)} set with status`, this.lastStatus); return this; @@ -1291,15 +1291,16 @@ export class APackage extends Identifiable implements IAPackage { const result: stringHTML[] = []; // Extract language preference from options, default to 'en-US' - const lang = options?.lang || 'en-US'; - const widthLeft = options?.widthLeft || '67%'; + const lang = options?.lang ?? 'en-US'; + const widthMain = options?.widthMain ?? '67%'; + const includeItemTypes = options?.itemType ?? [PigItemType.anEntity]; // 1. Package metadata as first element with localization const titleText = getLocalText(this.title, lang); const descText = getLocalText(this.description, lang); const pkgMetadata = `
    -
    +

    ${titleText || 'Untitled Package'}

    ${descText ? `
    ${descText}
    ` : ''}
    @@ -1314,20 +1315,9 @@ export class APackage extends Identifiable implements IAPackage {
    `; result.push(pkgMetadata); - /* const packageMetadata = ``; */ - // 2. Add HTML for all anEntity items (options are passed through) for (const item of this.graph) { - if (item.itemType === PigItemType.anEntity) { + if (includeItemTypes.includes(item.itemType)) { const entityHTML = (item as AnEntity).getHTML(options); result.push(entityHTML); } @@ -1586,7 +1576,7 @@ export class APackage extends Identifiable implements IAPackage { // Validate item has required pig:itemType if (!item['pig:itemType'] || !item['pig:itemType']['@id']) { const id = item['@id'] || item.id || 'unknown'; - logger.error(`APackage.instantiateItemJSONLD: @graph element missing pig:itemType, skipping ${id}`); + // logger.error(`APackage.instantiateItemJSONLD: @graph element missing pig:itemType, skipping ${id}`); return Msg.create(650, 'Instantiation from JSON-LD', 'pig:itemType', id); } @@ -1594,14 +1584,14 @@ export class APackage extends Identifiable implements IAPackage { // Filter allowed item types if (!this.isAllowedItemType(itype)) { - logger.error(`APackage.instantiateItemJSONLD: skipping item type '${itype}' which is not allowed in a graph`); + // logger.error(`APackage.instantiateItemJSONLD: skipping item type '${itype}' which is not allowed in a graph`); return Msg.create(651, 'Instantiation from JSON-LD', itype); } const instance = this.createInstance(itype); if (!instance) { - logger.error(`APackage.instantiateItemJSONLD: unable to create instance for itemType '${itype}'`); + // logger.error(`APackage.instantiateItemJSONLD: unable to create instance for itemType '${itype}'`); return Msg.create(652, 'Instantiation from JSON-LD', itype); } @@ -1611,9 +1601,9 @@ export class APackage extends Identifiable implements IAPackage { // Check if instantiation was successful const status = (instance as any).status(); if (!status || !status.ok) { - logger.error( + /* logger.error( `APackage.instantiateItemJSONLD: ${itype} '${item['@id'] || item.id || 'unknown'}' failed validation: ${status?.statusText || 'unknown error'}` - ); + ); */ return status || Msg.create(653, 'Instantiation from JSON-LD', itype, item['@id'] || item.id || 'unknown'); } @@ -1624,7 +1614,7 @@ export class APackage extends Identifiable implements IAPackage { }; } catch (err: any) { const errorMsg = `APackage.instantiateItemJSONLD: failed to populate instance with itemType '${itype}': ${err?.message ?? err}`; - logger.error(errorMsg); + // logger.error(errorMsg); return Msg.create(654, 'Instantiation from JSON-LD', itype, err?.message ?? String(err)); } } @@ -1645,14 +1635,14 @@ export class APackage extends Identifiable implements IAPackage { // Filter allowed item types if (!this.isAllowedItemType(itype)) { - logger.error(`APackage.instantiateItemXML: skipping item type '${itype}' which is not allowed in a graph`); + // logger.error(`APackage.instantiateItemXML: skipping item type '${itype}' which is not allowed in a graph`); return Msg.create(651, 'Instantiation from XML', itype); } const instance = this.createInstance(itype); if (!instance) { - logger.error(`APackage.instantiateItemXML: unable to create instance for itemType '${itype}'`); + // logger.error(`APackage.instantiateItemXML: unable to create instance for itemType '${itype}'`); return Msg.create(652, 'Instantiation from XML', itype); } @@ -1664,9 +1654,9 @@ export class APackage extends Identifiable implements IAPackage { // Check if instantiation was successful const status = (instance as any).status(); if (!status || !status.ok) { - logger.error( + /* logger.error( `APackage.instantiateItemXML: ${itype} '${item.id || 'unknown'}' failed validation: ${status?.statusText || 'unknown error'}` - ); + ); */ return status || Msg.create(653, 'Instantiation from XML', itype, item.id || 'unknown'); } @@ -1677,7 +1667,7 @@ export class APackage extends Identifiable implements IAPackage { }; } catch (err: any) { const errorMsg = `APackage.instantiateItemXML: failed to populate instance with itemType '${itype}': ${err?.message ?? err}`; - logger.error(errorMsg); + // logger.error(errorMsg); return Msg.create(654, 'Instantiation from XML', itype, err?.message ?? String(err)); } } diff --git a/src/utils/schemas/pig/ts/pig-package-constraints.ts b/src/utils/schemas/pig/ts/pig-package-constraints.ts index 3ac8e24..5abf165 100644 --- a/src/utils/schemas/pig/ts/pig-package-constraints.ts +++ b/src/utils/schemas/pig/ts/pig-package-constraints.ts @@ -29,8 +29,12 @@ * ✅ Unique IDs * ✅ aProperty.hasClass → Property * ✅ aLink.hasClass → Link - * anEntity and aRelationship class references - * Entity and Relationship specializes references + * ✅ anEntity and aRelationship class references + * ✅ Entity and Relationship specializes references + * Instances are consistent with their classes + * - properties and links are eligible + * - occurrence (minCount, maxCount) + * - value range * Phase 2 (important): * namespace prefixes are defined in the context * Enumeration value references @@ -54,11 +58,114 @@ import { IRsp, rspOK, Msg } from "../../../lib/messages"; import { logger } from "../../../lib/helpers"; import { IAPackage, PigItemType, PigItemTypeValue, TPigId } from "./pig-metaclasses"; +/** + * Available constraint check types + */ +export enum ConstraintCheckType { + UniqueIds = 'uniqueIds', + aPropertyHasClass = 'aPropertyHasClass', + aLinkHasClass = 'aLinkHasClass', + anEntityHasClass = 'anEntityHasClass', + aRelationshipHasClass = 'aRelationshipHasClass', + EntitySpecializes = 'entitySpecializes', + RelationshipSpecializes = 'relationshipSpecializes', + PropertySpecializes = 'propertySpecializes', + LinkSpecializes = 'linkSpecializes' +} + +/** + * All available constraint checks + */ +const allConstraintChecks: ConstraintCheckType[] = [ + ConstraintCheckType.UniqueIds, + ConstraintCheckType.aPropertyHasClass, + ConstraintCheckType.aLinkHasClass, + ConstraintCheckType.anEntityHasClass, + ConstraintCheckType.aRelationshipHasClass, + ConstraintCheckType.EntitySpecializes, + ConstraintCheckType.RelationshipSpecializes, + ConstraintCheckType.PropertySpecializes, + ConstraintCheckType.LinkSpecializes +]; + /** * Check cross-item constraints for a package * @param pkg - Package to validate + * @param checksToPerform - Optional list of checks to perform (default: all checks) * @returns IRsp (rspOK on success, error IRsp on failure) */ +export function checkConstraintsForPackage( + pkg: IAPackage, + checksToPerform?: ConstraintCheckType[] +): IRsp { + const checksSet = new Set(checksToPerform ?? allConstraintChecks); + + // 1. Check that all primary IDs are unique + if (checksSet.has(ConstraintCheckType.UniqueIds)) { + const rsp = checkUniqueIds(pkg); + if (!rsp.ok) return rsp; + } + + // 2. Build a map of itemTypes by ID for quick lookup + const itemTypeMap = buildItemTypeMap(pkg); + + // 3. Check aProperty.hasClass references + if (checksSet.has(ConstraintCheckType.aPropertyHasClass)) { + const rsp = checkPropertyReferences(pkg, itemTypeMap); + if (!rsp.ok) return rsp; + } + + // 4. Check aLink.hasClass references (aSourceLink and aTargetLink) + if (checksSet.has(ConstraintCheckType.aLinkHasClass)) { + const rsp = checkLinkReferences(pkg, itemTypeMap); + if (!rsp.ok) return rsp; + } + + // 5a. Check anEntity.hasClass references + if (checksSet.has(ConstraintCheckType.anEntityHasClass)) { + const rsp = checkEntityOrRelationshipReferences(pkg, PigItemType.anEntity, itemTypeMap, 'hasClass'); + if (!rsp.ok) return rsp; + } + + // 5b. Check aRelationship.hasClass references + if (checksSet.has(ConstraintCheckType.aRelationshipHasClass)) { + const rsp = checkEntityOrRelationshipReferences(pkg, PigItemType.aRelationship, itemTypeMap, 'hasClass'); + if (!rsp.ok) return rsp; + } + + // 6a. Check Entity.specializes and Relationship.specializes references + if (checksSet.has(ConstraintCheckType.EntitySpecializes)) { + const rsp = checkEntityOrRelationshipReferences(pkg, PigItemType.Entity, itemTypeMap, 'specializes'); + if (!rsp.ok) return rsp; + } + + // 6b. Check Entity.specializes and Relationship.specializes references + if (checksSet.has(ConstraintCheckType.RelationshipSpecializes)) { + const rsp = checkEntityOrRelationshipReferences(pkg, PigItemType.Relationship, itemTypeMap, 'specializes'); + if (!rsp.ok) return rsp; + } + + // 6c. Check Property.specializes + if (checksSet.has(ConstraintCheckType.PropertySpecializes)) { + const rsp = checkPropertyOrLinkReferences(pkg, PigItemType.Property, itemTypeMap, 'specializes'); + if (!rsp.ok) return rsp; + } + + // 6d. Check Link.specializes + if (checksSet.has(ConstraintCheckType.LinkSpecializes)) { + const rsp = checkPropertyOrLinkReferences(pkg, PigItemType.Link, itemTypeMap, 'specializes'); + if (!rsp.ok) return rsp; + } + + // logger.debug(`Package ${pkg.id || 'unnamed'}: all constraints validated successfully`); + return rspOK; +} + +/** + * Check cross-item constraints for a package + * @param pkg - Package to validate + * @returns IRsp (rspOK on success, error IRsp on failure) + * export function checkConstraintsForPackage(pkg: IAPackage): IRsp { // 1. Check that all primary IDs are unique const uniquenessCheck = checkUniqueIds(pkg); @@ -83,9 +190,27 @@ export function checkConstraintsForPackage(pkg: IAPackage): IRsp { return linkCheck; } + // 5. Check anEntity.hasClass and aRelationship.hasClass references + const classCheck = checkEntityAndRelationshipReferences(pkg, itemTypeMap, 'hasClass'); + if (!classCheck.ok) { + return classCheck; + } + + // 6. Check Entity.specializes and Relationship.specializes references + const specializesCheck = checkEntityAndRelationshipReferences(pkg, itemTypeMap, 'specializes'); + if (!specializesCheck.ok) { + return specializesCheck; + } + + // 7. Check Property.specializes and Link.specializes references + const propertyLinkSpecializesCheck = checkPropertyAndLinkReferences(pkg, itemTypeMap, 'specializes'); + if (!propertyLinkSpecializesCheck.ok) { + return propertyLinkSpecializesCheck; + } + // logger.debug(`Package ${pkg.id || 'unnamed'}: all constraints validated successfully`); return rspOK; -} +}*/ /** * Check that all primary IDs in the package are unique; @@ -163,7 +288,7 @@ function checkPropertyReferences( if (entity.hasProperty && Array.isArray(entity.hasProperty)) { for (let j = 0; j < entity.hasProperty.length; j++) { const prop = entity.hasProperty[j]; - const checkResult = validatePropertyHasClass(prop, itemId, j, itemTypeMap); + const checkResult = checkPropertyHasClass(prop, itemId, j, itemTypeMap); if (!checkResult.ok) { return checkResult; } @@ -177,7 +302,7 @@ function checkPropertyReferences( if (rel.hasProperty && Array.isArray(rel.hasProperty)) { for (let j = 0; j < rel.hasProperty.length; j++) { const prop = rel.hasProperty[j]; - const checkResult = validatePropertyHasClass(prop, itemId, j, itemTypeMap); + const checkResult = checkPropertyHasClass(prop, itemId, j, itemTypeMap); if (!checkResult.ok) { return checkResult; } @@ -197,7 +322,7 @@ function checkPropertyReferences( * @param itemTypeMap - Map for reference lookup * @returns IRsp (rspOK on success, error on invalid reference) */ -function validatePropertyHasClass( +function checkPropertyHasClass( prop: any, parentId: string, propIndex: number, @@ -207,8 +332,8 @@ function validatePropertyHasClass( return Msg.create(672, parentId, propIndex, 'missing hasClass'); } - // logger.debug(`validatePropertyHasClass: checking hasClass ${JSON.stringify(prop, null, 2)} for property at index ${propIndex} of parent ${parentId}`); - // logger.debug(`validatePropertyHasClass: itemTypeMap = ${JSON.stringify(Array.from(itemTypeMap.entries()), null, 2)}`); + // logger.debug(`checkPropertyHasClass: checking hasClass ${JSON.stringify(prop, null, 2)} for property at index ${propIndex} of parent ${parentId}`); + // logger.debug(`checkPropertyHasClass: itemTypeMap = ${JSON.stringify(Array.from(itemTypeMap.entries()), null, 2)}`); const targetType = itemTypeMap.get(prop.hasClass); if (!targetType) { @@ -243,7 +368,7 @@ function checkLinkReferences( if (entity.hasTargetLink && Array.isArray(entity.hasTargetLink)) { for (let j = 0; j < entity.hasTargetLink.length; j++) { const link = entity.hasTargetLink[j]; - const checkResult = validateLinkHasClass(link, itemId, j, 'hasTargetLink', itemTypeMap); + const checkResult = checkLinkHasClass(link, itemId, j, 'hasTargetLink', itemTypeMap); if (!checkResult.ok) { return checkResult; } @@ -259,7 +384,7 @@ function checkLinkReferences( if (rel.hasSourceLink && Array.isArray(rel.hasSourceLink)) { for (let j = 0; j < rel.hasSourceLink.length; j++) { const link = rel.hasSourceLink[j]; - const checkResult = validateLinkHasClass(link, itemId, j, 'hasSourceLink', itemTypeMap); + const checkResult = checkLinkHasClass(link, itemId, j, 'hasSourceLink', itemTypeMap); if (!checkResult.ok) { return checkResult; } @@ -270,7 +395,7 @@ function checkLinkReferences( if (rel.hasTargetLink && Array.isArray(rel.hasTargetLink)) { for (let j = 0; j < rel.hasTargetLink.length; j++) { const link = rel.hasTargetLink[j]; - const checkResult = validateLinkHasClass(link, itemId, j, 'hasTargetLink', itemTypeMap); + const checkResult = checkLinkHasClass(link, itemId, j, 'hasTargetLink', itemTypeMap); if (!checkResult.ok) { return checkResult; } @@ -291,8 +416,8 @@ function checkLinkReferences( * @param itemTypeMap - Map for reference lookup * @returns IRsp (rspOK on success, error on invalid reference) */ -function validateLinkHasClass( - link: any, +function checkLinkHasClass( + link: any, // PigItemType.aSourceLink | PigItemType.aTargetLink, parentId: string, linkIndex: number, linkArrayName: string, @@ -313,3 +438,152 @@ function validateLinkHasClass( return rspOK; } +/** + * Check that Entity/Relationship references (hasClass or specializes) point to valid items + * @param pkg - Package to validate + * @param itemTypeMap - Map from ID to itemType for reference lookup + * @param referenceType - Type of reference to check: 'hasClass' or 'specializes' + * @returns IRsp (rspOK on success, error on invalid reference) + */ +function checkEntityOrRelationshipReferences( + pkg: IAPackage, + itemType: PigItemTypeValue, // PigItemType.anEntity | PigItemType.aRelationship, + itemTypeMap: Map, + referenceType: 'hasClass' | 'specializes' +): IRsp { + const isHasClass = referenceType === 'hasClass'; + + for (let i = 0; i < pkg.graph.length; i++) { + const item = pkg.graph[i]; + const iType = (item as any).itemType; + const iId = (item as any)['@id'] ?? (item as any).id; + + // Check Entity items (both anEntity for hasClass, and Entity for specializes) + const isInstance = [PigItemType.anEntity, PigItemType.aRelationship].includes(iType); + const isClass = [PigItemType.Entity, PigItemType.Relationship].includes(iType); + + if( iType == itemType ) + if ((isHasClass && isInstance) || (!isHasClass && isClass)) { + const referenceValue = item[referenceType]; + + // logger.debug('checkEntityOrRelationshipReferences: ',item); + + if (!referenceValue) { + // specializes is optional (can inherit from pig:Entity directly) + if (!isHasClass) { + continue; + } + return Msg.create(674, iId, i, referenceType, `missing ${referenceType}`); + } + + // Expected type depends on whether we're checking hasClass or specializes: + // - hasClass: anEntity -> Entity, aRelationship -> Relationship + // - specializes: Entity -> Entity, Relationship -> Relationship + const expectedType = [PigItemType.Entity, PigItemType.anEntity].includes(itemType as any) ? PigItemType.Entity : PigItemType.Relationship; + const targetType = itemTypeMap.get(referenceValue); + if (!targetType) { + return Msg.create(675, iId, i, referenceType, referenceValue, 'not found in package'); + } + if (targetType !== expectedType) { + return Msg.create(675, iId, i, referenceType, referenceValue, `expected ${expectedType}, found ${targetType}`); + } + } + + /* + const contextName = isHasClass ? 'hasClass' : 'specializes'; + // Check Entity items (both anEntity for hasClass, and Entity for specializes) + const isEntityInstance = iType === PigItemType.anEntity; + const isEntityClass = iType === PigItemType.Entity; + + if ((isHasClass && isEntityInstance) || (!isHasClass && isEntityClass)) { + const entity = item as any; + const referenceValue = entity[referenceType]; + + if (!referenceValue) { + // specializes is optional (can inherit from pig:Entity directly) + if (!isHasClass) { + continue; + } + return Msg.create(674, iId, i, contextName, `missing ${contextName}`); + } + + const targetType = itemTypeMap.get(referenceValue); + if (!targetType) { + return Msg.create(675, iId, i, contextName, referenceValue, 'not found in package'); + } + if (targetType !== PigItemType.Entity) { + return Msg.create(675, iId, i, contextName, referenceValue, `expected pig:Entity, found ${targetType}`); + } + } + + // Check Relationship items (both aRelationship for hasClass, and Relationship for specializes) + const isRelationshipInstance = iType === PigItemType.aRelationship; + const isRelationshipClass = iType === PigItemType.Relationship; + + if ((isHasClass && isRelationshipInstance) || (!isHasClass && isRelationshipClass)) { + const rel = item as any; + const referenceValue = rel[referenceType]; + + if (!referenceValue) { + // specializes is optional (can inherit from pig:Relationship directly) + if (!isHasClass) { + continue; + } + return Msg.create(674, iId, i, contextName, `missing ${contextName}`); + } + + const targetType = itemTypeMap.get(referenceValue); + if (!targetType) { + return Msg.create(675, iId, i, contextName, referenceValue, 'not found in package'); + } + if (targetType !== PigItemType.Relationship) { + return Msg.create(675, iId, i, contextName, referenceValue, `expected pig:Relationship, found ${targetType}`); + } + } */ + } + + return rspOK; +} +/** + * Check that Property/Link specializes references point to valid items + * @param pkg - Package to validate + * @param itemTypeMap - Map from ID to itemType for reference lookup + * @param referenceType - Type of reference to check: currently only 'specializes' + * @returns IRsp (rspOK on success, error on invalid reference) + */ +function checkPropertyOrLinkReferences( + pkg: IAPackage, + itemType: PigItemTypeValue, + itemTypeMap: Map, + referenceType: 'specializes' +): IRsp { + for (let i = 0; i < pkg.graph.length; i++) { + const item = pkg.graph[i]; + const iType = (item as any).itemType; + const iId = (item as any)['@id'] ?? (item as any).id; + + if (iType === itemType) { + const property = item as any; + const referenceValue = property[referenceType]; + + if (!referenceValue) { + // specializes is optional (can inherit from pig:Property directly) + continue; + } + + // Expected type depends on whether we're checking Property or Link: + // - Property.specializes -> Property + // - Link.specializes -> Link + const expectedType = [PigItemType.Property].includes(itemType as any) ? PigItemType.Property : PigItemType.Link; + const targetType = itemTypeMap.get(referenceValue); + if (!targetType) { + return Msg.create(675, iId, i, referenceType, referenceValue, 'not found in package'); + } + if (targetType !== expectedType) { + return Msg.create(675, iId, i, referenceType, referenceValue, `expected ${expectedType}, found ${targetType}`); + } + } + } + + return rspOK; +} diff --git a/tests/unit/import-package-jsonld.spec.ts b/tests/unit/import-package-jsonld.spec.ts index 32573b5..d67eceb 100644 --- a/tests/unit/import-package-jsonld.spec.ts +++ b/tests/unit/import-package-jsonld.spec.ts @@ -8,7 +8,7 @@ describe('importJSONLD (file system)', () => { const filenames:string[] = [ //"../data/JSON-LD/05/Project 'Requirement with Enumerated Property'.pig.jsonld", //"../data/JSON-LD/11/Alice.pig.jsonld", - //"../data/JSON-LD/21/Project 'Very Simple Model (FMC) with Requirements'.pig.jsonld", + "../data/JSON-LD/21/Project 'Very Simple Model (FMC) with Requirements'.pig.jsonld", //"../data/JSON-LD/22/Small Autonomous Vehicle.pig.jsonld" // add more test files here, e.g. // "../data/JSON-LD/another-sample.pig.jsonld" diff --git a/tests/unit/pig-package-constraints.spec.ts b/tests/unit/pig-package-constraints.spec.ts index 3ecc8b2..f3e5927 100644 --- a/tests/unit/pig-package-constraints.spec.ts +++ b/tests/unit/pig-package-constraints.spec.ts @@ -4,8 +4,8 @@ * License and terms of use: Apache 2.0 (http://www.apache.org/licenses/LICENSE-2.0) */ -import { checkConstraintsForPackage } from '../../src/utils/schemas/pig/ts/pig-package-constraints'; -import { APackage, IAPackage, PigItemType } from '../../src/utils/schemas/pig/ts/pig-metaclasses'; +import { APackage } from '../../src/utils/schemas/pig/ts/pig-metaclasses'; +import { ConstraintCheckType } from '../../src/utils/schemas/pig/ts/pig-package-constraints'; describe('PIG Package Constraint Validation', () => { describe('Positive Tests - Valid Packages', () => { @@ -22,6 +22,26 @@ describe('PIG Package Constraint Validation', () => { 'pig:itemType': { '@id': 'pig:aPackage' }, 'dcterms:modified': '2025-01-16T10:00:00Z', '@graph': [ + { + "@id": "pig:Property", + "@type": "owl:DatatypeProperty", + "pig:itemType": { + "@id": "pig:Property" + }, + "dcterms:title": [ + { + "@value": "Property" + } + ], + "dcterms:description": [ + { + "@value": "A PIG meta-model element used for properties (aka attributes)." + } + ], + "sh:datatype": { + "@id": "xs:anyType" + } + }, { '@id': 'o:Property_Status', 'pig:specializes': 'pig:Property', @@ -31,6 +51,31 @@ describe('PIG Package Constraint Validation', () => { ], 'sh:datatype': { '@id': 'xs:string' } }, + { + "@id": "pig:Link", + "@type": "owl:ObjectProperty", + "pig:itemType": { + "@id": "pig:Link" + }, + "pig:eligibleEndpoint": [ + { + "@id": "pig:Entity" + }, + { + "@id": "pig:Relationship" + } + ], + "dcterms:title": [ + { + "@value": "linked with" + } + ], + "dcterms:description": [ + { + "@value": "Connects a reified relationship with its source or target. Also connects an organizer to a model element" + } + ] + }, { '@id': 'o:Link_RefersTo', 'pig:specializes': 'pig:Link', @@ -42,6 +87,23 @@ describe('PIG Package Constraint Validation', () => { { '@id': 'o:Entity_Requirement' } ] }, + { + "@id": "pig:Entity", + "@type": "owl:Class", + "pig:itemType": { + "@id": "pig:Entity" + }, + "dcterms:title": [ + { + "@value": "Entity" + } + ], + "dcterms:description": [ + { + "@value": "A PIG meta-model element used for entities (aka resources or artifacts)." + } + ] + }, { '@id': 'o:Entity_Requirement', 'pig:specializes': 'pig:Entity', @@ -85,16 +147,12 @@ describe('PIG Package Constraint Validation', () => { ] }; - const pkg = new APackage().setJSONLD(validPackageJsonLd); + const pkg = new APackage().setJSONLD(validPackageJsonLd); // all constraint checks const items = pkg.getAllItems(); expect(pkg.status().ok).toBe(true); - expect(items.length).toBe(6); + expect(items.length).toBe(9); - const rsp = checkConstraintsForPackage(pkg.get() as IAPackage); - - expect(rsp.ok).toBe(true); - expect(rsp.status).toBe(0); }); test('should validate package with relationship containing source and target links', () => { @@ -110,6 +168,26 @@ describe('PIG Package Constraint Validation', () => { 'pig:itemType': { '@id': 'pig:aPackage' }, 'dcterms:modified': '2025-01-16T10:00:00Z', '@graph': [ + { + "@id": "pig:Property", + "@type": "owl:DatatypeProperty", + "pig:itemType": { + "@id": "pig:Property" + }, + "dcterms:title": [ + { + "@value": "Property" + } + ], + "dcterms:description": [ + { + "@value": "A PIG meta-model element used for properties (aka attributes)." + } + ], + "sh:datatype": { + "@id": "xs:anyType" + } + }, { '@id': 'o:Property_Rationale', 'pig:specializes': 'pig:Property', @@ -119,6 +197,31 @@ describe('PIG Package Constraint Validation', () => { ], 'sh:datatype': { '@id': 'xs:string' } }, + { + "@id": "pig:Link", + "@type": "owl:ObjectProperty", + "pig:itemType": { + "@id": "pig:Link" + }, + "pig:eligibleEndpoint": [ + { + "@id": "pig:Entity" + }, + { + "@id": "pig:Relationship" + } + ], + "dcterms:title": [ + { + "@value": "linked with" + } + ], + "dcterms:description": [ + { + "@value": "Connects a reified relationship with its source or target. Also connects an organizer to a model element" + } + ] + }, { '@id': 'o:Link_Source', 'pig:specializes': 'pig:Link', @@ -141,6 +244,40 @@ describe('PIG Package Constraint Validation', () => { { '@id': 'o:Entity_Requirement' } ] }, + { + "@id": "pig:Entity", + "@type": "owl:Class", + "pig:itemType": { + "@id": "pig:Entity" + }, + "dcterms:title": [ + { + "@value": "Entity" + } + ], + "dcterms:description": [ + { + "@value": "A PIG meta-model element used for entities (aka resources or artifacts)." + } + ] + }, + { + "@id": "pig:Relationship", + "@type": "owl:Class", + "pig:itemType": { + "@id": "pig:Relationship" + }, + "dcterms:title": [ + { + "@value": "Relationship" + } + ], + "dcterms:description": [ + { + "@value": "A PIG meta-model element used for reified relationships (aka predicates)." + } + ] + }, { '@id': 'o:Relationship_Trace', 'pig:specializes': 'pig:Relationship', @@ -212,12 +349,8 @@ describe('PIG Package Constraint Validation', () => { const items = pkg.getAllItems(); expect(pkg.status().ok).toBe(true); - expect(items.length).toBe(9); + expect(items.length).toBe(13); - const rsp = checkConstraintsForPackage(pkg.get() as IAPackage); - - expect(rsp.ok).toBe(true); - expect(rsp.status).toBe(0); }); }); @@ -264,7 +397,7 @@ describe('PIG Package Constraint Validation', () => { }; const pkg = new APackage(); - pkg.setJSONLD(packageWithDuplicateIds); + pkg.setJSONLD(packageWithDuplicateIds,[ConstraintCheckType.UniqueIds]); // check the attribute values upon creation: /* if (pck.status().ok) @@ -661,4 +794,291 @@ describe('PIG Package Constraint Validation', () => { expect(rsp.statusText).toContain('expected pig:Link, found pig:Property'); */ }); }); + describe('Negative Tests - Invalid Entity and Relationship hasClass References', () => { + test('should reject anEntity with missing hasClass reference', () => { + const packageWithMissingEntityClass = { + '@context': { + 'pig': 'https://product-information-graph.gfse.org/', + 'dcterms': 'http://purl.org/dc/terms/', + 'sh': 'http://www.w3.org/ns/shacl#', + 'o': 'https://example.org/ontology/', + 'd': 'https://example.org/data/' + }, + '@id': 'd:test-missing-entity-class', + 'pig:itemType': { '@id': 'pig:aPackage' }, + 'dcterms:modified': '2025-01-16T10:00:00Z', + '@graph': [ + { + '@id': 'o:Entity_Requirement', + 'pig:specializes': 'pig:Entity', + 'pig:itemType': { '@id': 'pig:Entity' }, + 'dcterms:title': [ + { '@value': 'Requirement', '@language': 'en' } + ] + }, + { + '@id': 'd:REQ-invalid-class-nok', + // ❌ Missing @type (which maps to hasClass) + 'pig:itemType': { '@id': 'pig:anEntity' }, + 'pig:revision': '1.0', + 'dcterms:modified': '2025-01-16T10:00:00Z', + 'dcterms:title': [ + { '@value': 'Entity without class', '@language': 'en' } + ] + } + ] + }; + + const pkg = new APackage(); + pkg.setJSONLD(packageWithMissingEntityClass); + + expect(pkg.status().ok).toBe(false); + expect(pkg.status().status).toBe(679); // Not all item instantiations succeeded + }); + + test('should reject anEntity with hasClass pointing to non-existent Entity', () => { + const packageWithInvalidEntityClass = { + '@context': { + 'pig': 'https://product-information-graph.gfse.org/', + 'dcterms': 'http://purl.org/dc/terms/', + 'sh': 'http://www.w3.org/ns/shacl#', + 'o': 'https://example.org/ontology/', + 'd': 'https://example.org/data/' + }, + '@id': 'd:test-invalid-entity-class', + 'pig:itemType': { '@id': 'pig:aPackage' }, + 'dcterms:modified': '2025-01-16T10:00:00Z', + '@graph': [ + { + '@id': 'o:Entity_Requirement', + 'pig:specializes': 'pig:Entity', + 'pig:itemType': { '@id': 'pig:Entity' }, + 'dcterms:title': [ + { '@value': 'Requirement', '@language': 'en' } + ] + }, + { + '@id': 'd:REQ-nonexistent-class-nok', + '@type': 'o:Entity_NonExistent', // ❌ References non-existent Entity class + 'pig:itemType': { '@id': 'pig:anEntity' }, + 'pig:revision': '1.0', + 'dcterms:modified': '2025-01-16T10:00:00Z', + 'dcterms:title': [ + { '@value': 'Entity with invalid class', '@language': 'en' } + ] + } + ] + }; + + const pkg = new APackage(); + pkg.setJSONLD(packageWithInvalidEntityClass); + + expect(pkg.status().ok).toBe(false); + expect(pkg.status().status).toBe(675); // Invalid hasClass reference (not found) + }); + + test('should reject anEntity with hasClass pointing to wrong type (Property instead of Entity)', () => { + const packageWithWrongEntityClassType = { + '@context': { + 'pig': 'https://product-information-graph.gfse.org/', + 'dcterms': 'http://purl.org/dc/terms/', + 'sh': 'http://www.w3.org/ns/shacl#', + 'o': 'https://example.org/ontology/', + 'd': 'https://example.org/data/' + }, + '@id': 'd:test-wrong-entity-class-type', + 'pig:itemType': { '@id': 'pig:aPackage' }, + 'dcterms:modified': '2025-01-16T10:00:00Z', + '@graph': [ + { + '@id': 'o:Property_Status', + 'pig:specializes': 'pig:Property', + 'pig:itemType': { '@id': 'pig:Property' }, + 'dcterms:title': [ + { '@value': 'Status', '@language': 'en' } + ], + 'sh:datatype': { '@id': 'xs:string' } + }, + { + '@id': 'd:REQ-wrong-class-type-nok', + '@type': 'o:Property_Status', // ❌ References Property instead of Entity + 'pig:itemType': { '@id': 'pig:anEntity' }, + 'pig:revision': '1.0', + 'dcterms:modified': '2025-01-16T10:00:00Z', + 'dcterms:title': [ + { '@value': 'Entity with Property as class', '@language': 'en' } + ] + } + ] + }; + + const pkg = new APackage(); + pkg.setJSONLD(packageWithWrongEntityClassType); + + expect(pkg.status().ok).toBe(false); + expect(pkg.status().status).toBe(675); // Invalid hasClass type + }); + + test('should reject aRelationship with missing hasClass reference', () => { + const packageWithMissingRelClass = { + '@context': { + 'pig': 'https://product-information-graph.gfse.org/', + 'dcterms': 'http://purl.org/dc/terms/', + 'sh': 'http://www.w3.org/ns/shacl#', + 'o': 'https://example.org/ontology/', + 'd': 'https://example.org/data/' + }, + '@id': 'd:test-missing-rel-class', + 'pig:itemType': { '@id': 'pig:aPackage' }, + 'dcterms:modified': '2025-01-16T10:00:00Z', + '@graph': [ + { + '@id': 'o:Link_Source', + 'pig:specializes': 'pig:Link', + 'pig:itemType': { '@id': 'pig:Link' }, + 'dcterms:title': [ + { '@value': 'Source', '@language': 'en' } + ] + }, + { + '@id': 'o:Link_Target', + 'pig:specializes': 'pig:Link', + 'pig:itemType': { '@id': 'pig:Link' }, + 'dcterms:title': [ + { '@value': 'Target', '@language': 'en' } + ] + }, + { + '@id': 'o:Relationship_Trace', + 'pig:specializes': 'pig:Relationship', + 'pig:itemType': { '@id': 'pig:Relationship' }, + 'dcterms:title': [ + { '@value': 'Trace', '@language': 'en' } + ] + }, + { + '@id': 'o:Entity_Requirement', + 'pig:specializes': 'pig:Entity', + 'pig:itemType': { '@id': 'pig:Entity' }, + 'dcterms:title': [ + { '@value': 'Requirement', '@language': 'en' } + ] + }, + { + '@id': 'd:REQ-008-ok', + '@type': 'o:Entity_Requirement', + 'pig:itemType': { '@id': 'pig:anEntity' }, + 'pig:revision': '1.0', + 'dcterms:modified': '2025-01-16T10:00:00Z', + 'dcterms:title': [ + { '@value': 'Source Requirement', '@language': 'en' } + ] + }, + { + '@id': 'd:REL-missing-class-nok', + // ❌ Missing @type (which maps to hasClass) + 'pig:itemType': { '@id': 'pig:aRelationship' }, + 'pig:revision': '1.0', + 'dcterms:modified': '2025-01-16T10:00:00Z', + 'dcterms:title': [ + { '@value': 'Relationship without class', '@language': 'en' } + ], + 'o:Link_Source': [ + { + 'pig:itemType': { '@id': 'pig:aSourceLink' }, + '@id': 'd:REQ-008-ok' + } + ] + } + ] + }; + + const pkg = new APackage(); + pkg.setJSONLD(packageWithMissingRelClass); + + expect(pkg.status().ok).toBe(false); + expect(pkg.status().status).toBe(679); // Not all item instantiations succeeded + }); + + test('should reject aRelationship with hasClass pointing to wrong type (Link instead of Relationship)', () => { + const packageWithWrongRelClassType = { + '@context': { + 'pig': 'https://product-information-graph.gfse.org/', + 'dcterms': 'http://purl.org/dc/terms/', + 'sh': 'http://www.w3.org/ns/shacl#', + 'o': 'https://example.org/ontology/', + 'd': 'https://example.org/data/' + }, + '@id': 'd:test-wrong-rel-class-type', + 'pig:itemType': { '@id': 'pig:aPackage' }, + 'dcterms:modified': '2025-01-16T10:00:00Z', + '@graph': [ + { + '@id': 'o:Link_Source', + 'pig:specializes': 'pig:Link', + 'pig:itemType': { '@id': 'pig:Link' }, + 'dcterms:title': [ + { '@value': 'Source', '@language': 'en' } + ] + }, + { + '@id': 'o:Link_Target', + 'pig:specializes': 'pig:Link', + 'pig:itemType': { '@id': 'pig:Link' }, + 'dcterms:title': [ + { '@value': 'Target', '@language': 'en' } + ] + }, + { + '@id': 'o:Relationship_Trace', + 'pig:specializes': 'pig:Relationship', + 'pig:itemType': { '@id': 'pig:Relationship' }, + 'dcterms:title': [ + { '@value': 'Trace', '@language': 'en' } + ] + }, + { + '@id': 'o:Entity_Requirement', + 'pig:specializes': 'pig:Entity', + 'pig:itemType': { '@id': 'pig:Entity' }, + 'dcterms:title': [ + { '@value': 'Requirement', '@language': 'en' } + ] + }, + { + '@id': 'd:REQ-009-ok', + '@type': 'o:Entity_Requirement', + 'pig:itemType': { '@id': 'pig:anEntity' }, + 'pig:revision': '1.0', + 'dcterms:modified': '2025-01-16T10:00:00Z', + 'dcterms:title': [ + { '@value': 'Source Requirement', '@language': 'en' } + ] + }, + { + '@id': 'd:REL-wrong-class-type-nok', + '@type': 'o:Link_Source', // ❌ References Link instead of Relationship + 'pig:itemType': { '@id': 'pig:aRelationship' }, + 'pig:revision': '1.0', + 'dcterms:modified': '2025-01-16T10:00:00Z', + 'dcterms:title': [ + { '@value': 'Relationship with Link as class', '@language': 'en' } + ], + 'o:Link_Source': [ + { + 'pig:itemType': { '@id': 'pig:aSourceLink' }, + '@id': 'd:REQ-009-ok' + } + ] + } + ] + }; + + const pkg = new APackage(); + pkg.setJSONLD(packageWithWrongRelClassType); + + expect(pkg.status().ok).toBe(false); + expect(pkg.status().status).toBe(679); // Not all item instantiations succeeded + }); + }); }); diff --git a/tests/unit/pig-package-gethtml.spec.ts b/tests/unit/pig-package-gethtml.spec.ts index 3a12c10..13e3c03 100644 --- a/tests/unit/pig-package-gethtml.spec.ts +++ b/tests/unit/pig-package-gethtml.spec.ts @@ -5,6 +5,7 @@ */ import { APackage } from '../../src/utils/schemas/pig/ts/pig-metaclasses'; +import { ConstraintCheckType } from '../../src/utils/schemas/pig/ts/pig-package-constraints'; describe('PIG Package getHTML() Method', () => { describe('Valid Package with Single Entity', () => { @@ -68,7 +69,7 @@ describe('PIG Package getHTML() Method', () => { ] }; - const pkg = new APackage().setJSONLD(validPackageWithEntity); + const pkg = new APackage().setJSONLD(validPackageWithEntity, [ConstraintCheckType.UniqueIds, ConstraintCheckType.aPropertyHasClass]); expect(pkg.status().ok).toBe(true); @@ -136,7 +137,7 @@ describe('PIG Package getHTML() Method', () => { ] }; - const pkg = new APackage().setJSONLD(packageWithoutEntities); + const pkg = new APackage().setJSONLD(packageWithoutEntities, [ConstraintCheckType.UniqueIds, ConstraintCheckType.aPropertyHasClass]); expect(pkg.status().ok).toBe(true); @@ -216,7 +217,7 @@ describe('PIG Package getHTML() Method', () => { ] }; - const pkg = new APackage().setJSONLD(packageWithMixedItems); + const pkg = new APackage().setJSONLD(packageWithMixedItems, [ConstraintCheckType.UniqueIds, ConstraintCheckType.aPropertyHasClass]); expect(pkg.status().ok).toBe(true); @@ -242,7 +243,7 @@ describe('PIG Package getHTML() Method', () => { '@graph': [] // Empty graph - invalid! }; - const pkg = new APackage().setJSONLD(invalidPackage); + const pkg = new APackage().setJSONLD(invalidPackage, [ConstraintCheckType.UniqueIds, ConstraintCheckType.aPropertyHasClass]); expect(pkg.status().ok).toBe(false); @@ -312,7 +313,7 @@ describe('PIG Package getHTML() Method', () => { ] }; - const pkg = new APackage().setJSONLD(packageWithMultipleEntities); + const pkg = new APackage().setJSONLD(packageWithMultipleEntities, [ConstraintCheckType.UniqueIds, ConstraintCheckType.aPropertyHasClass]); expect(pkg.status().ok).toBe(true); From 686e3f822f46490f6f873fa4d6c3204be20250ae Mon Sep 17 00:00:00 2001 From: "OD-T14S-25\\PCUser" Date: Mon, 2 Feb 2026 14:32:13 +0100 Subject: [PATCH 22/26] all constraint checks applied on JSONLD and XML import. --- .../import/jsonld/import-package-jsonld.ts | 5 +- src/utils/import/xml/import-package-xml.ts | 5 +- src/utils/schemas/pig/json/pig-schemata.ts | 76 + src/utils/schemas/pig/ts/pig-metaclasses.ts | 13 + ...ement with Enumerated Property'.pig.jsonld | 2 +- tests/data/JSON-LD/11/Alice.pig.jsonld | 2 +- ... Model (FMC) with Requirements'.pig.jsonld | 2 +- .../22/Small Autonomous Vehicle.pig.jsonld | 8369 ++++++++++++++++- ...ple Model (FMC) with Requirements'.pig.xml | 2 +- 9 files changed, 8467 insertions(+), 9 deletions(-) diff --git a/src/utils/import/jsonld/import-package-jsonld.ts b/src/utils/import/jsonld/import-package-jsonld.ts index 761f4a4..52169d3 100644 --- a/src/utils/import/jsonld/import-package-jsonld.ts +++ b/src/utils/import/jsonld/import-package-jsonld.ts @@ -54,7 +54,8 @@ export async function importJSONLD(source: string | File | Blob): Promise } // Instantiate APackage and load the document - const aPackage = new APackage().setJSONLD( + const aPackage = new APackage().setJSONLD(doc); // apply all constraints checks by default +/* const aPackage = new APackage().setJSONLD( doc, // some examples are incomplete, so we skip the tests for specializes: [ @@ -65,7 +66,7 @@ export async function importJSONLD(source: string | File | Blob): Promise ConstraintCheckType.aRelationshipHasClass, ] ); - +*/ // Check if package was successfully created if (!aPackage.status().ok) { return aPackage.status(); diff --git a/src/utils/import/xml/import-package-xml.ts b/src/utils/import/xml/import-package-xml.ts index f35128c..fcd0189 100644 --- a/src/utils/import/xml/import-package-xml.ts +++ b/src/utils/import/xml/import-package-xml.ts @@ -63,7 +63,8 @@ export async function importXML(source: string | File | Blob): Promise { */ // Instantiate APackage directly from XML string - const aPackage = new APackage().setXML( + const aPackage = new APackage().setXML(xmlString); // apply all constraints checks by default +/* const aPackage = new APackage().setXML( xmlString, // some examples are incomplete, so we skip the tests for specializes: [ @@ -74,7 +75,7 @@ export async function importXML(source: string | File | Blob): Promise { ConstraintCheckType.aRelationshipHasClass, ] ); - +*/ // Check if package was successfully created if (!aPackage.status().ok) { return aPackage.status(); diff --git a/src/utils/schemas/pig/json/pig-schemata.ts b/src/utils/schemas/pig/json/pig-schemata.ts index 2b4cd7b..1a344cc 100644 --- a/src/utils/schemas/pig/json/pig-schemata.ts +++ b/src/utils/schemas/pig/json/pig-schemata.ts @@ -550,6 +550,77 @@ const ARELATIONSHIP_SCHEMA = { }; const validateARelationshipSchema = ajv.compile(ARELATIONSHIP_SCHEMA); +/* APACKAGE_SCHEMA: describes IAPackage (pig:aPackage) */ +const APACKAGE_SCHEMA = { + $schema: 'http://json-schema.org/draft-07/schema#', + $id: 'https://gfse.org/schemas/pig/IAPackage', + type: 'object', + properties: { + context: { + type: 'array', + // minItems: 1, + items: { + type: 'object', + description: 'Namespace definitions with tag and URI mappings', + properties: { + tag: { type: 'string' }, + uri: { type: 'string', format: 'uri' } + }, + additionalProperties: false + } + }, + id: { $ref: '#/$defs/idString' }, + itemType: { + type: 'string', + enum: ['pig:aPackage'], + description: 'The PigItemType for pig:aPackage' + }, + title: { + type: 'array', + minItems: 1, + items: { $ref: '#/$defs/LanguageText' } + }, + description: { + type: 'array', + minItems: 1, + items: { $ref: '#/$defs/LanguageText' } + }, + modified: { + type: 'string', + format: 'date-time' + }, + creator: { type: 'string' }, + graph: { + type: 'array', + items: { + type: 'object', + description: 'Any PIG item in the package graph; items are checked individually before instantiation' + } + } + }, + additionalProperties: false, + required: ['id', 'itemType', 'modified', 'graph'], + $defs: { + idString: { + type: 'string', + description: 'TPigId — term with namespace (prefix:local) or an URI', + pattern: ID_NAME_PATTERN + }, + LanguageText: { + type: 'object', + required: ['value'], + additionalProperties: false, + properties: { + value: { type: 'string' }, + lang: { type: 'string' } + } + } + } +}; +const validateAPackageSchema = ajv.compile(APACKAGE_SCHEMA); + +/** SCH: Exported schemata and validation functions for PIG items: +*/ export const SCH = { PROPERTY_SCHEMA, validatePropertySchema, @@ -580,5 +651,10 @@ export const SCH = { validateARelationshipSchema, getValidateARelationshipErrors() { return ajv.errorsText(validateARelationshipSchema.errors, { separator: '; ' }) + }, + APACKAGE_SCHEMA, + validateAPackageSchema, + getValidateAPackageErrors() { + return ajv.errorsText(validateAPackageSchema.errors, { separator: '; ' }) } }; diff --git a/src/utils/schemas/pig/ts/pig-metaclasses.ts b/src/utils/schemas/pig/ts/pig-metaclasses.ts index 4ab6a57..ff375aa 100644 --- a/src/utils/schemas/pig/ts/pig-metaclasses.ts +++ b/src/utils/schemas/pig/ts/pig-metaclasses.ts @@ -1062,6 +1062,19 @@ export class APackage extends Identifiable implements IAPackage { } validate(itm: IAPackage, checks?: ConstraintCheckType[] ): IRsp { + // Schema validation (AJV) - provides structural checks and reuses the idString definition + // ... only at the lowest subclass level: + logger.debug('APackage.validate: ', itm); + try { + const ok = SCH.validateAPackageSchema(itm); + if (!ok) { + const msg = SCH.getValidateAPackageErrors(); + return Msg.create(681, 'aPackage', itm.id, msg); + } + } catch (err: any) { + return Msg.create(682, 'aRelationship', itm.id, err?.message ?? String(err)); + } + // graph must be present and be an array if (!Array.isArray(itm.graph) || itm.graph.length < 1) { return Msg.create(630, 'graph'); diff --git a/tests/data/JSON-LD/05/Project 'Requirement with Enumerated Property'.pig.jsonld b/tests/data/JSON-LD/05/Project 'Requirement with Enumerated Property'.pig.jsonld index 5ba3400..a246c73 100644 --- a/tests/data/JSON-LD/05/Project 'Requirement with Enumerated Property'.pig.jsonld +++ b/tests/data/JSON-LD/05/Project 'Requirement with Enumerated Property'.pig.jsonld @@ -1 +1 @@ -{"@context":{"o":"https://product-information-graph.org/v0.2/ontology#","d":"https://product-information-graph.org/examples/05_Requirement-with-Enumerated-Property.specif#","rdf":"http://www.w3.org/1999/02/22-rdf-syntax-ns#","owl":"http://www.w3.org/2002/07/owl#","sh":"http://www.w3.org/ns/shacl#","xs":"http://www.w3.org/2001/XMLSchema#","dcterms":"http://purl.org/dc/terms/","IREB":"https://cpre.ireb.org/en/downloads-and-resources/glossary#","ReqIF":"https://www.prostep.org/fileadmin/downloads/PSI_ImplementationGuide_ReqIF_V1-7.pdf#","pig":"https://product-information-graph.org/v0.2/metamodel#","SpecIF":"https://specif.de/v1.2/schema#"},"@id":"d:P-Requirement-with-Enumerated-Property","@type":"pig:Package","dcterms:title":[{"@value":"Project 'Requirement with Enumerated Property'"}],"dcterms:modified":"2026-01-17T22:31:13.052Z","@graph":[{"@id":"pig:Entity","@type":"owl:Class","pig:itemType":{"@id":"pig:Entity"},"dcterms:title":[{"@value":"Entity"}],"dcterms:description":[{"@value":"A PIG meta-model element used for entities (aka resources or artifacts)."}],"pig:eligibleProperty":[{"@id":"pig:category"},{"@id":"pig:icon"}]},{"@id":"pig:Organizer","pig:specializes":{"@id":"pig:Entity"},"pig:itemType":{"@id":"pig:Entity"},"dcterms:title":[{"@value":"Organizer"}],"dcterms:description":[{"@value":"An element organizing model elements. An example is a list of requirements or a diagram using a certain notation."}],"pig:eligibleProperty":[{"@id":"pig:category"}]},{"@id":"pig:HierarchyRoot","pig:specializes":{"@id":"pig:Organizer"},"pig:itemType":{"@id":"pig:Entity"},"dcterms:title":[{"@value":"Hierarchy Root"}],"dcterms:description":[{"@value":"A subclass of PIG organizer serving as a root for hierarchically organized graph elements."}],"pig:eligibleProperty":[],"pig:eligibleTargetLink":[{"@id":"pig:lists"}]},{"@id":"pig:Outline","pig:specializes":{"@id":"pig:Organizer"},"pig:itemType":{"@id":"pig:Entity"},"dcterms:title":[{"@value":"Outline"}],"dcterms:description":[{"@value":"A subclass of PIG organizer comprising all information items of a human-readable document. As usual, the outline is hierarchically organized."}],"pig:eligibleProperty":[{"@id":"pig:category"}],"pig:eligibleTargetLink":[{"@id":"pig:lists"}]},{"@id":"pig:View","pig:specializes":{"@id":"pig:Organizer"},"pig:itemType":{"@id":"pig:Entity"},"dcterms:title":[{"@value":"View"}],"dcterms:description":[{"@value":"A subclass of PIG organizer representing a model view (diagram) using a certain notation showing selected model elements."}],"pig:eligibleProperty":[{"@id":"pig:category"},{"@id":"pig:icon"}],"pig:eligibleTargetLink":[{"@id":"pig:shows"},{"@id":"pig:depicts"}]},{"@id":"pig:Relationship","@type":"owl:Class","pig:itemType":{"@id":"pig:Relationship"},"dcterms:title":[{"@value":"Relationship"}],"dcterms:description":[{"@value":"A PIG meta-model element used for reified relationships (aka predicates)."}],"pig:eligibleProperty":[{"@id":"pig:category"},{"@id":"pig:icon"}],"pig:eligibleSourceLink":{"@id":"pig:SourceLink"},"pig:eligibleTargetLink":{"@id":"pig:TargetLink"}},{"@id":"pig:Property","@type":"owl:DatatypeProperty","pig:itemType":{"@id":"pig:Property"},"dcterms:title":[{"@value":"Property"}],"dcterms:description":[{"@value":"A PIG meta-model element used for properties (aka attributes)."}],"sh:datatype":{"@id":"xs:anyType"}},{"@id":"pig:icon","pig:specializes":{"@id":"pig:Property"},"pig:itemType":{"@id":"pig:Property"},"dcterms:title":[{"@value":"has icon"}],"dcterms:description":[{"@value":"Specifies an icon for a model element (entity or relationship)."}],"sh:datatype":{"@id":"xs:string"},"sh:minCount":0,"sh:maxCount":1},{"@id":"pig:category","pig:specializes":{"@id":"dcterms:type"},"pig:itemType":{"@id":"pig:Property"},"dcterms:title":[{"@value":"has category"}],"dcterms:description":[{"@value":"Specifies a category for an element (entity, relationship or organizer)."}],"sh:datatype":{"@id":"xs:string"},"sh:maxLength":32,"sh:minCount":0,"sh:maxCount":1},{"@id":"pig:Link","@type":"owl:ObjectProperty","pig:itemType":{"@id":"pig:Link"},"pig:eligibleEndpoint":[{"@id":"pig:Entity"},{"@id":"pig:Relationship"}],"dcterms:title":[{"@value":"linked with"}],"dcterms:description":[{"@value":"Connects a reified relationship with its source or target. Also connects an organizer to a model element"}]},{"@id":"pig:SourceLink","pig:specializes":{"@id":"pig:Link"},"pig:itemType":{"@id":"pig:Link"},"pig:eligibleEndpoint":[{"@id":"pig:Entity"},{"@id":"pig:Relationship"}],"dcterms:title":[{"@value":"to source"}],"dcterms:description":[{"@value":"Connects the source of a reified relationship."}]},{"@id":"pig:TargetLink","pig:specializes":{"@id":"pig:Link"},"pig:itemType":{"@id":"pig:Link"},"pig:eligibleEndpoint":[{"@id":"pig:Entity"},{"@id":"pig:Relationship"}],"dcterms:title":[{"@value":"to target"}],"dcterms:description":[{"@value":"Connects the target of a reified relationship or an organizer."}]},{"@id":"pig:lists","pig:specializes":{"@id":"pig:TargetLink"},"pig:itemType":{"@id":"pig:Link"},"pig:eligibleEndpoint":[{"@id":"pig:Entity"},{"@id":"pig:Relationship"},{"@id":"pig:Organizer"}],"dcterms:title":[{"@value":"lists"}],"dcterms:description":[{"@value":"Lists an entity, a relationship or a subordinated organizer."}]},{"@id":"pig:shows","pig:specializes":{"@id":"pig:TargetLink"},"pig:itemType":{"@id":"pig:Link"},"pig:eligibleEndpoint":[{"@id":"pig:Entity"},{"@id":"pig:Relationship"}],"dcterms:title":[{"@value":"shows"}],"dcterms:description":[{"@value":"Shows an entity or a relationship."}]},{"@id":"pig:depicts","pig:specializes":{"@id":"pig:TargetLink"},"pig:itemType":{"@id":"pig:Link"},"pig:eligibleEndpoint":[{"@id":"pig:Entity"}],"dcterms:title":[{"@value":"depicts"}],"dcterms:description":[{"@value":"Depicts an entity; inverse of uml:ownedDiagram."}]},{"@id":"dcterms:title","dcterms:title":[{"@value":"Title","@language":"en"},{"@value":"Titel","@language":"de"},{"@value":"Titre","@language":"fr"}],"dcterms:description":[{"@value":"

    A name given to the resource. (source: DCMI)

    Title (reference: Dublin Core) of the resource represented as rich text in XHTML content. SHOULD include only content that is valid inside an XHTML 'span' element. (source: OSLC)

    ","@language":"en"}],"@type":"owl:DatatypeProperty","pig:itemType":{"@id":"pig:Property"},"sh:datatype":{"@id":"xs:string"},"sh:maxCount":1,"sh:maxLength":256},{"@id":"dcterms:description","dcterms:title":[{"@value":"Description","@language":"en"},{"@value":"Beschreibung","@language":"de"},{"@value":"Description","@language":"fr"}],"dcterms:description":[{"@value":"

    An account of the resource. (source: DCMI)

    Descriptive text (reference: Dublin Core) about resource represented as rich text in XHTML content. SHOULD include only content that is valid and suitable inside an XHTML 'div' element. (source: OSLC)

    ","@language":"en"}],"@type":"owl:DatatypeProperty","pig:itemType":{"@id":"pig:Property"},"sh:datatype":{"@id":"xs:string"},"sh:maxCount":1},{"@id":"SpecIF:Diagram","dcterms:title":[{"@value":"Diagram","@language":"en"},{"@value":"Diagramm","@language":"de"},{"@value":"Diagramme","@language":"fr"}],"dcterms:description":[{"@value":"A diagram illustrating the resource or a link to a diagram.","@language":"en"}],"@type":"owl:DatatypeProperty","pig:itemType":{"@id":"pig:Property"},"sh:datatype":{"@id":"xs:string"}},{"@id":"dcterms:type","dcterms:title":[{"@value":"Element Type","@language":"en"},{"@value":"Element-Typ","@language":"de"},{"@value":"Type d'élément","@language":"fr"}],"dcterms:description":[{"@value":"

    The nature or genre of the resource. (source: DCMI)

    Recommended best practice is to use a controlled vocabulary such as the DCMI Type Vocabulary [DCMITYPE]. To describe the file format, physical medium, or dimensions of the resource, use the Format element.

    For example, a [[FMC:Actor]] may represent a System Function, a System Component or a User Role. Similarly, in the context of process modelling, a FMC:Actor may represent a Process Step or again a User Role. So, all of these are meaningful values for a FMC:Actor's property named dcterms:type.

    ","@language":"en"}],"@type":"owl:DatatypeProperty","pig:itemType":{"@id":"pig:Property"},"sh:datatype":{"@id":"xs:string"},"sh:maxCount":1,"sh:maxLength":32},{"@id":"SpecIF:Priority","dcterms:title":[{"@value":"Priority","@language":"en"},{"@value":"Priorität","@language":"de"},{"@value":"Priorité","@language":"fr"}],"dcterms:description":[{"@value":"Enumerated values for the 'Priority' of the resource.","@language":"en"}],"@type":"owl:ObjectProperty","pig:itemType":{"@id":"pig:Property"},"sh:datatype":{"@id":"xs:string"},"pig:eligibleValue":[{"@id":"SpecIF:priorityHigh","dcterms:title":[{"@value":"high","@language":"en"},{"@value":"hoch","@language":"de"},{"@value":"haut","@language":"fr"}]},{"@id":"SpecIF:priorityRatherHigh","dcterms:title":[{"@value":"rather high","@language":"en"},{"@value":"eher hoch","@language":"de"},{"@value":"plutôt haut","@language":"fr"}]},{"@id":"SpecIF:priorityMedium","dcterms:title":[{"@value":"medium","@language":"en"},{"@value":"mittel","@language":"de"},{"@value":"moyen","@language":"fr"}]},{"@id":"SpecIF:priorityRatherLow","dcterms:title":[{"@value":"rather low","@language":"en"},{"@value":"eher niedrig","@language":"de"},{"@value":"plutôt bas","@language":"fr"}]},{"@id":"SpecIF:priorityLow","dcterms:title":[{"@value":"low","@language":"en"},{"@value":"niedrig","@language":"de"},{"@value":"bas","@language":"fr"}]}]},{"@id":"SpecIF:Paragraph","dcterms:title":[{"@value":"Paragraph","@language":"en"},{"@value":"Textabsatz","@language":"de"},{"@value":"Paragraphe","@language":"fr"}],"dcterms:description":[{"@value":"

    A 'Paragraph' is an unspecified information in a document at any level.

    ","@language":"en"},{"@value":"

    Ein 'Textabschnitt' in einem Dokument auf beliebiger Ebene.

    ","@language":"de"}],"pig:specializes":{"@id":"pig:Entity"},"pig:eligibleProperty":[{"@id":"SpecIF:Diagram"},{"@id":"dcterms:type"}],"pig:eligibleTargetLink":[],"pig:itemType":{"@id":"pig:Entity"}},{"@id":"SpecIF:Heading","dcterms:title":[{"@value":"Heading","@language":"en"},{"@value":"Überschrift","@language":"de"},{"@value":"Intitulé","@language":"fr"}],"dcterms:description":[{"@value":"A 'Heading' is a chapter title at any level with optional description.","@language":"en"},{"@value":"Eine 'Überschrift' in einem Dokument ist der Titel eines Kapitels. Sie kann eine Beschreibung haben, die als Einleitung oder Zusammenfassung des Kapitels genutzt werden kann.","@language":"de"}],"pig:specializes":{"@id":"SpecIF:Paragraph"},"pig:eligibleProperty":[],"pig:eligibleTargetLink":[],"pig:itemType":{"@id":"pig:Entity"}},{"@id":"IREB:Requirement","dcterms:title":[{"@value":"Requirement","@language":"en"},{"@value":"Anforderung","@language":"de"},{"@value":"Exigence","@language":"fr"}],"dcterms:description":[{"@value":"

    A 'Requirement' is a singular documented physical and functional need that a particular design, product or process must be able to perform. (source: Wikipedia)

    Definition:

    1. A condition or capability needed by a user to solve a problem or achieve an objective.
    2. A condition or capability that must be met or possessed by a system or system component to satisfy a contract, standard, specification, or other formally imposed documents.
    3. A documented representation of a condition or capability as in (1) or (2).

    Note: The definition above is the classic one from IEEE Std 610.12 of 1990. Alternatively, we also give a more modern definition:

    1. A need perceived by a stakeholder.
    2. A capability or property that a system shall have.
    3. A documented representation of a need, capability or property.
    ","@language":"en"},{"@value":"

    Eine 'Anforderung' ist ein einzelnes dokumentiertes physisches und funktionales Bedürfnis, das ein bestimmter Entwurf, ein Produkt oder ein Prozess erfüllen muss. (source: Wikipedia)

    Definition:

    1. Eine Bedingung oder Fähigkeit, die ein Benutzer benötigt, um ein Problem zu lösen oder ein Ziel zu erreichen.
    2. Eine Bedingung oder Fähigkeit, die ein System oder eine Systemkomponente erfüllen oder besitzen muss, um einen Vertrag, eine Norm, eine Spezifikation oder ein anderes formal vorgeschriebenes Dokument zu erfüllen.
    3. Eine dokumentierte Darstellung einer Bedingung oder Fähigkeit wie in (1) oder (2).

    Anmerkung: Die obige Definition ist die klassische Definition aus IEEE Std 610.12 von 1990. Alternativ geben wir auch eine modernere Definition an:

    1. Ein von einem Stakeholder wahrgenommener Bedarf.
    2. Eine Fähigkeit oder Eigenschaft, die ein System haben soll.
    3. Eine dokumentierte Darstellung eines Bedarfs, einer Fähigkeit oder Eigenschaft.
    ","@language":"de"},{"@value":"

    Une 'Exigence' est un besoin physique et fonctionnel unique et documenté qu'une conception, un produit ou un processus particulier doit pouvoir satisfaire. (source: Wikipedia)

    Définition:

    1. Condition ou capacité dont un utilisateur a besoin pour résoudre un problème ou atteindre un objectif.
    2. Condition ou capacité qui doit être remplie ou possédée par un système ou un composant de système pour satisfaire à un contrat, à une norme, à une spécification ou à d'autres documents imposés officiellement.
    3. Une représentation documentée d'une condition ou d'une capacité comme dans (1) ou (2).

    Remarque: La définition ci-dessus est la définition classique de la norme IEEE 610.12 de 1990. Nous donnons également une définition plus moderne:

    1. Un besoin perçu par une partie prenante;
    2. Une capacité ou une propriété qu'un système doit avoir.
    3. Une représentation documentée d'un besoin, d'une capacité ou d'une propriété.
    ","@language":"fr"}],"pig:specializes":{"@id":"pig:Entity"},"pig:icon":{"@value":"↯"},"pig:eligibleProperty":[{"@id":"SpecIF:Priority"}],"pig:eligibleTargetLink":[],"pig:itemType":{"@id":"pig:Entity"}},{"@id":"d:Req-35100bca2b005ba","@type":"IREB:Requirement","dcterms:modified":"2020-03-26T22:59:00+02:00","dcterms:title":[{"@value":"Minimum button size","@language":"en"}],"dcterms:description":[{"@value":"

    The button size MUST not be less than 20mm in diameter.

    ","@language":"en"}],"SpecIF:Priority":[{"@id":"SpecIF:priorityRatherHigh","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:HierarchyRoot-P-Requirement-with-Enumerated-Property","@type":"pig:HierarchyRoot","pig:itemType":{"@id":"pig:anEntity"},"dcterms:modified":"2026-01-17T22:31:13.255Z","dcterms:title":[{"@value":"Hierarchy Root"}],"dcterms:description":[{"@value":"... anchoring all hierarchies of this graph (package)"}],"pig:lists":[{"@id":"d:HR-bca801377e3d1547","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:HR-bca801377e3d1547","@type":"SpecIF:Heading","dcterms:modified":"2026-01-17T22:31:13.146Z","dcterms:title":[{"@value":"Project 'Requirement with Enumerated Property'"}],"dcterms:type":[{"@value":"ReqIF:HierarchyRoot","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"},"pig:lists":[{"@id":"d:Req-35100bca2b005ba","pig:itemType":{"@id":"pig:aTargetLink"}}]}]} \ No newline at end of file +{"@context":{"o":"https://product-information-graph.org/v0.2/ontology#","d":"https://product-information-graph.org/examples/05_Requirement-with-Enumerated-Property.specif#","rdf":"http://www.w3.org/1999/02/22-rdf-syntax-ns#","owl":"http://www.w3.org/2002/07/owl#","sh":"http://www.w3.org/ns/shacl#","xs":"http://www.w3.org/2001/XMLSchema#","dcterms":"http://purl.org/dc/terms/","IREB":"https://cpre.ireb.org/en/downloads-and-resources/glossary#","ReqIF":"https://www.prostep.org/fileadmin/downloads/PSI_ImplementationGuide_ReqIF_V1-7.pdf#","pig":"https://product-information-graph.org/v0.2/metamodel#","SpecIF":"https://specif.de/v1.2/schema#"},"@id":"d:P-Requirement-with-Enumerated-Property","@type":"pig:Package","dcterms:title":[{"@value":"Project 'Requirement with Enumerated Property'"}],"dcterms:modified":"2026-01-17T22:31:13.052Z","@graph":[{"@id":"pig:Entity","@type":"owl:Class","pig:itemType":{"@id":"pig:Entity"},"dcterms:title":[{"@value":"Entity"}],"dcterms:description":[{"@value":"A PIG meta-model element used for entities (aka resources or artifacts)."}],"pig:eligibleProperty":[{"@id":"pig:category"},{"@id":"pig:icon"}]},{"@id":"pig:Organizer","pig:specializes":{"@id":"pig:Entity"},"pig:itemType":{"@id":"pig:Entity"},"dcterms:title":[{"@value":"Organizer"}],"dcterms:description":[{"@value":"An element organizing model elements. An example is a list of requirements or a diagram using a certain notation."}],"pig:eligibleProperty":[{"@id":"pig:category"}]},{"@id":"pig:HierarchyRoot","pig:specializes":{"@id":"pig:Organizer"},"pig:itemType":{"@id":"pig:Entity"},"dcterms:title":[{"@value":"Hierarchy Root"}],"dcterms:description":[{"@value":"A subclass of PIG organizer serving as a root for hierarchically organized graph elements."}],"pig:eligibleProperty":[],"pig:eligibleTargetLink":[{"@id":"pig:lists"}]},{"@id":"pig:Outline","pig:specializes":{"@id":"pig:Organizer"},"pig:itemType":{"@id":"pig:Entity"},"dcterms:title":[{"@value":"Outline"}],"dcterms:description":[{"@value":"A subclass of PIG organizer comprising all information items of a human-readable document. As usual, the outline is hierarchically organized."}],"pig:eligibleProperty":[{"@id":"pig:category"}],"pig:eligibleTargetLink":[{"@id":"pig:lists"}]},{"@id":"pig:View","pig:specializes":{"@id":"pig:Organizer"},"pig:itemType":{"@id":"pig:Entity"},"dcterms:title":[{"@value":"View"}],"dcterms:description":[{"@value":"A subclass of PIG organizer representing a model view (diagram) using a certain notation showing selected model elements."}],"pig:eligibleProperty":[{"@id":"pig:category"},{"@id":"pig:icon"}],"pig:eligibleTargetLink":[{"@id":"pig:shows"},{"@id":"pig:depicts"}]},{"@id":"pig:Relationship","@type":"owl:Class","pig:itemType":{"@id":"pig:Relationship"},"dcterms:title":[{"@value":"Relationship"}],"dcterms:description":[{"@value":"A PIG meta-model element used for reified relationships (aka predicates)."}],"pig:eligibleProperty":[{"@id":"pig:category"},{"@id":"pig:icon"}],"pig:eligibleSourceLink":{"@id":"pig:SourceLink"},"pig:eligibleTargetLink":{"@id":"pig:TargetLink"}},{"@id":"pig:Property","@type":"owl:DatatypeProperty","pig:itemType":{"@id":"pig:Property"},"dcterms:title":[{"@value":"Property"}],"dcterms:description":[{"@value":"A PIG meta-model element used for properties (aka attributes)."}],"sh:datatype":{"@id":"xs:anyType"}},{"@id":"pig:icon","pig:specializes":{"@id":"pig:Property"},"pig:itemType":{"@id":"pig:Property"},"dcterms:title":[{"@value":"has icon"}],"dcterms:description":[{"@value":"Specifies an icon for a model element (entity or relationship)."}],"sh:datatype":{"@id":"xs:string"},"sh:minCount":0,"sh:maxCount":1},{"@id":"pig:category","pig:specializes":{"@id":"pig:Property"},"pig:itemType":{"@id":"pig:Property"},"dcterms:title":[{"@value":"has category"}],"dcterms:description":[{"@value":"Specifies a category for an element (entity, relationship or organizer)."}],"sh:datatype":{"@id":"xs:string"},"sh:maxLength":32,"sh:minCount":0,"sh:maxCount":1},{"@id":"pig:Link","@type":"owl:ObjectProperty","pig:itemType":{"@id":"pig:Link"},"pig:eligibleEndpoint":[{"@id":"pig:Entity"},{"@id":"pig:Relationship"}],"dcterms:title":[{"@value":"linked with"}],"dcterms:description":[{"@value":"Connects a reified relationship with its source or target. Also connects an organizer to a model element"}]},{"@id":"pig:SourceLink","pig:specializes":{"@id":"pig:Link"},"pig:itemType":{"@id":"pig:Link"},"pig:eligibleEndpoint":[{"@id":"pig:Entity"},{"@id":"pig:Relationship"}],"dcterms:title":[{"@value":"to source"}],"dcterms:description":[{"@value":"Connects the source of a reified relationship."}]},{"@id":"pig:TargetLink","pig:specializes":{"@id":"pig:Link"},"pig:itemType":{"@id":"pig:Link"},"pig:eligibleEndpoint":[{"@id":"pig:Entity"},{"@id":"pig:Relationship"}],"dcterms:title":[{"@value":"to target"}],"dcterms:description":[{"@value":"Connects the target of a reified relationship or an organizer."}]},{"@id":"pig:lists","pig:specializes":{"@id":"pig:TargetLink"},"pig:itemType":{"@id":"pig:Link"},"pig:eligibleEndpoint":[{"@id":"pig:Entity"},{"@id":"pig:Relationship"},{"@id":"pig:Organizer"}],"dcterms:title":[{"@value":"lists"}],"dcterms:description":[{"@value":"Lists an entity, a relationship or a subordinated organizer."}]},{"@id":"pig:shows","pig:specializes":{"@id":"pig:TargetLink"},"pig:itemType":{"@id":"pig:Link"},"pig:eligibleEndpoint":[{"@id":"pig:Entity"},{"@id":"pig:Relationship"}],"dcterms:title":[{"@value":"shows"}],"dcterms:description":[{"@value":"Shows an entity or a relationship."}]},{"@id":"pig:depicts","pig:specializes":{"@id":"pig:TargetLink"},"pig:itemType":{"@id":"pig:Link"},"pig:eligibleEndpoint":[{"@id":"pig:Entity"}],"dcterms:title":[{"@value":"depicts"}],"dcterms:description":[{"@value":"Depicts an entity; inverse of uml:ownedDiagram."}]},{"@id":"dcterms:title","dcterms:title":[{"@value":"Title","@language":"en"},{"@value":"Titel","@language":"de"},{"@value":"Titre","@language":"fr"}],"dcterms:description":[{"@value":"

    A name given to the resource. (source: DCMI)

    Title (reference: Dublin Core) of the resource represented as rich text in XHTML content. SHOULD include only content that is valid inside an XHTML 'span' element. (source: OSLC)

    ","@language":"en"}],"@type":"owl:DatatypeProperty","pig:itemType":{"@id":"pig:Property"},"sh:datatype":{"@id":"xs:string"},"sh:maxCount":1,"sh:maxLength":256},{"@id":"dcterms:description","dcterms:title":[{"@value":"Description","@language":"en"},{"@value":"Beschreibung","@language":"de"},{"@value":"Description","@language":"fr"}],"dcterms:description":[{"@value":"

    An account of the resource. (source: DCMI)

    Descriptive text (reference: Dublin Core) about resource represented as rich text in XHTML content. SHOULD include only content that is valid and suitable inside an XHTML 'div' element. (source: OSLC)

    ","@language":"en"}],"@type":"owl:DatatypeProperty","pig:itemType":{"@id":"pig:Property"},"sh:datatype":{"@id":"xs:string"},"sh:maxCount":1},{"@id":"SpecIF:Diagram","dcterms:title":[{"@value":"Diagram","@language":"en"},{"@value":"Diagramm","@language":"de"},{"@value":"Diagramme","@language":"fr"}],"dcterms:description":[{"@value":"A diagram illustrating the resource or a link to a diagram.","@language":"en"}],"@type":"owl:DatatypeProperty","pig:itemType":{"@id":"pig:Property"},"sh:datatype":{"@id":"xs:string"}},{"@id":"dcterms:type","dcterms:title":[{"@value":"Element Type","@language":"en"},{"@value":"Element-Typ","@language":"de"},{"@value":"Type d'élément","@language":"fr"}],"dcterms:description":[{"@value":"

    The nature or genre of the resource. (source: DCMI)

    Recommended best practice is to use a controlled vocabulary such as the DCMI Type Vocabulary [DCMITYPE]. To describe the file format, physical medium, or dimensions of the resource, use the Format element.

    For example, a [[FMC:Actor]] may represent a System Function, a System Component or a User Role. Similarly, in the context of process modelling, a FMC:Actor may represent a Process Step or again a User Role. So, all of these are meaningful values for a FMC:Actor's property named dcterms:type.

    ","@language":"en"}],"@type":"owl:DatatypeProperty","pig:itemType":{"@id":"pig:Property"},"sh:datatype":{"@id":"xs:string"},"sh:maxCount":1,"sh:maxLength":32},{"@id":"SpecIF:Priority","dcterms:title":[{"@value":"Priority","@language":"en"},{"@value":"Priorität","@language":"de"},{"@value":"Priorité","@language":"fr"}],"dcterms:description":[{"@value":"Enumerated values for the 'Priority' of the resource.","@language":"en"}],"@type":"owl:ObjectProperty","pig:itemType":{"@id":"pig:Property"},"sh:datatype":{"@id":"xs:string"},"pig:eligibleValue":[{"@id":"SpecIF:priorityHigh","dcterms:title":[{"@value":"high","@language":"en"},{"@value":"hoch","@language":"de"},{"@value":"haut","@language":"fr"}]},{"@id":"SpecIF:priorityRatherHigh","dcterms:title":[{"@value":"rather high","@language":"en"},{"@value":"eher hoch","@language":"de"},{"@value":"plutôt haut","@language":"fr"}]},{"@id":"SpecIF:priorityMedium","dcterms:title":[{"@value":"medium","@language":"en"},{"@value":"mittel","@language":"de"},{"@value":"moyen","@language":"fr"}]},{"@id":"SpecIF:priorityRatherLow","dcterms:title":[{"@value":"rather low","@language":"en"},{"@value":"eher niedrig","@language":"de"},{"@value":"plutôt bas","@language":"fr"}]},{"@id":"SpecIF:priorityLow","dcterms:title":[{"@value":"low","@language":"en"},{"@value":"niedrig","@language":"de"},{"@value":"bas","@language":"fr"}]}]},{"@id":"SpecIF:Paragraph","dcterms:title":[{"@value":"Paragraph","@language":"en"},{"@value":"Textabsatz","@language":"de"},{"@value":"Paragraphe","@language":"fr"}],"dcterms:description":[{"@value":"

    A 'Paragraph' is an unspecified information in a document at any level.

    ","@language":"en"},{"@value":"

    Ein 'Textabschnitt' in einem Dokument auf beliebiger Ebene.

    ","@language":"de"}],"pig:specializes":{"@id":"pig:Entity"},"pig:eligibleProperty":[{"@id":"SpecIF:Diagram"},{"@id":"dcterms:type"}],"pig:eligibleTargetLink":[],"pig:itemType":{"@id":"pig:Entity"}},{"@id":"SpecIF:Heading","dcterms:title":[{"@value":"Heading","@language":"en"},{"@value":"Überschrift","@language":"de"},{"@value":"Intitulé","@language":"fr"}],"dcterms:description":[{"@value":"A 'Heading' is a chapter title at any level with optional description.","@language":"en"},{"@value":"Eine 'Überschrift' in einem Dokument ist der Titel eines Kapitels. Sie kann eine Beschreibung haben, die als Einleitung oder Zusammenfassung des Kapitels genutzt werden kann.","@language":"de"}],"pig:specializes":{"@id":"SpecIF:Paragraph"},"pig:eligibleProperty":[],"pig:eligibleTargetLink":[],"pig:itemType":{"@id":"pig:Entity"}},{"@id":"IREB:Requirement","dcterms:title":[{"@value":"Requirement","@language":"en"},{"@value":"Anforderung","@language":"de"},{"@value":"Exigence","@language":"fr"}],"dcterms:description":[{"@value":"

    A 'Requirement' is a singular documented physical and functional need that a particular design, product or process must be able to perform. (source: Wikipedia)

    Definition:

    1. A condition or capability needed by a user to solve a problem or achieve an objective.
    2. A condition or capability that must be met or possessed by a system or system component to satisfy a contract, standard, specification, or other formally imposed documents.
    3. A documented representation of a condition or capability as in (1) or (2).

    Note: The definition above is the classic one from IEEE Std 610.12 of 1990. Alternatively, we also give a more modern definition:

    1. A need perceived by a stakeholder.
    2. A capability or property that a system shall have.
    3. A documented representation of a need, capability or property.
    ","@language":"en"},{"@value":"

    Eine 'Anforderung' ist ein einzelnes dokumentiertes physisches und funktionales Bedürfnis, das ein bestimmter Entwurf, ein Produkt oder ein Prozess erfüllen muss. (source: Wikipedia)

    Definition:

    1. Eine Bedingung oder Fähigkeit, die ein Benutzer benötigt, um ein Problem zu lösen oder ein Ziel zu erreichen.
    2. Eine Bedingung oder Fähigkeit, die ein System oder eine Systemkomponente erfüllen oder besitzen muss, um einen Vertrag, eine Norm, eine Spezifikation oder ein anderes formal vorgeschriebenes Dokument zu erfüllen.
    3. Eine dokumentierte Darstellung einer Bedingung oder Fähigkeit wie in (1) oder (2).

    Anmerkung: Die obige Definition ist die klassische Definition aus IEEE Std 610.12 von 1990. Alternativ geben wir auch eine modernere Definition an:

    1. Ein von einem Stakeholder wahrgenommener Bedarf.
    2. Eine Fähigkeit oder Eigenschaft, die ein System haben soll.
    3. Eine dokumentierte Darstellung eines Bedarfs, einer Fähigkeit oder Eigenschaft.
    ","@language":"de"},{"@value":"

    Une 'Exigence' est un besoin physique et fonctionnel unique et documenté qu'une conception, un produit ou un processus particulier doit pouvoir satisfaire. (source: Wikipedia)

    Définition:

    1. Condition ou capacité dont un utilisateur a besoin pour résoudre un problème ou atteindre un objectif.
    2. Condition ou capacité qui doit être remplie ou possédée par un système ou un composant de système pour satisfaire à un contrat, à une norme, à une spécification ou à d'autres documents imposés officiellement.
    3. Une représentation documentée d'une condition ou d'une capacité comme dans (1) ou (2).

    Remarque: La définition ci-dessus est la définition classique de la norme IEEE 610.12 de 1990. Nous donnons également une définition plus moderne:

    1. Un besoin perçu par une partie prenante;
    2. Une capacité ou une propriété qu'un système doit avoir.
    3. Une représentation documentée d'un besoin, d'une capacité ou d'une propriété.
    ","@language":"fr"}],"pig:specializes":{"@id":"pig:Entity"},"pig:icon":{"@value":"↯"},"pig:eligibleProperty":[{"@id":"SpecIF:Priority"}],"pig:eligibleTargetLink":[],"pig:itemType":{"@id":"pig:Entity"}},{"@id":"d:Req-35100bca2b005ba","@type":"IREB:Requirement","dcterms:modified":"2020-03-26T22:59:00+02:00","dcterms:title":[{"@value":"Minimum button size","@language":"en"}],"dcterms:description":[{"@value":"

    The button size MUST not be less than 20mm in diameter.

    ","@language":"en"}],"SpecIF:Priority":[{"@id":"SpecIF:priorityRatherHigh","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:HierarchyRoot-P-Requirement-with-Enumerated-Property","@type":"pig:HierarchyRoot","pig:itemType":{"@id":"pig:anEntity"},"dcterms:modified":"2026-01-17T22:31:13.255Z","dcterms:title":[{"@value":"Hierarchy Root"}],"dcterms:description":[{"@value":"... anchoring all hierarchies of this graph (package)"}],"pig:lists":[{"@id":"d:HR-bca801377e3d1547","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:HR-bca801377e3d1547","@type":"SpecIF:Heading","dcterms:modified":"2026-01-17T22:31:13.146Z","dcterms:title":[{"@value":"Project 'Requirement with Enumerated Property'"}],"dcterms:type":[{"@value":"ReqIF:HierarchyRoot","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"},"pig:lists":[{"@id":"d:Req-35100bca2b005ba","pig:itemType":{"@id":"pig:aTargetLink"}}]}]} \ No newline at end of file diff --git a/tests/data/JSON-LD/11/Alice.pig.jsonld b/tests/data/JSON-LD/11/Alice.pig.jsonld index b2aa39d..fb391cf 100644 --- a/tests/data/JSON-LD/11/Alice.pig.jsonld +++ b/tests/data/JSON-LD/11/Alice.pig.jsonld @@ -255,7 +255,7 @@ { "@id": "pig:category", "pig:specializes": { - "@id": "dcterms:type" + "@id": "pig:Property" }, "pig:itemType": { "@id": "pig:Property" diff --git a/tests/data/JSON-LD/21/Project 'Very Simple Model (FMC) with Requirements'.pig.jsonld b/tests/data/JSON-LD/21/Project 'Very Simple Model (FMC) with Requirements'.pig.jsonld index a627c33..eedc3f1 100644 --- a/tests/data/JSON-LD/21/Project 'Very Simple Model (FMC) with Requirements'.pig.jsonld +++ b/tests/data/JSON-LD/21/Project 'Very Simple Model (FMC) with Requirements'.pig.jsonld @@ -240,7 +240,7 @@ { "@id": "pig:category", "pig:specializes": { - "@id": "dcterms:type" + "@id": "pig:Property" }, "pig:itemType": { "@id": "pig:Property" diff --git a/tests/data/JSON-LD/22/Small Autonomous Vehicle.pig.jsonld b/tests/data/JSON-LD/22/Small Autonomous Vehicle.pig.jsonld index 4ee70a8..9646ddf 100644 --- a/tests/data/JSON-LD/22/Small Autonomous Vehicle.pig.jsonld +++ b/tests/data/JSON-LD/22/Small Autonomous Vehicle.pig.jsonld @@ -1 +1,8368 @@ -{"@context":{"o":"https://product-information-graph.org/v0.2/ontology#","d":"https://product-information-graph.org/examples/Small%20Autonomous%20Vehicle.specif.zip#","rdf":"http://www.w3.org/1999/02/22-rdf-syntax-ns#","owl":"http://www.w3.org/2002/07/owl#","sh":"http://www.w3.org/ns/shacl#","xs":"http://www.w3.org/2001/XMLSchema#","dcterms":"http://purl.org/dc/terms/","FMC":"http://fmc-modeling.org#","RFLP":"https://product-information-graph.org/v0.2/ontology/RFLP#","IREB":"https://cpre.ireb.org/en/downloads-and-resources/glossary#","ReqIF":"https://www.prostep.org/fileadmin/downloads/PSI_ImplementationGuide_ReqIF_V1-7.pdf#","oslc_rm":"http://open-services.net/ns/rm#","uml":"https://www.omg.org/spec/UML#","sysml":"https://www.omg.org/spec/SysML#","pig":"https://product-information-graph.org/v0.2/metamodel#","SpecIF":"https://specif.de/v1.2/schema#"},"@id":"d:P-eee_1045467100313_135436_1","@type":"pig:Package","dcterms:title":[{"@value":"Small Autonomous Vehicle"}],"dcterms:description":[{"@value":"A set of SpecIF Classes derived from a SpecIF Ontology for the domains SpecIF:DomainBase, SpecIF:DomainSystemsEngineering, SpecIF:DomainSystemModelIntegration.","@language":"en"}],"dcterms:modified":"2026-01-17T22:38:55.612Z","@graph":[{"@id":"pig:Entity","@type":"owl:Class","pig:itemType":{"@id":"pig:Entity"},"dcterms:title":[{"@value":"Entity"}],"dcterms:description":[{"@value":"A PIG meta-model element used for entities (aka resources or artifacts)."}],"pig:eligibleProperty":[{"@id":"pig:category"},{"@id":"pig:icon"}]},{"@id":"pig:Organizer","pig:specializes":{"@id":"pig:Entity"},"pig:itemType":{"@id":"pig:Entity"},"dcterms:title":[{"@value":"Organizer"}],"dcterms:description":[{"@value":"An element organizing model elements. An example is a list of requirements or a diagram using a certain notation."}],"pig:eligibleProperty":[{"@id":"pig:category"}]},{"@id":"pig:HierarchyRoot","pig:specializes":{"@id":"pig:Organizer"},"pig:itemType":{"@id":"pig:Entity"},"dcterms:title":[{"@value":"Hierarchy Root"}],"dcterms:description":[{"@value":"A subclass of PIG organizer serving as a root for hierarchically organized graph elements."}],"pig:eligibleProperty":[],"pig:eligibleTargetLink":[{"@id":"pig:lists"}]},{"@id":"pig:Outline","pig:specializes":{"@id":"pig:Organizer"},"pig:itemType":{"@id":"pig:Entity"},"dcterms:title":[{"@value":"Outline"}],"dcterms:description":[{"@value":"A subclass of PIG organizer comprising all information items of a human-readable document. As usual, the outline is hierarchically organized."}],"pig:eligibleProperty":[{"@id":"pig:category"}],"pig:eligibleTargetLink":[{"@id":"pig:lists"}]},{"@id":"pig:View","pig:specializes":{"@id":"pig:Organizer"},"pig:itemType":{"@id":"pig:Entity"},"dcterms:title":[{"@value":"View"}],"dcterms:description":[{"@value":"A subclass of PIG organizer representing a model view (diagram) using a certain notation showing selected model elements."}],"pig:eligibleProperty":[{"@id":"pig:category"},{"@id":"pig:icon"}],"pig:eligibleTargetLink":[{"@id":"pig:shows"},{"@id":"pig:depicts"}]},{"@id":"pig:Relationship","@type":"owl:Class","pig:itemType":{"@id":"pig:Relationship"},"dcterms:title":[{"@value":"Relationship"}],"dcterms:description":[{"@value":"A PIG meta-model element used for reified relationships (aka predicates)."}],"pig:eligibleProperty":[{"@id":"pig:category"},{"@id":"pig:icon"}],"pig:eligibleSourceLink":{"@id":"pig:SourceLink"},"pig:eligibleTargetLink":{"@id":"pig:TargetLink"}},{"@id":"pig:Property","@type":"owl:DatatypeProperty","pig:itemType":{"@id":"pig:Property"},"dcterms:title":[{"@value":"Property"}],"dcterms:description":[{"@value":"A PIG meta-model element used for properties (aka attributes)."}],"sh:datatype":{"@id":"xs:anyType"}},{"@id":"pig:icon","pig:specializes":{"@id":"pig:Property"},"pig:itemType":{"@id":"pig:Property"},"dcterms:title":[{"@value":"has icon"}],"dcterms:description":[{"@value":"Specifies an icon for a model element (entity or relationship)."}],"sh:datatype":{"@id":"xs:string"},"sh:minCount":0,"sh:maxCount":1},{"@id":"pig:category","pig:specializes":{"@id":"dcterms:type"},"pig:itemType":{"@id":"pig:Property"},"dcterms:title":[{"@value":"has category"}],"dcterms:description":[{"@value":"Specifies a category for an element (entity, relationship or organizer)."}],"sh:datatype":{"@id":"xs:string"},"sh:maxLength":32,"sh:minCount":0,"sh:maxCount":1},{"@id":"pig:Link","@type":"owl:ObjectProperty","pig:itemType":{"@id":"pig:Link"},"pig:eligibleEndpoint":[{"@id":"pig:Entity"},{"@id":"pig:Relationship"}],"dcterms:title":[{"@value":"linked with"}],"dcterms:description":[{"@value":"Connects a reified relationship with its source or target. Also connects an organizer to a model element"}]},{"@id":"pig:SourceLink","pig:specializes":{"@id":"pig:Link"},"pig:itemType":{"@id":"pig:Link"},"pig:eligibleEndpoint":[{"@id":"pig:Entity"},{"@id":"pig:Relationship"}],"dcterms:title":[{"@value":"to source"}],"dcterms:description":[{"@value":"Connects the source of a reified relationship."}]},{"@id":"pig:TargetLink","pig:specializes":{"@id":"pig:Link"},"pig:itemType":{"@id":"pig:Link"},"pig:eligibleEndpoint":[{"@id":"pig:Entity"},{"@id":"pig:Relationship"}],"dcterms:title":[{"@value":"to target"}],"dcterms:description":[{"@value":"Connects the target of a reified relationship or an organizer."}]},{"@id":"pig:lists","pig:specializes":{"@id":"pig:TargetLink"},"pig:itemType":{"@id":"pig:Link"},"pig:eligibleEndpoint":[{"@id":"pig:Entity"},{"@id":"pig:Relationship"},{"@id":"pig:Organizer"}],"dcterms:title":[{"@value":"lists"}],"dcterms:description":[{"@value":"Lists an entity, a relationship or a subordinated organizer."}]},{"@id":"pig:shows","pig:specializes":{"@id":"pig:TargetLink"},"pig:itemType":{"@id":"pig:Link"},"pig:eligibleEndpoint":[{"@id":"pig:Entity"},{"@id":"pig:Relationship"}],"dcterms:title":[{"@value":"shows"}],"dcterms:description":[{"@value":"Shows an entity or a relationship."}]},{"@id":"pig:depicts","pig:specializes":{"@id":"pig:TargetLink"},"pig:itemType":{"@id":"pig:Link"},"pig:eligibleEndpoint":[{"@id":"pig:Entity"}],"dcterms:title":[{"@value":"depicts"}],"dcterms:description":[{"@value":"Depicts an entity; inverse of uml:ownedDiagram."}]},{"@id":"dcterms:title","dcterms:title":[{"@value":"Title","@language":"en"},{"@value":"Titel","@language":"de"},{"@value":"Titre","@language":"fr"}],"dcterms:description":[{"@value":"

    A name given to the resource. (source: DCMI)

    Title (reference: Dublin Core) of the resource represented as rich text in XHTML content. SHOULD include only content that is valid inside an XHTML 'span' element. (source: OSLC)

    ","@language":"en"}],"@type":"owl:DatatypeProperty","pig:itemType":{"@id":"pig:Property"},"sh:datatype":{"@id":"xs:string"},"sh:maxCount":1,"sh:maxLength":256},{"@id":"dcterms:description","dcterms:title":[{"@value":"Description","@language":"en"},{"@value":"Beschreibung","@language":"de"},{"@value":"Description","@language":"fr"}],"dcterms:description":[{"@value":"

    An account of the resource. (source: DCMI)

    Descriptive text (reference: Dublin Core) about resource represented as rich text in XHTML content. SHOULD include only content that is valid and suitable inside an XHTML 'div' element. (source: OSLC)

    ","@language":"en"}],"@type":"owl:DatatypeProperty","pig:itemType":{"@id":"pig:Property"},"sh:datatype":{"@id":"xs:string"},"sh:maxCount":1},{"@id":"SpecIF:Diagram","dcterms:title":[{"@value":"Diagram","@language":"en"},{"@value":"Diagramm","@language":"de"},{"@value":"Diagramme","@language":"fr"}],"dcterms:description":[{"@value":"A diagram illustrating the resource or a link to a diagram.","@language":"en"}],"@type":"owl:DatatypeProperty","pig:itemType":{"@id":"pig:Property"},"sh:datatype":{"@id":"xs:string"}},{"@id":"SpecIF:Notation","dcterms:title":[{"@value":"Notation","@language":"en"}],"dcterms:description":[{"@value":"The notation used by a model diagram, e.g. 'BPMN 2.0', 'SysML Activity Diagram' or 'FMC Block Diagram'.","@language":"en"}],"@type":"owl:DatatypeProperty","pig:itemType":{"@id":"pig:Property"},"sh:datatype":{"@id":"xs:string"},"sh:maxCount":1,"sh:maxLength":32},{"@id":"SpecIF:Paragraph","dcterms:title":[{"@value":"Paragraph","@language":"en"},{"@value":"Textabsatz","@language":"de"},{"@value":"Paragraphe","@language":"fr"}],"dcterms:description":[{"@value":"

    A 'Paragraph' is an unspecified information in a document at any level.

    ","@language":"en"},{"@value":"

    Ein 'Textabschnitt' in einem Dokument auf beliebiger Ebene.

    ","@language":"de"}],"pig:specializes":{"@id":"pig:Entity"},"pig:eligibleProperty":[{"@id":"SpecIF:Diagram"},{"@id":"pig:category"}],"pig:eligibleTargetLink":[],"pig:itemType":{"@id":"pig:Entity"}},{"@id":"SpecIF:ModelElement","dcterms:title":[{"@value":"Model Element","@language":"en"},{"@value":"Modellelement","@language":"de"}],"dcterms:description":[{"@value":"Is a generalized type for model elements.","@language":"en"},{"@value":"Ist ein generalisierter Typ für Modellelemente.","@language":"de"}],"pig:specializes":{"@id":"pig:Entity"},"pig:icon":{"@value":"☆"},"pig:eligibleProperty":[{"@id":"pig:category"}],"pig:eligibleTargetLink":[],"pig:itemType":{"@id":"pig:Entity"}},{"@id":"FMC:Actor","dcterms:title":[{"@value":"Actor","@language":"en"},{"@value":"Akteur","@language":"de"},{"@value":"Acteur","@language":"fr"}],"dcterms:description":[{"@value":"

    An 'Actor' is a fundamental model element type representing an active entity, be it an activity, a process step, a function, a system component or a role.

    The particular use or original type is specified with a [[dcterms:type]] property of the 'FMC:Actor'. A value of that property should be an ontology-term, such as [[bpmn:processStep]].

    ","@language":"en"},{"@value":"

    Ein 'Akteur' ist ein fundamentaler Modellelementtyp, der eine aktive Entität darstellt, sei es eine Aktivität, ein Prozessschritt, eine Funktion, eine Systemkomponente oder eine Rolle.

    Die spezielle Verwendung oder der ursprüngliche Typ wird mit einer [[dcterms:type]] Eigenschaft von 'FMC:Actor' spezifiziert. Die Werte dieser Eigenschaft können Ontologiebegriffe sein, wie z.B. [[bpmn:timer]].

    ","@language":"de"},{"@value":"

    Un 'Acteur' est un type d'élément de modèle fondamental représentant une entité active, qu'il s'agisse d'une activité, d'une étape de processus, d'une fonction, d'un composant de système ou d'un rôle.

    L'utilisation particulière ou le type original est spécifié avec une propriété [[dcterms:type]] de 'FMC:Actor'. Les valeurs de cette propriété peuvent être des termes d'ontologie, tels que [[bpmn:timer]].

    ","@language":"fr"}],"pig:specializes":{"@id":"SpecIF:ModelElement"},"pig:icon":{"@value":"□"},"pig:eligibleProperty":[],"pig:eligibleTargetLink":[],"pig:itemType":{"@id":"pig:Entity"}},{"@id":"SpecIF:Collection","dcterms:title":[{"@value":"Collection or Group","@language":"en"},{"@value":"Kollektion oder Gruppe","@language":"de"},{"@value":"Collection ou Groupe","@language":"fr"}],"dcterms:description":[{"@value":"

    A 'Collection' is a logical (often conceptual) group of resources linked with a [[SpecIF:contains]] statement. It corresponds to a 'Group' in BPMN Diagrams.

    BPMN: An arbitrary set of objects can be defined as a Group to show that they logically belong together. (source: BPMN Tutorial)

    ","@language":"en"},{"@value":"

    Eine 'Kollektion' ist eine logische Gruppierung bestimmter Modellelemente, die per [[SpecIF:contains]] Relation zusammen gefasst sind. Sie entspricht einer 'Gruppe' in BPMN Diagrammen. (source: BPMN Tutorial)

    ","@language":"de"},{"@value":"

    Une 'collection' est un groupe logique (souvent conceptuel) de ressources liées par une déclaration [[SpecIF:contains]]. Elle correspond à un 'groupe' dans les diagrammes BPMN. (source: BPMN Tutoriel)

    ","@language":"fr"}],"pig:specializes":{"@id":"SpecIF:ModelElement"},"pig:icon":{"@value":"⬚"},"pig:eligibleProperty":[],"pig:eligibleTargetLink":[],"pig:itemType":{"@id":"pig:Entity"}},{"@id":"FMC:State","dcterms:title":[{"@value":"State","@language":"en"},{"@value":"Zustand","@language":"de"},{"@value":"État","@language":"fr"}],"dcterms:description":[{"@value":"

    A 'State' is a fundamental model element type representing a passive entity, be it a value, a condition, an information storage or even a physical shape.

    The particular use or the original type is specified with a [[dcterms:type]] property of the 'FMC:State'. A value of that property should bean ontology-term, such as [[bpmn:dataObject]].

    ","@language":"en"},{"@value":"

    Ein 'Zustand' ist ein fundamentaler Modellelementtyp, der eine passive Entität darstellt, sei es ein Wert, ein Dokument, ein Informationsspeicher, eine Bedingung oder eine physische Beschaffenheit.

    Die spezielle Verwendung oder der ursprüngliche Typ wird mit einer [[dcterms:type]] Eigenschaft von 'FMC:State' spezifiziert. Die Werte dieser Eigenschaft können Ontologiebegriffe sein, wie z.B. [[ArchiMate:DataObject]].

    ","@language":"de"},{"@value":"

    Un 'État' est un type d'élément de modèle fondamental représentant une entité passive, qu'il s'agisse d'une valeur, d'une condition, d'un stockage d'informations ou même d'une forme physique.

    L'utilisation particulière ou le type original est spécifié avec une propriété [[dcterms:type]] de 'FMC:State'. Les valeurs de cette propriété peuvent être des termes d'ontologie, tels que [[ArchiMate:DataObject]].

    ","@language":"fr"}],"pig:specializes":{"@id":"SpecIF:ModelElement"},"pig:icon":{"@value":"○"},"pig:eligibleProperty":[],"pig:eligibleTargetLink":[],"pig:itemType":{"@id":"pig:Entity"}},{"@id":"FMC:Event","dcterms:title":[{"@value":"Event","@language":"en"},{"@value":"Ereignis","@language":"de"},{"@value":"Évenement","@language":"fr"}],"dcterms:description":[{"@value":"

    An 'Event' is a fundamental model element type representing a time reference, a change in condition/value or more generally a synchronization primitive.

    The particular use or the original type is specified with a [[dcterms:type]] property of the 'FMC:Event'. A value of that property should be an ontology-term, such as [[bpmn:startEvent]].

    ","@language":"en"},{"@value":"

    Ein 'Ereignis' ist ein fundamentaler Modellelementtyp, der eine Zeitreferenz, eine Änderung einer Bedingung/eines Wertes oder allgemeiner ein Synchronisationsmittel darstellt.

    Die spezielle Verwendung oder der ursprüngliche Typ wird mit einer [[dcterms:type]] Eigenschaft von 'FMC:Event' spezifiziert. Die Werte dieser Eigenschaft sollen Ontologiebegriffe sein, wie z.B. [[bpmn:startEvent]].

    ","@language":"de"},{"@value":"

    Un 'Événement' est un type d'élément de modèle fondamental représentant une référence temporelle, un changement de condition/valeur ou plus généralement une primitive de synchronisation.

    L'utilisation particulière ou le type original est spécifié avec une propriété [[dcterms:type]] de 'FMC:Event'. Les valeurs de cette propriété peuvent être des termes d'ontologie, tels que [[bpmn:startEvent]].

    ","@language":"fr"}],"pig:specializes":{"@id":"SpecIF:ModelElement"},"pig:icon":{"@value":"♢"},"pig:eligibleProperty":[],"pig:eligibleTargetLink":[],"pig:itemType":{"@id":"pig:Entity"}},{"@id":"uml:Package","dcterms:title":[{"@value":"Package","@language":"en"}],"pig:specializes":{"@id":"SpecIF:Collection"},"pig:eligibleProperty":[],"pig:eligibleTargetLink":[],"pig:itemType":{"@id":"pig:Entity"}},{"@id":"IREB:Requirement","dcterms:title":[{"@value":"Requirement","@language":"en"},{"@value":"Anforderung","@language":"de"},{"@value":"Exigence","@language":"fr"}],"dcterms:description":[{"@value":"

    A 'Requirement' is a singular documented physical and functional need that a particular design, product or process must be able to perform. (source: Wikipedia)

    Definition:

    1. A condition or capability needed by a user to solve a problem or achieve an objective.
    2. A condition or capability that must be met or possessed by a system or system component to satisfy a contract, standard, specification, or other formally imposed documents.
    3. A documented representation of a condition or capability as in (1) or (2).

    Note: The definition above is the classic one from IEEE Std 610.12 of 1990. Alternatively, we also give a more modern definition:

    1. A need perceived by a stakeholder.
    2. A capability or property that a system shall have.
    3. A documented representation of a need, capability or property.
    ","@language":"en"},{"@value":"

    Eine 'Anforderung' ist ein einzelnes dokumentiertes physisches und funktionales Bedürfnis, das ein bestimmter Entwurf, ein Produkt oder ein Prozess erfüllen muss. (source: Wikipedia)

    Definition:

    1. Eine Bedingung oder Fähigkeit, die ein Benutzer benötigt, um ein Problem zu lösen oder ein Ziel zu erreichen.
    2. Eine Bedingung oder Fähigkeit, die ein System oder eine Systemkomponente erfüllen oder besitzen muss, um einen Vertrag, eine Norm, eine Spezifikation oder ein anderes formal vorgeschriebenes Dokument zu erfüllen.
    3. Eine dokumentierte Darstellung einer Bedingung oder Fähigkeit wie in (1) oder (2).

    Anmerkung: Die obige Definition ist die klassische Definition aus IEEE Std 610.12 von 1990. Alternativ geben wir auch eine modernere Definition an:

    1. Ein von einem Stakeholder wahrgenommener Bedarf.
    2. Eine Fähigkeit oder Eigenschaft, die ein System haben soll.
    3. Eine dokumentierte Darstellung eines Bedarfs, einer Fähigkeit oder Eigenschaft.
    ","@language":"de"},{"@value":"

    Une 'Exigence' est un besoin physique et fonctionnel unique et documenté qu'une conception, un produit ou un processus particulier doit pouvoir satisfaire. (source: Wikipedia)

    Définition:

    1. Condition ou capacité dont un utilisateur a besoin pour résoudre un problème ou atteindre un objectif.
    2. Condition ou capacité qui doit être remplie ou possédée par un système ou un composant de système pour satisfaire à un contrat, à une norme, à une spécification ou à d'autres documents imposés officiellement.
    3. Une représentation documentée d'une condition ou d'une capacité comme dans (1) ou (2).

    Remarque: La définition ci-dessus est la définition classique de la norme IEEE 610.12 de 1990. Nous donnons également une définition plus moderne:

    1. Un besoin perçu par une partie prenante;
    2. Une capacité ou une propriété qu'un système doit avoir.
    3. Une représentation documentée d'un besoin, d'une capacité ou d'une propriété.
    ","@language":"fr"}],"pig:specializes":{"@id":"pig:Entity"},"pig:icon":{"@value":"↯"},"pig:eligibleProperty":[{"@id":"pig:category"}],"pig:eligibleTargetLink":[],"pig:itemType":{"@id":"pig:Entity"}},{"@id":"SpecIF:relates","dcterms:title":[{"@value":"relates","@language":"en"},{"@value":"verbindet","@language":"de"},{"@value":"relie","@language":"fr"}],"dcterms:description":[{"@value":"Is a generalized type for model relations.","@language":"en"},{"@value":"Ist ein generalisierter Typ für Modellrelationen.","@language":"de"}],"pig:specializes":{"@id":"pig:Relationship"},"pig:eligibleProperty":[{"@id":"pig:category"}],"pig:itemType":{"@id":"pig:Relationship"},"pig:eligibleSourceLink":{"@id":"SpecIF:relates-toSource"},"pig:eligibleTargetLink":{"@id":"SpecIF:relates-toTarget"}},{"@id":"SpecIF:relates-toSource","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:SourceLink"},"dcterms:title":[{"@value":"SpecIF:relates to source"}],"dcterms:description":[{"@value":"Connects the source of SpecIF:relates"}],"pig:eligibleEndpoint":[{"@id":"pig:Entity"},{"@id":"pig:Relationship"}]},{"@id":"SpecIF:relates-toTarget","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:TargetLink"},"dcterms:title":[{"@value":"SpecIF:relates to target"}],"dcterms:description":[{"@value":"Connects the target of SpecIF:relates"}],"pig:eligibleEndpoint":[{"@id":"pig:Entity"},{"@id":"pig:Relationship"}]},{"@id":"dcterms:hasPart","dcterms:title":[{"@value":"has part","@language":"en"},{"@value":"enthält","@language":"de"},{"@value":"contient","@language":"fr"}],"dcterms:description":[{"@value":"A related resource that is included either physically or logically in the described resource.\n\n*Comment: This property is intended to be used with non-literal values. This property is an inverse property of [[dcterms:isPartOf]].*","@language":"en"}],"pig:specializes":{"@id":"SpecIF:relates"},"pig:eligibleProperty":[],"pig:itemType":{"@id":"pig:Relationship"},"pig:eligibleSourceLink":{"@id":"dcterms:hasPart-toSource"},"pig:eligibleTargetLink":{"@id":"dcterms:hasPart-toTarget"}},{"@id":"dcterms:hasPart-toSource","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:SourceLink"},"dcterms:title":[{"@value":"dcterms:hasPart to source"}],"dcterms:description":[{"@value":"Connects the source of dcterms:hasPart"}],"pig:eligibleEndpoint":[{"@id":"FMC:Actor"},{"@id":"FMC:State"},{"@id":"SpecIF:Collection"},{"@id":"SpecIF:ModelElement"},{"@id":"o:RC-UmlClass"}]},{"@id":"dcterms:hasPart-toTarget","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:TargetLink"},"dcterms:title":[{"@value":"dcterms:hasPart to target"}],"dcterms:description":[{"@value":"Connects the target of dcterms:hasPart"}],"pig:eligibleEndpoint":[{"@id":"FMC:Actor"},{"@id":"FMC:State"},{"@id":"SpecIF:Collection"},{"@id":"SpecIF:ModelElement"},{"@id":"o:RC-UmlPort"},{"@id":"o:RC-UmlClass"}]},{"@id":"SpecIF:contains","dcterms:title":[{"@value":"contains","@language":"en"},{"@value":"enthält","@language":"de"},{"@value":"contient","@language":"fr"}],"dcterms:description":[{"@value":"General containment, such as:\n- Package-A *contains* Diagram-B\n- Collection-1 *contains* DataObject-1.1\n\nNot to confound with *[[dcterms:hasPart]]*.","@language":"en"}],"pig:specializes":{"@id":"SpecIF:relates"},"pig:eligibleProperty":[],"pig:itemType":{"@id":"pig:Relationship"},"pig:eligibleSourceLink":{"@id":"SpecIF:contains-toSource"},"pig:eligibleTargetLink":{"@id":"SpecIF:contains-toTarget"}},{"@id":"SpecIF:contains-toSource","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:SourceLink"},"dcterms:title":[{"@value":"SpecIF:contains to source"}],"dcterms:description":[{"@value":"Connects the source of SpecIF:contains"}],"pig:eligibleEndpoint":[{"@id":"FMC:Actor"},{"@id":"FMC:State"},{"@id":"SpecIF:Collection"},{"@id":"uml:Package"}]},{"@id":"SpecIF:contains-toTarget","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:TargetLink"},"dcterms:title":[{"@value":"SpecIF:contains to target"}],"dcterms:description":[{"@value":"Connects the target of SpecIF:contains"}],"pig:eligibleEndpoint":[{"@id":"FMC:Actor"},{"@id":"FMC:State"},{"@id":"FMC:Event"},{"@id":"SpecIF:Collection"},{"@id":"uml:Package"},{"@id":"SpecIF:ModelElement"},{"@id":"o:RC-SpecifView"},{"@id":"o:RC-PigView"},{"@id":"pig:View"},{"@id":"IREB:Requirement"}]},{"@id":"oslc_rm:satisfies","dcterms:title":[{"@value":"satisfies","@language":"en"},{"@value":"erfüllt","@language":"de"},{"@value":"satisfait","@language":"fr"}],"dcterms:description":[{"@value":"

    The object is satisfied by the subject. (source: OSLC)

    SpecIF suggests that the subject is confined to a model element, e.g, a [[FMC:Actor]] or [[FMC:State]], and the object is confined to a [[IREB:Requirement]]. More concretely, an example for this type of statement is 'Component-X satisfies 'Requirement-4711'.

    ","@language":"en"}],"pig:specializes":{"@id":"pig:Relationship"},"pig:eligibleProperty":[],"pig:itemType":{"@id":"pig:Relationship"},"pig:eligibleSourceLink":{"@id":"oslc_rm:satisfies-toSource"},"pig:eligibleTargetLink":{"@id":"oslc_rm:satisfies-toTarget"}},{"@id":"oslc_rm:satisfies-toSource","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:SourceLink"},"dcterms:title":[{"@value":"oslc_rm:satisfies to source"}],"dcterms:description":[{"@value":"Connects the source of oslc_rm:satisfies"}],"pig:eligibleEndpoint":[{"@id":"pig:Entity"},{"@id":"pig:Relationship"}]},{"@id":"oslc_rm:satisfies-toTarget","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:TargetLink"},"dcterms:title":[{"@value":"oslc_rm:satisfies to target"}],"dcterms:description":[{"@value":"Connects the target of oslc_rm:satisfies"}],"pig:eligibleEndpoint":[{"@id":"IREB:Requirement"}]},{"@id":"IREB:refines","dcterms:title":[{"@value":"refines","@language":"en"},{"@value":"verfeinert","@language":"de"},{"@value":"affine","@language":"fr"}],"dcterms:description":[{"@value":"

    A [[IREB:Requirement]] 'refines' another [[IREB:Requirement]].

    ","@language":"en"}],"pig:specializes":{"@id":"pig:Relationship"},"pig:eligibleProperty":[],"pig:itemType":{"@id":"pig:Relationship"},"pig:eligibleSourceLink":{"@id":"IREB:refines-toSource"},"pig:eligibleTargetLink":{"@id":"IREB:refines-toTarget"}},{"@id":"IREB:refines-toSource","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:SourceLink"},"dcterms:title":[{"@value":"IREB:refines to source"}],"dcterms:description":[{"@value":"Connects the source of IREB:refines"}],"pig:eligibleEndpoint":[{"@id":"IREB:Requirement"}]},{"@id":"IREB:refines-toTarget","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:TargetLink"},"dcterms:title":[{"@value":"IREB:refines to target"}],"dcterms:description":[{"@value":"Connects the target of IREB:refines"}],"pig:eligibleEndpoint":[{"@id":"IREB:Requirement"}]},{"@id":"sysml:Allocate","dcterms:title":[{"@value":"is allocated to","@language":"en"},{"@value":"zugeordnet zu","@language":"de"},{"@value":"allouée à","@language":"fr"}],"dcterms:description":[{"@value":"

    An [[FMC:Actor]] is allocated to another [[FMC:Actor]] (e.g. a logical function is allocated to a physical component.

    ","@language":"en"}],"pig:specializes":{"@id":"pig:Relationship"},"pig:eligibleProperty":[],"pig:itemType":{"@id":"pig:Relationship"},"pig:eligibleSourceLink":{"@id":"sysml:Allocate-toSource"},"pig:eligibleTargetLink":{"@id":"sysml:Allocate-toTarget"}},{"@id":"sysml:Allocate-toSource","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:SourceLink"},"dcterms:title":[{"@value":"sysml:Allocate to source"}],"dcterms:description":[{"@value":"Connects the source of sysml:Allocate"}],"pig:eligibleEndpoint":[{"@id":"SpecIF:ModelElement"}]},{"@id":"sysml:Allocate-toTarget","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:TargetLink"},"dcterms:title":[{"@value":"sysml:Allocate to target"}],"dcterms:description":[{"@value":"Connects the target of sysml:Allocate"}],"pig:eligibleEndpoint":[{"@id":"SpecIF:ModelElement"}]},{"@id":"uml:ownedBehavior","dcterms:title":[{"@value":"has Behavior"}],"pig:specializes":{"@id":"pig:Relationship"},"pig:eligibleProperty":[],"pig:itemType":{"@id":"pig:Relationship"},"pig:eligibleSourceLink":{"@id":"uml:ownedBehavior-toSource"},"pig:eligibleTargetLink":{"@id":"uml:ownedBehavior-toTarget"}},{"@id":"uml:ownedBehavior-toSource","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:SourceLink"},"dcterms:title":[{"@value":"uml:ownedBehavior to source"}],"dcterms:description":[{"@value":"Connects the source of uml:ownedBehavior"}],"pig:eligibleEndpoint":[{"@id":"pig:Entity"},{"@id":"pig:Relationship"}]},{"@id":"uml:ownedBehavior-toTarget","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:TargetLink"},"dcterms:title":[{"@value":"uml:ownedBehavior to target"}],"dcterms:description":[{"@value":"Connects the target of uml:ownedBehavior"}],"pig:eligibleEndpoint":[{"@id":"o:RC-UmlStatemachine"},{"@id":"o:RC-UmlActivity"},{"@id":"FMC:Actor"},{"@id":"o:RC-UmlUsecase"}]},{"@id":"uml:Trigger","dcterms:title":[{"@value":"triggers"}],"pig:specializes":{"@id":"pig:Relationship"},"pig:eligibleProperty":[],"pig:itemType":{"@id":"pig:Relationship"},"pig:eligibleSourceLink":{"@id":"uml:Trigger-toSource"},"pig:eligibleTargetLink":{"@id":"uml:Trigger-toTarget"}},{"@id":"uml:Trigger-toSource","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:SourceLink"},"dcterms:title":[{"@value":"uml:Trigger to source"}],"dcterms:description":[{"@value":"Connects the source of uml:Trigger"}],"pig:eligibleEndpoint":[{"@id":"pig:Entity"},{"@id":"pig:Relationship"}]},{"@id":"uml:Trigger-toTarget","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:TargetLink"},"dcterms:title":[{"@value":"uml:Trigger to target"}],"dcterms:description":[{"@value":"Connects the target of uml:Trigger"}],"pig:eligibleEndpoint":[{"@id":"pig:Entity"},{"@id":"pig:Relationship"}]},{"@id":"uml:TransitionSource","dcterms:title":[{"@value":"starts from"}],"pig:specializes":{"@id":"pig:Relationship"},"pig:eligibleProperty":[],"pig:itemType":{"@id":"pig:Relationship"},"pig:eligibleSourceLink":{"@id":"uml:TransitionSource-toSource"},"pig:eligibleTargetLink":{"@id":"uml:TransitionSource-toTarget"}},{"@id":"uml:TransitionSource-toSource","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:SourceLink"},"dcterms:title":[{"@value":"uml:TransitionSource to source"}],"dcterms:description":[{"@value":"Connects the source of uml:TransitionSource"}],"pig:eligibleEndpoint":[{"@id":"o:RC-UmlTransition"},{"@id":"FMC:Actor"}]},{"@id":"uml:TransitionSource-toTarget","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:TargetLink"},"dcterms:title":[{"@value":"uml:TransitionSource to target"}],"dcterms:description":[{"@value":"Connects the target of uml:TransitionSource"}],"pig:eligibleEndpoint":[{"@id":"o:RC-UmlState"},{"@id":"FMC:State"}]},{"@id":"uml:TransitionTarget","dcterms:title":[{"@value":"ends at"}],"pig:specializes":{"@id":"pig:Relationship"},"pig:eligibleProperty":[],"pig:itemType":{"@id":"pig:Relationship"},"pig:eligibleSourceLink":{"@id":"uml:TransitionTarget-toSource"},"pig:eligibleTargetLink":{"@id":"uml:TransitionTarget-toTarget"}},{"@id":"uml:TransitionTarget-toSource","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:SourceLink"},"dcterms:title":[{"@value":"uml:TransitionTarget to source"}],"dcterms:description":[{"@value":"Connects the source of uml:TransitionTarget"}],"pig:eligibleEndpoint":[{"@id":"o:RC-UmlTransition"},{"@id":"FMC:Actor"}]},{"@id":"uml:TransitionTarget-toTarget","pig:itemType":{"@id":"pig:Link"},"pig:specializes":{"@id":"pig:TargetLink"},"dcterms:title":[{"@value":"uml:TransitionTarget to target"}],"dcterms:description":[{"@value":"Connects the target of uml:TransitionTarget"}],"pig:eligibleEndpoint":[{"@id":"o:RC-UmlState"},{"@id":"FMC:State"}]},{"@id":"d:_19_0_3_71e0233_1746001337727_31616_14119","@type":"uml:Package","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"1. Requirements"}],"pig:category":[{"@value":"uml:Package","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552810549321_335902_14037","@type":"pig:View","pig:revision":"rev-9405830621","dcterms:modified":"2025-11-12T09:28:04.871Z","dcterms:title":[{"@value":"Original Requirement Specification"}],"SpecIF:Diagram":[{"@value":"files_and_images/Original Requirement Specification.png","pig:itemType":{"@id":"pig:aProperty"}}],"pig:category":[{"@value":"uml:Diagram","pig:itemType":{"@id":"pig:aProperty"}}],"SpecIF:Notation":[{"@value":"UML Requirement Diagram","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"},"pig:shows":[{"@id":"d:_18_5_3_bc402f4_1552810869277_586147_14175","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552810948738_707540_14217","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552810776263_894029_14121","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552813199775_830344_15281","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552810644650_650036_14079","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552812437056_257578_14975","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552812370943_152244_14924","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552811136575_459751_14253","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552811141795_384989_14263","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552813433937_279860_15327","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552810808641_447672_14157","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552813334959_22842_15317","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552813438857_436917_15337","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552810776263_894029_14121","@type":"IREB:Requirement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Navigation"}],"pig:category":[{"@value":"uml:Class","pig:itemType":{"@id":"pig:aProperty"}}],"dcterms:description":[{"@value":"The Vehicle shall autonomously choose the best route from the current location C to the target location T by means of a road map and actual traffic conditions."}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552810869277_586147_14175","@type":"IREB:Requirement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Road Driving"}],"pig:category":[{"@value":"uml:Class","pig:itemType":{"@id":"pig:aProperty"}}],"dcterms:description":[{"@value":"The vehicle shall be able to follow a selected road."}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552810644650_650036_14079","@type":"IREB:Requirement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Transport to Target"}],"pig:category":[{"@value":"uml:Class","pig:itemType":{"@id":"pig:aProperty"}}],"dcterms:description":[{"@value":"As a customer I would like to get a parcel delivered from the current location C to a target location T. "}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552812370943_152244_14924","@type":"IREB:Requirement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Location as Postal Address"}],"pig:category":[{"@value":"uml:Class","pig:itemType":{"@id":"pig:aProperty"}}],"dcterms:description":[{"@value":"A location may be specified as a postal address."}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552813199775_830344_15281","@type":"IREB:Requirement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Obstacle Avoidance"}],"pig:category":[{"@value":"uml:Class","pig:itemType":{"@id":"pig:aProperty"}}],"dcterms:description":[{"@value":"The vehicle shall not hit a person or an obstacle on the road."}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552810948738_707540_14217","@type":"IREB:Requirement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Safe Driving"}],"pig:category":[{"@value":"uml:Class","pig:itemType":{"@id":"pig:aProperty"}}],"dcterms:description":[{"@value":"The vehicle shall drive no faster than allowed or adequate for the actual road condition."}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552812437056_257578_14975","@type":"IREB:Requirement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Loacation as GPS Coordinate"}],"pig:category":[{"@value":"uml:Class","pig:itemType":{"@id":"pig:aProperty"}}],"dcterms:description":[{"@value":"A location may be specified as GPS Coordinate with Longitude and Latitude in Degrees."}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746001480225_327746_14120","@type":"uml:Package","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"2. Functional Layer"}],"pig:category":[{"@value":"uml:Package","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552811870216_105923_14824","@type":"pig:View","pig:revision":"rev-11094738149","dcterms:modified":"2025-11-12T09:28:21.131Z","dcterms:title":[{"@value":"Functional Decomposition"}],"SpecIF:Diagram":[{"@value":"files_and_images/Functional Decomposition.png","pig:itemType":{"@id":"pig:aProperty"}}],"pig:category":[{"@value":"uml:Diagram","pig:itemType":{"@id":"pig:aProperty"}}],"SpecIF:Notation":[{"@value":"SysML Block Definition Diagram","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"},"pig:shows":[{"@id":"d:_18_5_3_bc402f4_1552814104357_719492_15607","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552812805784_548404_15062","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552815791106_548984_16360","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552814523707_628151_15988","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1556615164506_303870_14975","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552811937697_690731_14862","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552812663506_709974_15011","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552813556602_820961_15353","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552810948738_707540_14217","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552810776263_894029_14121","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1556615212765_548060_15021","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552814194319_862392_15683","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552814246502_629251_15775","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_e40094_1718632293724_754873_14112","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552810869277_586147_14175","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552814212889_663150_15729","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552813038602_222864_15129","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552811510062_903764_14503","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552814266523_206006_15821","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552813818846_218375_15548","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_e40094_1718632569345_311906_14190","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_bc402f4_1604324293194_85516_13666","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_e40094_1718632549973_831908_14172","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_bc402f4_1604324214402_6480_13631","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_bc402f4_1604324487193_60359_13731","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_bc402f4_1604323867629_562362_13452","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552813096475_160687_15177","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1556615683513_411874_15073","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1556615721418_831605_15106","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_bc402f4_1604323821792_371188_13426","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552813723040_381289_15401","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552813102494_993665_15207","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_bc402f4_1604324465452_775050_13715","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_bc402f4_1604324188817_384398_13615","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552815590348_672436_16293","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552815653359_771130_16352","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_bc402f4_1604323888993_530325_13468","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552813795106_879353_15508","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_bc402f4_1604324636141_429081_13763","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_bc402f4_1604324764626_856811_13779","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_bc402f4_1604324512097_628722_13747","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552813870706_981259_15588","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_bc402f4_1604324447693_373448_13698","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_bc402f4_1604324321433_274293_13682","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552815541056_996851_16231","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552813556602_820961_15353","@type":"SpecIF:ModelElement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Brake in an Emergency"}],"pig:category":[{"@value":"RFLP:Function","pig:itemType":{"@id":"pig:aProperty"}}],"dcterms:description":[{"@value":"Take the vehicle to a full stop in the shortest time possible without loosing control over the trajectory."}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552814212889_663150_15729","@type":"SpecIF:ModelElement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Set Speed"}],"pig:category":[{"@value":"RFLP:Function","pig:itemType":{"@id":"pig:aProperty"}}],"dcterms:description":[{"@value":"The (autonomous) driver's speed command (gas pedal position)."}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1556615164506_303870_14975","@type":"SpecIF:ModelElement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Turn Right"}],"pig:category":[{"@value":"RFLP:Function","pig:itemType":{"@id":"pig:aProperty"}}],"dcterms:description":[{"@value":"Take a right turn at a road intersection. Observe the traffic entering the same lane and avoid a collision, if another vehicle does not observe the priority rules."}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552814194319_862392_15683","@type":"SpecIF:ModelElement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Set Radius"}],"pig:category":[{"@value":"RFLP:Function","pig:itemType":{"@id":"pig:aProperty"}}],"dcterms:description":[{"@value":"The (autonomous) driver's steering command (steering wheel position)."}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552812663506_709974_15011","@type":"SpecIF:ModelElement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Navigate"}],"pig:category":[{"@value":"RFLP:Function","pig:itemType":{"@id":"pig:aProperty"}}],"dcterms:description":[{"@value":"Select a path to get from the current position to the target."}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552814523707_628151_15988","@type":"SpecIF:ModelElement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Calculate Accelerations"}],"pig:category":[{"@value":"RFLP:Function","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1556615212765_548060_15021","@type":"SpecIF:ModelElement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Turn Left"}],"pig:category":[{"@value":"RFLP:Function","pig:itemType":{"@id":"pig:aProperty"}}],"dcterms:description":[{"@value":"Take a left turn in a road intersection. Observe the priority rules and avoid traffic on the two lanes you are crossing."}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552811937697_690731_14862","@type":"SpecIF:ModelElement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Drive to Target"}],"pig:category":[{"@value":"RFLP:Function","pig:itemType":{"@id":"pig:aProperty"}}],"dcterms:description":[{"@value":"Manoevre the vehicle from the current position to the selected target."}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552814246502_629251_15775","@type":"SpecIF:ModelElement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Set Acceleration Left"}],"pig:category":[{"@value":"RFLP:Function","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552813038602_222864_15129","@type":"SpecIF:ModelElement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Select an adequate Speed"}],"pig:category":[{"@value":"RFLP:Function","pig:itemType":{"@id":"pig:aProperty"}}],"dcterms:description":[{"@value":"Taking into account road condition and weather, select a safe speed."}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552815791106_548984_16360","@type":"SpecIF:ModelElement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Set Acceleration Right"}],"pig:category":[{"@value":"RFLP:Function","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552812805784_548404_15062","@type":"SpecIF:ModelElement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Follow the Road"}],"pig:category":[{"@value":"RFLP:Function","pig:itemType":{"@id":"pig:aProperty"}}],"dcterms:description":[{"@value":"Keep the vehicle on the selected road."}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552814266523_206006_15821","@type":"SpecIF:ModelElement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Apply Brake"}],"pig:category":[{"@value":"RFLP:Function","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","@type":"uml:Package","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"3. Logical Layer"}],"pig:category":[{"@value":"uml:Package","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746027287147_82140_14431","@type":"pig:View","pig:revision":"rev-7887707545","dcterms:modified":"2025-11-12T09:28:38.225Z","dcterms:title":[{"@value":"Logical Decomposition"}],"SpecIF:Diagram":[{"@value":"files_and_images/Logical Decomposition.png","pig:itemType":{"@id":"pig:aProperty"}}],"pig:category":[{"@value":"uml:Diagram","pig:itemType":{"@id":"pig:aProperty"}}],"SpecIF:Notation":[{"@value":"SysML Block Definition Diagram","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"},"pig:shows":[{"@id":"d:_18_5_3_bc402f4_1552814104357_719492_15607","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552811538626_715866_14549","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_e40094_1718632293724_754873_14112","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_bc402f4_1604360793737_196507_13523","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552811469014_293642_14411","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552811454014_108965_14365","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552827771600_60767_16481","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552811554859_819240_14595","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552811412605_640145_14319","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552811510062_903764_14503","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552811672063_243990_14798","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_e40094_1718634030433_51877_14234","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_bc402f4_1604360962045_534106_13570","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552814131280_1190_15654","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552811613008_58411_14648","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552811666192_832840_14768","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552827804167_216283_16528","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552811619502_982677_14678","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552811653332_976698_14708","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_19_0_3_e40094_1718632293724_754873_14112","@type":"SpecIF:ModelElement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Drive Right"}],"pig:category":[{"@value":"RFLP:Logical_System","pig:itemType":{"@id":"pig:aProperty"}}],"dcterms:description":[{"@value":"The wheel with motor and brake on the right side. The motor can accelerate and decelerate. The motor controller is \"4-quadrant\" and can supply electrical current for recharging the batteries."}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552827771600_60767_16481","@type":"SpecIF:ModelElement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Track Sensor"}],"pig:category":[{"@value":"RFLP:Logical_System","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552811469014_293642_14411","@type":"SpecIF:ModelElement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Body"}],"pig:category":[{"@value":"RFLP:Logical_System","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552811510062_903764_14503","@type":"SpecIF:ModelElement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Drive Left"}],"pig:category":[{"@value":"RFLP:Logical_System","pig:itemType":{"@id":"pig:aProperty"}}],"dcterms:description":[{"@value":"The wheel with motor and brake on the left side. The motor can accelerate and decelerate. The motor controller is \"4-quadrant\" and can supply electrical current for recharging the batteries."}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552811412605_640145_14319","@type":"SpecIF:ModelElement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"LEGO Mindstorms Vehicle"}],"pig:category":[{"@value":"RFLP:Logical_System","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552811538626_715866_14549","@type":"SpecIF:ModelElement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Support Front"}],"pig:category":[{"@value":"RFLP:Logical_System","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552814104357_719492_15607","@type":"SpecIF:ModelElement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Controller"}],"pig:category":[{"@value":"RFLP:Logical_System","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746027630926_778269_14800","@type":"pig:View","pig:revision":"rev-11807243868","dcterms:modified":"2025-11-12T09:29:01.139Z","dcterms:title":[{"@value":"Controller State Machine"}],"SpecIF:Diagram":[{"@value":"files_and_images/Controller State Machine.png","pig:itemType":{"@id":"pig:aProperty"}}],"pig:category":[{"@value":"uml:Diagram","pig:itemType":{"@id":"pig:aProperty"}}],"SpecIF:Notation":[{"@value":"SysML State Machine Diagram","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"},"pig:shows":[{"@id":"d:_19_0_3_71e0233_1746027747207_605800_14880","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028306923_558192_15006","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027631039_116153_14834","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027847324_539644_14916","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028149871_266697_14985","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028183413_413266_14988","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028605370_466818_15028","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027920180_215768_14934","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027631053_836894_14835","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028442990_717820_15013","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028275862_880382_14999","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027631056_691503_14836","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027731735_863978_14871","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027704287_746273_14855","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746029049431_401220_15072","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027837044_867827_14913","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027882482_912182_14918","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028839192_503107_15053","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028827712_739888_15050","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028061993_960870_14971","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028073773_979720_14974","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027804266_719052_14896","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028508430_363448_15020","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028822501_191804_15047","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027731735_371186_14872","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027967661_707482_14950","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027630942_863638_14801","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027630942_464786_14802","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746029024681_691401_15066","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028118776_36360_14979","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746029726958_589946_15078","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028195311_519257_14989","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028216231_986687_14993","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028282302_943711_15000","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028313498_548385_15007","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028899054_101006_15058","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028954791_356054_15062","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028884803_562591_15054","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746029056197_950529_15073","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028540160_854095_15021","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028483612_410592_15014","pig:itemType":{"@id":"pig:aTargetLink"}}],"pig:depicts":[{"@id":"d:_19_0_3_71e0233_1746027630942_863638_14801","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_19_0_3_71e0233_1746027631039_116153_14834","@type":"FMC:State","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"entry"}],"pig:category":[{"@value":"uml:Pseudostate","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746027631053_836894_14835","@type":"FMC:State","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Off"}],"pig:category":[{"@value":"uml:State","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746027731735_863978_14871","@type":"FMC:State","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"entry"}],"pig:category":[{"@value":"uml:Pseudostate","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746027747207_605800_14880","@type":"FMC:State","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Navigating"}],"pig:category":[{"@value":"uml:State","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746027804266_719052_14896","@type":"FMC:State","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Defining Target"}],"pig:category":[{"@value":"uml:State","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746027882482_912182_14918","@type":"FMC:State","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Following the Road"}],"pig:category":[{"@value":"uml:State","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746027920180_215768_14934","@type":"FMC:State","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Turning Right"}],"pig:category":[{"@value":"uml:State","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746027967661_707482_14950","@type":"FMC:State","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Turning Left"}],"pig:category":[{"@value":"uml:State","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746028605370_466818_15028","@type":"FMC:State","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Standing"}],"pig:category":[{"@value":"uml:State","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746027837044_867827_14913","@type":"FMC:Actor","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"entry→Defining Target"}],"pig:category":[{"@value":"uml:Transition","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746027847324_539644_14916","@type":"FMC:Actor","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Defining Target→Navigating"}],"pig:category":[{"@value":"uml:Transition","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746028061993_960870_14971","@type":"FMC:Actor","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Navigating→Following the Road"}],"pig:category":[{"@value":"uml:Transition","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746028073773_979720_14974","@type":"FMC:Actor","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Following the Road→Navigating"}],"pig:category":[{"@value":"uml:Transition","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746028149871_266697_14985","@type":"FMC:Actor","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Following the Road→Turning Right"}],"pig:category":[{"@value":"uml:Transition","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746028183413_413266_14988","@type":"FMC:Actor","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Turning Right→Following the Road"}],"pig:category":[{"@value":"uml:Transition","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746028275862_880382_14999","@type":"FMC:Actor","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Following the Road→Turning Left"}],"pig:category":[{"@value":"uml:Transition","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746028306923_558192_15006","@type":"FMC:Actor","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Turning Left→Following the Road"}],"pig:category":[{"@value":"uml:Transition","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746028822501_191804_15047","@type":"FMC:Actor","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Following the Road→Standing"}],"pig:category":[{"@value":"uml:Transition","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746028827712_739888_15050","@type":"FMC:Actor","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Following the Road→Standing"}],"pig:category":[{"@value":"uml:Transition","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746028839192_503107_15053","@type":"FMC:Actor","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Standing→Following the Road"}],"pig:category":[{"@value":"uml:Transition","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746029049431_401220_15072","@type":"FMC:Actor","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Standing→Defining Target"}],"pig:category":[{"@value":"uml:Transition","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746028508430_363448_15020","@type":"FMC:Actor","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Standing→Off"}],"pig:category":[{"@value":"uml:Transition","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746027704287_746273_14855","@type":"FMC:State","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"On"}],"pig:category":[{"@value":"uml:State","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746027631056_691503_14836","@type":"FMC:Actor","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"entry→Off"}],"pig:category":[{"@value":"uml:Transition","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746028442990_717820_15013","@type":"FMC:Actor","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Off→On"}],"pig:category":[{"@value":"uml:Transition","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552811554859_819240_14595","@type":"SpecIF:ModelElement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Support Rear"}],"pig:category":[{"@value":"RFLP:Logical_System","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_18_5_3_bc402f4_1552811454014_108965_14365","@type":"SpecIF:ModelElement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Chassis"}],"pig:category":[{"@value":"RFLP:Logical_System","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_bc402f4_1604360793737_196507_13523","@type":"SpecIF:ModelElement","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Collision Alarm \nSensor"}],"pig:category":[{"@value":"RFLP:Logical_System","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746028118776_36360_14979","@type":"FMC:Event","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"start_driving!"}],"pig:category":[{"@value":"uml:SignalEvent","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746028195311_519257_14989","@type":"FMC:Event","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"turn_right!"}],"pig:category":[{"@value":"uml:SignalEvent","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746028216231_986687_14993","@type":"FMC:Event","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"turned_right!"}],"pig:category":[{"@value":"uml:SignalEvent","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746028282302_943711_15000","@type":"FMC:Event","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"turn_left!"}],"pig:category":[{"@value":"uml:SignalEvent","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746028313498_548385_15007","@type":"FMC:Event","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"turned_left!"}],"pig:category":[{"@value":"uml:SignalEvent","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746028483612_410592_15014","@type":"FMC:Event","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"switch_on!"}],"pig:category":[{"@value":"uml:SignalEvent","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746028540160_854095_15021","@type":"FMC:Event","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"switch_off!"}],"pig:category":[{"@value":"uml:SignalEvent","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746028884803_562591_15054","@type":"FMC:Event","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"continue_driving!"}],"pig:category":[{"@value":"uml:SignalEvent","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746028899054_101006_15058","@type":"FMC:Event","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"halt!"}],"pig:category":[{"@value":"uml:SignalEvent","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746028954791_356054_15062","@type":"FMC:Event","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"emergency_brake!"}],"pig:category":[{"@value":"uml:SignalEvent","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746029024681_691401_15066","@type":"FMC:Event","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"navigate!"}],"pig:category":[{"@value":"uml:SignalEvent","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746029056197_950529_15073","@type":"FMC:Event","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"new_target!"}],"pig:category":[{"@value":"uml:SignalEvent","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746029726958_589946_15078","@type":"FMC:Event","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"re-navigate!"}],"pig:category":[{"@value":"uml:CallEvent","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746027630942_863638_14801","@type":"FMC:Actor","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"Controller State Machine"}],"pig:category":[{"@value":"uml:StateMachine","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746027630942_464786_14802","@type":"FMC:Actor","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"unnamed uml:Region"}],"pig:category":[{"@value":"uml:Region","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:_19_0_3_71e0233_1746027731735_371186_14872","@type":"FMC:Actor","dcterms:modified":"2025-09-24T08:28:08.223Z","dcterms:title":[{"@value":"unnamed uml:Region"}],"pig:category":[{"@value":"uml:Region","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"}},{"@id":"d:S-contains-10399921810","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001337727_31616_14119","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552810549321_335902_14037","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-10330010667","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001337727_31616_14119","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552810776263_894029_14121","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-10652725449","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001337727_31616_14119","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552810869277_586147_14175","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-11927092777","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001337727_31616_14119","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552810644650_650036_14079","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-8881937697","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001337727_31616_14119","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552812370943_152244_14924","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-10783514673","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001337727_31616_14119","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552813199775_830344_15281","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-10945506396","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001337727_31616_14119","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552810948738_707540_14217","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-11407335150","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001337727_31616_14119","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552812437056_257578_14975","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-9116397029","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001480225_327746_14120","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552811870216_105923_14824","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-10022314071","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001480225_327746_14120","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552813556602_820961_15353","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-9131303994","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001480225_327746_14120","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552814212889_663150_15729","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-8559115413","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001480225_327746_14120","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1556615164506_303870_14975","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-10881577187","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001480225_327746_14120","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552814194319_862392_15683","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-9119481481","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001480225_327746_14120","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552812663506_709974_15011","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-12098040971","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001480225_327746_14120","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552814523707_628151_15988","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-10442923979","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001480225_327746_14120","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1556615212765_548060_15021","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-11694297906","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001480225_327746_14120","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552811937697_690731_14862","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-9652197932","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001480225_327746_14120","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552814246502_629251_15775","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-9362975811","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001480225_327746_14120","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552813038602_222864_15129","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-10771124872","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001480225_327746_14120","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552815791106_548984_16360","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-9168262784","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001480225_327746_14120","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552812805784_548404_15062","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-8878119738","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001480225_327746_14120","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552814266523_206006_15821","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_19_0_3_bc402f4_1604324487193_60359_13731","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1552812805784_548404_15062","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552814194319_862392_15683","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_19_0_3_bc402f4_1604323888993_530325_13468","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1552813556602_820961_15353","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552814523707_628151_15988","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_19_0_3_bc402f4_1604324214402_6480_13631","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1552814523707_628151_15988","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552815791106_548984_16360","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_19_0_3_bc402f4_1604324447693_373448_13698","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1556615212765_548060_15021","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552814194319_862392_15683","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1556615721418_831605_15106","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1552811937697_690731_14862","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1556615212765_548060_15021","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1556615683513_411874_15073","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1552811937697_690731_14862","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1556615164506_303870_14975","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552813723040_381289_15401","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1552811937697_690731_14862","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552813556602_820961_15353","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_19_0_3_bc402f4_1604324465452_775050_13715","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1556615164506_303870_14975","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552814194319_862392_15683","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_19_0_3_bc402f4_1604324512097_628722_13747","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1556615164506_303870_14975","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552813038602_222864_15129","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_19_0_3_bc402f4_1604323867629_562362_13452","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1552814212889_663150_15729","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552814523707_628151_15988","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_19_0_3_bc402f4_1604324293194_85516_13666","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1552814523707_628151_15988","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552814266523_206006_15821","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_19_0_3_bc402f4_1604324321433_274293_13682","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1556615212765_548060_15021","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552813038602_222864_15129","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_19_0_3_bc402f4_1604324636141_429081_13763","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1552812805784_548404_15062","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552813038602_222864_15129","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552813096475_160687_15177","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1552811937697_690731_14862","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552812663506_709974_15011","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_19_0_3_bc402f4_1604324764626_856811_13779","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1552813038602_222864_15129","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552814212889_663150_15729","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_19_0_3_bc402f4_1604323821792_371188_13426","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1552814194319_862392_15683","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552814523707_628151_15988","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552813102494_993665_15207","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1552811937697_690731_14862","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552812805784_548404_15062","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_19_0_3_bc402f4_1604324188817_384398_13615","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1552814523707_628151_15988","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552814246502_629251_15775","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-10564266575","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027287147_82140_14431","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-11515557626","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_e40094_1718632293724_754873_14112","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-9482395742","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552827771600_60767_16481","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-9179309009","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552811469014_293642_14411","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-8743767210","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552811510062_903764_14503","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-8520696102","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552811412605_640145_14319","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-8274829800","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552811538626_715866_14549","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-8790231064","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552814104357_719492_15607","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-ownedBehavior-10906203416","@type":"uml:ownedBehavior","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:ownedBehavior-toSource":[{"@id":"d:_18_5_3_bc402f4_1552814104357_719492_15607","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:ownedBehavior-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027630942_863638_14801","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-8869082288","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027630942_863638_14801","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-9973927808","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027630926_778269_14800","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-11028317306","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746027630942_863638_14801","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027630942_464786_14802","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-10256822099","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746027630942_464786_14802","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027631039_116153_14834","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-8821517563","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746027630942_464786_14802","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027631053_836894_14835","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-8168210938","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746027630942_464786_14802","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027704287_746273_14855","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-11015906742","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746027704287_746273_14855","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027731735_371186_14872","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-10159638974","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746027731735_371186_14872","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027731735_863978_14871","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-11234558713","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746027731735_371186_14872","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027747207_605800_14880","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-8004350392","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746027731735_371186_14872","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027804266_719052_14896","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-10687126464","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746027731735_371186_14872","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027882482_912182_14918","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-9457711542","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746027731735_371186_14872","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027920180_215768_14934","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-10206589560","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746027731735_371186_14872","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027967661_707482_14950","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-11254687961","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746027731735_371186_14872","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028605370_466818_15028","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-startsFrom-10764992335","@type":"uml:TransitionSource","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionSource-toSource":[{"@id":"d:_19_0_3_71e0233_1746027837044_867827_14913","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionSource-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027731735_863978_14871","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-endsAt-10266389823","@type":"uml:TransitionTarget","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionTarget-toSource":[{"@id":"d:_19_0_3_71e0233_1746027837044_867827_14913","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionTarget-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027804266_719052_14896","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-startsFrom-9736561245","@type":"uml:TransitionSource","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionSource-toSource":[{"@id":"d:_19_0_3_71e0233_1746027847324_539644_14916","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionSource-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027804266_719052_14896","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-endsAt-11306959252","@type":"uml:TransitionTarget","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionTarget-toSource":[{"@id":"d:_19_0_3_71e0233_1746027847324_539644_14916","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionTarget-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027747207_605800_14880","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-triggers-11057421225","@type":"uml:Trigger","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:Trigger-toSource":[{"@id":"d:_19_0_3_71e0233_1746029024681_691401_15066","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:Trigger-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027847324_539644_14916","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-startsFrom-10753048967","@type":"uml:TransitionSource","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionSource-toSource":[{"@id":"d:_19_0_3_71e0233_1746028061993_960870_14971","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionSource-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027747207_605800_14880","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-endsAt-10164860996","@type":"uml:TransitionTarget","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionTarget-toSource":[{"@id":"d:_19_0_3_71e0233_1746028061993_960870_14971","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionTarget-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027882482_912182_14918","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-triggers-9989729747","@type":"uml:Trigger","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:Trigger-toSource":[{"@id":"d:_19_0_3_71e0233_1746028118776_36360_14979","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:Trigger-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028061993_960870_14971","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-startsFrom-8258457006","@type":"uml:TransitionSource","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionSource-toSource":[{"@id":"d:_19_0_3_71e0233_1746028073773_979720_14974","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionSource-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027882482_912182_14918","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-endsAt-8326005469","@type":"uml:TransitionTarget","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionTarget-toSource":[{"@id":"d:_19_0_3_71e0233_1746028073773_979720_14974","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionTarget-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027747207_605800_14880","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-triggers-11586041943","@type":"uml:Trigger","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:Trigger-toSource":[{"@id":"d:_19_0_3_71e0233_1746029726958_589946_15078","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:Trigger-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028073773_979720_14974","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-startsFrom-10663437825","@type":"uml:TransitionSource","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionSource-toSource":[{"@id":"d:_19_0_3_71e0233_1746028149871_266697_14985","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionSource-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027882482_912182_14918","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-endsAt-10827655661","@type":"uml:TransitionTarget","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionTarget-toSource":[{"@id":"d:_19_0_3_71e0233_1746028149871_266697_14985","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionTarget-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027920180_215768_14934","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-triggers-11897440242","@type":"uml:Trigger","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:Trigger-toSource":[{"@id":"d:_19_0_3_71e0233_1746028195311_519257_14989","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:Trigger-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028149871_266697_14985","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-startsFrom-10501816934","@type":"uml:TransitionSource","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionSource-toSource":[{"@id":"d:_19_0_3_71e0233_1746028183413_413266_14988","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionSource-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027920180_215768_14934","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-endsAt-9816959590","@type":"uml:TransitionTarget","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionTarget-toSource":[{"@id":"d:_19_0_3_71e0233_1746028183413_413266_14988","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionTarget-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027882482_912182_14918","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-triggers-8400858676","@type":"uml:Trigger","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:Trigger-toSource":[{"@id":"d:_19_0_3_71e0233_1746028216231_986687_14993","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:Trigger-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028183413_413266_14988","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-startsFrom-9888010871","@type":"uml:TransitionSource","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionSource-toSource":[{"@id":"d:_19_0_3_71e0233_1746028275862_880382_14999","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionSource-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027882482_912182_14918","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-endsAt-7971585829","@type":"uml:TransitionTarget","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionTarget-toSource":[{"@id":"d:_19_0_3_71e0233_1746028275862_880382_14999","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionTarget-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027967661_707482_14950","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-triggers-8791358862","@type":"uml:Trigger","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:Trigger-toSource":[{"@id":"d:_19_0_3_71e0233_1746028282302_943711_15000","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:Trigger-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028275862_880382_14999","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-startsFrom-8873253251","@type":"uml:TransitionSource","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionSource-toSource":[{"@id":"d:_19_0_3_71e0233_1746028306923_558192_15006","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionSource-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027967661_707482_14950","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-endsAt-10269038785","@type":"uml:TransitionTarget","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionTarget-toSource":[{"@id":"d:_19_0_3_71e0233_1746028306923_558192_15006","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionTarget-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027882482_912182_14918","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-triggers-8710683288","@type":"uml:Trigger","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:Trigger-toSource":[{"@id":"d:_19_0_3_71e0233_1746028313498_548385_15007","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:Trigger-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028306923_558192_15006","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-startsFrom-8996430444","@type":"uml:TransitionSource","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionSource-toSource":[{"@id":"d:_19_0_3_71e0233_1746028822501_191804_15047","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionSource-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027882482_912182_14918","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-endsAt-11699322235","@type":"uml:TransitionTarget","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionTarget-toSource":[{"@id":"d:_19_0_3_71e0233_1746028822501_191804_15047","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionTarget-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028605370_466818_15028","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-triggers-9704245737","@type":"uml:Trigger","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:Trigger-toSource":[{"@id":"d:_19_0_3_71e0233_1746028899054_101006_15058","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:Trigger-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028822501_191804_15047","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-startsFrom-8860759247","@type":"uml:TransitionSource","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionSource-toSource":[{"@id":"d:_19_0_3_71e0233_1746028827712_739888_15050","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionSource-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027882482_912182_14918","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-endsAt-11563651038","@type":"uml:TransitionTarget","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionTarget-toSource":[{"@id":"d:_19_0_3_71e0233_1746028827712_739888_15050","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionTarget-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028605370_466818_15028","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-triggers-8483779004","@type":"uml:Trigger","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:Trigger-toSource":[{"@id":"d:_19_0_3_71e0233_1746028954791_356054_15062","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:Trigger-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028827712_739888_15050","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-startsFrom-11316265439","@type":"uml:TransitionSource","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionSource-toSource":[{"@id":"d:_19_0_3_71e0233_1746028839192_503107_15053","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionSource-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028605370_466818_15028","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-endsAt-8092734140","@type":"uml:TransitionTarget","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionTarget-toSource":[{"@id":"d:_19_0_3_71e0233_1746028839192_503107_15053","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionTarget-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027882482_912182_14918","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-triggers-9344676895","@type":"uml:Trigger","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:Trigger-toSource":[{"@id":"d:_19_0_3_71e0233_1746028884803_562591_15054","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:Trigger-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028839192_503107_15053","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-startsFrom-10914308453","@type":"uml:TransitionSource","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionSource-toSource":[{"@id":"d:_19_0_3_71e0233_1746029049431_401220_15072","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionSource-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028605370_466818_15028","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-endsAt-10482894906","@type":"uml:TransitionTarget","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionTarget-toSource":[{"@id":"d:_19_0_3_71e0233_1746029049431_401220_15072","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionTarget-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027804266_719052_14896","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-triggers-10198907956","@type":"uml:Trigger","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:Trigger-toSource":[{"@id":"d:_19_0_3_71e0233_1746029056197_950529_15073","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:Trigger-toTarget":[{"@id":"d:_19_0_3_71e0233_1746029049431_401220_15072","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-startsFrom-10203202111","@type":"uml:TransitionSource","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionSource-toSource":[{"@id":"d:_19_0_3_71e0233_1746028508430_363448_15020","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionSource-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028605370_466818_15028","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-endsAt-10388500447","@type":"uml:TransitionTarget","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionTarget-toSource":[{"@id":"d:_19_0_3_71e0233_1746028508430_363448_15020","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionTarget-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027631053_836894_14835","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-triggers-8226880185","@type":"uml:Trigger","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:Trigger-toSource":[{"@id":"d:_19_0_3_71e0233_1746028540160_854095_15021","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:Trigger-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028508430_363448_15020","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-startsFrom-10505811433","@type":"uml:TransitionSource","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionSource-toSource":[{"@id":"d:_19_0_3_71e0233_1746027631056_691503_14836","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionSource-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027631039_116153_14834","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-endsAt-11750312327","@type":"uml:TransitionTarget","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionTarget-toSource":[{"@id":"d:_19_0_3_71e0233_1746027631056_691503_14836","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionTarget-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027631053_836894_14835","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-startsFrom-9662251988","@type":"uml:TransitionSource","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionSource-toSource":[{"@id":"d:_19_0_3_71e0233_1746028442990_717820_15013","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionSource-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027631053_836894_14835","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-endsAt-10042078921","@type":"uml:TransitionTarget","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:TransitionTarget-toSource":[{"@id":"d:_19_0_3_71e0233_1746028442990_717820_15013","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:TransitionTarget-toTarget":[{"@id":"d:_19_0_3_71e0233_1746027704287_746273_14855","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-triggers-11689502440","@type":"uml:Trigger","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"uml:Trigger-toSource":[{"@id":"d:_19_0_3_71e0233_1746028483612_410592_15014","pig:itemType":{"@id":"pig:aSourceLink"}}],"uml:Trigger-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028442990_717820_15013","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-8524437672","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552811554859_819240_14595","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-10606577794","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552811454014_108965_14365","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-10600261667","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_bc402f4_1604360793737_196507_13523","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-8034687851","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028118776_36360_14979","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-8284367231","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028195311_519257_14989","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-11116214028","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028216231_986687_14993","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-11694709529","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028282302_943711_15000","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-12033035043","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028313498_548385_15007","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-9345097305","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028483612_410592_15014","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-10887885853","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028540160_854095_15021","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-11330005271","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028884803_562591_15054","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-10697539955","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028899054_101006_15058","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-8277838339","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746028954791_356054_15062","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-10218959244","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746029024681_691401_15066","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-10331126120","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746029056197_950529_15073","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:S-contains-8478289863","@type":"SpecIF:contains","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"SpecIF:contains-toSource":[{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"SpecIF:contains-toTarget":[{"@id":"d:_19_0_3_71e0233_1746029726958_589946_15078","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552814131280_1190_15654","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1552811412605_640145_14319","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552814104357_719492_15607","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_19_0_3_bc402f4_1604360962045_534106_13570","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1552811412605_640145_14319","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_19_0_3_bc402f4_1604360793737_196507_13523","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552811613008_58411_14648","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1552811412605_640145_14319","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552811454014_108965_14365","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_19_0_3_e40094_1718634030433_51877_14234","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1552811412605_640145_14319","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_19_0_3_e40094_1718632293724_754873_14112","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552811619502_982677_14678","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1552811412605_640145_14319","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552811469014_293642_14411","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552827804167_216283_16528","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1552811412605_640145_14319","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552827771600_60767_16481","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552811666192_832840_14768","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1552811412605_640145_14319","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552811538626_715866_14549","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552811672063_243990_14798","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1552811412605_640145_14319","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552811554859_819240_14595","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552811653332_976698_14708","@type":"dcterms:hasPart","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"dcterms:hasPart-toSource":[{"@id":"d:_18_5_3_bc402f4_1552811412605_640145_14319","pig:itemType":{"@id":"pig:aSourceLink"}}],"dcterms:hasPart-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552811510062_903764_14503","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552810808641_447672_14157","@type":"IREB:refines","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"IREB:refines-toSource":[{"@id":"d:_18_5_3_bc402f4_1552810776263_894029_14121","pig:itemType":{"@id":"pig:aSourceLink"}}],"IREB:refines-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552810644650_650036_14079","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552811141795_384989_14263","@type":"IREB:refines","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"IREB:refines-toSource":[{"@id":"d:_18_5_3_bc402f4_1552810948738_707540_14217","pig:itemType":{"@id":"pig:aSourceLink"}}],"IREB:refines-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552810644650_650036_14079","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552813438857_436917_15337","@type":"IREB:refines","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"IREB:refines-toSource":[{"@id":"d:_18_5_3_bc402f4_1552812370943_152244_14924","pig:itemType":{"@id":"pig:aSourceLink"}}],"IREB:refines-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552810644650_650036_14079","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552813334959_22842_15317","@type":"IREB:refines","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"IREB:refines-toSource":[{"@id":"d:_18_5_3_bc402f4_1552813199775_830344_15281","pig:itemType":{"@id":"pig:aSourceLink"}}],"IREB:refines-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552810644650_650036_14079","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552813433937_279860_15327","@type":"IREB:refines","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"IREB:refines-toSource":[{"@id":"d:_18_5_3_bc402f4_1552812437056_257578_14975","pig:itemType":{"@id":"pig:aSourceLink"}}],"IREB:refines-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552810644650_650036_14079","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552811136575_459751_14253","@type":"IREB:refines","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"IREB:refines-toSource":[{"@id":"d:_18_5_3_bc402f4_1552810869277_586147_14175","pig:itemType":{"@id":"pig:aSourceLink"}}],"IREB:refines-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552810644650_650036_14079","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552813795106_879353_15508","@type":"oslc_rm:satisfies","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"oslc_rm:satisfies-toSource":[{"@id":"d:_18_5_3_bc402f4_1552812805784_548404_15062","pig:itemType":{"@id":"pig:aSourceLink"}}],"oslc_rm:satisfies-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552810869277_586147_14175","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552813870706_981259_15588","@type":"oslc_rm:satisfies","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"oslc_rm:satisfies-toSource":[{"@id":"d:_18_5_3_bc402f4_1552812663506_709974_15011","pig:itemType":{"@id":"pig:aSourceLink"}}],"oslc_rm:satisfies-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552810776263_894029_14121","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552815653359_771130_16352","@type":"sysml:Allocate","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"sysml:Allocate-toSource":[{"@id":"d:_18_5_3_bc402f4_1552814523707_628151_15988","pig:itemType":{"@id":"pig:aSourceLink"}}],"sysml:Allocate-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552814104357_719492_15607","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552815590348_672436_16293","@type":"sysml:Allocate","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"sysml:Allocate-toSource":[{"@id":"d:_18_5_3_bc402f4_1552814266523_206006_15821","pig:itemType":{"@id":"pig:aSourceLink"}}],"sysml:Allocate-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552811510062_903764_14503","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_19_0_3_e40094_1718632549973_831908_14172","@type":"sysml:Allocate","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"sysml:Allocate-toSource":[{"@id":"d:_18_5_3_bc402f4_1552815791106_548984_16360","pig:itemType":{"@id":"pig:aSourceLink"}}],"sysml:Allocate-toTarget":[{"@id":"d:_19_0_3_e40094_1718632293724_754873_14112","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552815541056_996851_16231","@type":"sysml:Allocate","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"sysml:Allocate-toSource":[{"@id":"d:_18_5_3_bc402f4_1552814246502_629251_15775","pig:itemType":{"@id":"pig:aSourceLink"}}],"sysml:Allocate-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552811510062_903764_14503","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_18_5_3_bc402f4_1552813818846_218375_15548","@type":"oslc_rm:satisfies","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"oslc_rm:satisfies-toSource":[{"@id":"d:_18_5_3_bc402f4_1552813038602_222864_15129","pig:itemType":{"@id":"pig:aSourceLink"}}],"oslc_rm:satisfies-toTarget":[{"@id":"d:_18_5_3_bc402f4_1552810948738_707540_14217","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:_19_0_3_e40094_1718632569345_311906_14190","@type":"sysml:Allocate","dcterms:modified":"2025-09-24T08:28:08.223Z","pig:itemType":{"@id":"pig:aRelationship"},"sysml:Allocate-toSource":[{"@id":"d:_18_5_3_bc402f4_1552814266523_206006_15821","pig:itemType":{"@id":"pig:aSourceLink"}}],"sysml:Allocate-toTarget":[{"@id":"d:_19_0_3_e40094_1718632293724_754873_14112","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:HierarchyRoot-P-eee_1045467100313_135436_1","@type":"pig:HierarchyRoot","pig:itemType":{"@id":"pig:anEntity"},"dcterms:modified":"2026-01-17T22:38:55.908Z","dcterms:title":[{"@value":"Hierarchy Root"}],"dcterms:description":[{"@value":"... anchoring all hierarchies of this graph (package)"}],"pig:lists":[{"@id":"d:HR-9052885961","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:HR-FolderGlossary-10391243923","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:eee_1045467100313_135436_1","@type":"pig:Outline","pig:revision":"rev-10410861023","dcterms:modified":"2025-11-12T09:27:42.126Z","dcterms:title":[{"@value":"Small Autonomous Vehicle"}],"pig:category":[{"@value":"uml:Model","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"},"pig:lists":[{"@id":"d:_19_0_3_71e0233_1746001337727_31616_14119","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746001480225_327746_14120","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746001561119_779379_14121","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:HR-9052885961","@type":"pig:Outline","dcterms:modified":"2026-01-17T22:38:55.793Z","dcterms:title":[{"@value":"Small Autonomous Vehicle"}],"dcterms:description":[{"@value":"A set of SpecIF Classes derived from a SpecIF Ontology for the domains SpecIF:DomainBase, SpecIF:DomainSystemsEngineering, SpecIF:DomainSystemModelIntegration.","@language":"en"}],"pig:category":[{"@value":"ReqIF:HierarchyRoot","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"},"pig:lists":[{"@id":"d:eee_1045467100313_135436_1","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:FolderGlossary-10391243923","@type":"pig:Outline","dcterms:modified":"2026-01-17T22:38:43.273Z","dcterms:title":[{"@value":"Model Elements (Glossary)"}],"pig:category":[{"@value":"SpecIF:Glossary","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"},"pig:lists":[{"@id":"d:_18_5_3_bc402f4_1552814266523_206006_15821","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552811469014_293642_14411","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552813556602_820961_15353","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552814523707_628151_15988","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552811454014_108965_14365","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_bc402f4_1604360793737_196507_13523","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028884803_562591_15054","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552814104357_719492_15607","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027630942_863638_14801","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027804266_719052_14896","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027847324_539644_14916","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552811510062_903764_14503","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_e40094_1718632293724_754873_14112","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552811937697_690731_14862","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028954791_356054_15062","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027631039_116153_14834","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027731735_863978_14871","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027837044_867827_14913","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027631056_691503_14836","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552812805784_548404_15062","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027882482_912182_14918","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028073773_979720_14974","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028822501_191804_15047","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028827712_739888_15050","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028275862_880382_14999","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028149871_266697_14985","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028899054_101006_15058","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552811412605_640145_14319","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552812437056_257578_14975","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552812370943_152244_14924","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552812663506_709974_15011","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746029024681_691401_15066","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027747207_605800_14880","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028061993_960870_14971","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552810776263_894029_14121","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746029056197_950529_15073","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552813199775_830344_15281","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027631053_836894_14835","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028442990_717820_15013","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027704287_746273_14855","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746029726958_589946_15078","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552810869277_586147_14175","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552810948738_707540_14217","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552813038602_222864_15129","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552814246502_629251_15775","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552815791106_548984_16360","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552814194319_862392_15683","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552814212889_663150_15729","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028605370_466818_15028","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746029049431_401220_15072","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028839192_503107_15053","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028508430_363448_15020","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028118776_36360_14979","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552811538626_715866_14549","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552811554859_819240_14595","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028540160_854095_15021","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028483612_410592_15014","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552827771600_60767_16481","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1552810644650_650036_14079","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1556615212765_548060_15021","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_18_5_3_bc402f4_1556615164506_303870_14975","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028282302_943711_15000","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028195311_519257_14989","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028313498_548385_15007","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028216231_986687_14993","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027967661_707482_14950","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028306923_558192_15006","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027920180_215768_14934","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746028183413_413266_14988","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027630942_464786_14802","pig:itemType":{"@id":"pig:aTargetLink"}},{"@id":"d:_19_0_3_71e0233_1746027731735_371186_14872","pig:itemType":{"@id":"pig:aTargetLink"}}]},{"@id":"d:HR-FolderGlossary-10391243923","@type":"pig:Outline","dcterms:modified":"2026-01-17T22:38:55.793Z","dcterms:title":[{"@value":"Small Autonomous Vehicle"}],"dcterms:description":[{"@value":"A set of SpecIF Classes derived from a SpecIF Ontology for the domains SpecIF:DomainBase, SpecIF:DomainSystemsEngineering, SpecIF:DomainSystemModelIntegration.","@language":"en"}],"pig:category":[{"@value":"ReqIF:HierarchyRoot","pig:itemType":{"@id":"pig:aProperty"}}],"pig:itemType":{"@id":"pig:anEntity"},"pig:lists":[{"@id":"d:FolderGlossary-10391243923","pig:itemType":{"@id":"pig:aTargetLink"}}]}]} \ No newline at end of file +{ + "@context": { + "o": "https://product-information-graph.org/v0.2/ontology#", + "d": "https://product-information-graph.org/examples/Small%20Autonomous%20Vehicle.specif.zip#", + "rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#", + "owl": "http://www.w3.org/2002/07/owl#", + "sh": "http://www.w3.org/ns/shacl#", + "xs": "http://www.w3.org/2001/XMLSchema#", + "dcterms": "http://purl.org/dc/terms/", + "FMC": "http://fmc-modeling.org#", + "RFLP": "https://product-information-graph.org/v0.2/ontology/RFLP#", + "IREB": "https://cpre.ireb.org/en/downloads-and-resources/glossary#", + "ReqIF": "https://www.prostep.org/fileadmin/downloads/PSI_ImplementationGuide_ReqIF_V1-7.pdf#", + "oslc_rm": "http://open-services.net/ns/rm#", + "uml": "https://www.omg.org/spec/UML#", + "sysml": "https://www.omg.org/spec/SysML#", + "pig": "https://product-information-graph.org/v0.2/metamodel#", + "SpecIF": "https://specif.de/v1.2/schema#" + }, + "@id": "d:P-eee_1045467100313_135436_1", + "@type": "pig:Package", + "dcterms:title": [ + { + "@value": "Small Autonomous Vehicle" + } + ], + "dcterms:description": [ + { + "@value": "A set of SpecIF Classes derived from a SpecIF Ontology for the domains SpecIF:DomainBase, SpecIF:DomainSystemsEngineering, SpecIF:DomainSystemModelIntegration.", + "@language": "en" + } + ], + "dcterms:modified": "2026-01-17T22:38:55.612Z", + "@graph": [ + { + "@id": "pig:Entity", + "@type": "owl:Class", + "pig:itemType": { + "@id": "pig:Entity" + }, + "dcterms:title": [ + { + "@value": "Entity" + } + ], + "dcterms:description": [ + { + "@value": "A PIG meta-model element used for entities (aka resources or artifacts)." + } + ], + "pig:eligibleProperty": [ + { + "@id": "pig:category" + }, + { + "@id": "pig:icon" + } + ] + }, + { + "@id": "pig:Organizer", + "pig:specializes": { + "@id": "pig:Entity" + }, + "pig:itemType": { + "@id": "pig:Entity" + }, + "dcterms:title": [ + { + "@value": "Organizer" + } + ], + "dcterms:description": [ + { + "@value": "An element organizing model elements. An example is a list of requirements or a diagram using a certain notation." + } + ], + "pig:eligibleProperty": [ + { + "@id": "pig:category" + } + ] + }, + { + "@id": "pig:HierarchyRoot", + "pig:specializes": { + "@id": "pig:Organizer" + }, + "pig:itemType": { + "@id": "pig:Entity" + }, + "dcterms:title": [ + { + "@value": "Hierarchy Root" + } + ], + "dcterms:description": [ + { + "@value": "A subclass of PIG organizer serving as a root for hierarchically organized graph elements." + } + ], + "pig:eligibleProperty": [ + ], + "pig:eligibleTargetLink": [ + { + "@id": "pig:lists" + } + ] + }, + { + "@id": "pig:Outline", + "pig:specializes": { + "@id": "pig:Organizer" + }, + "pig:itemType": { + "@id": "pig:Entity" + }, + "dcterms:title": [ + { + "@value": "Outline" + } + ], + "dcterms:description": [ + { + "@value": "A subclass of PIG organizer comprising all information items of a human-readable document. As usual, the outline is hierarchically organized." + } + ], + "pig:eligibleProperty": [ + { + "@id": "pig:category" + } + ], + "pig:eligibleTargetLink": [ + { + "@id": "pig:lists" + } + ] + }, + { + "@id": "pig:View", + "pig:specializes": { + "@id": "pig:Organizer" + }, + "pig:itemType": { + "@id": "pig:Entity" + }, + "dcterms:title": [ + { + "@value": "View" + } + ], + "dcterms:description": [ + { + "@value": "A subclass of PIG organizer representing a model view (diagram) using a certain notation showing selected model elements." + } + ], + "pig:eligibleProperty": [ + { + "@id": "pig:category" + }, + { + "@id": "pig:icon" + } + ], + "pig:eligibleTargetLink": [ + { + "@id": "pig:shows" + }, + { + "@id": "pig:depicts" + } + ] + }, + { + "@id": "pig:Relationship", + "@type": "owl:Class", + "pig:itemType": { + "@id": "pig:Relationship" + }, + "dcterms:title": [ + { + "@value": "Relationship" + } + ], + "dcterms:description": [ + { + "@value": "A PIG meta-model element used for reified relationships (aka predicates)." + } + ], + "pig:eligibleProperty": [ + { + "@id": "pig:category" + }, + { + "@id": "pig:icon" + } + ], + "pig:eligibleSourceLink": { + "@id": "pig:SourceLink" + }, + "pig:eligibleTargetLink": { + "@id": "pig:TargetLink" + } + }, + { + "@id": "pig:Property", + "@type": "owl:DatatypeProperty", + "pig:itemType": { + "@id": "pig:Property" + }, + "dcterms:title": [ + { + "@value": "Property" + } + ], + "dcterms:description": [ + { + "@value": "A PIG meta-model element used for properties (aka attributes)." + } + ], + "sh:datatype": { + "@id": "xs:anyType" + } + }, + { + "@id": "pig:icon", + "pig:specializes": { + "@id": "pig:Property" + }, + "pig:itemType": { + "@id": "pig:Property" + }, + "dcterms:title": [ + { + "@value": "has icon" + } + ], + "dcterms:description": [ + { + "@value": "Specifies an icon for a model element (entity or relationship)." + } + ], + "sh:datatype": { + "@id": "xs:string" + }, + "sh:minCount": 0, + "sh:maxCount": 1 + }, + { + "@id": "pig:category", + "pig:specializes": { + "@id": "pig:Property" + }, + "pig:itemType": { + "@id": "pig:Property" + }, + "dcterms:title": [ + { + "@value": "has category" + } + ], + "dcterms:description": [ + { + "@value": "Specifies a category for an element (entity, relationship or organizer)." + } + ], + "sh:datatype": { + "@id": "xs:string" + }, + "sh:maxLength": 32, + "sh:minCount": 0, + "sh:maxCount": 1 + }, + { + "@id": "pig:Link", + "@type": "owl:ObjectProperty", + "pig:itemType": { + "@id": "pig:Link" + }, + "pig:eligibleEndpoint": [ + { + "@id": "pig:Entity" + }, + { + "@id": "pig:Relationship" + } + ], + "dcterms:title": [ + { + "@value": "linked with" + } + ], + "dcterms:description": [ + { + "@value": "Connects a reified relationship with its source or target. Also connects an organizer to a model element" + } + ] + }, + { + "@id": "pig:SourceLink", + "pig:specializes": { + "@id": "pig:Link" + }, + "pig:itemType": { + "@id": "pig:Link" + }, + "pig:eligibleEndpoint": [ + { + "@id": "pig:Entity" + }, + { + "@id": "pig:Relationship" + } + ], + "dcterms:title": [ + { + "@value": "to source" + } + ], + "dcterms:description": [ + { + "@value": "Connects the source of a reified relationship." + } + ] + }, + { + "@id": "pig:TargetLink", + "pig:specializes": { + "@id": "pig:Link" + }, + "pig:itemType": { + "@id": "pig:Link" + }, + "pig:eligibleEndpoint": [ + { + "@id": "pig:Entity" + }, + { + "@id": "pig:Relationship" + } + ], + "dcterms:title": [ + { + "@value": "to target" + } + ], + "dcterms:description": [ + { + "@value": "Connects the target of a reified relationship or an organizer." + } + ] + }, + { + "@id": "pig:lists", + "pig:specializes": { + "@id": "pig:TargetLink" + }, + "pig:itemType": { + "@id": "pig:Link" + }, + "pig:eligibleEndpoint": [ + { + "@id": "pig:Entity" + }, + { + "@id": "pig:Relationship" + }, + { + "@id": "pig:Organizer" + } + ], + "dcterms:title": [ + { + "@value": "lists" + } + ], + "dcterms:description": [ + { + "@value": "Lists an entity, a relationship or a subordinated organizer." + } + ] + }, + { + "@id": "pig:shows", + "pig:specializes": { + "@id": "pig:TargetLink" + }, + "pig:itemType": { + "@id": "pig:Link" + }, + "pig:eligibleEndpoint": [ + { + "@id": "pig:Entity" + }, + { + "@id": "pig:Relationship" + } + ], + "dcterms:title": [ + { + "@value": "shows" + } + ], + "dcterms:description": [ + { + "@value": "Shows an entity or a relationship." + } + ] + }, + { + "@id": "pig:depicts", + "pig:specializes": { + "@id": "pig:TargetLink" + }, + "pig:itemType": { + "@id": "pig:Link" + }, + "pig:eligibleEndpoint": [ + { + "@id": "pig:Entity" + } + ], + "dcterms:title": [ + { + "@value": "depicts" + } + ], + "dcterms:description": [ + { + "@value": "Depicts an entity; inverse of uml:ownedDiagram." + } + ] + }, + { + "@id": "dcterms:title", + "dcterms:title": [ + { + "@value": "Title", + "@language": "en" + }, + { + "@value": "Titel", + "@language": "de" + }, + { + "@value": "Titre", + "@language": "fr" + } + ], + "dcterms:description": [ + { + "@value": "

    A name given to the resource. (source: DCMI)

    Title (reference: Dublin Core) of the resource represented as rich text in XHTML content. SHOULD include only content that is valid inside an XHTML 'span' element. (source: OSLC)

    ", + "@language": "en" + } + ], + "@type": "owl:DatatypeProperty", + "pig:itemType": { + "@id": "pig:Property" + }, + "sh:datatype": { + "@id": "xs:string" + }, + "sh:maxCount": 1, + "sh:maxLength": 256 + }, + { + "@id": "dcterms:description", + "dcterms:title": [ + { + "@value": "Description", + "@language": "en" + }, + { + "@value": "Beschreibung", + "@language": "de" + }, + { + "@value": "Description", + "@language": "fr" + } + ], + "dcterms:description": [ + { + "@value": "

    An account of the resource. (source: DCMI)

    Descriptive text (reference: Dublin Core) about resource represented as rich text in XHTML content. SHOULD include only content that is valid and suitable inside an XHTML 'div' element. (source: OSLC)

    ", + "@language": "en" + } + ], + "@type": "owl:DatatypeProperty", + "pig:itemType": { + "@id": "pig:Property" + }, + "sh:datatype": { + "@id": "xs:string" + }, + "sh:maxCount": 1 + }, + { + "@id": "SpecIF:Diagram", + "dcterms:title": [ + { + "@value": "Diagram", + "@language": "en" + }, + { + "@value": "Diagramm", + "@language": "de" + }, + { + "@value": "Diagramme", + "@language": "fr" + } + ], + "dcterms:description": [ + { + "@value": "A diagram illustrating the resource or a link to a diagram.", + "@language": "en" + } + ], + "@type": "owl:DatatypeProperty", + "pig:itemType": { + "@id": "pig:Property" + }, + "sh:datatype": { + "@id": "xs:string" + } + }, + { + "@id": "SpecIF:Notation", + "dcterms:title": [ + { + "@value": "Notation", + "@language": "en" + } + ], + "dcterms:description": [ + { + "@value": "The notation used by a model diagram, e.g. 'BPMN 2.0', 'SysML Activity Diagram' or 'FMC Block Diagram'.", + "@language": "en" + } + ], + "@type": "owl:DatatypeProperty", + "pig:itemType": { + "@id": "pig:Property" + }, + "sh:datatype": { + "@id": "xs:string" + }, + "sh:maxCount": 1, + "sh:maxLength": 32 + }, + { + "@id": "SpecIF:Paragraph", + "dcterms:title": [ + { + "@value": "Paragraph", + "@language": "en" + }, + { + "@value": "Textabsatz", + "@language": "de" + }, + { + "@value": "Paragraphe", + "@language": "fr" + } + ], + "dcterms:description": [ + { + "@value": "

    A 'Paragraph' is an unspecified information in a document at any level.

    ", + "@language": "en" + }, + { + "@value": "

    Ein 'Textabschnitt' in einem Dokument auf beliebiger Ebene.

    ", + "@language": "de" + } + ], + "pig:specializes": { + "@id": "pig:Entity" + }, + "pig:eligibleProperty": [ + { + "@id": "SpecIF:Diagram" + }, + { + "@id": "pig:category" + } + ], + "pig:eligibleTargetLink": [ + ], + "pig:itemType": { + "@id": "pig:Entity" + } + }, + { + "@id": "SpecIF:ModelElement", + "dcterms:title": [ + { + "@value": "Model Element", + "@language": "en" + }, + { + "@value": "Modellelement", + "@language": "de" + } + ], + "dcterms:description": [ + { + "@value": "Is a generalized type for model elements.", + "@language": "en" + }, + { + "@value": "Ist ein generalisierter Typ für Modellelemente.", + "@language": "de" + } + ], + "pig:specializes": { + "@id": "pig:Entity" + }, + "pig:icon": { + "@value": "☆" + }, + "pig:eligibleProperty": [ + { + "@id": "pig:category" + } + ], + "pig:eligibleTargetLink": [ + ], + "pig:itemType": { + "@id": "pig:Entity" + } + }, + { + "@id": "FMC:Actor", + "dcterms:title": [ + { + "@value": "Actor", + "@language": "en" + }, + { + "@value": "Akteur", + "@language": "de" + }, + { + "@value": "Acteur", + "@language": "fr" + } + ], + "dcterms:description": [ + { + "@value": "

    An 'Actor' is a fundamental model element type representing an active entity, be it an activity, a process step, a function, a system component or a role.

    The particular use or original type is specified with a [[dcterms:type]] property of the 'FMC:Actor'. A value of that property should be an ontology-term, such as [[bpmn:processStep]].

    ", + "@language": "en" + }, + { + "@value": "

    Ein 'Akteur' ist ein fundamentaler Modellelementtyp, der eine aktive Entität darstellt, sei es eine Aktivität, ein Prozessschritt, eine Funktion, eine Systemkomponente oder eine Rolle.

    Die spezielle Verwendung oder der ursprüngliche Typ wird mit einer [[dcterms:type]] Eigenschaft von 'FMC:Actor' spezifiziert. Die Werte dieser Eigenschaft können Ontologiebegriffe sein, wie z.B. [[bpmn:timer]].

    ", + "@language": "de" + }, + { + "@value": "

    Un 'Acteur' est un type d'élément de modèle fondamental représentant une entité active, qu'il s'agisse d'une activité, d'une étape de processus, d'une fonction, d'un composant de système ou d'un rôle.

    L'utilisation particulière ou le type original est spécifié avec une propriété [[dcterms:type]] de 'FMC:Actor'. Les valeurs de cette propriété peuvent être des termes d'ontologie, tels que [[bpmn:timer]].

    ", + "@language": "fr" + } + ], + "pig:specializes": { + "@id": "SpecIF:ModelElement" + }, + "pig:icon": { + "@value": "□" + }, + "pig:eligibleProperty": [ + ], + "pig:eligibleTargetLink": [ + ], + "pig:itemType": { + "@id": "pig:Entity" + } + }, + { + "@id": "SpecIF:Collection", + "dcterms:title": [ + { + "@value": "Collection or Group", + "@language": "en" + }, + { + "@value": "Kollektion oder Gruppe", + "@language": "de" + }, + { + "@value": "Collection ou Groupe", + "@language": "fr" + } + ], + "dcterms:description": [ + { + "@value": "

    A 'Collection' is a logical (often conceptual) group of resources linked with a [[SpecIF:contains]] statement. It corresponds to a 'Group' in BPMN Diagrams.

    BPMN: An arbitrary set of objects can be defined as a Group to show that they logically belong together. (source: BPMN Tutorial)

    ", + "@language": "en" + }, + { + "@value": "

    Eine 'Kollektion' ist eine logische Gruppierung bestimmter Modellelemente, die per [[SpecIF:contains]] Relation zusammen gefasst sind. Sie entspricht einer 'Gruppe' in BPMN Diagrammen. (source: BPMN Tutorial)

    ", + "@language": "de" + }, + { + "@value": "

    Une 'collection' est un groupe logique (souvent conceptuel) de ressources liées par une déclaration [[SpecIF:contains]]. Elle correspond à un 'groupe' dans les diagrammes BPMN. (source: BPMN Tutoriel)

    ", + "@language": "fr" + } + ], + "pig:specializes": { + "@id": "SpecIF:ModelElement" + }, + "pig:icon": { + "@value": "⬚" + }, + "pig:eligibleProperty": [ + ], + "pig:eligibleTargetLink": [ + ], + "pig:itemType": { + "@id": "pig:Entity" + } + }, + { + "@id": "FMC:State", + "dcterms:title": [ + { + "@value": "State", + "@language": "en" + }, + { + "@value": "Zustand", + "@language": "de" + }, + { + "@value": "État", + "@language": "fr" + } + ], + "dcterms:description": [ + { + "@value": "

    A 'State' is a fundamental model element type representing a passive entity, be it a value, a condition, an information storage or even a physical shape.

    The particular use or the original type is specified with a [[dcterms:type]] property of the 'FMC:State'. A value of that property should bean ontology-term, such as [[bpmn:dataObject]].

    ", + "@language": "en" + }, + { + "@value": "

    Ein 'Zustand' ist ein fundamentaler Modellelementtyp, der eine passive Entität darstellt, sei es ein Wert, ein Dokument, ein Informationsspeicher, eine Bedingung oder eine physische Beschaffenheit.

    Die spezielle Verwendung oder der ursprüngliche Typ wird mit einer [[dcterms:type]] Eigenschaft von 'FMC:State' spezifiziert. Die Werte dieser Eigenschaft können Ontologiebegriffe sein, wie z.B. [[ArchiMate:DataObject]].

    ", + "@language": "de" + }, + { + "@value": "

    Un 'État' est un type d'élément de modèle fondamental représentant une entité passive, qu'il s'agisse d'une valeur, d'une condition, d'un stockage d'informations ou même d'une forme physique.

    L'utilisation particulière ou le type original est spécifié avec une propriété [[dcterms:type]] de 'FMC:State'. Les valeurs de cette propriété peuvent être des termes d'ontologie, tels que [[ArchiMate:DataObject]].

    ", + "@language": "fr" + } + ], + "pig:specializes": { + "@id": "SpecIF:ModelElement" + }, + "pig:icon": { + "@value": "○" + }, + "pig:eligibleProperty": [ + ], + "pig:eligibleTargetLink": [ + ], + "pig:itemType": { + "@id": "pig:Entity" + } + }, + { + "@id": "FMC:Event", + "dcterms:title": [ + { + "@value": "Event", + "@language": "en" + }, + { + "@value": "Ereignis", + "@language": "de" + }, + { + "@value": "Évenement", + "@language": "fr" + } + ], + "dcterms:description": [ + { + "@value": "

    An 'Event' is a fundamental model element type representing a time reference, a change in condition/value or more generally a synchronization primitive.

    The particular use or the original type is specified with a [[dcterms:type]] property of the 'FMC:Event'. A value of that property should be an ontology-term, such as [[bpmn:startEvent]].

    ", + "@language": "en" + }, + { + "@value": "

    Ein 'Ereignis' ist ein fundamentaler Modellelementtyp, der eine Zeitreferenz, eine Änderung einer Bedingung/eines Wertes oder allgemeiner ein Synchronisationsmittel darstellt.

    Die spezielle Verwendung oder der ursprüngliche Typ wird mit einer [[dcterms:type]] Eigenschaft von 'FMC:Event' spezifiziert. Die Werte dieser Eigenschaft sollen Ontologiebegriffe sein, wie z.B. [[bpmn:startEvent]].

    ", + "@language": "de" + }, + { + "@value": "

    Un 'Événement' est un type d'élément de modèle fondamental représentant une référence temporelle, un changement de condition/valeur ou plus généralement une primitive de synchronisation.

    L'utilisation particulière ou le type original est spécifié avec une propriété [[dcterms:type]] de 'FMC:Event'. Les valeurs de cette propriété peuvent être des termes d'ontologie, tels que [[bpmn:startEvent]].

    ", + "@language": "fr" + } + ], + "pig:specializes": { + "@id": "SpecIF:ModelElement" + }, + "pig:icon": { + "@value": "♢" + }, + "pig:eligibleProperty": [ + ], + "pig:eligibleTargetLink": [ + ], + "pig:itemType": { + "@id": "pig:Entity" + } + }, + { + "@id": "uml:Package", + "dcterms:title": [ + { + "@value": "Package", + "@language": "en" + } + ], + "pig:specializes": { + "@id": "SpecIF:Collection" + }, + "pig:eligibleProperty": [ + ], + "pig:eligibleTargetLink": [ + ], + "pig:itemType": { + "@id": "pig:Entity" + } + }, + { + "@id": "IREB:Requirement", + "dcterms:title": [ + { + "@value": "Requirement", + "@language": "en" + }, + { + "@value": "Anforderung", + "@language": "de" + }, + { + "@value": "Exigence", + "@language": "fr" + } + ], + "dcterms:description": [ + { + "@value": "

    A 'Requirement' is a singular documented physical and functional need that a particular design, product or process must be able to perform. (source: Wikipedia)

    Definition:

    1. A condition or capability needed by a user to solve a problem or achieve an objective.
    2. A condition or capability that must be met or possessed by a system or system component to satisfy a contract, standard, specification, or other formally imposed documents.
    3. A documented representation of a condition or capability as in (1) or (2).

    Note: The definition above is the classic one from IEEE Std 610.12 of 1990. Alternatively, we also give a more modern definition:

    1. A need perceived by a stakeholder.
    2. A capability or property that a system shall have.
    3. A documented representation of a need, capability or property.
    ", + "@language": "en" + }, + { + "@value": "

    Eine 'Anforderung' ist ein einzelnes dokumentiertes physisches und funktionales Bedürfnis, das ein bestimmter Entwurf, ein Produkt oder ein Prozess erfüllen muss. (source: Wikipedia)

    Definition:

    1. Eine Bedingung oder Fähigkeit, die ein Benutzer benötigt, um ein Problem zu lösen oder ein Ziel zu erreichen.
    2. Eine Bedingung oder Fähigkeit, die ein System oder eine Systemkomponente erfüllen oder besitzen muss, um einen Vertrag, eine Norm, eine Spezifikation oder ein anderes formal vorgeschriebenes Dokument zu erfüllen.
    3. Eine dokumentierte Darstellung einer Bedingung oder Fähigkeit wie in (1) oder (2).

    Anmerkung: Die obige Definition ist die klassische Definition aus IEEE Std 610.12 von 1990. Alternativ geben wir auch eine modernere Definition an:

    1. Ein von einem Stakeholder wahrgenommener Bedarf.
    2. Eine Fähigkeit oder Eigenschaft, die ein System haben soll.
    3. Eine dokumentierte Darstellung eines Bedarfs, einer Fähigkeit oder Eigenschaft.
    ", + "@language": "de" + }, + { + "@value": "

    Une 'Exigence' est un besoin physique et fonctionnel unique et documenté qu'une conception, un produit ou un processus particulier doit pouvoir satisfaire. (source: Wikipedia)

    Définition:

    1. Condition ou capacité dont un utilisateur a besoin pour résoudre un problème ou atteindre un objectif.
    2. Condition ou capacité qui doit être remplie ou possédée par un système ou un composant de système pour satisfaire à un contrat, à une norme, à une spécification ou à d'autres documents imposés officiellement.
    3. Une représentation documentée d'une condition ou d'une capacité comme dans (1) ou (2).

    Remarque: La définition ci-dessus est la définition classique de la norme IEEE 610.12 de 1990. Nous donnons également une définition plus moderne:

    1. Un besoin perçu par une partie prenante;
    2. Une capacité ou une propriété qu'un système doit avoir.
    3. Une représentation documentée d'un besoin, d'une capacité ou d'une propriété.
    ", + "@language": "fr" + } + ], + "pig:specializes": { + "@id": "pig:Entity" + }, + "pig:icon": { + "@value": "↯" + }, + "pig:eligibleProperty": [ + { + "@id": "pig:category" + } + ], + "pig:eligibleTargetLink": [ + ], + "pig:itemType": { + "@id": "pig:Entity" + } + }, + { + "@id": "SpecIF:relates", + "dcterms:title": [ + { + "@value": "relates", + "@language": "en" + }, + { + "@value": "verbindet", + "@language": "de" + }, + { + "@value": "relie", + "@language": "fr" + } + ], + "dcterms:description": [ + { + "@value": "Is a generalized type for model relations.", + "@language": "en" + }, + { + "@value": "Ist ein generalisierter Typ für Modellrelationen.", + "@language": "de" + } + ], + "pig:specializes": { + "@id": "pig:Relationship" + }, + "pig:eligibleProperty": [ + { + "@id": "pig:category" + } + ], + "pig:itemType": { + "@id": "pig:Relationship" + }, + "pig:eligibleSourceLink": { + "@id": "SpecIF:relates-toSource" + }, + "pig:eligibleTargetLink": { + "@id": "SpecIF:relates-toTarget" + } + }, + { + "@id": "SpecIF:relates-toSource", + "pig:itemType": { + "@id": "pig:Link" + }, + "pig:specializes": { + "@id": "pig:SourceLink" + }, + "dcterms:title": [ + { + "@value": "SpecIF:relates to source" + } + ], + "dcterms:description": [ + { + "@value": "Connects the source of SpecIF:relates" + } + ], + "pig:eligibleEndpoint": [ + { + "@id": "pig:Entity" + }, + { + "@id": "pig:Relationship" + } + ] + }, + { + "@id": "SpecIF:relates-toTarget", + "pig:itemType": { + "@id": "pig:Link" + }, + "pig:specializes": { + "@id": "pig:TargetLink" + }, + "dcterms:title": [ + { + "@value": "SpecIF:relates to target" + } + ], + "dcterms:description": [ + { + "@value": "Connects the target of SpecIF:relates" + } + ], + "pig:eligibleEndpoint": [ + { + "@id": "pig:Entity" + }, + { + "@id": "pig:Relationship" + } + ] + }, + { + "@id": "dcterms:hasPart", + "dcterms:title": [ + { + "@value": "has part", + "@language": "en" + }, + { + "@value": "enthält", + "@language": "de" + }, + { + "@value": "contient", + "@language": "fr" + } + ], + "dcterms:description": [ + { + "@value": "A related resource that is included either physically or logically in the described resource.\n\n*Comment: This property is intended to be used with non-literal values. This property is an inverse property of [[dcterms:isPartOf]].*", + "@language": "en" + } + ], + "pig:specializes": { + "@id": "SpecIF:relates" + }, + "pig:eligibleProperty": [ + ], + "pig:itemType": { + "@id": "pig:Relationship" + }, + "pig:eligibleSourceLink": { + "@id": "dcterms:hasPart-toSource" + }, + "pig:eligibleTargetLink": { + "@id": "dcterms:hasPart-toTarget" + } + }, + { + "@id": "dcterms:hasPart-toSource", + "pig:itemType": { + "@id": "pig:Link" + }, + "pig:specializes": { + "@id": "pig:SourceLink" + }, + "dcterms:title": [ + { + "@value": "dcterms:hasPart to source" + } + ], + "dcterms:description": [ + { + "@value": "Connects the source of dcterms:hasPart" + } + ], + "pig:eligibleEndpoint": [ + { + "@id": "FMC:Actor" + }, + { + "@id": "FMC:State" + }, + { + "@id": "SpecIF:Collection" + }, + { + "@id": "SpecIF:ModelElement" + }, + { + "@id": "o:RC-UmlClass" + } + ] + }, + { + "@id": "dcterms:hasPart-toTarget", + "pig:itemType": { + "@id": "pig:Link" + }, + "pig:specializes": { + "@id": "pig:TargetLink" + }, + "dcterms:title": [ + { + "@value": "dcterms:hasPart to target" + } + ], + "dcterms:description": [ + { + "@value": "Connects the target of dcterms:hasPart" + } + ], + "pig:eligibleEndpoint": [ + { + "@id": "FMC:Actor" + }, + { + "@id": "FMC:State" + }, + { + "@id": "SpecIF:Collection" + }, + { + "@id": "SpecIF:ModelElement" + }, + { + "@id": "o:RC-UmlPort" + }, + { + "@id": "o:RC-UmlClass" + } + ] + }, + { + "@id": "SpecIF:contains", + "dcterms:title": [ + { + "@value": "contains", + "@language": "en" + }, + { + "@value": "enthält", + "@language": "de" + }, + { + "@value": "contient", + "@language": "fr" + } + ], + "dcterms:description": [ + { + "@value": "General containment, such as:\n- Package-A *contains* Diagram-B\n- Collection-1 *contains* DataObject-1.1\n\nNot to confound with *[[dcterms:hasPart]]*.", + "@language": "en" + } + ], + "pig:specializes": { + "@id": "SpecIF:relates" + }, + "pig:eligibleProperty": [ + ], + "pig:itemType": { + "@id": "pig:Relationship" + }, + "pig:eligibleSourceLink": { + "@id": "SpecIF:contains-toSource" + }, + "pig:eligibleTargetLink": { + "@id": "SpecIF:contains-toTarget" + } + }, + { + "@id": "SpecIF:contains-toSource", + "pig:itemType": { + "@id": "pig:Link" + }, + "pig:specializes": { + "@id": "pig:SourceLink" + }, + "dcterms:title": [ + { + "@value": "SpecIF:contains to source" + } + ], + "dcterms:description": [ + { + "@value": "Connects the source of SpecIF:contains" + } + ], + "pig:eligibleEndpoint": [ + { + "@id": "FMC:Actor" + }, + { + "@id": "FMC:State" + }, + { + "@id": "SpecIF:Collection" + }, + { + "@id": "uml:Package" + } + ] + }, + { + "@id": "SpecIF:contains-toTarget", + "pig:itemType": { + "@id": "pig:Link" + }, + "pig:specializes": { + "@id": "pig:TargetLink" + }, + "dcterms:title": [ + { + "@value": "SpecIF:contains to target" + } + ], + "dcterms:description": [ + { + "@value": "Connects the target of SpecIF:contains" + } + ], + "pig:eligibleEndpoint": [ + { + "@id": "FMC:Actor" + }, + { + "@id": "FMC:State" + }, + { + "@id": "FMC:Event" + }, + { + "@id": "SpecIF:Collection" + }, + { + "@id": "uml:Package" + }, + { + "@id": "SpecIF:ModelElement" + }, + { + "@id": "o:RC-SpecifView" + }, + { + "@id": "o:RC-PigView" + }, + { + "@id": "pig:View" + }, + { + "@id": "IREB:Requirement" + } + ] + }, + { + "@id": "oslc_rm:satisfies", + "dcterms:title": [ + { + "@value": "satisfies", + "@language": "en" + }, + { + "@value": "erfüllt", + "@language": "de" + }, + { + "@value": "satisfait", + "@language": "fr" + } + ], + "dcterms:description": [ + { + "@value": "

    The object is satisfied by the subject. (source: OSLC)

    SpecIF suggests that the subject is confined to a model element, e.g, a [[FMC:Actor]] or [[FMC:State]], and the object is confined to a [[IREB:Requirement]]. More concretely, an example for this type of statement is 'Component-X satisfies 'Requirement-4711'.

    ", + "@language": "en" + } + ], + "pig:specializes": { + "@id": "pig:Relationship" + }, + "pig:eligibleProperty": [ + ], + "pig:itemType": { + "@id": "pig:Relationship" + }, + "pig:eligibleSourceLink": { + "@id": "oslc_rm:satisfies-toSource" + }, + "pig:eligibleTargetLink": { + "@id": "oslc_rm:satisfies-toTarget" + } + }, + { + "@id": "oslc_rm:satisfies-toSource", + "pig:itemType": { + "@id": "pig:Link" + }, + "pig:specializes": { + "@id": "pig:SourceLink" + }, + "dcterms:title": [ + { + "@value": "oslc_rm:satisfies to source" + } + ], + "dcterms:description": [ + { + "@value": "Connects the source of oslc_rm:satisfies" + } + ], + "pig:eligibleEndpoint": [ + { + "@id": "pig:Entity" + }, + { + "@id": "pig:Relationship" + } + ] + }, + { + "@id": "oslc_rm:satisfies-toTarget", + "pig:itemType": { + "@id": "pig:Link" + }, + "pig:specializes": { + "@id": "pig:TargetLink" + }, + "dcterms:title": [ + { + "@value": "oslc_rm:satisfies to target" + } + ], + "dcterms:description": [ + { + "@value": "Connects the target of oslc_rm:satisfies" + } + ], + "pig:eligibleEndpoint": [ + { + "@id": "IREB:Requirement" + } + ] + }, + { + "@id": "IREB:refines", + "dcterms:title": [ + { + "@value": "refines", + "@language": "en" + }, + { + "@value": "verfeinert", + "@language": "de" + }, + { + "@value": "affine", + "@language": "fr" + } + ], + "dcterms:description": [ + { + "@value": "

    A [[IREB:Requirement]] 'refines' another [[IREB:Requirement]].

    ", + "@language": "en" + } + ], + "pig:specializes": { + "@id": "pig:Relationship" + }, + "pig:eligibleProperty": [ + ], + "pig:itemType": { + "@id": "pig:Relationship" + }, + "pig:eligibleSourceLink": { + "@id": "IREB:refines-toSource" + }, + "pig:eligibleTargetLink": { + "@id": "IREB:refines-toTarget" + } + }, + { + "@id": "IREB:refines-toSource", + "pig:itemType": { + "@id": "pig:Link" + }, + "pig:specializes": { + "@id": "pig:SourceLink" + }, + "dcterms:title": [ + { + "@value": "IREB:refines to source" + } + ], + "dcterms:description": [ + { + "@value": "Connects the source of IREB:refines" + } + ], + "pig:eligibleEndpoint": [ + { + "@id": "IREB:Requirement" + } + ] + }, + { + "@id": "IREB:refines-toTarget", + "pig:itemType": { + "@id": "pig:Link" + }, + "pig:specializes": { + "@id": "pig:TargetLink" + }, + "dcterms:title": [ + { + "@value": "IREB:refines to target" + } + ], + "dcterms:description": [ + { + "@value": "Connects the target of IREB:refines" + } + ], + "pig:eligibleEndpoint": [ + { + "@id": "IREB:Requirement" + } + ] + }, + { + "@id": "sysml:Allocate", + "dcterms:title": [ + { + "@value": "is allocated to", + "@language": "en" + }, + { + "@value": "zugeordnet zu", + "@language": "de" + }, + { + "@value": "allouée à", + "@language": "fr" + } + ], + "dcterms:description": [ + { + "@value": "

    An [[FMC:Actor]] is allocated to another [[FMC:Actor]] (e.g. a logical function is allocated to a physical component.

    ", + "@language": "en" + } + ], + "pig:specializes": { + "@id": "pig:Relationship" + }, + "pig:eligibleProperty": [ + ], + "pig:itemType": { + "@id": "pig:Relationship" + }, + "pig:eligibleSourceLink": { + "@id": "sysml:Allocate-toSource" + }, + "pig:eligibleTargetLink": { + "@id": "sysml:Allocate-toTarget" + } + }, + { + "@id": "sysml:Allocate-toSource", + "pig:itemType": { + "@id": "pig:Link" + }, + "pig:specializes": { + "@id": "pig:SourceLink" + }, + "dcterms:title": [ + { + "@value": "sysml:Allocate to source" + } + ], + "dcterms:description": [ + { + "@value": "Connects the source of sysml:Allocate" + } + ], + "pig:eligibleEndpoint": [ + { + "@id": "SpecIF:ModelElement" + } + ] + }, + { + "@id": "sysml:Allocate-toTarget", + "pig:itemType": { + "@id": "pig:Link" + }, + "pig:specializes": { + "@id": "pig:TargetLink" + }, + "dcterms:title": [ + { + "@value": "sysml:Allocate to target" + } + ], + "dcterms:description": [ + { + "@value": "Connects the target of sysml:Allocate" + } + ], + "pig:eligibleEndpoint": [ + { + "@id": "SpecIF:ModelElement" + } + ] + }, + { + "@id": "uml:ownedBehavior", + "dcterms:title": [ + { + "@value": "has Behavior" + } + ], + "pig:specializes": { + "@id": "pig:Relationship" + }, + "pig:eligibleProperty": [ + ], + "pig:itemType": { + "@id": "pig:Relationship" + }, + "pig:eligibleSourceLink": { + "@id": "uml:ownedBehavior-toSource" + }, + "pig:eligibleTargetLink": { + "@id": "uml:ownedBehavior-toTarget" + } + }, + { + "@id": "uml:ownedBehavior-toSource", + "pig:itemType": { + "@id": "pig:Link" + }, + "pig:specializes": { + "@id": "pig:SourceLink" + }, + "dcterms:title": [ + { + "@value": "uml:ownedBehavior to source" + } + ], + "dcterms:description": [ + { + "@value": "Connects the source of uml:ownedBehavior" + } + ], + "pig:eligibleEndpoint": [ + { + "@id": "pig:Entity" + }, + { + "@id": "pig:Relationship" + } + ] + }, + { + "@id": "uml:ownedBehavior-toTarget", + "pig:itemType": { + "@id": "pig:Link" + }, + "pig:specializes": { + "@id": "pig:TargetLink" + }, + "dcterms:title": [ + { + "@value": "uml:ownedBehavior to target" + } + ], + "dcterms:description": [ + { + "@value": "Connects the target of uml:ownedBehavior" + } + ], + "pig:eligibleEndpoint": [ + { + "@id": "o:RC-UmlStatemachine" + }, + { + "@id": "o:RC-UmlActivity" + }, + { + "@id": "FMC:Actor" + }, + { + "@id": "o:RC-UmlUsecase" + } + ] + }, + { + "@id": "uml:Trigger", + "dcterms:title": [ + { + "@value": "triggers" + } + ], + "pig:specializes": { + "@id": "pig:Relationship" + }, + "pig:eligibleProperty": [ + ], + "pig:itemType": { + "@id": "pig:Relationship" + }, + "pig:eligibleSourceLink": { + "@id": "uml:Trigger-toSource" + }, + "pig:eligibleTargetLink": { + "@id": "uml:Trigger-toTarget" + } + }, + { + "@id": "uml:Trigger-toSource", + "pig:itemType": { + "@id": "pig:Link" + }, + "pig:specializes": { + "@id": "pig:SourceLink" + }, + "dcterms:title": [ + { + "@value": "uml:Trigger to source" + } + ], + "dcterms:description": [ + { + "@value": "Connects the source of uml:Trigger" + } + ], + "pig:eligibleEndpoint": [ + { + "@id": "pig:Entity" + }, + { + "@id": "pig:Relationship" + } + ] + }, + { + "@id": "uml:Trigger-toTarget", + "pig:itemType": { + "@id": "pig:Link" + }, + "pig:specializes": { + "@id": "pig:TargetLink" + }, + "dcterms:title": [ + { + "@value": "uml:Trigger to target" + } + ], + "dcterms:description": [ + { + "@value": "Connects the target of uml:Trigger" + } + ], + "pig:eligibleEndpoint": [ + { + "@id": "pig:Entity" + }, + { + "@id": "pig:Relationship" + } + ] + }, + { + "@id": "uml:TransitionSource", + "dcterms:title": [ + { + "@value": "starts from" + } + ], + "pig:specializes": { + "@id": "pig:Relationship" + }, + "pig:eligibleProperty": [ + ], + "pig:itemType": { + "@id": "pig:Relationship" + }, + "pig:eligibleSourceLink": { + "@id": "uml:TransitionSource-toSource" + }, + "pig:eligibleTargetLink": { + "@id": "uml:TransitionSource-toTarget" + } + }, + { + "@id": "uml:TransitionSource-toSource", + "pig:itemType": { + "@id": "pig:Link" + }, + "pig:specializes": { + "@id": "pig:SourceLink" + }, + "dcterms:title": [ + { + "@value": "uml:TransitionSource to source" + } + ], + "dcterms:description": [ + { + "@value": "Connects the source of uml:TransitionSource" + } + ], + "pig:eligibleEndpoint": [ + { + "@id": "o:RC-UmlTransition" + }, + { + "@id": "FMC:Actor" + } + ] + }, + { + "@id": "uml:TransitionSource-toTarget", + "pig:itemType": { + "@id": "pig:Link" + }, + "pig:specializes": { + "@id": "pig:TargetLink" + }, + "dcterms:title": [ + { + "@value": "uml:TransitionSource to target" + } + ], + "dcterms:description": [ + { + "@value": "Connects the target of uml:TransitionSource" + } + ], + "pig:eligibleEndpoint": [ + { + "@id": "o:RC-UmlState" + }, + { + "@id": "FMC:State" + } + ] + }, + { + "@id": "uml:TransitionTarget", + "dcterms:title": [ + { + "@value": "ends at" + } + ], + "pig:specializes": { + "@id": "pig:Relationship" + }, + "pig:eligibleProperty": [ + ], + "pig:itemType": { + "@id": "pig:Relationship" + }, + "pig:eligibleSourceLink": { + "@id": "uml:TransitionTarget-toSource" + }, + "pig:eligibleTargetLink": { + "@id": "uml:TransitionTarget-toTarget" + } + }, + { + "@id": "uml:TransitionTarget-toSource", + "pig:itemType": { + "@id": "pig:Link" + }, + "pig:specializes": { + "@id": "pig:SourceLink" + }, + "dcterms:title": [ + { + "@value": "uml:TransitionTarget to source" + } + ], + "dcterms:description": [ + { + "@value": "Connects the source of uml:TransitionTarget" + } + ], + "pig:eligibleEndpoint": [ + { + "@id": "o:RC-UmlTransition" + }, + { + "@id": "FMC:Actor" + } + ] + }, + { + "@id": "uml:TransitionTarget-toTarget", + "pig:itemType": { + "@id": "pig:Link" + }, + "pig:specializes": { + "@id": "pig:TargetLink" + }, + "dcterms:title": [ + { + "@value": "uml:TransitionTarget to target" + } + ], + "dcterms:description": [ + { + "@value": "Connects the target of uml:TransitionTarget" + } + ], + "pig:eligibleEndpoint": [ + { + "@id": "o:RC-UmlState" + }, + { + "@id": "FMC:State" + } + ] + }, + { + "@id": "d:_19_0_3_71e0233_1746001337727_31616_14119", + "@type": "uml:Package", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "1. Requirements" + } + ], + "pig:category": [ + { + "@value": "uml:Package", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552810549321_335902_14037", + "@type": "pig:View", + "pig:revision": "rev-9405830621", + "dcterms:modified": "2025-11-12T09:28:04.871Z", + "dcterms:title": [ + { + "@value": "Original Requirement Specification" + } + ], + "SpecIF:Diagram": [ + { + "@value": "files_and_images/Original Requirement Specification.png", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:category": [ + { + "@value": "uml:Diagram", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "SpecIF:Notation": [ + { + "@value": "UML Requirement Diagram", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + }, + "pig:shows": [ + { + "@id": "d:_18_5_3_bc402f4_1552810869277_586147_14175", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552810948738_707540_14217", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552810776263_894029_14121", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552813199775_830344_15281", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552810644650_650036_14079", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552812437056_257578_14975", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552812370943_152244_14924", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552811136575_459751_14253", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552811141795_384989_14263", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552813433937_279860_15327", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552810808641_447672_14157", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552813334959_22842_15317", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552813438857_436917_15337", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:_18_5_3_bc402f4_1552810776263_894029_14121", + "@type": "IREB:Requirement", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "Navigation" + } + ], + "pig:category": [ + { + "@value": "uml:Class", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "dcterms:description": [ + { + "@value": "The Vehicle shall autonomously choose the best route from the current location C to the target location T by means of a road map and actual traffic conditions." + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552810869277_586147_14175", + "@type": "IREB:Requirement", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "Road Driving" + } + ], + "pig:category": [ + { + "@value": "uml:Class", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "dcterms:description": [ + { + "@value": "The vehicle shall be able to follow a selected road." + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552810644650_650036_14079", + "@type": "IREB:Requirement", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "Transport to Target" + } + ], + "pig:category": [ + { + "@value": "uml:Class", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "dcterms:description": [ + { + "@value": "As a customer I would like to get a parcel delivered from the current location C to a target location T. " + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552812370943_152244_14924", + "@type": "IREB:Requirement", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "Location as Postal Address" + } + ], + "pig:category": [ + { + "@value": "uml:Class", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "dcterms:description": [ + { + "@value": "A location may be specified as a postal address." + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552813199775_830344_15281", + "@type": "IREB:Requirement", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "Obstacle Avoidance" + } + ], + "pig:category": [ + { + "@value": "uml:Class", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "dcterms:description": [ + { + "@value": "The vehicle shall not hit a person or an obstacle on the road." + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552810948738_707540_14217", + "@type": "IREB:Requirement", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "Safe Driving" + } + ], + "pig:category": [ + { + "@value": "uml:Class", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "dcterms:description": [ + { + "@value": "The vehicle shall drive no faster than allowed or adequate for the actual road condition." + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552812437056_257578_14975", + "@type": "IREB:Requirement", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "Loacation as GPS Coordinate" + } + ], + "pig:category": [ + { + "@value": "uml:Class", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "dcterms:description": [ + { + "@value": "A location may be specified as GPS Coordinate with Longitude and Latitude in Degrees." + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746001480225_327746_14120", + "@type": "uml:Package", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "2. Functional Layer" + } + ], + "pig:category": [ + { + "@value": "uml:Package", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552811870216_105923_14824", + "@type": "pig:View", + "pig:revision": "rev-11094738149", + "dcterms:modified": "2025-11-12T09:28:21.131Z", + "dcterms:title": [ + { + "@value": "Functional Decomposition" + } + ], + "SpecIF:Diagram": [ + { + "@value": "files_and_images/Functional Decomposition.png", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:category": [ + { + "@value": "uml:Diagram", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "SpecIF:Notation": [ + { + "@value": "SysML Block Definition Diagram", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + }, + "pig:shows": [ + { + "@id": "d:_18_5_3_bc402f4_1552814104357_719492_15607", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552812805784_548404_15062", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552815791106_548984_16360", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552814523707_628151_15988", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1556615164506_303870_14975", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552811937697_690731_14862", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552812663506_709974_15011", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552813556602_820961_15353", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552810948738_707540_14217", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552810776263_894029_14121", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1556615212765_548060_15021", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552814194319_862392_15683", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552814246502_629251_15775", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_e40094_1718632293724_754873_14112", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552810869277_586147_14175", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552814212889_663150_15729", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552813038602_222864_15129", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552811510062_903764_14503", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552814266523_206006_15821", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552813818846_218375_15548", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_e40094_1718632569345_311906_14190", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_bc402f4_1604324293194_85516_13666", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_e40094_1718632549973_831908_14172", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_bc402f4_1604324214402_6480_13631", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_bc402f4_1604324487193_60359_13731", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_bc402f4_1604323867629_562362_13452", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552813096475_160687_15177", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1556615683513_411874_15073", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1556615721418_831605_15106", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_bc402f4_1604323821792_371188_13426", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552813723040_381289_15401", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552813102494_993665_15207", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_bc402f4_1604324465452_775050_13715", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_bc402f4_1604324188817_384398_13615", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552815590348_672436_16293", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552815653359_771130_16352", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_bc402f4_1604323888993_530325_13468", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552813795106_879353_15508", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_bc402f4_1604324636141_429081_13763", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_bc402f4_1604324764626_856811_13779", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_bc402f4_1604324512097_628722_13747", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552813870706_981259_15588", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_bc402f4_1604324447693_373448_13698", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_bc402f4_1604324321433_274293_13682", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552815541056_996851_16231", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:_18_5_3_bc402f4_1552813556602_820961_15353", + "@type": "SpecIF:ModelElement", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "Brake in an Emergency" + } + ], + "pig:category": [ + { + "@value": "RFLP:Function", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "dcterms:description": [ + { + "@value": "Take the vehicle to a full stop in the shortest time possible without loosing control over the trajectory." + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552814212889_663150_15729", + "@type": "SpecIF:ModelElement", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "Set Speed" + } + ], + "pig:category": [ + { + "@value": "RFLP:Function", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "dcterms:description": [ + { + "@value": "The (autonomous) driver's speed command (gas pedal position)." + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1556615164506_303870_14975", + "@type": "SpecIF:ModelElement", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "Turn Right" + } + ], + "pig:category": [ + { + "@value": "RFLP:Function", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "dcterms:description": [ + { + "@value": "Take a right turn at a road intersection. Observe the traffic entering the same lane and avoid a collision, if another vehicle does not observe the priority rules." + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552814194319_862392_15683", + "@type": "SpecIF:ModelElement", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "Set Radius" + } + ], + "pig:category": [ + { + "@value": "RFLP:Function", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "dcterms:description": [ + { + "@value": "The (autonomous) driver's steering command (steering wheel position)." + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552812663506_709974_15011", + "@type": "SpecIF:ModelElement", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "Navigate" + } + ], + "pig:category": [ + { + "@value": "RFLP:Function", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "dcterms:description": [ + { + "@value": "Select a path to get from the current position to the target." + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552814523707_628151_15988", + "@type": "SpecIF:ModelElement", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "Calculate Accelerations" + } + ], + "pig:category": [ + { + "@value": "RFLP:Function", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1556615212765_548060_15021", + "@type": "SpecIF:ModelElement", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "Turn Left" + } + ], + "pig:category": [ + { + "@value": "RFLP:Function", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "dcterms:description": [ + { + "@value": "Take a left turn in a road intersection. Observe the priority rules and avoid traffic on the two lanes you are crossing." + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552811937697_690731_14862", + "@type": "SpecIF:ModelElement", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "Drive to Target" + } + ], + "pig:category": [ + { + "@value": "RFLP:Function", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "dcterms:description": [ + { + "@value": "Manoevre the vehicle from the current position to the selected target." + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552814246502_629251_15775", + "@type": "SpecIF:ModelElement", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "Set Acceleration Left" + } + ], + "pig:category": [ + { + "@value": "RFLP:Function", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552813038602_222864_15129", + "@type": "SpecIF:ModelElement", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "Select an adequate Speed" + } + ], + "pig:category": [ + { + "@value": "RFLP:Function", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "dcterms:description": [ + { + "@value": "Taking into account road condition and weather, select a safe speed." + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552815791106_548984_16360", + "@type": "SpecIF:ModelElement", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "Set Acceleration Right" + } + ], + "pig:category": [ + { + "@value": "RFLP:Function", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552812805784_548404_15062", + "@type": "SpecIF:ModelElement", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "Follow the Road" + } + ], + "pig:category": [ + { + "@value": "RFLP:Function", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "dcterms:description": [ + { + "@value": "Keep the vehicle on the selected road." + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552814266523_206006_15821", + "@type": "SpecIF:ModelElement", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "Apply Brake" + } + ], + "pig:category": [ + { + "@value": "RFLP:Function", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746001561119_779379_14121", + "@type": "uml:Package", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "3. Logical Layer" + } + ], + "pig:category": [ + { + "@value": "uml:Package", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746027287147_82140_14431", + "@type": "pig:View", + "pig:revision": "rev-7887707545", + "dcterms:modified": "2025-11-12T09:28:38.225Z", + "dcterms:title": [ + { + "@value": "Logical Decomposition" + } + ], + "SpecIF:Diagram": [ + { + "@value": "files_and_images/Logical Decomposition.png", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:category": [ + { + "@value": "uml:Diagram", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "SpecIF:Notation": [ + { + "@value": "SysML Block Definition Diagram", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + }, + "pig:shows": [ + { + "@id": "d:_18_5_3_bc402f4_1552814104357_719492_15607", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552811538626_715866_14549", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_e40094_1718632293724_754873_14112", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_bc402f4_1604360793737_196507_13523", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552811469014_293642_14411", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552811454014_108965_14365", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552827771600_60767_16481", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552811554859_819240_14595", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552811412605_640145_14319", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552811510062_903764_14503", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552811672063_243990_14798", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_e40094_1718634030433_51877_14234", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_bc402f4_1604360962045_534106_13570", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552814131280_1190_15654", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552811613008_58411_14648", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552811666192_832840_14768", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552827804167_216283_16528", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552811619502_982677_14678", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552811653332_976698_14708", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:_19_0_3_e40094_1718632293724_754873_14112", + "@type": "SpecIF:ModelElement", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "Drive Right" + } + ], + "pig:category": [ + { + "@value": "RFLP:Logical_System", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "dcterms:description": [ + { + "@value": "The wheel with motor and brake on the right side. The motor can accelerate and decelerate. The motor controller is \"4-quadrant\" and can supply electrical current for recharging the batteries." + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552827771600_60767_16481", + "@type": "SpecIF:ModelElement", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "Track Sensor" + } + ], + "pig:category": [ + { + "@value": "RFLP:Logical_System", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552811469014_293642_14411", + "@type": "SpecIF:ModelElement", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "Body" + } + ], + "pig:category": [ + { + "@value": "RFLP:Logical_System", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552811510062_903764_14503", + "@type": "SpecIF:ModelElement", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "Drive Left" + } + ], + "pig:category": [ + { + "@value": "RFLP:Logical_System", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "dcterms:description": [ + { + "@value": "The wheel with motor and brake on the left side. The motor can accelerate and decelerate. The motor controller is \"4-quadrant\" and can supply electrical current for recharging the batteries." + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552811412605_640145_14319", + "@type": "SpecIF:ModelElement", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "LEGO Mindstorms Vehicle" + } + ], + "pig:category": [ + { + "@value": "RFLP:Logical_System", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552811538626_715866_14549", + "@type": "SpecIF:ModelElement", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "Support Front" + } + ], + "pig:category": [ + { + "@value": "RFLP:Logical_System", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552814104357_719492_15607", + "@type": "SpecIF:ModelElement", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "Controller" + } + ], + "pig:category": [ + { + "@value": "RFLP:Logical_System", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746027630926_778269_14800", + "@type": "pig:View", + "pig:revision": "rev-11807243868", + "dcterms:modified": "2025-11-12T09:29:01.139Z", + "dcterms:title": [ + { + "@value": "Controller State Machine" + } + ], + "SpecIF:Diagram": [ + { + "@value": "files_and_images/Controller State Machine.png", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:category": [ + { + "@value": "uml:Diagram", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "SpecIF:Notation": [ + { + "@value": "SysML State Machine Diagram", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + }, + "pig:shows": [ + { + "@id": "d:_19_0_3_71e0233_1746027747207_605800_14880", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746028306923_558192_15006", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746027631039_116153_14834", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746027847324_539644_14916", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746028149871_266697_14985", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746028183413_413266_14988", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746028605370_466818_15028", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746027920180_215768_14934", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746027631053_836894_14835", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746028442990_717820_15013", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746028275862_880382_14999", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746027631056_691503_14836", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746027731735_863978_14871", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746027704287_746273_14855", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746029049431_401220_15072", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746027837044_867827_14913", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746027882482_912182_14918", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746028839192_503107_15053", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746028827712_739888_15050", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746028061993_960870_14971", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746028073773_979720_14974", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746027804266_719052_14896", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746028508430_363448_15020", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746028822501_191804_15047", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746027731735_371186_14872", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746027967661_707482_14950", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746027630942_863638_14801", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746027630942_464786_14802", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746029024681_691401_15066", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746028118776_36360_14979", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746029726958_589946_15078", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746028195311_519257_14989", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746028216231_986687_14993", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746028282302_943711_15000", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746028313498_548385_15007", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746028899054_101006_15058", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746028954791_356054_15062", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746028884803_562591_15054", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746029056197_950529_15073", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746028540160_854095_15021", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746028483612_410592_15014", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ], + "pig:depicts": [ + { + "@id": "d:_19_0_3_71e0233_1746027630942_863638_14801", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:_19_0_3_71e0233_1746027631039_116153_14834", + "@type": "FMC:State", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "entry" + } + ], + "pig:category": [ + { + "@value": "uml:Pseudostate", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746027631053_836894_14835", + "@type": "FMC:State", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "Off" + } + ], + "pig:category": [ + { + "@value": "uml:State", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746027731735_863978_14871", + "@type": "FMC:State", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "entry" + } + ], + "pig:category": [ + { + "@value": "uml:Pseudostate", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746027747207_605800_14880", + "@type": "FMC:State", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "Navigating" + } + ], + "pig:category": [ + { + "@value": "uml:State", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746027804266_719052_14896", + "@type": "FMC:State", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "Defining Target" + } + ], + "pig:category": [ + { + "@value": "uml:State", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746027882482_912182_14918", + "@type": "FMC:State", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "Following the Road" + } + ], + "pig:category": [ + { + "@value": "uml:State", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746027920180_215768_14934", + "@type": "FMC:State", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "Turning Right" + } + ], + "pig:category": [ + { + "@value": "uml:State", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746027967661_707482_14950", + "@type": "FMC:State", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "Turning Left" + } + ], + "pig:category": [ + { + "@value": "uml:State", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746028605370_466818_15028", + "@type": "FMC:State", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "Standing" + } + ], + "pig:category": [ + { + "@value": "uml:State", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746027837044_867827_14913", + "@type": "FMC:Actor", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "entry→Defining Target" + } + ], + "pig:category": [ + { + "@value": "uml:Transition", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746027847324_539644_14916", + "@type": "FMC:Actor", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "Defining Target→Navigating" + } + ], + "pig:category": [ + { + "@value": "uml:Transition", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746028061993_960870_14971", + "@type": "FMC:Actor", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "Navigating→Following the Road" + } + ], + "pig:category": [ + { + "@value": "uml:Transition", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746028073773_979720_14974", + "@type": "FMC:Actor", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "Following the Road→Navigating" + } + ], + "pig:category": [ + { + "@value": "uml:Transition", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746028149871_266697_14985", + "@type": "FMC:Actor", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "Following the Road→Turning Right" + } + ], + "pig:category": [ + { + "@value": "uml:Transition", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746028183413_413266_14988", + "@type": "FMC:Actor", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "Turning Right→Following the Road" + } + ], + "pig:category": [ + { + "@value": "uml:Transition", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746028275862_880382_14999", + "@type": "FMC:Actor", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "Following the Road→Turning Left" + } + ], + "pig:category": [ + { + "@value": "uml:Transition", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746028306923_558192_15006", + "@type": "FMC:Actor", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "Turning Left→Following the Road" + } + ], + "pig:category": [ + { + "@value": "uml:Transition", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746028822501_191804_15047", + "@type": "FMC:Actor", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "Following the Road→Standing" + } + ], + "pig:category": [ + { + "@value": "uml:Transition", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746028827712_739888_15050", + "@type": "FMC:Actor", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "Following the Road→Standing" + } + ], + "pig:category": [ + { + "@value": "uml:Transition", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746028839192_503107_15053", + "@type": "FMC:Actor", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "Standing→Following the Road" + } + ], + "pig:category": [ + { + "@value": "uml:Transition", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746029049431_401220_15072", + "@type": "FMC:Actor", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "Standing→Defining Target" + } + ], + "pig:category": [ + { + "@value": "uml:Transition", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746028508430_363448_15020", + "@type": "FMC:Actor", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "Standing→Off" + } + ], + "pig:category": [ + { + "@value": "uml:Transition", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746027704287_746273_14855", + "@type": "FMC:State", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "On" + } + ], + "pig:category": [ + { + "@value": "uml:State", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746027631056_691503_14836", + "@type": "FMC:Actor", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "entry→Off" + } + ], + "pig:category": [ + { + "@value": "uml:Transition", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746028442990_717820_15013", + "@type": "FMC:Actor", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "Off→On" + } + ], + "pig:category": [ + { + "@value": "uml:Transition", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552811554859_819240_14595", + "@type": "SpecIF:ModelElement", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "Support Rear" + } + ], + "pig:category": [ + { + "@value": "RFLP:Logical_System", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552811454014_108965_14365", + "@type": "SpecIF:ModelElement", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "Chassis" + } + ], + "pig:category": [ + { + "@value": "RFLP:Logical_System", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_19_0_3_bc402f4_1604360793737_196507_13523", + "@type": "SpecIF:ModelElement", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "Collision Alarm \nSensor" + } + ], + "pig:category": [ + { + "@value": "RFLP:Logical_System", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746028118776_36360_14979", + "@type": "FMC:Event", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "start_driving!" + } + ], + "pig:category": [ + { + "@value": "uml:SignalEvent", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746028195311_519257_14989", + "@type": "FMC:Event", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "turn_right!" + } + ], + "pig:category": [ + { + "@value": "uml:SignalEvent", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746028216231_986687_14993", + "@type": "FMC:Event", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "turned_right!" + } + ], + "pig:category": [ + { + "@value": "uml:SignalEvent", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746028282302_943711_15000", + "@type": "FMC:Event", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "turn_left!" + } + ], + "pig:category": [ + { + "@value": "uml:SignalEvent", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746028313498_548385_15007", + "@type": "FMC:Event", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "turned_left!" + } + ], + "pig:category": [ + { + "@value": "uml:SignalEvent", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746028483612_410592_15014", + "@type": "FMC:Event", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "switch_on!" + } + ], + "pig:category": [ + { + "@value": "uml:SignalEvent", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746028540160_854095_15021", + "@type": "FMC:Event", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "switch_off!" + } + ], + "pig:category": [ + { + "@value": "uml:SignalEvent", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746028884803_562591_15054", + "@type": "FMC:Event", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "continue_driving!" + } + ], + "pig:category": [ + { + "@value": "uml:SignalEvent", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746028899054_101006_15058", + "@type": "FMC:Event", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "halt!" + } + ], + "pig:category": [ + { + "@value": "uml:SignalEvent", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746028954791_356054_15062", + "@type": "FMC:Event", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "emergency_brake!" + } + ], + "pig:category": [ + { + "@value": "uml:SignalEvent", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746029024681_691401_15066", + "@type": "FMC:Event", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "navigate!" + } + ], + "pig:category": [ + { + "@value": "uml:SignalEvent", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746029056197_950529_15073", + "@type": "FMC:Event", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "new_target!" + } + ], + "pig:category": [ + { + "@value": "uml:SignalEvent", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746029726958_589946_15078", + "@type": "FMC:Event", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "re-navigate!" + } + ], + "pig:category": [ + { + "@value": "uml:CallEvent", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746027630942_863638_14801", + "@type": "FMC:Actor", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "Controller State Machine" + } + ], + "pig:category": [ + { + "@value": "uml:StateMachine", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746027630942_464786_14802", + "@type": "FMC:Actor", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "unnamed uml:Region" + } + ], + "pig:category": [ + { + "@value": "uml:Region", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746027731735_371186_14872", + "@type": "FMC:Actor", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "dcterms:title": [ + { + "@value": "unnamed uml:Region" + } + ], + "pig:category": [ + { + "@value": "uml:Region", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + } + }, + { + "@id": "d:S-contains-10399921810", + "@type": "SpecIF:contains", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "SpecIF:contains-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746001337727_31616_14119", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "SpecIF:contains-toTarget": [ + { + "@id": "d:_18_5_3_bc402f4_1552810549321_335902_14037", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-contains-10330010667", + "@type": "SpecIF:contains", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "SpecIF:contains-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746001337727_31616_14119", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "SpecIF:contains-toTarget": [ + { + "@id": "d:_18_5_3_bc402f4_1552810776263_894029_14121", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-contains-10652725449", + "@type": "SpecIF:contains", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "SpecIF:contains-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746001337727_31616_14119", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "SpecIF:contains-toTarget": [ + { + "@id": "d:_18_5_3_bc402f4_1552810869277_586147_14175", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-contains-11927092777", + "@type": "SpecIF:contains", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "SpecIF:contains-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746001337727_31616_14119", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "SpecIF:contains-toTarget": [ + { + "@id": "d:_18_5_3_bc402f4_1552810644650_650036_14079", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-contains-8881937697", + "@type": "SpecIF:contains", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "SpecIF:contains-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746001337727_31616_14119", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "SpecIF:contains-toTarget": [ + { + "@id": "d:_18_5_3_bc402f4_1552812370943_152244_14924", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-contains-10783514673", + "@type": "SpecIF:contains", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "SpecIF:contains-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746001337727_31616_14119", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "SpecIF:contains-toTarget": [ + { + "@id": "d:_18_5_3_bc402f4_1552813199775_830344_15281", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-contains-10945506396", + "@type": "SpecIF:contains", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "SpecIF:contains-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746001337727_31616_14119", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "SpecIF:contains-toTarget": [ + { + "@id": "d:_18_5_3_bc402f4_1552810948738_707540_14217", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-contains-11407335150", + "@type": "SpecIF:contains", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "SpecIF:contains-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746001337727_31616_14119", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "SpecIF:contains-toTarget": [ + { + "@id": "d:_18_5_3_bc402f4_1552812437056_257578_14975", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-contains-9116397029", + "@type": "SpecIF:contains", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "SpecIF:contains-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746001480225_327746_14120", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "SpecIF:contains-toTarget": [ + { + "@id": "d:_18_5_3_bc402f4_1552811870216_105923_14824", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-contains-10022314071", + "@type": "SpecIF:contains", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "SpecIF:contains-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746001480225_327746_14120", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "SpecIF:contains-toTarget": [ + { + "@id": "d:_18_5_3_bc402f4_1552813556602_820961_15353", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-contains-9131303994", + "@type": "SpecIF:contains", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "SpecIF:contains-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746001480225_327746_14120", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "SpecIF:contains-toTarget": [ + { + "@id": "d:_18_5_3_bc402f4_1552814212889_663150_15729", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-contains-8559115413", + "@type": "SpecIF:contains", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "SpecIF:contains-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746001480225_327746_14120", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "SpecIF:contains-toTarget": [ + { + "@id": "d:_18_5_3_bc402f4_1556615164506_303870_14975", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-contains-10881577187", + "@type": "SpecIF:contains", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "SpecIF:contains-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746001480225_327746_14120", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "SpecIF:contains-toTarget": [ + { + "@id": "d:_18_5_3_bc402f4_1552814194319_862392_15683", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-contains-9119481481", + "@type": "SpecIF:contains", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "SpecIF:contains-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746001480225_327746_14120", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "SpecIF:contains-toTarget": [ + { + "@id": "d:_18_5_3_bc402f4_1552812663506_709974_15011", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-contains-12098040971", + "@type": "SpecIF:contains", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "SpecIF:contains-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746001480225_327746_14120", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "SpecIF:contains-toTarget": [ + { + "@id": "d:_18_5_3_bc402f4_1552814523707_628151_15988", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-contains-10442923979", + "@type": "SpecIF:contains", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "SpecIF:contains-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746001480225_327746_14120", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "SpecIF:contains-toTarget": [ + { + "@id": "d:_18_5_3_bc402f4_1556615212765_548060_15021", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-contains-11694297906", + "@type": "SpecIF:contains", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "SpecIF:contains-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746001480225_327746_14120", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "SpecIF:contains-toTarget": [ + { + "@id": "d:_18_5_3_bc402f4_1552811937697_690731_14862", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-contains-9652197932", + "@type": "SpecIF:contains", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "SpecIF:contains-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746001480225_327746_14120", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "SpecIF:contains-toTarget": [ + { + "@id": "d:_18_5_3_bc402f4_1552814246502_629251_15775", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-contains-9362975811", + "@type": "SpecIF:contains", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "SpecIF:contains-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746001480225_327746_14120", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "SpecIF:contains-toTarget": [ + { + "@id": "d:_18_5_3_bc402f4_1552813038602_222864_15129", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-contains-10771124872", + "@type": "SpecIF:contains", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "SpecIF:contains-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746001480225_327746_14120", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "SpecIF:contains-toTarget": [ + { + "@id": "d:_18_5_3_bc402f4_1552815791106_548984_16360", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-contains-9168262784", + "@type": "SpecIF:contains", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "SpecIF:contains-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746001480225_327746_14120", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "SpecIF:contains-toTarget": [ + { + "@id": "d:_18_5_3_bc402f4_1552812805784_548404_15062", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-contains-8878119738", + "@type": "SpecIF:contains", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "SpecIF:contains-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746001480225_327746_14120", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "SpecIF:contains-toTarget": [ + { + "@id": "d:_18_5_3_bc402f4_1552814266523_206006_15821", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:_19_0_3_bc402f4_1604324487193_60359_13731", + "@type": "dcterms:hasPart", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "dcterms:hasPart-toSource": [ + { + "@id": "d:_18_5_3_bc402f4_1552812805784_548404_15062", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "dcterms:hasPart-toTarget": [ + { + "@id": "d:_18_5_3_bc402f4_1552814194319_862392_15683", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:_19_0_3_bc402f4_1604323888993_530325_13468", + "@type": "dcterms:hasPart", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "dcterms:hasPart-toSource": [ + { + "@id": "d:_18_5_3_bc402f4_1552813556602_820961_15353", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "dcterms:hasPart-toTarget": [ + { + "@id": "d:_18_5_3_bc402f4_1552814523707_628151_15988", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:_19_0_3_bc402f4_1604324214402_6480_13631", + "@type": "dcterms:hasPart", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "dcterms:hasPart-toSource": [ + { + "@id": "d:_18_5_3_bc402f4_1552814523707_628151_15988", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "dcterms:hasPart-toTarget": [ + { + "@id": "d:_18_5_3_bc402f4_1552815791106_548984_16360", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:_19_0_3_bc402f4_1604324447693_373448_13698", + "@type": "dcterms:hasPart", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "dcterms:hasPart-toSource": [ + { + "@id": "d:_18_5_3_bc402f4_1556615212765_548060_15021", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "dcterms:hasPart-toTarget": [ + { + "@id": "d:_18_5_3_bc402f4_1552814194319_862392_15683", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:_18_5_3_bc402f4_1556615721418_831605_15106", + "@type": "dcterms:hasPart", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "dcterms:hasPart-toSource": [ + { + "@id": "d:_18_5_3_bc402f4_1552811937697_690731_14862", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "dcterms:hasPart-toTarget": [ + { + "@id": "d:_18_5_3_bc402f4_1556615212765_548060_15021", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:_18_5_3_bc402f4_1556615683513_411874_15073", + "@type": "dcterms:hasPart", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "dcterms:hasPart-toSource": [ + { + "@id": "d:_18_5_3_bc402f4_1552811937697_690731_14862", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "dcterms:hasPart-toTarget": [ + { + "@id": "d:_18_5_3_bc402f4_1556615164506_303870_14975", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:_18_5_3_bc402f4_1552813723040_381289_15401", + "@type": "dcterms:hasPart", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "dcterms:hasPart-toSource": [ + { + "@id": "d:_18_5_3_bc402f4_1552811937697_690731_14862", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "dcterms:hasPart-toTarget": [ + { + "@id": "d:_18_5_3_bc402f4_1552813556602_820961_15353", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:_19_0_3_bc402f4_1604324465452_775050_13715", + "@type": "dcterms:hasPart", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "dcterms:hasPart-toSource": [ + { + "@id": "d:_18_5_3_bc402f4_1556615164506_303870_14975", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "dcterms:hasPart-toTarget": [ + { + "@id": "d:_18_5_3_bc402f4_1552814194319_862392_15683", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:_19_0_3_bc402f4_1604324512097_628722_13747", + "@type": "dcterms:hasPart", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "dcterms:hasPart-toSource": [ + { + "@id": "d:_18_5_3_bc402f4_1556615164506_303870_14975", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "dcterms:hasPart-toTarget": [ + { + "@id": "d:_18_5_3_bc402f4_1552813038602_222864_15129", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:_19_0_3_bc402f4_1604323867629_562362_13452", + "@type": "dcterms:hasPart", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "dcterms:hasPart-toSource": [ + { + "@id": "d:_18_5_3_bc402f4_1552814212889_663150_15729", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "dcterms:hasPart-toTarget": [ + { + "@id": "d:_18_5_3_bc402f4_1552814523707_628151_15988", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:_19_0_3_bc402f4_1604324293194_85516_13666", + "@type": "dcterms:hasPart", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "dcterms:hasPart-toSource": [ + { + "@id": "d:_18_5_3_bc402f4_1552814523707_628151_15988", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "dcterms:hasPart-toTarget": [ + { + "@id": "d:_18_5_3_bc402f4_1552814266523_206006_15821", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:_19_0_3_bc402f4_1604324321433_274293_13682", + "@type": "dcterms:hasPart", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "dcterms:hasPart-toSource": [ + { + "@id": "d:_18_5_3_bc402f4_1556615212765_548060_15021", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "dcterms:hasPart-toTarget": [ + { + "@id": "d:_18_5_3_bc402f4_1552813038602_222864_15129", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:_19_0_3_bc402f4_1604324636141_429081_13763", + "@type": "dcterms:hasPart", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "dcterms:hasPart-toSource": [ + { + "@id": "d:_18_5_3_bc402f4_1552812805784_548404_15062", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "dcterms:hasPart-toTarget": [ + { + "@id": "d:_18_5_3_bc402f4_1552813038602_222864_15129", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:_18_5_3_bc402f4_1552813096475_160687_15177", + "@type": "dcterms:hasPart", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "dcterms:hasPart-toSource": [ + { + "@id": "d:_18_5_3_bc402f4_1552811937697_690731_14862", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "dcterms:hasPart-toTarget": [ + { + "@id": "d:_18_5_3_bc402f4_1552812663506_709974_15011", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:_19_0_3_bc402f4_1604324764626_856811_13779", + "@type": "dcterms:hasPart", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "dcterms:hasPart-toSource": [ + { + "@id": "d:_18_5_3_bc402f4_1552813038602_222864_15129", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "dcterms:hasPart-toTarget": [ + { + "@id": "d:_18_5_3_bc402f4_1552814212889_663150_15729", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:_19_0_3_bc402f4_1604323821792_371188_13426", + "@type": "dcterms:hasPart", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "dcterms:hasPart-toSource": [ + { + "@id": "d:_18_5_3_bc402f4_1552814194319_862392_15683", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "dcterms:hasPart-toTarget": [ + { + "@id": "d:_18_5_3_bc402f4_1552814523707_628151_15988", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:_18_5_3_bc402f4_1552813102494_993665_15207", + "@type": "dcterms:hasPart", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "dcterms:hasPart-toSource": [ + { + "@id": "d:_18_5_3_bc402f4_1552811937697_690731_14862", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "dcterms:hasPart-toTarget": [ + { + "@id": "d:_18_5_3_bc402f4_1552812805784_548404_15062", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:_19_0_3_bc402f4_1604324188817_384398_13615", + "@type": "dcterms:hasPart", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "dcterms:hasPart-toSource": [ + { + "@id": "d:_18_5_3_bc402f4_1552814523707_628151_15988", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "dcterms:hasPart-toTarget": [ + { + "@id": "d:_18_5_3_bc402f4_1552814246502_629251_15775", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-contains-10564266575", + "@type": "SpecIF:contains", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "SpecIF:contains-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746001561119_779379_14121", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "SpecIF:contains-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746027287147_82140_14431", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-contains-11515557626", + "@type": "SpecIF:contains", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "SpecIF:contains-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746001561119_779379_14121", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "SpecIF:contains-toTarget": [ + { + "@id": "d:_19_0_3_e40094_1718632293724_754873_14112", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-contains-9482395742", + "@type": "SpecIF:contains", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "SpecIF:contains-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746001561119_779379_14121", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "SpecIF:contains-toTarget": [ + { + "@id": "d:_18_5_3_bc402f4_1552827771600_60767_16481", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-contains-9179309009", + "@type": "SpecIF:contains", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "SpecIF:contains-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746001561119_779379_14121", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "SpecIF:contains-toTarget": [ + { + "@id": "d:_18_5_3_bc402f4_1552811469014_293642_14411", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-contains-8743767210", + "@type": "SpecIF:contains", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "SpecIF:contains-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746001561119_779379_14121", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "SpecIF:contains-toTarget": [ + { + "@id": "d:_18_5_3_bc402f4_1552811510062_903764_14503", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-contains-8520696102", + "@type": "SpecIF:contains", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "SpecIF:contains-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746001561119_779379_14121", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "SpecIF:contains-toTarget": [ + { + "@id": "d:_18_5_3_bc402f4_1552811412605_640145_14319", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-contains-8274829800", + "@type": "SpecIF:contains", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "SpecIF:contains-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746001561119_779379_14121", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "SpecIF:contains-toTarget": [ + { + "@id": "d:_18_5_3_bc402f4_1552811538626_715866_14549", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-contains-8790231064", + "@type": "SpecIF:contains", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "SpecIF:contains-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746001561119_779379_14121", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "SpecIF:contains-toTarget": [ + { + "@id": "d:_18_5_3_bc402f4_1552814104357_719492_15607", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-ownedBehavior-10906203416", + "@type": "uml:ownedBehavior", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "uml:ownedBehavior-toSource": [ + { + "@id": "d:_18_5_3_bc402f4_1552814104357_719492_15607", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "uml:ownedBehavior-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746027630942_863638_14801", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-contains-8869082288", + "@type": "SpecIF:contains", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "SpecIF:contains-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746001561119_779379_14121", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "SpecIF:contains-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746027630942_863638_14801", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-contains-9973927808", + "@type": "SpecIF:contains", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "SpecIF:contains-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746001561119_779379_14121", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "SpecIF:contains-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746027630926_778269_14800", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-contains-11028317306", + "@type": "SpecIF:contains", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "SpecIF:contains-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746027630942_863638_14801", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "SpecIF:contains-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746027630942_464786_14802", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-contains-10256822099", + "@type": "SpecIF:contains", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "SpecIF:contains-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746027630942_464786_14802", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "SpecIF:contains-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746027631039_116153_14834", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-contains-8821517563", + "@type": "SpecIF:contains", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "SpecIF:contains-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746027630942_464786_14802", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "SpecIF:contains-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746027631053_836894_14835", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-contains-8168210938", + "@type": "SpecIF:contains", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "SpecIF:contains-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746027630942_464786_14802", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "SpecIF:contains-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746027704287_746273_14855", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-contains-11015906742", + "@type": "SpecIF:contains", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "SpecIF:contains-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746027704287_746273_14855", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "SpecIF:contains-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746027731735_371186_14872", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-contains-10159638974", + "@type": "SpecIF:contains", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "SpecIF:contains-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746027731735_371186_14872", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "SpecIF:contains-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746027731735_863978_14871", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-contains-11234558713", + "@type": "SpecIF:contains", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "SpecIF:contains-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746027731735_371186_14872", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "SpecIF:contains-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746027747207_605800_14880", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-contains-8004350392", + "@type": "SpecIF:contains", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "SpecIF:contains-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746027731735_371186_14872", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "SpecIF:contains-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746027804266_719052_14896", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-contains-10687126464", + "@type": "SpecIF:contains", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "SpecIF:contains-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746027731735_371186_14872", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "SpecIF:contains-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746027882482_912182_14918", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-contains-9457711542", + "@type": "SpecIF:contains", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "SpecIF:contains-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746027731735_371186_14872", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "SpecIF:contains-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746027920180_215768_14934", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-contains-10206589560", + "@type": "SpecIF:contains", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "SpecIF:contains-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746027731735_371186_14872", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "SpecIF:contains-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746027967661_707482_14950", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-contains-11254687961", + "@type": "SpecIF:contains", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "SpecIF:contains-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746027731735_371186_14872", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "SpecIF:contains-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746028605370_466818_15028", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-startsFrom-10764992335", + "@type": "uml:TransitionSource", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "uml:TransitionSource-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746027837044_867827_14913", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "uml:TransitionSource-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746027731735_863978_14871", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-endsAt-10266389823", + "@type": "uml:TransitionTarget", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "uml:TransitionTarget-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746027837044_867827_14913", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "uml:TransitionTarget-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746027804266_719052_14896", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-startsFrom-9736561245", + "@type": "uml:TransitionSource", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "uml:TransitionSource-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746027847324_539644_14916", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "uml:TransitionSource-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746027804266_719052_14896", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-endsAt-11306959252", + "@type": "uml:TransitionTarget", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "uml:TransitionTarget-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746027847324_539644_14916", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "uml:TransitionTarget-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746027747207_605800_14880", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-triggers-11057421225", + "@type": "uml:Trigger", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "uml:Trigger-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746029024681_691401_15066", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "uml:Trigger-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746027847324_539644_14916", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-startsFrom-10753048967", + "@type": "uml:TransitionSource", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "uml:TransitionSource-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746028061993_960870_14971", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "uml:TransitionSource-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746027747207_605800_14880", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-endsAt-10164860996", + "@type": "uml:TransitionTarget", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "uml:TransitionTarget-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746028061993_960870_14971", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "uml:TransitionTarget-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746027882482_912182_14918", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-triggers-9989729747", + "@type": "uml:Trigger", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "uml:Trigger-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746028118776_36360_14979", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "uml:Trigger-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746028061993_960870_14971", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-startsFrom-8258457006", + "@type": "uml:TransitionSource", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "uml:TransitionSource-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746028073773_979720_14974", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "uml:TransitionSource-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746027882482_912182_14918", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-endsAt-8326005469", + "@type": "uml:TransitionTarget", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "uml:TransitionTarget-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746028073773_979720_14974", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "uml:TransitionTarget-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746027747207_605800_14880", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-triggers-11586041943", + "@type": "uml:Trigger", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "uml:Trigger-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746029726958_589946_15078", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "uml:Trigger-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746028073773_979720_14974", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-startsFrom-10663437825", + "@type": "uml:TransitionSource", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "uml:TransitionSource-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746028149871_266697_14985", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "uml:TransitionSource-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746027882482_912182_14918", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-endsAt-10827655661", + "@type": "uml:TransitionTarget", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "uml:TransitionTarget-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746028149871_266697_14985", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "uml:TransitionTarget-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746027920180_215768_14934", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-triggers-11897440242", + "@type": "uml:Trigger", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "uml:Trigger-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746028195311_519257_14989", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "uml:Trigger-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746028149871_266697_14985", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-startsFrom-10501816934", + "@type": "uml:TransitionSource", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "uml:TransitionSource-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746028183413_413266_14988", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "uml:TransitionSource-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746027920180_215768_14934", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-endsAt-9816959590", + "@type": "uml:TransitionTarget", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "uml:TransitionTarget-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746028183413_413266_14988", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "uml:TransitionTarget-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746027882482_912182_14918", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-triggers-8400858676", + "@type": "uml:Trigger", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "uml:Trigger-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746028216231_986687_14993", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "uml:Trigger-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746028183413_413266_14988", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-startsFrom-9888010871", + "@type": "uml:TransitionSource", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "uml:TransitionSource-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746028275862_880382_14999", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "uml:TransitionSource-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746027882482_912182_14918", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-endsAt-7971585829", + "@type": "uml:TransitionTarget", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "uml:TransitionTarget-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746028275862_880382_14999", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "uml:TransitionTarget-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746027967661_707482_14950", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-triggers-8791358862", + "@type": "uml:Trigger", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "uml:Trigger-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746028282302_943711_15000", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "uml:Trigger-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746028275862_880382_14999", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-startsFrom-8873253251", + "@type": "uml:TransitionSource", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "uml:TransitionSource-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746028306923_558192_15006", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "uml:TransitionSource-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746027967661_707482_14950", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-endsAt-10269038785", + "@type": "uml:TransitionTarget", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "uml:TransitionTarget-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746028306923_558192_15006", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "uml:TransitionTarget-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746027882482_912182_14918", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-triggers-8710683288", + "@type": "uml:Trigger", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "uml:Trigger-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746028313498_548385_15007", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "uml:Trigger-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746028306923_558192_15006", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-startsFrom-8996430444", + "@type": "uml:TransitionSource", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "uml:TransitionSource-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746028822501_191804_15047", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "uml:TransitionSource-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746027882482_912182_14918", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-endsAt-11699322235", + "@type": "uml:TransitionTarget", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "uml:TransitionTarget-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746028822501_191804_15047", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "uml:TransitionTarget-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746028605370_466818_15028", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-triggers-9704245737", + "@type": "uml:Trigger", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "uml:Trigger-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746028899054_101006_15058", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "uml:Trigger-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746028822501_191804_15047", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-startsFrom-8860759247", + "@type": "uml:TransitionSource", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "uml:TransitionSource-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746028827712_739888_15050", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "uml:TransitionSource-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746027882482_912182_14918", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-endsAt-11563651038", + "@type": "uml:TransitionTarget", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "uml:TransitionTarget-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746028827712_739888_15050", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "uml:TransitionTarget-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746028605370_466818_15028", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-triggers-8483779004", + "@type": "uml:Trigger", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "uml:Trigger-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746028954791_356054_15062", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "uml:Trigger-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746028827712_739888_15050", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-startsFrom-11316265439", + "@type": "uml:TransitionSource", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "uml:TransitionSource-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746028839192_503107_15053", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "uml:TransitionSource-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746028605370_466818_15028", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-endsAt-8092734140", + "@type": "uml:TransitionTarget", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "uml:TransitionTarget-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746028839192_503107_15053", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "uml:TransitionTarget-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746027882482_912182_14918", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-triggers-9344676895", + "@type": "uml:Trigger", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "uml:Trigger-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746028884803_562591_15054", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "uml:Trigger-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746028839192_503107_15053", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-startsFrom-10914308453", + "@type": "uml:TransitionSource", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "uml:TransitionSource-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746029049431_401220_15072", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "uml:TransitionSource-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746028605370_466818_15028", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-endsAt-10482894906", + "@type": "uml:TransitionTarget", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "uml:TransitionTarget-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746029049431_401220_15072", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "uml:TransitionTarget-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746027804266_719052_14896", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-triggers-10198907956", + "@type": "uml:Trigger", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "uml:Trigger-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746029056197_950529_15073", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "uml:Trigger-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746029049431_401220_15072", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-startsFrom-10203202111", + "@type": "uml:TransitionSource", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "uml:TransitionSource-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746028508430_363448_15020", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "uml:TransitionSource-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746028605370_466818_15028", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-endsAt-10388500447", + "@type": "uml:TransitionTarget", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "uml:TransitionTarget-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746028508430_363448_15020", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "uml:TransitionTarget-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746027631053_836894_14835", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-triggers-8226880185", + "@type": "uml:Trigger", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "uml:Trigger-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746028540160_854095_15021", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "uml:Trigger-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746028508430_363448_15020", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-startsFrom-10505811433", + "@type": "uml:TransitionSource", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "uml:TransitionSource-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746027631056_691503_14836", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "uml:TransitionSource-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746027631039_116153_14834", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-endsAt-11750312327", + "@type": "uml:TransitionTarget", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "uml:TransitionTarget-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746027631056_691503_14836", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "uml:TransitionTarget-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746027631053_836894_14835", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-startsFrom-9662251988", + "@type": "uml:TransitionSource", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "uml:TransitionSource-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746028442990_717820_15013", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "uml:TransitionSource-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746027631053_836894_14835", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-endsAt-10042078921", + "@type": "uml:TransitionTarget", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "uml:TransitionTarget-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746028442990_717820_15013", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "uml:TransitionTarget-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746027704287_746273_14855", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-triggers-11689502440", + "@type": "uml:Trigger", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "uml:Trigger-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746028483612_410592_15014", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "uml:Trigger-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746028442990_717820_15013", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-contains-8524437672", + "@type": "SpecIF:contains", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "SpecIF:contains-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746001561119_779379_14121", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "SpecIF:contains-toTarget": [ + { + "@id": "d:_18_5_3_bc402f4_1552811554859_819240_14595", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-contains-10606577794", + "@type": "SpecIF:contains", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "SpecIF:contains-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746001561119_779379_14121", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "SpecIF:contains-toTarget": [ + { + "@id": "d:_18_5_3_bc402f4_1552811454014_108965_14365", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-contains-10600261667", + "@type": "SpecIF:contains", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "SpecIF:contains-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746001561119_779379_14121", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "SpecIF:contains-toTarget": [ + { + "@id": "d:_19_0_3_bc402f4_1604360793737_196507_13523", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-contains-8034687851", + "@type": "SpecIF:contains", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "SpecIF:contains-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746001561119_779379_14121", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "SpecIF:contains-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746028118776_36360_14979", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-contains-8284367231", + "@type": "SpecIF:contains", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "SpecIF:contains-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746001561119_779379_14121", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "SpecIF:contains-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746028195311_519257_14989", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-contains-11116214028", + "@type": "SpecIF:contains", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "SpecIF:contains-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746001561119_779379_14121", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "SpecIF:contains-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746028216231_986687_14993", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-contains-11694709529", + "@type": "SpecIF:contains", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "SpecIF:contains-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746001561119_779379_14121", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "SpecIF:contains-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746028282302_943711_15000", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-contains-12033035043", + "@type": "SpecIF:contains", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "SpecIF:contains-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746001561119_779379_14121", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "SpecIF:contains-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746028313498_548385_15007", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-contains-9345097305", + "@type": "SpecIF:contains", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "SpecIF:contains-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746001561119_779379_14121", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "SpecIF:contains-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746028483612_410592_15014", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-contains-10887885853", + "@type": "SpecIF:contains", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "SpecIF:contains-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746001561119_779379_14121", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "SpecIF:contains-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746028540160_854095_15021", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-contains-11330005271", + "@type": "SpecIF:contains", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "SpecIF:contains-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746001561119_779379_14121", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "SpecIF:contains-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746028884803_562591_15054", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-contains-10697539955", + "@type": "SpecIF:contains", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "SpecIF:contains-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746001561119_779379_14121", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "SpecIF:contains-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746028899054_101006_15058", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-contains-8277838339", + "@type": "SpecIF:contains", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "SpecIF:contains-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746001561119_779379_14121", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "SpecIF:contains-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746028954791_356054_15062", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-contains-10218959244", + "@type": "SpecIF:contains", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "SpecIF:contains-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746001561119_779379_14121", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "SpecIF:contains-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746029024681_691401_15066", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-contains-10331126120", + "@type": "SpecIF:contains", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "SpecIF:contains-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746001561119_779379_14121", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "SpecIF:contains-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746029056197_950529_15073", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:S-contains-8478289863", + "@type": "SpecIF:contains", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "SpecIF:contains-toSource": [ + { + "@id": "d:_19_0_3_71e0233_1746001561119_779379_14121", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "SpecIF:contains-toTarget": [ + { + "@id": "d:_19_0_3_71e0233_1746029726958_589946_15078", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:_18_5_3_bc402f4_1552814131280_1190_15654", + "@type": "dcterms:hasPart", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "dcterms:hasPart-toSource": [ + { + "@id": "d:_18_5_3_bc402f4_1552811412605_640145_14319", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "dcterms:hasPart-toTarget": [ + { + "@id": "d:_18_5_3_bc402f4_1552814104357_719492_15607", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:_19_0_3_bc402f4_1604360962045_534106_13570", + "@type": "dcterms:hasPart", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "dcterms:hasPart-toSource": [ + { + "@id": "d:_18_5_3_bc402f4_1552811412605_640145_14319", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "dcterms:hasPart-toTarget": [ + { + "@id": "d:_19_0_3_bc402f4_1604360793737_196507_13523", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:_18_5_3_bc402f4_1552811613008_58411_14648", + "@type": "dcterms:hasPart", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "dcterms:hasPart-toSource": [ + { + "@id": "d:_18_5_3_bc402f4_1552811412605_640145_14319", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "dcterms:hasPart-toTarget": [ + { + "@id": "d:_18_5_3_bc402f4_1552811454014_108965_14365", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:_19_0_3_e40094_1718634030433_51877_14234", + "@type": "dcterms:hasPart", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "dcterms:hasPart-toSource": [ + { + "@id": "d:_18_5_3_bc402f4_1552811412605_640145_14319", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "dcterms:hasPart-toTarget": [ + { + "@id": "d:_19_0_3_e40094_1718632293724_754873_14112", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:_18_5_3_bc402f4_1552811619502_982677_14678", + "@type": "dcterms:hasPart", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "dcterms:hasPart-toSource": [ + { + "@id": "d:_18_5_3_bc402f4_1552811412605_640145_14319", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "dcterms:hasPart-toTarget": [ + { + "@id": "d:_18_5_3_bc402f4_1552811469014_293642_14411", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:_18_5_3_bc402f4_1552827804167_216283_16528", + "@type": "dcterms:hasPart", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "dcterms:hasPart-toSource": [ + { + "@id": "d:_18_5_3_bc402f4_1552811412605_640145_14319", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "dcterms:hasPart-toTarget": [ + { + "@id": "d:_18_5_3_bc402f4_1552827771600_60767_16481", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:_18_5_3_bc402f4_1552811666192_832840_14768", + "@type": "dcterms:hasPart", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "dcterms:hasPart-toSource": [ + { + "@id": "d:_18_5_3_bc402f4_1552811412605_640145_14319", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "dcterms:hasPart-toTarget": [ + { + "@id": "d:_18_5_3_bc402f4_1552811538626_715866_14549", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:_18_5_3_bc402f4_1552811672063_243990_14798", + "@type": "dcterms:hasPart", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "dcterms:hasPart-toSource": [ + { + "@id": "d:_18_5_3_bc402f4_1552811412605_640145_14319", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "dcterms:hasPart-toTarget": [ + { + "@id": "d:_18_5_3_bc402f4_1552811554859_819240_14595", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:_18_5_3_bc402f4_1552811653332_976698_14708", + "@type": "dcterms:hasPart", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "dcterms:hasPart-toSource": [ + { + "@id": "d:_18_5_3_bc402f4_1552811412605_640145_14319", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "dcterms:hasPart-toTarget": [ + { + "@id": "d:_18_5_3_bc402f4_1552811510062_903764_14503", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:_18_5_3_bc402f4_1552810808641_447672_14157", + "@type": "IREB:refines", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "IREB:refines-toSource": [ + { + "@id": "d:_18_5_3_bc402f4_1552810776263_894029_14121", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "IREB:refines-toTarget": [ + { + "@id": "d:_18_5_3_bc402f4_1552810644650_650036_14079", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:_18_5_3_bc402f4_1552811141795_384989_14263", + "@type": "IREB:refines", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "IREB:refines-toSource": [ + { + "@id": "d:_18_5_3_bc402f4_1552810948738_707540_14217", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "IREB:refines-toTarget": [ + { + "@id": "d:_18_5_3_bc402f4_1552810644650_650036_14079", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:_18_5_3_bc402f4_1552813438857_436917_15337", + "@type": "IREB:refines", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "IREB:refines-toSource": [ + { + "@id": "d:_18_5_3_bc402f4_1552812370943_152244_14924", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "IREB:refines-toTarget": [ + { + "@id": "d:_18_5_3_bc402f4_1552810644650_650036_14079", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:_18_5_3_bc402f4_1552813334959_22842_15317", + "@type": "IREB:refines", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "IREB:refines-toSource": [ + { + "@id": "d:_18_5_3_bc402f4_1552813199775_830344_15281", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "IREB:refines-toTarget": [ + { + "@id": "d:_18_5_3_bc402f4_1552810644650_650036_14079", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:_18_5_3_bc402f4_1552813433937_279860_15327", + "@type": "IREB:refines", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "IREB:refines-toSource": [ + { + "@id": "d:_18_5_3_bc402f4_1552812437056_257578_14975", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "IREB:refines-toTarget": [ + { + "@id": "d:_18_5_3_bc402f4_1552810644650_650036_14079", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:_18_5_3_bc402f4_1552811136575_459751_14253", + "@type": "IREB:refines", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "IREB:refines-toSource": [ + { + "@id": "d:_18_5_3_bc402f4_1552810869277_586147_14175", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "IREB:refines-toTarget": [ + { + "@id": "d:_18_5_3_bc402f4_1552810644650_650036_14079", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:_18_5_3_bc402f4_1552813795106_879353_15508", + "@type": "oslc_rm:satisfies", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "oslc_rm:satisfies-toSource": [ + { + "@id": "d:_18_5_3_bc402f4_1552812805784_548404_15062", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "oslc_rm:satisfies-toTarget": [ + { + "@id": "d:_18_5_3_bc402f4_1552810869277_586147_14175", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:_18_5_3_bc402f4_1552813870706_981259_15588", + "@type": "oslc_rm:satisfies", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "oslc_rm:satisfies-toSource": [ + { + "@id": "d:_18_5_3_bc402f4_1552812663506_709974_15011", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "oslc_rm:satisfies-toTarget": [ + { + "@id": "d:_18_5_3_bc402f4_1552810776263_894029_14121", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:_18_5_3_bc402f4_1552815653359_771130_16352", + "@type": "sysml:Allocate", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "sysml:Allocate-toSource": [ + { + "@id": "d:_18_5_3_bc402f4_1552814523707_628151_15988", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "sysml:Allocate-toTarget": [ + { + "@id": "d:_18_5_3_bc402f4_1552814104357_719492_15607", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:_18_5_3_bc402f4_1552815590348_672436_16293", + "@type": "sysml:Allocate", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "sysml:Allocate-toSource": [ + { + "@id": "d:_18_5_3_bc402f4_1552814266523_206006_15821", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "sysml:Allocate-toTarget": [ + { + "@id": "d:_18_5_3_bc402f4_1552811510062_903764_14503", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:_19_0_3_e40094_1718632549973_831908_14172", + "@type": "sysml:Allocate", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "sysml:Allocate-toSource": [ + { + "@id": "d:_18_5_3_bc402f4_1552815791106_548984_16360", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "sysml:Allocate-toTarget": [ + { + "@id": "d:_19_0_3_e40094_1718632293724_754873_14112", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:_18_5_3_bc402f4_1552815541056_996851_16231", + "@type": "sysml:Allocate", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "sysml:Allocate-toSource": [ + { + "@id": "d:_18_5_3_bc402f4_1552814246502_629251_15775", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "sysml:Allocate-toTarget": [ + { + "@id": "d:_18_5_3_bc402f4_1552811510062_903764_14503", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:_18_5_3_bc402f4_1552813818846_218375_15548", + "@type": "oslc_rm:satisfies", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "oslc_rm:satisfies-toSource": [ + { + "@id": "d:_18_5_3_bc402f4_1552813038602_222864_15129", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "oslc_rm:satisfies-toTarget": [ + { + "@id": "d:_18_5_3_bc402f4_1552810948738_707540_14217", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:_19_0_3_e40094_1718632569345_311906_14190", + "@type": "sysml:Allocate", + "dcterms:modified": "2025-09-24T08:28:08.223Z", + "pig:itemType": { + "@id": "pig:aRelationship" + }, + "sysml:Allocate-toSource": [ + { + "@id": "d:_18_5_3_bc402f4_1552814266523_206006_15821", + "pig:itemType": { + "@id": "pig:aSourceLink" + } + } + ], + "sysml:Allocate-toTarget": [ + { + "@id": "d:_19_0_3_e40094_1718632293724_754873_14112", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:HierarchyRoot-P-eee_1045467100313_135436_1", + "@type": "pig:HierarchyRoot", + "pig:itemType": { + "@id": "pig:anEntity" + }, + "dcterms:modified": "2026-01-17T22:38:55.908Z", + "dcterms:title": [ + { + "@value": "Hierarchy Root" + } + ], + "dcterms:description": [ + { + "@value": "... anchoring all hierarchies of this graph (package)" + } + ], + "pig:lists": [ + { + "@id": "d:HR-9052885961", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:HR-FolderGlossary-10391243923", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:eee_1045467100313_135436_1", + "@type": "pig:Outline", + "pig:revision": "rev-10410861023", + "dcterms:modified": "2025-11-12T09:27:42.126Z", + "dcterms:title": [ + { + "@value": "Small Autonomous Vehicle" + } + ], + "pig:category": [ + { + "@value": "uml:Model", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + }, + "pig:lists": [ + { + "@id": "d:_19_0_3_71e0233_1746001337727_31616_14119", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746001480225_327746_14120", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746001561119_779379_14121", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:HR-9052885961", + "@type": "pig:Outline", + "dcterms:modified": "2026-01-17T22:38:55.793Z", + "dcterms:title": [ + { + "@value": "Small Autonomous Vehicle" + } + ], + "dcterms:description": [ + { + "@value": "A set of SpecIF Classes derived from a SpecIF Ontology for the domains SpecIF:DomainBase, SpecIF:DomainSystemsEngineering, SpecIF:DomainSystemModelIntegration.", + "@language": "en" + } + ], + "pig:category": [ + { + "@value": "ReqIF:HierarchyRoot", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + }, + "pig:lists": [ + { + "@id": "d:eee_1045467100313_135436_1", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:FolderGlossary-10391243923", + "@type": "pig:Outline", + "dcterms:modified": "2026-01-17T22:38:43.273Z", + "dcterms:title": [ + { + "@value": "Model Elements (Glossary)" + } + ], + "pig:category": [ + { + "@value": "SpecIF:Glossary", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + }, + "pig:lists": [ + { + "@id": "d:_18_5_3_bc402f4_1552814266523_206006_15821", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552811469014_293642_14411", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552813556602_820961_15353", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552814523707_628151_15988", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552811454014_108965_14365", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_bc402f4_1604360793737_196507_13523", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746028884803_562591_15054", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552814104357_719492_15607", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746027630942_863638_14801", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746027804266_719052_14896", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746027847324_539644_14916", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552811510062_903764_14503", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_e40094_1718632293724_754873_14112", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552811937697_690731_14862", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746028954791_356054_15062", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746027631039_116153_14834", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746027731735_863978_14871", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746027837044_867827_14913", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746027631056_691503_14836", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552812805784_548404_15062", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746027882482_912182_14918", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746028073773_979720_14974", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746028822501_191804_15047", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746028827712_739888_15050", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746028275862_880382_14999", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746028149871_266697_14985", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746028899054_101006_15058", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552811412605_640145_14319", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552812437056_257578_14975", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552812370943_152244_14924", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552812663506_709974_15011", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746029024681_691401_15066", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746027747207_605800_14880", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746028061993_960870_14971", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552810776263_894029_14121", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746029056197_950529_15073", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552813199775_830344_15281", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746027631053_836894_14835", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746028442990_717820_15013", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746027704287_746273_14855", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746029726958_589946_15078", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552810869277_586147_14175", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552810948738_707540_14217", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552813038602_222864_15129", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552814246502_629251_15775", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552815791106_548984_16360", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552814194319_862392_15683", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552814212889_663150_15729", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746028605370_466818_15028", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746029049431_401220_15072", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746028839192_503107_15053", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746028508430_363448_15020", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746028118776_36360_14979", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552811538626_715866_14549", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552811554859_819240_14595", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746028540160_854095_15021", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746028483612_410592_15014", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552827771600_60767_16481", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1552810644650_650036_14079", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1556615212765_548060_15021", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_18_5_3_bc402f4_1556615164506_303870_14975", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746028282302_943711_15000", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746028195311_519257_14989", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746028313498_548385_15007", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746028216231_986687_14993", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746027967661_707482_14950", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746028306923_558192_15006", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746027920180_215768_14934", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746028183413_413266_14988", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746027630942_464786_14802", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + }, + { + "@id": "d:_19_0_3_71e0233_1746027731735_371186_14872", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + }, + { + "@id": "d:HR-FolderGlossary-10391243923", + "@type": "pig:Outline", + "dcterms:modified": "2026-01-17T22:38:55.793Z", + "dcterms:title": [ + { + "@value": "Small Autonomous Vehicle" + } + ], + "dcterms:description": [ + { + "@value": "A set of SpecIF Classes derived from a SpecIF Ontology for the domains SpecIF:DomainBase, SpecIF:DomainSystemsEngineering, SpecIF:DomainSystemModelIntegration.", + "@language": "en" + } + ], + "pig:category": [ + { + "@value": "ReqIF:HierarchyRoot", + "pig:itemType": { + "@id": "pig:aProperty" + } + } + ], + "pig:itemType": { + "@id": "pig:anEntity" + }, + "pig:lists": [ + { + "@id": "d:FolderGlossary-10391243923", + "pig:itemType": { + "@id": "pig:aTargetLink" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/tests/data/XML/21/Project 'Very Simple Model (FMC) with Requirements'.pig.xml b/tests/data/XML/21/Project 'Very Simple Model (FMC) with Requirements'.pig.xml index 6782008..07372ef 100644 --- a/tests/data/XML/21/Project 'Very Simple Model (FMC) with Requirements'.pig.xml +++ b/tests/data/XML/21/Project 'Very Simple Model (FMC) with Requirements'.pig.xml @@ -90,7 +90,7 @@ - dcterms:type + pig:Property has category Specifies a category for an element (entity, relationship or organizer). From a1b34f0ea2b0ea7671bcde7bdc8f6010f08f6a06 Mon Sep 17 00:00:00 2001 From: "OD-T14S-25\\PCUser" Date: Mon, 2 Feb 2026 14:53:17 +0100 Subject: [PATCH 23/26] editorial changes in comments --- src/utils/import/jsonld/import-package-jsonld.ts | 2 +- src/utils/import/xml/import-package-xml.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/utils/import/jsonld/import-package-jsonld.ts b/src/utils/import/jsonld/import-package-jsonld.ts index 52169d3..92eabb3 100644 --- a/src/utils/import/jsonld/import-package-jsonld.ts +++ b/src/utils/import/jsonld/import-package-jsonld.ts @@ -54,7 +54,7 @@ export async function importJSONLD(source: string | File | Blob): Promise } // Instantiate APackage and load the document - const aPackage = new APackage().setJSONLD(doc); // apply all constraints checks by default + const aPackage = new APackage().setJSONLD(doc); // apply all constraint checks by default /* const aPackage = new APackage().setJSONLD( doc, // some examples are incomplete, so we skip the tests for specializes: diff --git a/src/utils/import/xml/import-package-xml.ts b/src/utils/import/xml/import-package-xml.ts index fcd0189..cd8cbaf 100644 --- a/src/utils/import/xml/import-package-xml.ts +++ b/src/utils/import/xml/import-package-xml.ts @@ -63,7 +63,7 @@ export async function importXML(source: string | File | Blob): Promise { */ // Instantiate APackage directly from XML string - const aPackage = new APackage().setXML(xmlString); // apply all constraints checks by default + const aPackage = new APackage().setXML(xmlString); // apply all constraint checks by default /* const aPackage = new APackage().setXML( xmlString, // some examples are incomplete, so we skip the tests for specializes: From 5db5e199e15395880d94a3c01092ddcb9b1d8a6b Mon Sep 17 00:00:00 2001 From: "OD-T14S-25\\PCUser" Date: Mon, 2 Feb 2026 14:56:58 +0100 Subject: [PATCH 24/26] removed debug logging and redundant check in aPackage.validate(). --- src/utils/schemas/pig/ts/pig-metaclasses.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/utils/schemas/pig/ts/pig-metaclasses.ts b/src/utils/schemas/pig/ts/pig-metaclasses.ts index ff375aa..62769c5 100644 --- a/src/utils/schemas/pig/ts/pig-metaclasses.ts +++ b/src/utils/schemas/pig/ts/pig-metaclasses.ts @@ -1064,7 +1064,7 @@ export class APackage extends Identifiable implements IAPackage { validate(itm: IAPackage, checks?: ConstraintCheckType[] ): IRsp { // Schema validation (AJV) - provides structural checks and reuses the idString definition // ... only at the lowest subclass level: - logger.debug('APackage.validate: ', itm); + // logger.debug('APackage.validate: ', itm); try { const ok = SCH.validateAPackageSchema(itm); if (!ok) { @@ -1075,11 +1075,12 @@ export class APackage extends Identifiable implements IAPackage { return Msg.create(682, 'aRelationship', itm.id, err?.message ?? String(err)); } + /* checked by schema .. // graph must be present and be an array if (!Array.isArray(itm.graph) || itm.graph.length < 1) { return Msg.create(630, 'graph'); } - + */ // Call parent validation let rsp = super.validate(itm); if (!rsp.ok) { From 2c57a2c7436522be4da30ff7839b44c1ea4865cb Mon Sep 17 00:00:00 2001 From: "OD-T14S-25\\PCUser" Date: Tue, 3 Feb 2026 09:36:53 +0100 Subject: [PATCH 25/26] Changes as suggested by Chrie' review. --- .../schemas/pig/ts/pig-package-constraints.ts | 102 ------------------ 1 file changed, 102 deletions(-) diff --git a/src/utils/schemas/pig/ts/pig-package-constraints.ts b/src/utils/schemas/pig/ts/pig-package-constraints.ts index 5abf165..b181dd0 100644 --- a/src/utils/schemas/pig/ts/pig-package-constraints.ts +++ b/src/utils/schemas/pig/ts/pig-package-constraints.ts @@ -161,57 +161,6 @@ export function checkConstraintsForPackage( return rspOK; } -/** - * Check cross-item constraints for a package - * @param pkg - Package to validate - * @returns IRsp (rspOK on success, error IRsp on failure) - * -export function checkConstraintsForPackage(pkg: IAPackage): IRsp { - // 1. Check that all primary IDs are unique - const uniquenessCheck = checkUniqueIds(pkg); - if (!uniquenessCheck.ok) { - return uniquenessCheck; - } - - // 2. Build a map of itemTypes by ID for quick lookup - const itemTypeMap = buildItemTypeMap(pkg); - // if (pkg.id == 'd:test-invalid-prop') - // logger.debug(`checkConstraintsForPackage (1): `, pkg, itemTypeMap); - - // 3. Check aProperty.hasClass references - const propertyCheck = checkPropertyReferences(pkg, itemTypeMap); - if (!propertyCheck.ok) { - return propertyCheck; - } - - // 4. Check aLink.hasClass references (aSourceLink and aTargetLink) - const linkCheck = checkLinkReferences(pkg, itemTypeMap); - if (!linkCheck.ok) { - return linkCheck; - } - - // 5. Check anEntity.hasClass and aRelationship.hasClass references - const classCheck = checkEntityAndRelationshipReferences(pkg, itemTypeMap, 'hasClass'); - if (!classCheck.ok) { - return classCheck; - } - - // 6. Check Entity.specializes and Relationship.specializes references - const specializesCheck = checkEntityAndRelationshipReferences(pkg, itemTypeMap, 'specializes'); - if (!specializesCheck.ok) { - return specializesCheck; - } - - // 7. Check Property.specializes and Link.specializes references - const propertyLinkSpecializesCheck = checkPropertyAndLinkReferences(pkg, itemTypeMap, 'specializes'); - if (!propertyLinkSpecializesCheck.ok) { - return propertyLinkSpecializesCheck; - } - - // logger.debug(`Package ${pkg.id || 'unnamed'}: all constraints validated successfully`); - return rspOK; -}*/ - /** * Check that all primary IDs in the package are unique; * validates both '@id' and 'id' fields. @@ -489,57 +438,6 @@ function checkEntityOrRelationshipReferences( } } - /* - const contextName = isHasClass ? 'hasClass' : 'specializes'; - // Check Entity items (both anEntity for hasClass, and Entity for specializes) - const isEntityInstance = iType === PigItemType.anEntity; - const isEntityClass = iType === PigItemType.Entity; - - if ((isHasClass && isEntityInstance) || (!isHasClass && isEntityClass)) { - const entity = item as any; - const referenceValue = entity[referenceType]; - - if (!referenceValue) { - // specializes is optional (can inherit from pig:Entity directly) - if (!isHasClass) { - continue; - } - return Msg.create(674, iId, i, contextName, `missing ${contextName}`); - } - - const targetType = itemTypeMap.get(referenceValue); - if (!targetType) { - return Msg.create(675, iId, i, contextName, referenceValue, 'not found in package'); - } - if (targetType !== PigItemType.Entity) { - return Msg.create(675, iId, i, contextName, referenceValue, `expected pig:Entity, found ${targetType}`); - } - } - - // Check Relationship items (both aRelationship for hasClass, and Relationship for specializes) - const isRelationshipInstance = iType === PigItemType.aRelationship; - const isRelationshipClass = iType === PigItemType.Relationship; - - if ((isHasClass && isRelationshipInstance) || (!isHasClass && isRelationshipClass)) { - const rel = item as any; - const referenceValue = rel[referenceType]; - - if (!referenceValue) { - // specializes is optional (can inherit from pig:Relationship directly) - if (!isHasClass) { - continue; - } - return Msg.create(674, iId, i, contextName, `missing ${contextName}`); - } - - const targetType = itemTypeMap.get(referenceValue); - if (!targetType) { - return Msg.create(675, iId, i, contextName, referenceValue, 'not found in package'); - } - if (targetType !== PigItemType.Relationship) { - return Msg.create(675, iId, i, contextName, referenceValue, `expected pig:Relationship, found ${targetType}`); - } - } */ } return rspOK; From 99f1380460f383bb450f941fe54fa505b2130940 Mon Sep 17 00:00:00 2001 From: "OD-T14S-25\\PCUser" Date: Tue, 3 Feb 2026 09:50:44 +0100 Subject: [PATCH 26/26] another change as suggested by Copilot. --- src/utils/import/jsonld/import-package-jsonld.ts | 5 +++-- src/utils/import/xml/import-package-xml.ts | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/utils/import/jsonld/import-package-jsonld.ts b/src/utils/import/jsonld/import-package-jsonld.ts index 92eabb3..d795346 100644 --- a/src/utils/import/jsonld/import-package-jsonld.ts +++ b/src/utils/import/jsonld/import-package-jsonld.ts @@ -23,7 +23,7 @@ import { IRsp, rspOK, Msg } from "../../lib/messages"; import { LIB, logger } from "../../lib/helpers"; import { APackage, TPigItem } from '../../schemas/pig/ts/pig-metaclasses'; import { SCH_LD } from '../../schemas/pig/jsonld/pig-schemata-jsonld'; -import { ConstraintCheckType } from '../../schemas/pig/ts/pig-package-constraints'; +// import { ConstraintCheckType } from '../../schemas/pig/ts/pig-package-constraints'; /** * Import JSON-LD document and instantiate PIG items @@ -55,7 +55,8 @@ export async function importJSONLD(source: string | File | Blob): Promise // Instantiate APackage and load the document const aPackage = new APackage().setJSONLD(doc); // apply all constraint checks by default -/* const aPackage = new APackage().setJSONLD( +/* keeping it because it will be needed when implementing further consistency checks: + const aPackage = new APackage().setJSONLD( doc, // some examples are incomplete, so we skip the tests for specializes: [ diff --git a/src/utils/import/xml/import-package-xml.ts b/src/utils/import/xml/import-package-xml.ts index cd8cbaf..9cff022 100644 --- a/src/utils/import/xml/import-package-xml.ts +++ b/src/utils/import/xml/import-package-xml.ts @@ -22,7 +22,7 @@ import { IRsp, rspOK, Msg } from '../../lib/messages'; import { LIB, logger } from '../../lib/helpers'; import { APackage, TPigItem } from '../../schemas/pig/ts/pig-metaclasses'; -import { ConstraintCheckType } from '../../schemas/pig/ts/pig-package-constraints'; +//import { ConstraintCheckType } from '../../schemas/pig/ts/pig-package-constraints'; /** * Import XML document and instantiate PIG items @@ -64,7 +64,8 @@ export async function importXML(source: string | File | Blob): Promise { // Instantiate APackage directly from XML string const aPackage = new APackage().setXML(xmlString); // apply all constraint checks by default -/* const aPackage = new APackage().setXML( +/* keeping it because it will be needed when implementing further consistency checks: + const aPackage = new APackage().setXML( xmlString, // some examples are incomplete, so we skip the tests for specializes: [