diff --git a/src/utils/import/ReqIF/reqif2pig.ts b/src/utils/import/ReqIF/reqif2pig.ts
index e5d6ed5..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/pig-metaclasses';
export class reqif2pig {
private validate(xml: Document): boolean {
diff --git a/src/utils/import/jsonld/import-jsonld.ts.goodButReplaced b/src/utils/import/jsonld/import-jsonld.ts.goodButReplaced
deleted file mode 100644
index 3a9b2ce..0000000
--- a/src/utils/import/jsonld/import-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/jsonld/import-jsonld.ts b/src/utils/import/jsonld/import-package-jsonld.ts
similarity index 61%
rename from src/utils/import/jsonld/import-jsonld.ts
rename to src/utils/import/jsonld/import-package-jsonld.ts
index 19fee0e..c1176d2 100644
--- a/src/utils/import/jsonld/import-jsonld.ts
+++ b/src/utils/import/jsonld/import-package-jsonld.ts
@@ -21,8 +21,9 @@
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 { ConstraintCheckType } from '../../schemas/pig/ts/pig-package-constraints';
/**
* Import JSON-LD document and instantiate PIG items
@@ -35,28 +36,47 @@ 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 {
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
- 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);
+ 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); // apply all constraint checks by default
+/* 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:
+ [
+ ConstraintCheckType.UniqueIds,
+ ConstraintCheckType.aPropertyHasClass,
+ ConstraintCheckType.aLinkHasClass,
+ ConstraintCheckType.anEntityHasClass,
+ ConstraintCheckType.aRelationshipHasClass,
+ ]
+ );
+*/
+ // 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);
const expectedCount = doc['@graph']?.length || 0;
const actualCount = allItems.length -1;
@@ -65,7 +85,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`);
}
@@ -73,8 +93,6 @@ export async function importJSONLD(source: string | File | Blob): Promise
result.response = allItems;
result.responseType = 'json';
- result = result as IRsp;
-
- return result
+ return result as IRsp;
}
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..9cff022
--- /dev/null
+++ b/src/utils/import/xml/import-package-xml.ts
@@ -0,0 +1,106 @@
+/*! 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 { ConstraintCheckType } from '../../schemas/pig/ts/pig-package-constraints';
+
+/**
+ * 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); // apply all constraint checks by default
+/* 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:
+ [
+ ConstraintCheckType.UniqueIds,
+ ConstraintCheckType.aPropertyHasClass,
+ ConstraintCheckType.aLinkHasClass,
+ ConstraintCheckType.anEntityHasClass,
+ ConstraintCheckType.aRelationshipHasClass,
+ ]
+ );
+*/
+ // 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;
+}
diff --git a/src/utils/lib/helpers.ts b/src/utils/lib/helpers.ts
index baa2ca2..80d7734 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,50 +23,37 @@ 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 = {
-/* 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');
@@ -326,6 +313,88 @@ 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}${rootTag}>`;
+
+ 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 +442,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..4598454 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
@@ -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) =>
@@ -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) =>
@@ -329,24 +365,34 @@ 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) =>
+ `${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)
@@ -383,20 +429,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 +495,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..3f23411
--- /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, 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/index.html b/src/utils/schemas/pig/index.html
new file mode 100644
index 0000000..dd6dff9
--- /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:
Product Information Graph - JSON Schema Validation (Draft-07)
+
+
+
+
+
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.
+ 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.
+
+ 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").
+
+ 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.
+
+ 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.
+ 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.
+
+ 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.
+
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.
+ 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
+
+
+
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.
+
+
+
+
+
+
+
+
+
\ 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
new file mode 100644
index 0000000..b04d805
--- /dev/null
+++ b/src/utils/schemas/pig/jsonld/pig-schemata-jsonld.ts
@@ -0,0 +1,299 @@
+/*! 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:
+ * - 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)
+ * - 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
+ *
+ * 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';
+
+export const SCHEMA_PATH = 'http://product-information-graph.org/schema/2026-01-12/jsonld/';
+
+// 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];
+ }
+
+ 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');
+ },
+ async getLinkValidator() {
+ return await getValidator('Link');
+ },
+ async getEntityValidator() {
+ return await getValidator('Entity');
+ },
+ async getRelationshipValidator() {
+ return await getValidator('Relationship');
+ },
+ async getAnEntityValidator() {
+ return await getValidator('AnEntity');
+ },
+ async getARelationshipValidator() {
+ return await getValidator('ARelationship');
+ },
+ async getPackageValidator() {
+ return await getValidator('APackage');
+ },
+
+ // Schema getter methods (return promises)
+ async getPropertySchema() {
+ return await loadSchema('Property');
+ },
+ async getLinkSchema() {
+ return await loadSchema('Link');
+ },
+ 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');
+ },
+
+ // 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);
+ },
+
+ // Error getter methods
+ async getValidatePropertyLDErrors(): Promise {
+ const validator = await getValidator('Property');
+ return ajv.errorsText(validator.errors, { separator: '; ' });
+ },
+ async getValidateLinkLDErrors(): Promise {
+ const validator = await getValidator('Link');
+ return ajv.errorsText(validator.errors, { separator: '; ' });
+ },
+ async getValidateEntityLDErrors(): Promise {
+ const validator = await getValidator('Entity');
+ return ajv.errorsText(validator.errors, { separator: '; ' });
+ },
+ async getValidateRelationshipLDErrors(): Promise {
+ const validator = await getValidator('Relationship');
+ return ajv.errorsText(validator.errors, { separator: '; ' });
+ },
+ async getValidateAnEntityLDErrors(): Promise {
+ const validator = await getValidator('AnEntity');
+ return ajv.errorsText(validator.errors, { separator: '; ' });
+ },
+ async getValidateARelationshipLDErrors(): Promise {
+ const validator = await getValidator('ARelationship');
+ return ajv.errorsText(validator.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/pig-schemata-jsonld.ts b/src/utils/schemas/pig/jsonld/pig-schemata-jsonld.ts.goodButReplaced
similarity index 98%
rename from src/utils/schemas/pig/pig-schemata-jsonld.ts
rename to src/utils/schemas/pig/jsonld/pig-schemata-jsonld.ts.goodButReplaced
index 7515730..7f64c56 100644
--- a/src/utils/schemas/pig/pig-schemata-jsonld.ts
+++ 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)
@@ -24,9 +26,9 @@
* - load schemata from external files, as soon as a server with CORS enabled is available
*/
-import { ajv } from '../../../plugins/ajv';
+import { ajv } from '../../../../plugins/ajv';
-const SCHEMA_PATH = 'https://cascade.gfse.org/pig/2026-01-12/schema/jsonld/';
+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 */
diff --git a/src/utils/schemas/pig/pig-infrastructure.ts.work-in-progress b/src/utils/schemas/pig/pig-infrastructure.ts.work-in-progress
deleted file mode 100644
index 0e85ed9..0000000
--- a/src/utils/schemas/pig/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/pig-metaclasses.ts b/src/utils/schemas/pig/ts/pig-metaclasses.ts
similarity index 56%
rename from src/utils/schemas/pig/pig-metaclasses.ts
rename to src/utils/schemas/pig/ts/pig-metaclasses.ts
index 4f5a68c..62769c5 100644
--- a/src/utils/schemas/pig/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.
@@ -29,13 +29,14 @@
* - Programming errors result in exceptions, data errors in IRsp return values.
*/
-import { IRsp, rspOK, Msg, Rsp } from "../../lib/messages";
-import { RE } from "../../lib/definitions";
-import { LIB, logger } from "../../lib/helpers";
-import { JsonPrimitive, JsonValue, JsonArray, JsonObject } from "../../lib/helpers";
+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 './pig-schemata';
-import { checkConstraintsForPackage } from './pig-package-constraints';
+import { SCH } from '../json/pig-schemata';
+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
@@ -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',
@@ -79,11 +82,13 @@ 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',
String = 'xs:string',
AnyURI = 'xs:anyURI',
+ Date = 'xs:date',
DateTime = 'xs:dateTime',
Duration = 'xs:duration',
ComplexType = 'xs:complexType'
@@ -105,6 +110,11 @@ export interface ILanguageText {
export interface IText {
value: string;
}
+export interface IOptionsHTML {
+ widthMain?: string; // width of the main column, e.g. '150px' or '67%'
+ itemType?: PigItemTypeValue[]; // itemTypes to include
+ lang?: tagIETF;
+}
//////////////////////////////////////
// The abstract classes:
@@ -136,6 +146,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;
}
@@ -145,11 +160,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
@@ -166,6 +176,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(602, this.id, itm.id);
+ if (this.specializes && this.specializes !== itm.specializes)
+ return Msg.create(603, 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.
@@ -188,48 +220,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
}
}
@@ -241,6 +256,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;
@@ -253,13 +276,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 {
@@ -272,6 +302,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.
@@ -287,15 +326,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 {
@@ -357,10 +387,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);
- }
+ } */
}
//////////////////////////////////////
@@ -397,6 +430,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));
@@ -434,49 +494,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)
@@ -486,6 +525,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) {
@@ -509,27 +566,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 {
@@ -540,6 +585,31 @@ 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:
+ // logger.debug('Entity.validate: ', itm);
+ 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) {
@@ -563,42 +633,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) {
@@ -624,31 +702,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; */
}
}
@@ -665,6 +725,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) {
@@ -684,40 +752,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) {
@@ -729,29 +795,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) {
@@ -763,31 +831,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 {
@@ -798,6 +853,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);
@@ -834,30 +910,59 @@ export class AnEntity extends AnElement implements IAnEntity {
// logger.debug('AnEntity.getJSONLD: ', out);
return jld;
}
- getHTML(options?: object): stringHTML {
- // ToDo: implement a HTML representation of the entity including its properties
- return '
not implemented yet
';
+ setXML(itm: stringXML) {
+ super.setXML(itm);
+ if (this.lastStatus.ok)
+ return this.set(this.lastStatus.response as IAnEntity);
+ return this;
}
- 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);
+ getHTML(options?: IOptionsHTML): stringHTML {
+ if (!this.lastStatus.ok) return '
Invalid entity
';
+
+ // Extract language preference from options, default to 'en-US'
+ const lang = options?.lang || 'en-US';
+ const widthMain = options?.widthMain || '67%';
+
+ const titleText = getLocalText(this.title, lang);
+ const descText = getLocalText(this.description, lang);
+
+ // Build properties HTML
+ let propertiesHTML = '';
+ if (this.hasProperty && this.hasProperty.length > 0) {
+ propertiesHTML = '
';
}
- // 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);
+ // Build metadata HTML with localized date
+ const metadataHTML = `
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)
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:
A condition or capability needed by a user to solve a problem or achieve an objective.
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.
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:
A need perceived by a stakeholder.
A capability or property that a system shall have.
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:
Eine Bedingung oder Fähigkeit, die ein Benutzer benötigt, um ein Problem zu lösen oder ein Ziel zu erreichen.
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.
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:
Ein von einem Stakeholder wahrgenommener Bedarf.
Eine Fähigkeit oder Eigenschaft, die ein System haben soll.
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:
Condition ou capacité dont un utilisateur a besoin pour résoudre un problème ou atteindre un objectif.
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.
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:
Un besoin perçu par une partie prenante;
Une capacité ou une propriété qu'un système doit avoir.
Une représentation documentée d'un besoin, d'une capacité ou d'une propriété.
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":"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":"
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)
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:
A condition or capability needed by a user to solve a problem or achieve an objective.
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.
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:
A need perceived by a stakeholder.
A capability or property that a system shall have.
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:
Eine Bedingung oder Fähigkeit, die ein Benutzer benötigt, um ein Problem zu lösen oder ein Ziel zu erreichen.
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.
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:
Ein von einem Stakeholder wahrgenommener Bedarf.
Eine Fähigkeit oder Eigenschaft, die ein System haben soll.
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:
Condition ou capacité dont un utilisateur a besoin pour résoudre un problème ou atteindre un objectif.
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.
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:
Un besoin perçu par une partie prenante;
Une capacité ou une propriété qu'un système doit avoir.
Une représentation documentée d'un besoin, d'une capacité ou d'une propriété.
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)
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.
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]].
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]].
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]].
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:
A condition or capability needed by a user to solve a problem or achieve an objective.
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.
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:
A need perceived by a stakeholder.
A capability or property that a system shall have.
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:
Eine Bedingung oder Fähigkeit, die ein Benutzer benötigt, um ein Problem zu lösen oder ein Ziel zu erreichen.
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.
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:
Ein von einem Stakeholder wahrgenommener Bedarf.
Eine Fähigkeit oder Eigenschaft, die ein System haben soll.
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:
Condition ou capacité dont un utilisateur a besoin pour résoudre un problème ou atteindre un objectif.
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.
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:
Un besoin perçu par une partie prenante;
Une capacité ou une propriété qu'un système doit avoir.
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.
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":"
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.
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)
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)
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]].
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]].
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]].
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:
A condition or capability needed by a user to solve a problem or achieve an objective.
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.
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:
A need perceived by a stakeholder.
A capability or property that a system shall have.
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:
Eine Bedingung oder Fähigkeit, die ein Benutzer benötigt, um ein Problem zu lösen oder ein Ziel zu erreichen.
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.
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:
Ein von einem Stakeholder wahrgenommener Bedarf.
Eine Fähigkeit oder Eigenschaft, die ein System haben soll.
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:
Condition ou capacité dont un utilisateur a besoin pour résoudre un problème ou atteindre un objectif.
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.
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:
Un besoin perçu par une partie prenante;
Une capacité ou une propriété qu'un système doit avoir.
Une représentation documentée d'un besoin, d'une capacité ou d'une propriété.
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'.
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..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-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":"
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)
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)
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]].
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]].
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:
A condition or capability needed by a user to solve a problem or achieve an objective.
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.
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:
A need perceived by a stakeholder.
A capability or property that a system shall have.
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:
Eine Bedingung oder Fähigkeit, die ein Benutzer benötigt, um ein Problem zu lösen oder ein Ziel zu erreichen.
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.
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:
Ein von einem Stakeholder wahrgenommener Bedarf.
Eine Fähigkeit oder Eigenschaft, die ein System haben soll.
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:
Condition ou capacité dont un utilisateur a besoin pour résoudre un problème ou atteindre un objectif.
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.
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:
Un besoin perçu par une partie prenante;
Une capacité ou une propriété qu'un système doit avoir.
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":"","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":"","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":"","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":"","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": "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": "
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)
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)
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]].
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)
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]].
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]].
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:
A condition or capability needed by a user to solve a problem or achieve an objective.
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.
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:
A need perceived by a stakeholder.
A capability or property that a system shall have.
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:
Eine Bedingung oder Fähigkeit, die ein Benutzer benötigt, um ein Problem zu lösen oder ein Ziel zu erreichen.
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.
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:
Ein von einem Stakeholder wahrgenommener Bedarf.
Eine Fähigkeit oder Eigenschaft, die ein System haben soll.
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:
Condition ou capacité dont un utilisateur a besoin pour résoudre un problème ou atteindre un objectif.
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.
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:
Un besoin perçu par une partie prenante;
Une capacité ou une propriété qu'un système doit avoir.
Une représentation documentée d'un besoin, d'une capacité ou d'une propriété.
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'.
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]].
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]].
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]].
Une représentation documentée d'un besoin, d'une capacité ou d'une propriété.
- pig:Entity
+ pig:Entity↯SpecIF:Priority
@@ -390,20 +399,20 @@
schreibtécritA [[FMC:Actor]] 'writes' (changes) a [[FMC:State]].
- pig:Relationship
+ pig:RelationshipSpecIF:writes-toSourceSpecIF:writes-toTarget
- pig:SourceLink
+ pig:SourceLinkSpecIF:writes to sourceConnects the source of SpecIF:writesFMC:Actor
- pig:TargetLink
+ pig:TargetLinkSpecIF:writes to targetConnects the target of SpecIF:writesFMC:State
@@ -414,20 +423,20 @@
liestlitA [[FMC:Actor]] 'reads' a [[FMC:State]].
- pig:Relationship
+ pig:RelationshipSpecIF:reads-toSourceSpecIF:reads-toTarget
- pig:SourceLink
+ pig:SourceLinkSpecIF:reads to sourceConnects the source of SpecIF:readsFMC:Actor
- pig:TargetLink
+ pig:TargetLinkSpecIF:reads to targetConnects the target of SpecIF:readsFMC:State
@@ -449,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:Relationshiposlc_rm:satisfies-toSourceoslc_rm:satisfies-toTarget
- pig:SourceLink
+ pig:SourceLinkoslc_rm:satisfies to sourceConnects the source of oslc_rm:satisfiesFMC:Actor
@@ -463,7 +472,7 @@
- pig:TargetLink
+ pig:TargetLinkoslc_rm:satisfies to targetConnects the target of oslc_rm:satisfiesIREB:Requirement
@@ -608,7 +617,7 @@
- 2026-01-12T12:38:50.710Z
+ 2026-01-17T22:38:20.041ZHierarchy Root... anchoring all hierarchies of this graph (package)
@@ -636,7 +645,7 @@
- 2026-01-12T12:38:50.579Z
+ 2026-01-17T22:38:19.821ZProject 'Very Simple Model (FMC) with Requirements'ReqIF:HierarchyRoot
@@ -661,7 +670,7 @@
- 2026-01-12T12:38:50.579Z
+ 2026-01-17T22:38:19.821ZProject 'Very Simple Model (FMC) with Requirements'ReqIF:HierarchyRoot
@@ -680,7 +689,7 @@
- 2026-01-12T12:38:50.579Z
+ 2026-01-17T22:38:19.821ZProject 'Very Simple Model (FMC) with Requirements'ReqIF:HierarchyRoot
@@ -691,7 +700,7 @@
- 2026-01-12T12:38:44.062Z
+ 2026-01-17T22:38:13.953ZModel Elements (Glossary)SpecIF:Glossary
@@ -705,7 +714,7 @@
- 2026-01-12T12:38:50.579Z
+ 2026-01-17T22:38:19.821ZProject 'Very Simple Model (FMC) with Requirements'ReqIF:HierarchyRoot
@@ -715,4 +724,4 @@
-
+
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 @@
+
+
diff --git a/tests/unit/import-jsonld.spec.ts b/tests/unit/import-package-jsonld.spec.ts
similarity index 90%
rename from tests/unit/import-jsonld.spec.ts
rename to tests/unit/import-package-jsonld.spec.ts
index a499b38..d67eceb 100644
--- a/tests/unit/import-jsonld.spec.ts
+++ b/tests/unit/import-package-jsonld.spec.ts
@@ -1,14 +1,15 @@
import * as fs from 'fs';
import * as path from 'path';
-import { importJSONLD } from '../../src/utils/import/jsonld/import-jsonld';
-import { TPigItem } from '../../src/utils/schemas/pig/pig-metaclasses';
+import { importJSONLD } from '../../src/utils/import/jsonld/import-package-jsonld';
+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/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"
];
@@ -31,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[];
@@ -43,7 +44,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
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': '
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)
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)
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]].
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:
A condition or capability needed by a user to solve a problem or achieve an objective.
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.
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:
A need perceived by a stakeholder.
A capability or property that a system shall have.
A documented representation of a need, capability or property.
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'.
+
+
+
+
+ 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.