From 702bfdbbc9ca0990703873912978d73f68866766 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Sat, 3 Oct 2026 20:04:33 +0000 Subject: [PATCH 1/4] feat(ontology): generate the metamodel table from the pilot's SysML.ecore (20250201) Read the pinned pilot implementation's SysML.ecore instead of the 202407 OWL rendering, record each property's ordering, derivation, redefinitions, subsettings and opposite and each class's abstractness, and fail CI when the table drifts from the pin. Write nonunique as isUnique false and own the flow, payload, end, terminate and instantiation metaclasses through a FeatureMembership, still reading graphs earlier releases wrote. Co-Authored-By: jason.han --- .circleci/config.yml | 19 + Makefile | 12 +- .../ontology-pilot-metamodel.changed.md | 1 + docs/project/roadmap.md | 29 +- docs/project/spec-compliance.md | 2 +- docs/reference/rdf-mapping.md | 19 +- internal/translate/export/end_forms.go | 2 +- internal/translate/export/rdf_expr.go | 2 +- internal/translate/export/rdf_in.go | 36 +- internal/translate/export/rdf_out.go | 13 +- internal/translate/rdf/ontology/README.md | 112 +-- internal/translate/rdf/ontology/ontology.go | 39 +- internal/translate/rdf/ontology/table.go | 807 +++++++++--------- internal/translate/rdf/ontology/validate.go | 14 +- scripts/download-pilot-metamodel.sh | 25 + tests/export/cross_feature_test.go | 16 +- .../testdata/convert/action_nodes.golden.ttl | 20 +- .../export/testdata/convert/bounds.golden.ttl | 2 +- .../convert/end_binding_bodies.golden.ttl | 28 +- .../payload_declaration_bodies.golden.ttl | 54 +- .../convert/then_after_members.golden.ttl | 42 +- .../convert/views_flows_parameters.golden.ttl | 18 +- .../testdata/ontology-known-violations.txt | 26 +- tests/migrate/relations_test.go | 2 +- tests/ontology/ontology_test.go | 85 +- tools/gen/ontology/main.go | 697 ++++++--------- tools/gen/ontology/main_test.go | 117 --- tools/gen/ontology/run_test.go | 259 +++--- 28 files changed, 1245 insertions(+), 1253 deletions(-) create mode 100644 changes/unreleased/ontology-pilot-metamodel.changed.md create mode 100755 scripts/download-pilot-metamodel.sh delete mode 100644 tools/gen/ontology/main_test.go diff --git a/.circleci/config.yml b/.circleci/config.yml index 4f2a67d0ab..105fa50150 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -506,6 +506,25 @@ jobs: - install-solvers - download-corpora + # The metamodel table is generated from the pilot's SysML.ecore at the pin; + # a pin bump without regenerating it fails here. + - restore_cache: + keys: + - pilot-metamodel-v1-{{ checksum "scripts/download-pilot-metamodel.sh" }}-{{ checksum "scripts/pilot-pin.sh" }} + + - run: + name: Download the pilot metamodel + command: ./scripts/download-pilot-metamodel.sh + + - save_cache: + key: pilot-metamodel-v1-{{ checksum "scripts/download-pilot-metamodel.sh" }}-{{ checksum "scripts/pilot-pin.sh" }} + paths: + - build/pilot-metamodel + + - run: + name: Check the metamodel table matches the pinned SysML.ecore + command: make ontology-table-check + # The corpora gate alone, so its per-root verdict lines are legible in the # log and a skip cannot hide behind a green suite. - run: diff --git a/Makefile b/Makefile index ac1eacc78c..2662f9e2bc 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -.PHONY: all build build-sysml build-prod build-wasm-prod build-lsp build-grpc build-engine build-core build-syntax build-wasm build-wasm-wasip1 build-wasm-js wasm-check static-check windows-versioninfo-check man man-check install-tree pgo-profile conformance conformance-pkg conformance-rust conformance-julia conformance-matlab test test-shard coverage lint clean install help fuml-expected python-test python-coverage scripts-coverage node-coverage python-install proto proto-buf python-proto proto-ts proto-rust proto-lint proto-breaking vscode-grammar vscode-build vscode-package docs docs-install docs-serve docs-engine-assets docs-counts docs-check changelog-check changelog-render self-model +.PHONY: all build build-sysml build-prod build-wasm-prod build-lsp build-grpc build-engine build-core build-syntax build-wasm build-wasm-wasip1 build-wasm-js wasm-check static-check windows-versioninfo-check man man-check install-tree pgo-profile conformance conformance-pkg conformance-rust conformance-julia conformance-matlab test test-shard coverage lint clean install help ontology-table ontology-table-check fuml-expected python-test python-coverage scripts-coverage node-coverage python-install proto proto-buf python-proto proto-ts proto-rust proto-lint proto-breaking vscode-grammar vscode-build vscode-package docs docs-install docs-serve docs-engine-assets docs-counts docs-check changelog-check changelog-render self-model # Version information # Only release tags describe a build; the moving `nightly` tag is not a version. @@ -310,6 +310,16 @@ stdlib-snapshot-check: ## Verify the committed library snapshot matches the bund go run -C $(TOOLS_DIR) ./gen/snapshot -check @echo "✓ stdlib.snapshot is current" +ontology-table: ## Regenerate the metamodel table from the pilot SysML.ecore that scripts/pilot-pin.sh pins + ./scripts/download-pilot-metamodel.sh + go run -C $(TOOLS_DIR) ./gen/ontology + @echo "✓ internal/translate/rdf/ontology/table.go regenerated" + +ontology-table-check: ## Verify the committed metamodel table matches the pinned pilot SysML.ecore, as CI does + ./scripts/download-pilot-metamodel.sh + go run -C $(TOOLS_DIR) ./gen/ontology -check + @echo "✓ internal/translate/rdf/ontology/table.go is current" + fuml-expected: ## Regenerate docs/project/fuml-referee-expected.json from the pinned fUML reference implementation (needs a JDK) ./scripts/fuml-expected.sh @echo "✓ fuml-referee-expected.json regenerated" diff --git a/changes/unreleased/ontology-pilot-metamodel.changed.md b/changes/unreleased/ontology-pilot-metamodel.changed.md new file mode 100644 index 0000000000..558c97cb27 --- /dev/null +++ b/changes/unreleased/ontology-pilot-metamodel.changed.md @@ -0,0 +1 @@ +- **The metamodel table is generated from the OMG SysML v2 metamodel version 20250201, read from the pinned pilot implementation's `SysML.ecore`, and records each property's ordering, derivation, redefinitions, subsettings and opposite.** It was pinned to the 202407 rendering of `Open-MBEE/sysmlv2-rdf-ontology`, which has not moved since. The table now declares `FlowUsage`, `PayloadFeature`, `FlowEnd`, `TerminateActionUsage` and the other metaclasses added since, so a type owns them through a `sysml:FeatureMembership` and lists them in `sysml:ownedFeature`, as it owns any feature; `nonunique` is written `sysml:isUnique false`, since the metamodel no longer declares `isNonunique`. Graphs written by earlier releases still read. `ontology.Property` gains `Ordered`, `Derived`, `Redefines`, `Subsets` and `Opposite`, `ontology.Class` gains `Abstract`, and the ontology gate reports a subject typed by an abstract metaclass. CI fails when the table drifts from the pinned metamodel (`make ontology-table-check`). diff --git a/docs/project/roadmap.md b/docs/project/roadmap.md index 647ba0fa68..7081dca6f8 100644 --- a/docs/project/roadmap.md +++ b/docs/project/roadmap.md @@ -718,11 +718,13 @@ the inventory in `tests/export/testdata/ontology-known-violations.txt`. The `typ `function` and `targetFeature` keys stay listed for the fixtures' unresolvable names and body parameters above; the parameters go when D1/D2 make expression bodies elements of the graph. -The abstract-metaclass half is not mechanizable from the ontology: `SysML.owl` records no ecore -abstractness (see D8), so every metaclass the encoder writes (`kinds.go` and the constants in -`rdf_out.go`/`rdf_expr.go`) was checked by hand against the abstract classes of the pilot's -`SysML.ecore` and `kerml.ecore` — `ConnectorAsUsage`, `ControlNode`, `Element`, `Expose`, -`Import`, `InstantiationExpression`, `LoopActionUsage`, `Relationship`. Two were written: +The abstract-metaclass half was checked by hand while the table came from `SysML.owl`, which +records no ecore abstractness: every metaclass the encoder writes (`kinds.go` and the constants in +`rdf_out.go`/`rdf_expr.go`) against the abstract classes of the pilot's `SysML.ecore` and +`kerml.ecore` — `ConnectorAsUsage`, `ControlNode`, `Element`, `Expose`, `Import`, +`InstantiationExpression`, `LoopActionUsage`, `Relationship`. Generated from the ecore (D8), the +table now records them, and the same gate reports a subject typed by one as `abstract-class`; no +golden graph has one. Two were written: `Import`, now `NamespaceImport` / `MembershipImport` and, for an `expose`, `NamespaceExpose` / `MembershipExpose` in place of an `sysx:isExpose` flag, and `ConnectorAsUsage` for a KerML `connector`, now `Connector`. The decoder still accepts both abstract classes from older graphs. @@ -733,7 +735,9 @@ still delivers every `type`, `referent` and `targetFeature` of its fixture. [`Open-MBEE/sysmlv2-rdf-ontology`](https://github.com/Open-MBEE/sysmlv2-rdf-ontology) renders the OMG metamodel (version 202407, from `SysML.ecore`) as OML and OWL: `SysML.owl`, 172 classes, 348 -object properties, 63 datatype properties, with `rdfs:domain`/`rdfs:range` on each. It uses the +object properties, 63 datatype properties, with `rdfs:domain`/`rdfs:range` on each, and has not +been regenerated since. The current metamodel, version 20250201 as the pinned pilot's `SysML.ecore` +declares it, has 175 classes, 351 object properties and 64 datatype properties. It uses the *same* namespace we do and its class IRIs are the plain metaclass names we already emit; the difference is the properties, each qualified by the metaclass that defines it (`sysml:Element_declaredName`, `sysml:Element_owner` with range `OwningMembership`), and a @@ -747,9 +751,12 @@ structural decisions (`internal/translate/export/rdf_out.go`), so the profile is layer: property name → defining metaclass. **Done:** the table and the gate. `internal/translate/rdf/ontology` holds the term table generated -from `SysML.owl` by `tools/gen/ontology` from a local checkout (version `202407`, -upstream commit in the generated header): 411 properties spanning only **336 distinct unqualified -names — 59 names are declared by more than one metaclass** (`type`, `value`, `source`, `target`, +by `tools/gen/ontology` from the pilot's `SysML.ecore` at the release `scripts/pilot-pin.sh` pins +(version `20250201`, pilot tag and commit in the generated header), naming each property by the +OWL rendering's `_` IRI and recording its multiplicity, ordering, derivation, +redefinitions, subsettings and opposite; `make ontology-table-check` keeps it equal to the pin in +CI. It holds 415 properties spanning only **342 distinct unqualified +names — 58 names are declared by more than one metaclass** (`type`, `value`, `source`, `target`, …), so the unqualified convention is genuinely lossy in the other direction and a profile encoder has to pick by the subject's metaclass (`LookupProperty` returns every declaration; `AmbiguousNames` reports the set). The gate is `TestGoldenGraphsMatchOntology`, whose inventory is @@ -757,8 +764,8 @@ also the profile's work list, sorted into five causes: properties the metamodel relationship or membership element that we collapse into the element (`value` → `FeatureValue`, the multiplicity bounds → `MultiplicityRange`, `isNegated` → `Invariant`, a transition's ends → `Connector`) — the same collapse D3.3 undid for ownership and D1/D2 will undo for expressions and -ends; names as literals (D7); metaclass names the 202407 rendering does not have (`FlowUsage`, -which it calls `FlowConnectionUsage`, and `TerminateActionUsage`); the metaclasses of our own +ends; names as literals (D7); metaclass names the metamodel does not have (`ClassUsage`, +`IndividualDefinition`, `IndividualUsage`); the metaclasses of our own `sysx:` namespace; and the properties we write into the SysML namespace that no metaclass declares, each either a relationship the metamodel reifies as an element (`specializes`, `subsets`, `redefines`, `references`, `aliasedElement`, `via`) or a notation flag with no diff --git a/docs/project/spec-compliance.md b/docs/project/spec-compliance.md index 570a543220..5d7bda4055 100644 --- a/docs/project/spec-compliance.md +++ b/docs/project/spec-compliance.md @@ -2735,7 +2735,7 @@ a whole model or that its vocabulary is settled — see | Ownership as the abstract syntax states it: `sysml:owner` and `sysml:owningRelatedElement` as element references, and a materialized `OwningMembership` — or `FeatureMembership` where a type owns a feature — between owner and member, each with its own IRI, `sysml:elementId` and member/owner wiring | `export/rdf_out.go` `owningMembership`/`relationshipOwnership`, `rdf/ids.go` `OwningMembershipID` (the member's id plus `_om`, which no element id can be) | `export/ownership_graph_test.go:TestEveryElementCarriesItsElementID`, `:TestOnlyTheOutermostElementIsARoot`, `:TestMembersAreReachedThroughTheirMembership`, `:TestAFeatureIsOwnedThroughAFeatureMembership`, `:TestARelationshipOwnsItsMemberDirectly`, `:TestVisibilityIsStatedByTheMembership`, `:TestOwnershipComesBackFromTheMembershipsAlone`, `:TestWithoutAnyOwnershipPropertyTheTreeFlattens`, `:TestCompactOwnershipGraphStillConverts`, `:TestMembershipWithoutItsEndsIsReported` | ✅ Faithful for containment — one root per document, and the tree comes back from the memberships alone with `sysx:sourceText` and `sysml:owningNamespace` stripped. The compact `sysml:owningNamespace` shape earlier releases wrote is still written and still read; a membership missing an end is a typed error naming `sysml:memberElement`. Not claimed: a graph read back through a live Flexo API | | Expression node identity: an id in `[a-zA-Z0-9_-]+` and `sysml:elementId`, so a node is addressable by id like an element | `rdf/ids.go` `ExpressionNodeID` (the owner's id, `_p`, and the encoded position, which no element or membership id can be), `rdf/vocab.go` `ExpressionIRI`, `export/rdf_expr.go` `expressionNode` | `rdf/ids_test.go:TestExpressionNodeIDRoundTripsAndCannotCollide`, `export/export_test.go:TestFixtureElementIDsRoundTrip`, `export/w6g4_rdf_expr_test.go:TestExpressionIdentityIsPerPosition`, `:TestExpressionTreesKeepTheRoundTripExact` | ✅ Faithful for addressing — the id is deterministic, reversible and accepted where an element id is; the `.` an earlier id held was refused by `requireValidId` before the store was read. A node is still not a model element: no `sysml:qualifiedName`, no ownership, and it is reached only from the position holding it | | Reference-valued properties as element references, as the API defines them: `sysml:type`, `importedNamespace`, `importedMembership` (the imported element's owning membership, KerML §8.3.2.5 `MembershipImport::importedMembership`), `sourceFeature`/`targetFeature`, `referent`, `function`, and every declaration-head relationship link the element the name resolves to — an element of the graph by its id, a standard library element by its normative id whether or not the library is in the graph — and stay a literal only for a name that resolves to nothing the model declares or a body parameter, which is no element | `export/rdf_out.go` `reference`, `importedMembership`; `export/rdf_identity.go` `subjectForNode` (normative ids through `identity.LibraryCatalog`); `export/names.go` resolver-checked shortest spelling; `export/rdf_in.go` `referenceName`, `libraryElement` (reads an IRI or a legacy literal) | `tests/export/reference_iris_test.go` `TestReferencePropertiesLinkElements` (a library type, a current-document type, an inherited `start`, a feature chain, a membership import's owning membership, a metadata definition by short name, an unresolvable name kept as a literal), `TestLegacyReferenceGraphsStillRead`; `tests/export/ontology_gate_test.go` `TestGoldenGraphsMatchOntology` (the `literal-for-object-property` inventory shrank to the fixtures' unresolvable names) | ✅ Faithful (a graph from a release that wrote the name as a literal reads back and gains the links on its next hop) | -| Every metaclass written is concrete in the metamodel, as every element the SysML v2 API returns is: an import is `sysml:NamespaceImport` or `sysml:MembershipImport`, never abstract `sysml:Import`; a KerML `connector` is `sysml:Connector`, never abstract `sysml:ConnectorAsUsage`; and no other abstract class of the pilot's `SysML.ecore`/`kerml.ecore` (`ControlNode`, `Element`, `Expose`, `InstantiationExpression`, `LoopActionUsage`, `Relationship`) is written | `export/rdf_out.go` `encodeMember` (`mNamespaceImport`/`mMembershipImport`); `export/kinds.go` `usageMetaclass` (`Connector`), `legacyConnectorAsUsage`; `export/rdf_in.go` `declarationHead` (accepts `sysml:Import` and `sysml:ConnectorAsUsage` from older graphs) | `tests/export/reference_iris_test.go` `TestReferencePropertiesLinkElements`, `TestLegacyReferenceGraphsStillRead` (abstract `sysml:Import`), `TestLegacyConnectorAsUsageStillReads`; golden `imports.golden.ttl` | ✅ Faithful (audited by hand against the ecore models' abstract classes, which the pinned `SysML.owl` does not record) | +| Every metaclass written is concrete in the metamodel, as every element the SysML v2 API returns is: an import is `sysml:NamespaceImport` or `sysml:MembershipImport`, never abstract `sysml:Import`; a KerML `connector` is `sysml:Connector`, never abstract `sysml:ConnectorAsUsage`; and no other abstract class of the pilot's `SysML.ecore`/`kerml.ecore` (`ControlNode`, `Element`, `Expose`, `InstantiationExpression`, `LoopActionUsage`, `Relationship`) is written | `export/rdf_out.go` `encodeMember` (`mNamespaceImport`/`mMembershipImport`); `export/kinds.go` `usageMetaclass` (`Connector`), `legacyConnectorAsUsage`; `export/rdf_in.go` `declarationHead` (accepts `sysml:Import` and `sysml:ConnectorAsUsage` from older graphs) | `tests/export/reference_iris_test.go` `TestReferencePropertiesLinkElements`, `TestLegacyReferenceGraphsStillRead` (abstract `sysml:Import`), `TestLegacyConnectorAsUsageStillReads`; golden `imports.golden.ttl` | ✅ Faithful (`TestGoldenGraphsMatchOntology` reports a subject typed by a metaclass the pinned `SysML.ecore` declares abstract) | | Ownership cycle in an input graph | refused: every element's `owningNamespace` chain must reach a root, or no root owns the element and printing would emit an empty document | `export_test.go:TestOwnershipCycleIsUnsupported` | ⛔ Rejected rather than emitting an empty file (deliberate). Ownership in the abstract syntax is a tree — an element has at most one owning relationship, and the graph is what a notation document nests — so a cycle is not an unrepresentable model but an inconsistent graph. The alternative, writing the elements a root does reach, would silently drop the cycle's members; the refusal names the elements in it | | Lexical `//` and `/* */` trivia across the RDF hop | no element owns trivia; `doc`/`comment` are declarations and do convert | `export_test.go:TestCommentsThroughRDF` | ⛔ Not carried through `.ttl` (a direct `.sysml` save keeps it). Trivia belongs to no element in the abstract syntax, so there is no subject to hang it on; carrying it as a per-element `sysx:` blob would make the graph a source archive rather than a model. The surfaces say so: `sysml -convert` and `%save` print the experimental note, and the guide points at the notation save for round trips that must keep comments | | Blank nodes, RDF collections, bare literal shorthands | rejected by `rdf.ParseTurtle` | `rdf_test.go:TestParseTurtleRejects` | ⛔ Not supported (deliberate; see [the mapping](../reference/rdf-mapping.md)). This is a subset of Turtle, not all of it: an element of this graph is addressed by an IRI derived from its qualified name, and a blank node has no such name, so a blank-node subject could not be read back as an element or written twice to the same address. Collections and bare literal shorthands are unused by anything this mapping writes. A parse error names the line rather than dropping the statement, so a foreign graph using them fails loudly | diff --git a/docs/reference/rdf-mapping.md b/docs/reference/rdf-mapping.md index e51300ab29..14b2f6b528 100644 --- a/docs/reference/rdf-mapping.md +++ b/docs/reference/rdf-mapping.md @@ -378,9 +378,12 @@ triples come); a set of classes with no such member is refused, naming the subje an element a relationship owns, whose owner is no namespace), kept alongside `sysml:owner` as the compact spelling earlier releases wrote - `sysml:visibility`, `sysml:direction` +- `sysml:isUnique` `false` for `nonunique` (`Feature::isUnique`, true when + absent), the one flag written false. The `sysml:isNonunique` earlier releases + wrote, which the 20250201 metamodel no longer declares, still reads. - Feature flags, written only when true, so an absent flag reads as false: `isAbstract`, `isVariation`, `isVariant`, `isReference`, `isComposite`, `isDerived`, - `isOrdered`, `isNonunique`, `isEnd`, `isConstant`, `isIndividual`, `isPortion`, + `isOrdered`, `isEnd`, `isConstant`, `isIndividual`, `isPortion`, `isConjugated`, `isAll`, `isAccept`, `isResult`, and `isEvent` for an `event` modifier on a usage whose metaclass is not itself `sysml:EventOccurrenceUsage`. A flag the two grammars spell differently is written back in the grammar of @@ -562,7 +565,7 @@ The `sysx:` properties: | the behavioral properties | `sysx:guard`, `sysx:expression`, `sysx:payload`, … — the parts of a behavioral node the vocabulary has no predicate for, listed under [Behavior](#behavior). | For expressions and end-binding heads, the encoder still emits these `sysx:` -terms. They carry notation or ordering facts for which the 202407 metamodel has +terms. They carry notation or ordering facts for which the metamodel has no property; they are annotations, not replacements for the standard shape: | Terms | Why the annotation remains | @@ -626,6 +629,14 @@ from: - `sysx:ActionExecutionNode` — `action a { x + 1 }`, an action node performing an inline expression, which no SysML v2 production spells. +A type owns a `FlowUsage`, `SuccessionFlowUsage`, `FlowEnd`, `PayloadFeature`, +`TerminateActionUsage` or `ConstructorExpression`, `IndexExpression` or +`InstantiationExpression` through a `sysml:FeatureMembership`, listed in its +`sysml:ownedFeature`, as it owns any feature. Releases whose metamodel table +predated these metaclasses (version 202407) owned them through a plain +`sysml:OwningMembership`; in a SysML graph, which has no `member` keyword, that +shape still reads back as the same feature. + Reading, the metaclasses earlier releases wrote for the standard constructs above — `sysx:Alias`, `sysx:FilterMember`, `sysx:MultiplicityDeclaration`, `sysx:ConstraintMember`, `sysx:AssumeMember`, `sysx:RequireMember`, @@ -1509,8 +1520,8 @@ A flow's `of` clause is a `sysml:PayloadFeature` the flow owns through a is that feature, named `p`, so `m.p` reaches it; `of T` and `of T[1]` state only its `FeatureTyping` and multiplicity, and the feature takes the flow's next position as its name (`…::@0` in a flow with no body members). Read back, the -feature is written after `of`, not in the flow's body. 202407 names the -metaclass `ItemFeature`. A graph written before this states the payload as the +feature is written after `of`, not in the flow's body. The 202407 metamodel +named the metaclass `ItemFeature`. A graph written before this states the payload as the expression `sysx:payload` and still reads back with it; a flow stating both, or a `PayloadFeature` owned by anything but a flow, is refused. diff --git a/internal/translate/export/end_forms.go b/internal/translate/export/end_forms.go index 2de46efb5a..2021744fe6 100644 --- a/internal/translate/export/end_forms.go +++ b/internal/translate/export/end_forms.go @@ -425,7 +425,7 @@ func (d *decoder) payloadText(el *element) (string, error) { if d.boolOf(payload, rdf.SysML+"isOrdered") { flags += " ordered" } - if d.boolOf(payload, rdf.SysML+"isNonunique") { + if d.nonunique(payload) { flags += " nonunique" } words := d.identWords(payload) diff --git a/internal/translate/export/rdf_expr.go b/internal/translate/export/rdf_expr.go index 8e5c86bae3..11d1ac1ef9 100644 --- a/internal/translate/export/rdf_expr.go +++ b/internal/translate/export/rdf_expr.go @@ -55,7 +55,7 @@ const ( ) // Properties this mapping adds: argument order, which RDF does not carry, and -// parts the 202407 metamodel rendering has no property for. +// parts the metamodel has no property for. const ( xArgumentIndex = "argumentIndex" xArgumentName = "argumentName" diff --git a/internal/translate/export/rdf_in.go b/internal/translate/export/rdf_in.go index baaf34ea57..6c907bf038 100644 --- a/internal/translate/export/rdf_in.go +++ b/internal/translate/export/rdf_in.go @@ -1671,6 +1671,14 @@ func (d *decoder) head(el *element) (string, error) { return d.memberPrefixed(el, head) } +// featuresUndeclaredIn202407 are the SysML Feature metaclasses the 202407 metamodel +// table did not declare, so an earlier mapping never owned them as features. +var featuresUndeclaredIn202407 = map[string]bool{ + "ConstructorExpression": true, "FlowEnd": true, "FlowUsage": true, "IndexExpression": true, + "InstantiationExpression": true, "PayloadFeature": true, "SuccessionFlowUsage": true, + "TerminateActionUsage": true, +} + // typeFeatureMember reports whether a type owns el, a feature, through a plain // OwningMembership rather than a FeatureMembership (KerML.xtext TypeFeatureMember). func (d *decoder) typeFeatureMember(el *element) bool { @@ -1683,6 +1691,11 @@ func (d *decoder) typeFeatureMember(el *element) bool { if d.boolOf(el, rdf.SysML+"isVariant") || d.enumeratedValue(el) || d.ownedCrossFeature(el.owner) == el { return false } + // A mapping predating these metaclasses owned them through a plain + // OwningMembership; SysML has no `member`, so that shape is a plain feature. + if !d.kerml(el) && featuresUndeclaredIn202407[el.metaclass] { + return false + } m, owned := d.owningMembership[el.iri] return owned && d.metaclass(rdf.IRI(m.iri)) == mOwningMembership } @@ -2327,7 +2340,7 @@ func (d *decoder) usageHead(el *element, kind ast.UsageKind) (string, error) { if d.boolOf(el, rdf.SysML+"isOrdered") { multPart += " ordered" } - if d.boolOf(el, rdf.SysML+"isNonunique") { + if d.nonunique(el) { multPart += " nonunique" } typed, err := d.referenceList(el, rdf.SysML+relationshipProperty[ast.RelTyping]) @@ -3543,13 +3556,11 @@ func (d *decoder) crossFeatureWords(cross *element) ([]string, error) { case mult != "": words = append(words, mult) } - for _, flag := range []struct { - property string - keyword string - }{{"isOrdered", "ordered"}, {"isNonunique", "nonunique"}} { - if d.boolOf(cross, rdf.SysML+flag.property) { - words = append(words, flag.keyword) - } + if d.boolOf(cross, rdf.SysML+"isOrdered") { + words = append(words, "ordered") + } + if d.nonunique(cross) { + words = append(words, "nonunique") } if len(words) == 0 { return nil, &UnsupportedError{ @@ -4098,6 +4109,15 @@ func (d *decoder) boolOf(el *element, property string) bool { return false } +// nonunique reads `nonunique` from Feature::isUnique false, or from the +// isNonunique an earlier mapping wrote for it. +func (d *decoder) nonunique(el *element) bool { + if unique, stated := d.graph.Lexical(rdf.IRI(el.iri), rdf.SysML+pIsUnique); stated { + return unique == "false" || unique == "0" + } + return d.boolOf(el, rdf.SysML+"isNonunique") +} + // declaresUsage reports whether el is a usage declaration rather than a body // statement of the same metaclass: every declaration states sysx:hasBody. func (d *decoder) declaresUsage(el *element) bool { diff --git a/internal/translate/export/rdf_out.go b/internal/translate/export/rdf_out.go index 341ddbd0c2..e3f21c04a5 100644 --- a/internal/translate/export/rdf_out.go +++ b/internal/translate/export/rdf_out.go @@ -69,6 +69,7 @@ const ( pIsDefault = "isDefault" pIsInitial = "isInitial" pIsEnd = "isEnd" + pIsUnique = "isUnique" pName = "name" pReferences = "references" pConnectorEnd = "connectorEnd" @@ -1446,11 +1447,11 @@ func (e *encoder) encodeMember(h memberHead, owner string) error { {"isPortion", n.IsPortion || n.Portion != ast.PortionNone}, {"isDerived", n.IsDerived}, {"isOrdered", n.IsOrdered}, - {"isNonunique", n.IsNonunique}, {"isAccept", n.IsAccept}, {"isResult", n.IsResult}, {"isParallel", n.IsParallel}, }) + e.nonunique(subject, n.IsNonunique) // `: ~P` types the port by P's conjugate; the usage owns no Conjugation // of its own, so Type::isConjugated stays false on it. if n.HasConjugatedTyping() { @@ -2597,6 +2598,14 @@ func (e *encoder) flags(subject rdf.Term, flags []boolProperty) { } } +// nonunique states `nonunique` as Feature::isUnique false, the metamodel's one +// uniqueness property. +func (e *encoder) nonunique(subject rdf.Term, nonunique bool) { + if nonunique { + e.graph.Add(subject, e.sysml(pIsUnique), rdf.Bool(false)) + } +} + // prefixes maps the `#M` annotations ahead of a declaration as metadata usages // it owns after its body members (PrefixMetadataMember), keyed `#` for the writer. func (e *encoder) prefixes(subject rdf.Term, fqn string, prefixes []*ast.PrefixMetadata, members []ast.Node) error { @@ -2652,8 +2661,8 @@ func (e *encoder) crossFeature(subject rdf.Term, fqn string, n *ast.Usage) error {"isPortion", cross.IsPortion}, {"isDerived", cross.IsDerived}, {"isOrdered", cross.IsOrdered}, - {"isNonunique", cross.IsNonunique}, }) + e.nonunique(crossSubject, cross.IsNonunique) if keyword := directionKeyword(cross.Direction); keyword != "" { e.graph.Add(crossSubject, e.sysml(pDirection), rdf.String(keyword)) } diff --git a/internal/translate/rdf/ontology/README.md b/internal/translate/rdf/ontology/README.md index 91f7b8e3df..4b7d5db45e 100644 --- a/internal/translate/rdf/ontology/README.md +++ b/internal/translate/rdf/ontology/README.md @@ -1,69 +1,71 @@ -# SysML v2 ontology term table +# SysML v2 metamodel term table -`table.go` is generated from the OMG SysML v2 metamodel as -[Open-MBEE/sysmlv2-rdf-ontology](https://github.com/Open-MBEE/sysmlv2-rdf-ontology) -renders it in OWL — `sysml2/owl/www.omg.org/spec/SysML.owl`, version `202407`, -generated there from `SysML.ecore` — plus the checkout's `sysml2/ecore/SysML.ecore` -itself, which supplies each property's upper multiplicity. Neither file is -vendored here (the OWL alone is ~624 KB of third-party RDF/XML): the generator -reads them from a local checkout and records the upstream commit SHA in the -generated header, so the table is reproducible from a header alone. +`table.go` is generated from the OMG SysML v2 metamodel as the pilot implementation +([Systems-Modeling/SysML-v2-Pilot-Implementation](https://github.com/Systems-Modeling/SysML-v2-Pilot-Implementation)) +publishes it: `org.omg.sysml/model/SysML.ecore`, at the release and commit +[`scripts/pilot-pin.sh`](../../../../scripts/pilot-pin.sh) pins for every other pilot input. +The metamodel version is the date in the ecore's namespace URI +(`https://www.omg.org/spec/SysML/20250201` → `20250201`). The ecore is not vendored +(~620 KB of third-party XMI); the generated header records the pilot tag, commit and namespace +URI, so the table is reproducible from the header alone. -The table holds, per property, the unqualified local name this tool's encoder -writes (`declaredName`), the metaclass that defines it (`Element`), the full -ontology IRI (`https://www.omg.org/spec/SysML#Element_declaredName`), whether it -is an `owl:ObjectProperty` or an `owl:DatatypeProperty`, its declared -`rdfs:range`, and whether its ecore upper bound is unbounded (`Many` — the -multiplicity the API JSON form spells as an array). It also holds every -`owl:Class` and its named `rdfs:subClassOf` parents, which `IsAncestorOrSelf` -walks for the domain check in `validate.go` and which `PropertyOf` uses to -pick the declaration a given metaclass inherits a name from. +Each ecore `EStructuralFeature` becomes one property, named as the OWL rendering of the +metamodel names it — `https://www.omg.org/spec/SysML#_` — and holding: -The table's contents are counted in one place, -[docs/project/roadmap.md](../../../../docs/project/roadmap.md) § D8, together with -what the gate finds. Some unqualified names are declared by more than one -metaclass, so `LookupProperty` returns every declaration and `AmbiguousNames` -reports those names rather than one being picked silently. +| Field | From the ecore | +|-------|----------------| +| `Name`, `DefiningClass`, `IRI` | the feature's name and the `EClass` declaring it | +| `Kind` | `ObjectProperty` for an `EReference`, `DatatypeProperty` for an `EAttribute` | +| `Range` | the referenced class, the attribute's enumeration, or the XSD/OWL datatype of its primitive (`Boolean` → `xsd:boolean`, `String` → `xsd:string`, `Integer` → `xsd:int`, `Real` → `owl:real`) | +| `Many` | `upperBound="-1"`: the API JSON form spells it as an array | +| `Ordered` | a multi-valued feature without `ordered="false"` (ecore's default is ordered) | +| `Derived` | `derived="true"` | +| `Redefines`, `Subsets` | the `redefines` / `subsets` annotations' references, as `Class::feature` | +| `Opposite` | `eOpposite`, as `Class::feature` | -## What the ontology does not carry +`Property.QualifiedName` gives the same `Class::feature` spelling, so the three reference fields +can be looked up with `PropertyOf`. Every `EClass` becomes a `Class` with its `eSuperTypes`, which +`IsAncestorOrSelf` walks for the domain check in `validate.go` and `PropertyOf` uses to pick the +declaration a metaclass inherits a name from, and `Abstract` for `abstract="true"`, which the check +reports as an `abstract-class` violation. -`SysML.owl` records no ecore abstractness. The only abstractness in the file is -the metamodel's own `Type::isAbstract` property (`sysml:Type_isAbstract`, a -`Type`-domained `owl:DatatypeProperty` about modeled types, not about -metaclasses); the `owl:Class` declarations themselves carry no -abstract/concrete marker. A "the metaclass must be concrete" check is therefore -not possible from this table and is not implemented — see -`docs/project/roadmap.md` § D7 for the abstract-`sysml:Import` finding that check -would otherwise have caught. +The table's contents are counted in one place, +[docs/project/roadmap.md](../../../../docs/project/roadmap.md) § D8, together with what the gate +finds. Some unqualified names are declared by more than one metaclass, so `LookupProperty` returns +every declaration and `AmbiguousNames` reports those names rather than one being picked silently. -## Regenerating +## Regenerating and checking -Clone the ontology (any revision; the SHA is recorded, not pinned): +From the repository root: ```bash -git clone https://github.com/Open-MBEE/sysmlv2-rdf-ontology.git +make ontology-table # ./scripts/download-pilot-metamodel.sh && go run -C tools ./gen/ontology +make ontology-table-check # the same with -check, as CI runs it ``` -Then, from the repository root: +`scripts/download-pilot-metamodel.sh` fetches the pinned pilot's `org.omg.sysml/model` into +`build/pilot-metamodel/` and stamps it with the pin; the generator refuses a download whose stamp +is not the current pin. It also refuses an ecore whose namespace URI is not +`https://www.omg.org/spec/SysML/`, a feature whose type, opposite, redefined or subsetted +feature names nothing in the ecore, a primitive it has no datatype for, and a name containing `_`, +which would make an IRI ambiguous. `-check` writes nothing and fails when the committed table +differs from what the pin generates. `TestTableFollowsThePilotPin` (`tests/ontology`) fails, with +no download needed, when the pin moves and the table's header still names the previous one. -```bash -go run -C tools ./gen/ontology -ontology /path/to/sysmlv2-rdf-ontology -``` +## Bumping -or, equivalently, with the checkout in `$SYSMLV2_RDF_ONTOLOGY`: - -```bash -SYSMLV2_RDF_ONTOLOGY=/path/to/sysmlv2-rdf-ontology go generate ./internal/translate/rdf/ontology -``` +The table follows the pilot pin; there is no separate ontology pin to bump. -The generator lives in the `tools/` module and writes the table under the -repository root it finds above its working directory; pass the checkout as an -absolute path. It reads the ontology version from the checkout's `sysml2/README.md` -and the commit SHA from the checkout's on-disk Git metadata. It does not need a -`git` binary, refuses to write a table if any property has no `rdfs:domain` or -if a property IRI disagrees with its domain or names no eStructuralFeature in -the ecore, and overwrites `table.go` in place. -Review the diff, then run -`go test ./internal/translate/rdf/ontology/... ./internal/translate/export/...` — the -export gate compares the golden graphs against the new table and will report -anything the ontology bump changed. +1. Move `PILOT_TAG` and `PILOT_COMMIT` in `scripts/pilot-pin.sh` (see + [docs/project/pilot-corpora.md](../../../../docs/project/pilot-corpora.md) for what else that + moves). +2. `make ontology-table`, then review the diff of `table.go`: classes and properties added, + removed or renamed, and new flags. +3. Update the counts in `tests/ontology/ontology_test.go` and `docs/project/roadmap.md` § D8. +4. `go test ./internal/translate/... ./tests/ontology ./tests/export ./tests/migrate` and the + RDF and API-JSON corpus round-trip gates (`docs/project/rdf-corpus-roundtrip.md`). The export + gate `TestGoldenGraphsMatchOntology` compares the golden graphs against the new table: a + metaclass the export writes that the metamodel renamed, or a property it dropped, appears as a + new violation, and an entry of `tests/export/testdata/ontology-known-violations.txt` the new + table resolves as one to remove. Fix the mapping rather than listing a new violation, and keep + graphs earlier releases wrote readable. diff --git a/internal/translate/rdf/ontology/ontology.go b/internal/translate/rdf/ontology/ontology.go index 0686173cc2..749975b96a 100644 --- a/internal/translate/rdf/ontology/ontology.go +++ b/internal/translate/rdf/ontology/ontology.go @@ -1,12 +1,11 @@ // Package ontology holds the SysML v2 metamodel term table generated from the -// Open-MBEE OWL rendering, plus the domain/range check built on it. The ontology -// qualifies each property by its defining metaclass (sysml:Element_declaredName) -// where this tool writes the unqualified name (sysml:declaredName), so the table -// records both spellings. It records no ecore abstractness, so a "the metaclass -// must be concrete" check is not possible here. See README.md. +// OMG metamodel's SysML.ecore, plus the domain/range check built on it. The +// table qualifies each property by its defining metaclass in OWL style +// (sysml:Element_declaredName) where this tool writes the unqualified name +// (sysml:declaredName), so it records both spellings. See README.md. package ontology -//go:generate go run -C ../../../../tools ./gen/ontology -ontology $SYSMLV2_RDF_ONTOLOGY +//go:generate go run -C ../../../../tools ./gen/ontology import ( "strings" @@ -31,7 +30,7 @@ func (k PropertyKind) String() string { return "owl:ObjectProperty" } -// Property is one metamodel property as the ontology declares it. +// Property is one metamodel property, an ecore eStructuralFeature. type Property struct { // Name is the unqualified name this tool's encoder writes ("declaredName"). Name string @@ -41,18 +40,38 @@ type Property struct { IRI string // Kind is owl:ObjectProperty or owl:DatatypeProperty. Kind PropertyKind - // Range is the declared rdfs:range IRI, empty when none is declared. + // Range is the rdfs:range IRI: a metaclass or enumeration in the SysML + // namespace, or the XSD/OWL datatype of an ecore primitive. Range string // Many reports an unbounded upper multiplicity (ecore upperBound -1): // the API JSON shape is an array. Many bool + // Ordered reports a Many property whose values are ordered (ecore + // ordered, which defaults to true); a single-valued property is never Ordered. + Ordered bool + // Derived reports a property the metamodel computes (ecore derived="true") + // rather than one an element owns. + Derived bool + // Redefines and Subsets name the properties this one redefines or subsets, + // as "DefiningClass::name" ("Type::ownedFeature"), when the metamodel states any. + Redefines []string + Subsets []string + // Opposite is the "DefiningClass::name" of the ecore eOpposite, the + // navigable property at the other end of the same association, if any. + Opposite string } -// Class is one metaclass and its named rdfs:subClassOf parents; the anonymous -// cardinality restrictions the ontology also states are not recorded. +// QualifiedName returns the property as "DefiningClass::name", the form +// Redefines, Subsets and Opposite name properties in. +func (p Property) QualifiedName() string { return p.DefiningClass + "::" + p.Name } + +// Class is one metaclass, an ecore EClass, and its eSuperTypes. type Class struct { // Name is the metaclass name ("PartUsage"), its local name in the namespace. Name string + // Abstract reports an abstract metaclass (ecore abstract="true"), one no + // element is an instance of directly. + Abstract bool // Parents are the metaclass names of the declared direct superclasses. Parents []string } diff --git a/internal/translate/rdf/ontology/table.go b/internal/translate/rdf/ontology/table.go index 858567bfe3..027a335ef6 100644 --- a/internal/translate/rdf/ontology/table.go +++ b/internal/translate/rdf/ontology/table.go @@ -1,440 +1,446 @@ // Code generated by tools/gen/ontology. DO NOT EDIT. // -// Source: Open-MBEE/sysmlv2-rdf-ontology, sysml2/owl/www.omg.org/spec/SysML.owl -// Ecore: sysml2/ecore/SysML.ecore (property multiplicities) -// Ontology: SysML v2 metamodel version 202407 (generated from SysML.ecore) -// Commit: a1fda2623d4a0a7b7ace855e12e799dbd5cbaa82 +// Source: https://github.com/Systems-Modeling/SysML-v2-Pilot-Implementation.git 2026-08, org.omg.sysml/model/SysML.ecore +// Commit: 692170b71867353b8f90341e61556f49a5beb0e5 +// Metamodel: https://www.omg.org/spec/SysML/20250201 // // Regenerate with (see README.md): // -// go run -C tools ./gen/ontology -ontology +// ./scripts/download-pilot-metamodel.sh +// go run -C tools ./gen/ontology package ontology -// Version is the OMG SysML v2 metamodel version the table was generated from. -const Version = "202407" +// Version is the OMG SysML v2 metamodel version the table was generated from, +// the date in the ecore's namespace URI. +const Version = "20250201" -// SourceCommit is the sysmlv2-rdf-ontology commit the table was generated from. -const SourceCommit = "a1fda2623d4a0a7b7ace855e12e799dbd5cbaa82" +// SourceTag is the pilot implementation release the table was generated from. +const SourceTag = "2026-08" -// properties holds every owl:ObjectProperty and owl:DatatypeProperty the -// ontology declares, ordered by IRI. +// SourceCommit is the pilot implementation commit the table was generated from. +const SourceCommit = "692170b71867353b8f90341e61556f49a5beb0e5" + +// properties holds every eStructuralFeature the metamodel declares, ordered by IRI. var properties = []Property{ - {Name: "payloadArgument", DefiningClass: "AcceptActionUsage", IRI: "https://www.omg.org/spec/SysML#AcceptActionUsage_payloadArgument", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression"}, - {Name: "payloadParameter", DefiningClass: "AcceptActionUsage", IRI: "https://www.omg.org/spec/SysML#AcceptActionUsage_payloadParameter", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ReferenceUsage"}, - {Name: "receiverArgument", DefiningClass: "AcceptActionUsage", IRI: "https://www.omg.org/spec/SysML#AcceptActionUsage_receiverArgument", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression"}, - {Name: "action", DefiningClass: "ActionDefinition", IRI: "https://www.omg.org/spec/SysML#ActionDefinition_action", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ActionUsage", Many: true}, - {Name: "actionDefinition", DefiningClass: "ActionUsage", IRI: "https://www.omg.org/spec/SysML#ActionUsage_actionDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Behavior", Many: true}, - {Name: "ownedActorParameter", DefiningClass: "ActorMembership", IRI: "https://www.omg.org/spec/SysML#ActorMembership_ownedActorParameter", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PartUsage"}, - {Name: "allocation", DefiningClass: "AllocationDefinition", IRI: "https://www.omg.org/spec/SysML#AllocationDefinition_allocation", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#AllocationUsage", Many: true}, - {Name: "allocationDefinition", DefiningClass: "AllocationUsage", IRI: "https://www.omg.org/spec/SysML#AllocationUsage_allocationDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#AllocationDefinition", Many: true}, - {Name: "resultExpression", DefiningClass: "AnalysisCaseDefinition", IRI: "https://www.omg.org/spec/SysML#AnalysisCaseDefinition_resultExpression", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression"}, - {Name: "analysisCaseDefinition", DefiningClass: "AnalysisCaseUsage", IRI: "https://www.omg.org/spec/SysML#AnalysisCaseUsage_analysisCaseDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#AnalysisCaseDefinition"}, - {Name: "resultExpression", DefiningClass: "AnalysisCaseUsage", IRI: "https://www.omg.org/spec/SysML#AnalysisCaseUsage_resultExpression", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression"}, - {Name: "annotatedElement", DefiningClass: "AnnotatingElement", IRI: "https://www.omg.org/spec/SysML#AnnotatingElement_annotatedElement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element", Many: true}, - {Name: "annotation", DefiningClass: "AnnotatingElement", IRI: "https://www.omg.org/spec/SysML#AnnotatingElement_annotation", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Annotation", Many: true}, - {Name: "ownedAnnotatingRelationship", DefiningClass: "AnnotatingElement", IRI: "https://www.omg.org/spec/SysML#AnnotatingElement_ownedAnnotatingRelationship", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Annotation", Many: true}, - {Name: "annotatedElement", DefiningClass: "Annotation", IRI: "https://www.omg.org/spec/SysML#Annotation_annotatedElement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element"}, - {Name: "annotatingElement", DefiningClass: "Annotation", IRI: "https://www.omg.org/spec/SysML#Annotation_annotatingElement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#AnnotatingElement"}, - {Name: "owningAnnotatedElement", DefiningClass: "Annotation", IRI: "https://www.omg.org/spec/SysML#Annotation_owningAnnotatedElement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element"}, - {Name: "owningAnnotatingElement", DefiningClass: "Annotation", IRI: "https://www.omg.org/spec/SysML#Annotation_owningAnnotatingElement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#AnnotatingElement"}, - {Name: "assertedConstraint", DefiningClass: "AssertConstraintUsage", IRI: "https://www.omg.org/spec/SysML#AssertConstraintUsage_assertedConstraint", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConstraintUsage"}, - {Name: "referent", DefiningClass: "AssignmentActionUsage", IRI: "https://www.omg.org/spec/SysML#AssignmentActionUsage_referent", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature"}, - {Name: "targetArgument", DefiningClass: "AssignmentActionUsage", IRI: "https://www.omg.org/spec/SysML#AssignmentActionUsage_targetArgument", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression"}, - {Name: "valueExpression", DefiningClass: "AssignmentActionUsage", IRI: "https://www.omg.org/spec/SysML#AssignmentActionUsage_valueExpression", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression"}, - {Name: "associationEnd", DefiningClass: "Association", IRI: "https://www.omg.org/spec/SysML#Association_associationEnd", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Many: true}, - {Name: "relatedType", DefiningClass: "Association", IRI: "https://www.omg.org/spec/SysML#Association_relatedType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Many: true}, - {Name: "sourceType", DefiningClass: "Association", IRI: "https://www.omg.org/spec/SysML#Association_sourceType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type"}, - {Name: "targetType", DefiningClass: "Association", IRI: "https://www.omg.org/spec/SysML#Association_targetType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Many: true}, - {Name: "attributeDefinition", DefiningClass: "AttributeUsage", IRI: "https://www.omg.org/spec/SysML#AttributeUsage_attributeDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#DataType", Many: true}, - {Name: "parameter", DefiningClass: "Behavior", IRI: "https://www.omg.org/spec/SysML#Behavior_parameter", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Many: true}, - {Name: "step", DefiningClass: "Behavior", IRI: "https://www.omg.org/spec/SysML#Behavior_step", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Step", Many: true}, - {Name: "predicate", DefiningClass: "BooleanExpression", IRI: "https://www.omg.org/spec/SysML#BooleanExpression_predicate", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Predicate"}, - {Name: "calculation", DefiningClass: "CalculationDefinition", IRI: "https://www.omg.org/spec/SysML#CalculationDefinition_calculation", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#CalculationUsage", Many: true}, - {Name: "calculationDefinition", DefiningClass: "CalculationUsage", IRI: "https://www.omg.org/spec/SysML#CalculationUsage_calculationDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Function"}, - {Name: "actorParameter", DefiningClass: "CaseDefinition", IRI: "https://www.omg.org/spec/SysML#CaseDefinition_actorParameter", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PartUsage", Many: true}, - {Name: "objectiveRequirement", DefiningClass: "CaseDefinition", IRI: "https://www.omg.org/spec/SysML#CaseDefinition_objectiveRequirement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RequirementUsage"}, - {Name: "subjectParameter", DefiningClass: "CaseDefinition", IRI: "https://www.omg.org/spec/SysML#CaseDefinition_subjectParameter", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Usage"}, - {Name: "actorParameter", DefiningClass: "CaseUsage", IRI: "https://www.omg.org/spec/SysML#CaseUsage_actorParameter", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PartUsage", Many: true}, - {Name: "caseDefinition", DefiningClass: "CaseUsage", IRI: "https://www.omg.org/spec/SysML#CaseUsage_caseDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#CaseDefinition"}, - {Name: "objectiveRequirement", DefiningClass: "CaseUsage", IRI: "https://www.omg.org/spec/SysML#CaseUsage_objectiveRequirement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RequirementUsage"}, - {Name: "subjectParameter", DefiningClass: "CaseUsage", IRI: "https://www.omg.org/spec/SysML#CaseUsage_subjectParameter", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Usage"}, - {Name: "ownedSubclassification", DefiningClass: "Classifier", IRI: "https://www.omg.org/spec/SysML#Classifier_ownedSubclassification", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Subclassification", Many: true}, + {Name: "payloadArgument", DefiningClass: "AcceptActionUsage", IRI: "https://www.omg.org/spec/SysML#AcceptActionUsage_payloadArgument", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Derived: true}, + {Name: "payloadParameter", DefiningClass: "AcceptActionUsage", IRI: "https://www.omg.org/spec/SysML#AcceptActionUsage_payloadParameter", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ReferenceUsage", Derived: true, Subsets: []string{"Usage::nestedReference", "Step::parameter"}}, + {Name: "receiverArgument", DefiningClass: "AcceptActionUsage", IRI: "https://www.omg.org/spec/SysML#AcceptActionUsage_receiverArgument", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Derived: true}, + {Name: "action", DefiningClass: "ActionDefinition", IRI: "https://www.omg.org/spec/SysML#ActionDefinition_action", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ActionUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Behavior::step", "Definition::usage"}}, + {Name: "actionDefinition", DefiningClass: "ActionUsage", IRI: "https://www.omg.org/spec/SysML#ActionUsage_actionDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Behavior", Many: true, Ordered: true, Derived: true, Redefines: []string{"Step::behavior", "OccurrenceUsage::occurrenceDefinition"}}, + {Name: "ownedActorParameter", DefiningClass: "ActorMembership", IRI: "https://www.omg.org/spec/SysML#ActorMembership_ownedActorParameter", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PartUsage", Derived: true, Redefines: []string{"ParameterMembership::ownedMemberParameter"}}, + {Name: "allocation", DefiningClass: "AllocationDefinition", IRI: "https://www.omg.org/spec/SysML#AllocationDefinition_allocation", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#AllocationUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Definition::usage"}}, + {Name: "allocationDefinition", DefiningClass: "AllocationUsage", IRI: "https://www.omg.org/spec/SysML#AllocationUsage_allocationDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#AllocationDefinition", Many: true, Ordered: true, Derived: true, Redefines: []string{"ConnectionUsage::connectionDefinition"}}, + {Name: "resultExpression", DefiningClass: "AnalysisCaseDefinition", IRI: "https://www.omg.org/spec/SysML#AnalysisCaseDefinition_resultExpression", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Derived: true, Subsets: []string{"Function::expression", "Type::ownedFeature"}}, + {Name: "analysisCaseDefinition", DefiningClass: "AnalysisCaseUsage", IRI: "https://www.omg.org/spec/SysML#AnalysisCaseUsage_analysisCaseDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#AnalysisCaseDefinition", Derived: true, Redefines: []string{"CaseUsage::caseDefinition"}}, + {Name: "resultExpression", DefiningClass: "AnalysisCaseUsage", IRI: "https://www.omg.org/spec/SysML#AnalysisCaseUsage_resultExpression", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Derived: true, Subsets: []string{"Type::ownedFeature"}}, + {Name: "annotatedElement", DefiningClass: "AnnotatingElement", IRI: "https://www.omg.org/spec/SysML#AnnotatingElement_annotatedElement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element", Many: true, Ordered: true, Derived: true}, + {Name: "annotation", DefiningClass: "AnnotatingElement", IRI: "https://www.omg.org/spec/SysML#AnnotatingElement_annotation", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Annotation", Many: true, Ordered: true, Derived: true, Opposite: "Annotation::annotatingElement"}, + {Name: "ownedAnnotatingRelationship", DefiningClass: "AnnotatingElement", IRI: "https://www.omg.org/spec/SysML#AnnotatingElement_ownedAnnotatingRelationship", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Annotation", Many: true, Ordered: true, Derived: true, Subsets: []string{"AnnotatingElement::annotation", "Element::ownedRelationship"}, Opposite: "Annotation::owningAnnotatingElement"}, + {Name: "owningAnnotatingRelationship", DefiningClass: "AnnotatingElement", IRI: "https://www.omg.org/spec/SysML#AnnotatingElement_owningAnnotatingRelationship", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Annotation", Derived: true, Subsets: []string{"Element::owningRelationship", "AnnotatingElement::annotation"}, Opposite: "Annotation::ownedAnnotatingElement"}, + {Name: "annotatedElement", DefiningClass: "Annotation", IRI: "https://www.omg.org/spec/SysML#Annotation_annotatedElement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element", Redefines: []string{"Relationship::target"}}, + {Name: "annotatingElement", DefiningClass: "Annotation", IRI: "https://www.omg.org/spec/SysML#Annotation_annotatingElement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#AnnotatingElement", Derived: true, Redefines: []string{"Relationship::source"}, Opposite: "AnnotatingElement::annotation"}, + {Name: "ownedAnnotatingElement", DefiningClass: "Annotation", IRI: "https://www.omg.org/spec/SysML#Annotation_ownedAnnotatingElement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#AnnotatingElement", Derived: true, Subsets: []string{"Annotation::annotatingElement", "Relationship::ownedRelatedElement"}, Opposite: "AnnotatingElement::owningAnnotatingRelationship"}, + {Name: "owningAnnotatedElement", DefiningClass: "Annotation", IRI: "https://www.omg.org/spec/SysML#Annotation_owningAnnotatedElement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element", Derived: true, Subsets: []string{"Annotation::annotatedElement", "Relationship::owningRelatedElement"}, Opposite: "Element::ownedAnnotation"}, + {Name: "owningAnnotatingElement", DefiningClass: "Annotation", IRI: "https://www.omg.org/spec/SysML#Annotation_owningAnnotatingElement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#AnnotatingElement", Derived: true, Subsets: []string{"Annotation::annotatingElement", "Relationship::owningRelatedElement"}, Opposite: "AnnotatingElement::ownedAnnotatingRelationship"}, + {Name: "assertedConstraint", DefiningClass: "AssertConstraintUsage", IRI: "https://www.omg.org/spec/SysML#AssertConstraintUsage_assertedConstraint", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConstraintUsage", Derived: true}, + {Name: "referent", DefiningClass: "AssignmentActionUsage", IRI: "https://www.omg.org/spec/SysML#AssignmentActionUsage_referent", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Derived: true, Subsets: []string{"Namespace::member"}}, + {Name: "targetArgument", DefiningClass: "AssignmentActionUsage", IRI: "https://www.omg.org/spec/SysML#AssignmentActionUsage_targetArgument", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Derived: true}, + {Name: "valueExpression", DefiningClass: "AssignmentActionUsage", IRI: "https://www.omg.org/spec/SysML#AssignmentActionUsage_valueExpression", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Derived: true}, + {Name: "associationEnd", DefiningClass: "Association", IRI: "https://www.omg.org/spec/SysML#Association_associationEnd", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Many: true, Derived: true, Redefines: []string{"Type::endFeature"}}, + {Name: "relatedType", DefiningClass: "Association", IRI: "https://www.omg.org/spec/SysML#Association_relatedType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Many: true, Ordered: true, Derived: true, Redefines: []string{"Relationship::relatedElement"}}, + {Name: "sourceType", DefiningClass: "Association", IRI: "https://www.omg.org/spec/SysML#Association_sourceType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Derived: true, Redefines: []string{"Relationship::source"}, Subsets: []string{"Association::relatedType"}}, + {Name: "targetType", DefiningClass: "Association", IRI: "https://www.omg.org/spec/SysML#Association_targetType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Many: true, Derived: true, Redefines: []string{"Relationship::target"}, Subsets: []string{"Association::relatedType"}}, + {Name: "attributeDefinition", DefiningClass: "AttributeUsage", IRI: "https://www.omg.org/spec/SysML#AttributeUsage_attributeDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#DataType", Many: true, Ordered: true, Derived: true, Redefines: []string{"Usage::definition"}}, + {Name: "parameter", DefiningClass: "Behavior", IRI: "https://www.omg.org/spec/SysML#Behavior_parameter", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Many: true, Ordered: true, Derived: true, Redefines: []string{"Type::directedFeature"}}, + {Name: "step", DefiningClass: "Behavior", IRI: "https://www.omg.org/spec/SysML#Behavior_step", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Step", Many: true, Derived: true, Subsets: []string{"Type::feature"}}, + {Name: "predicate", DefiningClass: "BooleanExpression", IRI: "https://www.omg.org/spec/SysML#BooleanExpression_predicate", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Predicate", Derived: true, Redefines: []string{"Expression::function"}}, + {Name: "calculation", DefiningClass: "CalculationDefinition", IRI: "https://www.omg.org/spec/SysML#CalculationDefinition_calculation", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#CalculationUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"ActionDefinition::action", "Function::expression"}}, + {Name: "calculationDefinition", DefiningClass: "CalculationUsage", IRI: "https://www.omg.org/spec/SysML#CalculationUsage_calculationDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Function", Derived: true, Redefines: []string{"Expression::function", "ActionUsage::actionDefinition"}}, + {Name: "actorParameter", DefiningClass: "CaseDefinition", IRI: "https://www.omg.org/spec/SysML#CaseDefinition_actorParameter", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PartUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Behavior::parameter", "Definition::usage"}}, + {Name: "objectiveRequirement", DefiningClass: "CaseDefinition", IRI: "https://www.omg.org/spec/SysML#CaseDefinition_objectiveRequirement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RequirementUsage", Derived: true, Subsets: []string{"Definition::usage"}}, + {Name: "subjectParameter", DefiningClass: "CaseDefinition", IRI: "https://www.omg.org/spec/SysML#CaseDefinition_subjectParameter", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Usage", Derived: true, Subsets: []string{"Behavior::parameter", "Definition::usage"}}, + {Name: "actorParameter", DefiningClass: "CaseUsage", IRI: "https://www.omg.org/spec/SysML#CaseUsage_actorParameter", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PartUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Step::parameter", "Usage::usage"}}, + {Name: "caseDefinition", DefiningClass: "CaseUsage", IRI: "https://www.omg.org/spec/SysML#CaseUsage_caseDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#CaseDefinition", Derived: true, Redefines: []string{"CalculationUsage::calculationDefinition"}}, + {Name: "objectiveRequirement", DefiningClass: "CaseUsage", IRI: "https://www.omg.org/spec/SysML#CaseUsage_objectiveRequirement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RequirementUsage", Derived: true, Subsets: []string{"Usage::usage"}}, + {Name: "subjectParameter", DefiningClass: "CaseUsage", IRI: "https://www.omg.org/spec/SysML#CaseUsage_subjectParameter", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Usage", Derived: true, Subsets: []string{"Step::parameter", "Usage::usage"}}, + {Name: "ownedSubclassification", DefiningClass: "Classifier", IRI: "https://www.omg.org/spec/SysML#Classifier_ownedSubclassification", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Subclassification", Many: true, Derived: true, Subsets: []string{"Type::ownedSpecialization"}, Opposite: "Subclassification::owningClassifier"}, {Name: "body", DefiningClass: "Comment", IRI: "https://www.omg.org/spec/SysML#Comment_body", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string"}, {Name: "locale", DefiningClass: "Comment", IRI: "https://www.omg.org/spec/SysML#Comment_locale", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string"}, - {Name: "concernDefinition", DefiningClass: "ConcernUsage", IRI: "https://www.omg.org/spec/SysML#ConcernUsage_concernDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConcernDefinition"}, - {Name: "originalPortDefinition", DefiningClass: "ConjugatedPortDefinition", IRI: "https://www.omg.org/spec/SysML#ConjugatedPortDefinition_originalPortDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PortDefinition"}, - {Name: "ownedPortConjugator", DefiningClass: "ConjugatedPortDefinition", IRI: "https://www.omg.org/spec/SysML#ConjugatedPortDefinition_ownedPortConjugator", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PortConjugation"}, - {Name: "conjugatedPortDefinition", DefiningClass: "ConjugatedPortTyping", IRI: "https://www.omg.org/spec/SysML#ConjugatedPortTyping_conjugatedPortDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConjugatedPortDefinition"}, - {Name: "portDefinition", DefiningClass: "ConjugatedPortTyping", IRI: "https://www.omg.org/spec/SysML#ConjugatedPortTyping_portDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PortDefinition"}, - {Name: "conjugatedType", DefiningClass: "Conjugation", IRI: "https://www.omg.org/spec/SysML#Conjugation_conjugatedType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type"}, - {Name: "originalType", DefiningClass: "Conjugation", IRI: "https://www.omg.org/spec/SysML#Conjugation_originalType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type"}, - {Name: "owningType", DefiningClass: "Conjugation", IRI: "https://www.omg.org/spec/SysML#Conjugation_owningType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type"}, - {Name: "connectionEnd", DefiningClass: "ConnectionDefinition", IRI: "https://www.omg.org/spec/SysML#ConnectionDefinition_connectionEnd", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Usage", Many: true}, - {Name: "connectionDefinition", DefiningClass: "ConnectionUsage", IRI: "https://www.omg.org/spec/SysML#ConnectionUsage_connectionDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#AssociationStructure", Many: true}, - {Name: "association", DefiningClass: "Connector", IRI: "https://www.omg.org/spec/SysML#Connector_association", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Association", Many: true}, - {Name: "connectorEnd", DefiningClass: "Connector", IRI: "https://www.omg.org/spec/SysML#Connector_connectorEnd", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Many: true}, - {Name: "relatedFeature", DefiningClass: "Connector", IRI: "https://www.omg.org/spec/SysML#Connector_relatedFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Many: true}, - {Name: "sourceFeature", DefiningClass: "Connector", IRI: "https://www.omg.org/spec/SysML#Connector_sourceFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature"}, - {Name: "targetFeature", DefiningClass: "Connector", IRI: "https://www.omg.org/spec/SysML#Connector_targetFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Many: true}, - {Name: "constraintDefinition", DefiningClass: "ConstraintUsage", IRI: "https://www.omg.org/spec/SysML#ConstraintUsage_constraintDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Predicate"}, - {Name: "directedUsage", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_directedUsage", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Usage", Many: true}, + {Name: "concernDefinition", DefiningClass: "ConcernUsage", IRI: "https://www.omg.org/spec/SysML#ConcernUsage_concernDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConcernDefinition", Derived: true, Redefines: []string{"RequirementUsage::requirementDefinition"}}, + {Name: "originalPortDefinition", DefiningClass: "ConjugatedPortDefinition", IRI: "https://www.omg.org/spec/SysML#ConjugatedPortDefinition_originalPortDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PortDefinition", Derived: true, Redefines: []string{"Element::owningNamespace"}, Opposite: "PortDefinition::conjugatedPortDefinition"}, + {Name: "ownedPortConjugator", DefiningClass: "ConjugatedPortDefinition", IRI: "https://www.omg.org/spec/SysML#ConjugatedPortDefinition_ownedPortConjugator", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PortConjugation", Derived: true, Redefines: []string{"Type::ownedConjugator"}, Opposite: "PortConjugation::conjugatedPortDefinition"}, + {Name: "conjugatedPortDefinition", DefiningClass: "ConjugatedPortTyping", IRI: "https://www.omg.org/spec/SysML#ConjugatedPortTyping_conjugatedPortDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConjugatedPortDefinition", Redefines: []string{"FeatureTyping::type"}}, + {Name: "portDefinition", DefiningClass: "ConjugatedPortTyping", IRI: "https://www.omg.org/spec/SysML#ConjugatedPortTyping_portDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PortDefinition", Derived: true}, + {Name: "conjugatedType", DefiningClass: "Conjugation", IRI: "https://www.omg.org/spec/SysML#Conjugation_conjugatedType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Redefines: []string{"Relationship::source"}}, + {Name: "originalType", DefiningClass: "Conjugation", IRI: "https://www.omg.org/spec/SysML#Conjugation_originalType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Redefines: []string{"Relationship::target"}}, + {Name: "owningType", DefiningClass: "Conjugation", IRI: "https://www.omg.org/spec/SysML#Conjugation_owningType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Derived: true, Subsets: []string{"Conjugation::conjugatedType", "Relationship::owningRelatedElement"}, Opposite: "Type::ownedConjugator"}, + {Name: "connectionEnd", DefiningClass: "ConnectionDefinition", IRI: "https://www.omg.org/spec/SysML#ConnectionDefinition_connectionEnd", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Usage", Many: true, Ordered: true, Derived: true, Redefines: []string{"Association::associationEnd"}}, + {Name: "connectionDefinition", DefiningClass: "ConnectionUsage", IRI: "https://www.omg.org/spec/SysML#ConnectionUsage_connectionDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#AssociationStructure", Many: true, Ordered: true, Derived: true, Redefines: []string{"Connector::association"}, Subsets: []string{"ItemUsage::itemDefinition"}}, + {Name: "association", DefiningClass: "Connector", IRI: "https://www.omg.org/spec/SysML#Connector_association", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Association", Many: true, Ordered: true, Derived: true, Redefines: []string{"Feature::type"}}, + {Name: "connectorEnd", DefiningClass: "Connector", IRI: "https://www.omg.org/spec/SysML#Connector_connectorEnd", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Many: true, Ordered: true, Derived: true, Redefines: []string{"Type::endFeature"}}, + {Name: "defaultFeaturingType", DefiningClass: "Connector", IRI: "https://www.omg.org/spec/SysML#Connector_defaultFeaturingType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Derived: true}, + {Name: "relatedFeature", DefiningClass: "Connector", IRI: "https://www.omg.org/spec/SysML#Connector_relatedFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Many: true, Ordered: true, Derived: true, Redefines: []string{"Relationship::relatedElement"}}, + {Name: "sourceFeature", DefiningClass: "Connector", IRI: "https://www.omg.org/spec/SysML#Connector_sourceFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Derived: true, Redefines: []string{"Relationship::source"}, Subsets: []string{"Connector::relatedFeature"}}, + {Name: "targetFeature", DefiningClass: "Connector", IRI: "https://www.omg.org/spec/SysML#Connector_targetFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Many: true, Ordered: true, Derived: true, Redefines: []string{"Relationship::target"}, Subsets: []string{"Connector::relatedFeature"}}, + {Name: "constraintDefinition", DefiningClass: "ConstraintUsage", IRI: "https://www.omg.org/spec/SysML#ConstraintUsage_constraintDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Predicate", Derived: true, Redefines: []string{"BooleanExpression::predicate"}}, + {Name: "crossedFeature", DefiningClass: "CrossSubsetting", IRI: "https://www.omg.org/spec/SysML#CrossSubsetting_crossedFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Redefines: []string{"Subsetting::subsettedFeature"}}, + {Name: "crossingFeature", DefiningClass: "CrossSubsetting", IRI: "https://www.omg.org/spec/SysML#CrossSubsetting_crossingFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Derived: true, Redefines: []string{"Subsetting::owningFeature", "Subsetting::subsettingFeature"}, Opposite: "Feature::ownedCrossSubsetting"}, + {Name: "directedUsage", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_directedUsage", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Usage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Type::directedFeature", "Definition::usage"}}, {Name: "isVariation", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_isVariation", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean"}, - {Name: "ownedAction", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedAction", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ActionUsage", Many: true}, - {Name: "ownedAllocation", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedAllocation", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#AllocationUsage", Many: true}, - {Name: "ownedAnalysisCase", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedAnalysisCase", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#AnalysisCaseUsage", Many: true}, - {Name: "ownedAttribute", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedAttribute", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#AttributeUsage", Many: true}, - {Name: "ownedCalculation", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedCalculation", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#CalculationUsage", Many: true}, - {Name: "ownedCase", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedCase", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#CaseUsage", Many: true}, - {Name: "ownedConcern", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedConcern", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConcernUsage", Many: true}, - {Name: "ownedConnection", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedConnection", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConnectorAsUsage", Many: true}, - {Name: "ownedConstraint", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedConstraint", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConstraintUsage", Many: true}, - {Name: "ownedEnumeration", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedEnumeration", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#EnumerationUsage", Many: true}, - {Name: "ownedFlow", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedFlow", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#FlowConnectionUsage", Many: true}, - {Name: "ownedInterface", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedInterface", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#InterfaceUsage", Many: true}, - {Name: "ownedItem", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedItem", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ItemUsage", Many: true}, - {Name: "ownedMetadata", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedMetadata", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#MetadataUsage", Many: true}, - {Name: "ownedOccurrence", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedOccurrence", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#OccurrenceUsage", Many: true}, - {Name: "ownedPart", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedPart", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PartUsage", Many: true}, - {Name: "ownedPort", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedPort", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PortUsage", Many: true}, - {Name: "ownedReference", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedReference", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ReferenceUsage", Many: true}, - {Name: "ownedRendering", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedRendering", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RenderingUsage", Many: true}, - {Name: "ownedRequirement", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedRequirement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RequirementUsage", Many: true}, - {Name: "ownedState", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedState", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#StateUsage", Many: true}, - {Name: "ownedTransition", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedTransition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#TransitionUsage", Many: true}, - {Name: "ownedUsage", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedUsage", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Usage", Many: true}, - {Name: "ownedUseCase", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedUseCase", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#UseCaseUsage", Many: true}, - {Name: "ownedVerificationCase", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedVerificationCase", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#VerificationCaseUsage", Many: true}, - {Name: "ownedView", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedView", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ViewUsage", Many: true}, - {Name: "ownedViewpoint", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedViewpoint", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ViewpointUsage", Many: true}, - {Name: "usage", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_usage", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Usage", Many: true}, - {Name: "variant", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_variant", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Usage", Many: true}, - {Name: "variantMembership", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_variantMembership", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#VariantMembership", Many: true}, - {Name: "client", DefiningClass: "Dependency", IRI: "https://www.omg.org/spec/SysML#Dependency_client", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element", Many: true}, - {Name: "supplier", DefiningClass: "Dependency", IRI: "https://www.omg.org/spec/SysML#Dependency_supplier", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element", Many: true}, - {Name: "differencingType", DefiningClass: "Differencing", IRI: "https://www.omg.org/spec/SysML#Differencing_differencingType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type"}, - {Name: "typeDifferenced", DefiningClass: "Differencing", IRI: "https://www.omg.org/spec/SysML#Differencing_typeDifferenced", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type"}, - {Name: "disjoiningType", DefiningClass: "Disjoining", IRI: "https://www.omg.org/spec/SysML#Disjoining_disjoiningType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type"}, - {Name: "owningType", DefiningClass: "Disjoining", IRI: "https://www.omg.org/spec/SysML#Disjoining_owningType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type"}, - {Name: "typeDisjoined", DefiningClass: "Disjoining", IRI: "https://www.omg.org/spec/SysML#Disjoining_typeDisjoined", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type"}, - {Name: "documentedElement", DefiningClass: "Documentation", IRI: "https://www.omg.org/spec/SysML#Documentation_documentedElement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element"}, - {Name: "condition", DefiningClass: "ElementFilterMembership", IRI: "https://www.omg.org/spec/SysML#ElementFilterMembership_condition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression"}, - {Name: "aliasIds", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_aliasIds", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string", Many: true}, + {Name: "ownedAction", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedAction", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ActionUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Definition::ownedOccurrence"}}, + {Name: "ownedAllocation", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedAllocation", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#AllocationUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Definition::ownedConnection"}}, + {Name: "ownedAnalysisCase", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedAnalysisCase", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#AnalysisCaseUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Definition::ownedCase"}}, + {Name: "ownedAttribute", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedAttribute", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#AttributeUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Definition::ownedUsage"}}, + {Name: "ownedCalculation", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedCalculation", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#CalculationUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Definition::ownedAction"}}, + {Name: "ownedCase", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedCase", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#CaseUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Definition::ownedCalculation"}}, + {Name: "ownedConcern", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedConcern", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConcernUsage", Many: true, Derived: true, Subsets: []string{"Definition::ownedRequirement"}}, + {Name: "ownedConnection", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedConnection", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConnectorAsUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Definition::ownedUsage"}}, + {Name: "ownedConstraint", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedConstraint", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConstraintUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Definition::ownedOccurrence"}}, + {Name: "ownedEnumeration", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedEnumeration", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#EnumerationUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Definition::ownedAttribute"}}, + {Name: "ownedFlow", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedFlow", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#FlowUsage", Many: true, Derived: true, Subsets: []string{"Definition::ownedConnection"}}, + {Name: "ownedInterface", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedInterface", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#InterfaceUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Definition::ownedConnection"}}, + {Name: "ownedItem", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedItem", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ItemUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Definition::ownedOccurrence"}}, + {Name: "ownedMetadata", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedMetadata", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#MetadataUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Definition::ownedItem"}}, + {Name: "ownedOccurrence", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedOccurrence", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#OccurrenceUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Definition::ownedUsage"}}, + {Name: "ownedPart", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedPart", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PartUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Definition::ownedItem"}}, + {Name: "ownedPort", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedPort", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PortUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Definition::ownedUsage"}}, + {Name: "ownedReference", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedReference", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ReferenceUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Definition::ownedUsage"}}, + {Name: "ownedRendering", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedRendering", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RenderingUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Definition::ownedPart"}}, + {Name: "ownedRequirement", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedRequirement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RequirementUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Definition::ownedConstraint"}}, + {Name: "ownedState", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedState", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#StateUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Definition::ownedAction"}}, + {Name: "ownedTransition", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedTransition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#TransitionUsage", Many: true, Derived: true, Subsets: []string{"Definition::ownedUsage"}}, + {Name: "ownedUsage", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedUsage", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Usage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Type::ownedFeature", "Definition::usage"}, Opposite: "Usage::owningDefinition"}, + {Name: "ownedUseCase", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedUseCase", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#UseCaseUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Definition::ownedCase"}}, + {Name: "ownedVerificationCase", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedVerificationCase", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#VerificationCaseUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Definition::ownedCase"}}, + {Name: "ownedView", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedView", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ViewUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Definition::ownedPart"}}, + {Name: "ownedViewpoint", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedViewpoint", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ViewpointUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Definition::ownedRequirement"}}, + {Name: "usage", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_usage", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Usage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Type::feature"}}, + {Name: "variant", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_variant", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Usage", Many: true, Derived: true, Subsets: []string{"Namespace::ownedMember"}}, + {Name: "variantMembership", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_variantMembership", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#VariantMembership", Many: true, Derived: true, Subsets: []string{"Namespace::ownedMembership"}}, + {Name: "client", DefiningClass: "Dependency", IRI: "https://www.omg.org/spec/SysML#Dependency_client", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element", Many: true, Ordered: true, Redefines: []string{"Relationship::source"}}, + {Name: "supplier", DefiningClass: "Dependency", IRI: "https://www.omg.org/spec/SysML#Dependency_supplier", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element", Many: true, Ordered: true, Redefines: []string{"Relationship::target"}}, + {Name: "differencingType", DefiningClass: "Differencing", IRI: "https://www.omg.org/spec/SysML#Differencing_differencingType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Redefines: []string{"Relationship::target"}}, + {Name: "typeDifferenced", DefiningClass: "Differencing", IRI: "https://www.omg.org/spec/SysML#Differencing_typeDifferenced", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Derived: true, Redefines: []string{"Relationship::source"}, Subsets: []string{"Relationship::owningRelatedElement"}, Opposite: "Type::ownedDifferencing"}, + {Name: "disjoiningType", DefiningClass: "Disjoining", IRI: "https://www.omg.org/spec/SysML#Disjoining_disjoiningType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Redefines: []string{"Relationship::target"}}, + {Name: "owningType", DefiningClass: "Disjoining", IRI: "https://www.omg.org/spec/SysML#Disjoining_owningType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Derived: true, Subsets: []string{"Relationship::owningRelatedElement", "Disjoining::typeDisjoined"}, Opposite: "Type::ownedDisjoining"}, + {Name: "typeDisjoined", DefiningClass: "Disjoining", IRI: "https://www.omg.org/spec/SysML#Disjoining_typeDisjoined", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Redefines: []string{"Relationship::source"}}, + {Name: "documentedElement", DefiningClass: "Documentation", IRI: "https://www.omg.org/spec/SysML#Documentation_documentedElement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element", Derived: true, Redefines: []string{"AnnotatingElement::annotatedElement"}, Subsets: []string{"Element::owner"}, Opposite: "Element::documentation"}, + {Name: "condition", DefiningClass: "ElementFilterMembership", IRI: "https://www.omg.org/spec/SysML#ElementFilterMembership_condition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Derived: true, Redefines: []string{"OwningMembership::ownedMemberElement"}}, + {Name: "aliasIds", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_aliasIds", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string", Many: true, Ordered: true}, {Name: "declaredName", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_declaredName", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string"}, {Name: "declaredShortName", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_declaredShortName", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string"}, - {Name: "documentation", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_documentation", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Documentation", Many: true}, + {Name: "documentation", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_documentation", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Documentation", Many: true, Ordered: true, Derived: true, Subsets: []string{"Element::ownedElement"}, Opposite: "Documentation::documentedElement"}, {Name: "elementId", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_elementId", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string"}, {Name: "isImpliedIncluded", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_isImpliedIncluded", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean"}, - {Name: "isLibraryElement", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_isLibraryElement", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean"}, - {Name: "name", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_name", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string"}, - {Name: "ownedAnnotation", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_ownedAnnotation", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Annotation", Many: true}, - {Name: "ownedElement", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_ownedElement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element", Many: true}, - {Name: "ownedRelationship", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_ownedRelationship", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Relationship", Many: true}, - {Name: "owner", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_owner", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element"}, - {Name: "owningMembership", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_owningMembership", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#OwningMembership"}, - {Name: "owningNamespace", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_owningNamespace", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Namespace"}, - {Name: "owningRelationship", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_owningRelationship", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Relationship"}, - {Name: "qualifiedName", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_qualifiedName", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string"}, - {Name: "shortName", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_shortName", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string"}, - {Name: "textualRepresentation", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_textualRepresentation", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#TextualRepresentation", Many: true}, - {Name: "enumeratedValue", DefiningClass: "EnumerationDefinition", IRI: "https://www.omg.org/spec/SysML#EnumerationDefinition_enumeratedValue", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#EnumerationUsage", Many: true}, - {Name: "enumerationDefinition", DefiningClass: "EnumerationUsage", IRI: "https://www.omg.org/spec/SysML#EnumerationUsage_enumerationDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#EnumerationDefinition"}, - {Name: "eventOccurrence", DefiningClass: "EventOccurrenceUsage", IRI: "https://www.omg.org/spec/SysML#EventOccurrenceUsage_eventOccurrence", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#OccurrenceUsage"}, - {Name: "exhibitedState", DefiningClass: "ExhibitStateUsage", IRI: "https://www.omg.org/spec/SysML#ExhibitStateUsage_exhibitedState", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#StateUsage"}, - {Name: "function", DefiningClass: "Expression", IRI: "https://www.omg.org/spec/SysML#Expression_function", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Function"}, - {Name: "isModelLevelEvaluable", DefiningClass: "Expression", IRI: "https://www.omg.org/spec/SysML#Expression_isModelLevelEvaluable", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean"}, - {Name: "result", DefiningClass: "Expression", IRI: "https://www.omg.org/spec/SysML#Expression_result", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature"}, - {Name: "targetFeature", DefiningClass: "FeatureChainExpression", IRI: "https://www.omg.org/spec/SysML#FeatureChainExpression_targetFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature"}, - {Name: "chainingFeature", DefiningClass: "FeatureChaining", IRI: "https://www.omg.org/spec/SysML#FeatureChaining_chainingFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature"}, - {Name: "featureChained", DefiningClass: "FeatureChaining", IRI: "https://www.omg.org/spec/SysML#FeatureChaining_featureChained", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature"}, - {Name: "featureInverted", DefiningClass: "FeatureInverting", IRI: "https://www.omg.org/spec/SysML#FeatureInverting_featureInverted", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature"}, - {Name: "invertingFeature", DefiningClass: "FeatureInverting", IRI: "https://www.omg.org/spec/SysML#FeatureInverting_invertingFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature"}, - {Name: "owningFeature", DefiningClass: "FeatureInverting", IRI: "https://www.omg.org/spec/SysML#FeatureInverting_owningFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature"}, - {Name: "ownedMemberFeature", DefiningClass: "FeatureMembership", IRI: "https://www.omg.org/spec/SysML#FeatureMembership_ownedMemberFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature"}, - {Name: "owningType", DefiningClass: "FeatureMembership", IRI: "https://www.omg.org/spec/SysML#FeatureMembership_owningType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type"}, - {Name: "referent", DefiningClass: "FeatureReferenceExpression", IRI: "https://www.omg.org/spec/SysML#FeatureReferenceExpression_referent", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature"}, - {Name: "owningFeature", DefiningClass: "FeatureTyping", IRI: "https://www.omg.org/spec/SysML#FeatureTyping_owningFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature"}, - {Name: "type", DefiningClass: "FeatureTyping", IRI: "https://www.omg.org/spec/SysML#FeatureTyping_type", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type"}, - {Name: "typedFeature", DefiningClass: "FeatureTyping", IRI: "https://www.omg.org/spec/SysML#FeatureTyping_typedFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature"}, - {Name: "featureWithValue", DefiningClass: "FeatureValue", IRI: "https://www.omg.org/spec/SysML#FeatureValue_featureWithValue", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature"}, + {Name: "isLibraryElement", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_isLibraryElement", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean", Derived: true}, + {Name: "name", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_name", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string", Derived: true}, + {Name: "ownedAnnotation", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_ownedAnnotation", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Annotation", Many: true, Ordered: true, Derived: true, Subsets: []string{"Element::ownedRelationship"}, Opposite: "Annotation::owningAnnotatedElement"}, + {Name: "ownedElement", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_ownedElement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element", Many: true, Ordered: true, Derived: true, Opposite: "Element::owner"}, + {Name: "ownedRelationship", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_ownedRelationship", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Relationship", Many: true, Ordered: true, Opposite: "Relationship::owningRelatedElement"}, + {Name: "owner", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_owner", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element", Derived: true, Opposite: "Element::ownedElement"}, + {Name: "owningMembership", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_owningMembership", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#OwningMembership", Derived: true, Subsets: []string{"Element::owningRelationship"}, Opposite: "OwningMembership::ownedMemberElement"}, + {Name: "owningNamespace", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_owningNamespace", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Namespace", Derived: true, Opposite: "Namespace::ownedMember"}, + {Name: "owningRelationship", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_owningRelationship", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Relationship", Opposite: "Relationship::ownedRelatedElement"}, + {Name: "qualifiedName", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_qualifiedName", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string", Derived: true}, + {Name: "shortName", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_shortName", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string", Derived: true}, + {Name: "textualRepresentation", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_textualRepresentation", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#TextualRepresentation", Many: true, Ordered: true, Derived: true, Subsets: []string{"Element::ownedElement"}, Opposite: "TextualRepresentation::representedElement"}, + {Name: "enumeratedValue", DefiningClass: "EnumerationDefinition", IRI: "https://www.omg.org/spec/SysML#EnumerationDefinition_enumeratedValue", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#EnumerationUsage", Many: true, Ordered: true, Derived: true, Redefines: []string{"Definition::variant"}}, + {Name: "enumerationDefinition", DefiningClass: "EnumerationUsage", IRI: "https://www.omg.org/spec/SysML#EnumerationUsage_enumerationDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#EnumerationDefinition", Derived: true, Redefines: []string{"AttributeUsage::attributeDefinition"}}, + {Name: "eventOccurrence", DefiningClass: "EventOccurrenceUsage", IRI: "https://www.omg.org/spec/SysML#EventOccurrenceUsage_eventOccurrence", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#OccurrenceUsage", Derived: true}, + {Name: "exhibitedState", DefiningClass: "ExhibitStateUsage", IRI: "https://www.omg.org/spec/SysML#ExhibitStateUsage_exhibitedState", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#StateUsage", Derived: true, Redefines: []string{"PerformActionUsage::performedAction"}}, + {Name: "function", DefiningClass: "Expression", IRI: "https://www.omg.org/spec/SysML#Expression_function", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Function", Derived: true, Redefines: []string{"Step::behavior"}}, + {Name: "isModelLevelEvaluable", DefiningClass: "Expression", IRI: "https://www.omg.org/spec/SysML#Expression_isModelLevelEvaluable", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean", Derived: true}, + {Name: "result", DefiningClass: "Expression", IRI: "https://www.omg.org/spec/SysML#Expression_result", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Derived: true, Subsets: []string{"Type::output", "Step::parameter"}}, + {Name: "targetFeature", DefiningClass: "FeatureChainExpression", IRI: "https://www.omg.org/spec/SysML#FeatureChainExpression_targetFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Derived: true, Subsets: []string{"Namespace::member"}}, + {Name: "chainingFeature", DefiningClass: "FeatureChaining", IRI: "https://www.omg.org/spec/SysML#FeatureChaining_chainingFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Redefines: []string{"Relationship::target"}}, + {Name: "featureChained", DefiningClass: "FeatureChaining", IRI: "https://www.omg.org/spec/SysML#FeatureChaining_featureChained", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Derived: true, Redefines: []string{"Relationship::source"}, Subsets: []string{"Relationship::owningRelatedElement"}, Opposite: "Feature::ownedFeatureChaining"}, + {Name: "featureInverted", DefiningClass: "FeatureInverting", IRI: "https://www.omg.org/spec/SysML#FeatureInverting_featureInverted", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Redefines: []string{"Relationship::source"}}, + {Name: "invertingFeature", DefiningClass: "FeatureInverting", IRI: "https://www.omg.org/spec/SysML#FeatureInverting_invertingFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Redefines: []string{"Relationship::target"}}, + {Name: "owningFeature", DefiningClass: "FeatureInverting", IRI: "https://www.omg.org/spec/SysML#FeatureInverting_owningFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Derived: true, Subsets: []string{"FeatureInverting::featureInverted", "Relationship::owningRelatedElement"}, Opposite: "Feature::ownedFeatureInverting"}, + {Name: "ownedMemberFeature", DefiningClass: "FeatureMembership", IRI: "https://www.omg.org/spec/SysML#FeatureMembership_ownedMemberFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Derived: true, Redefines: []string{"OwningMembership::ownedMemberElement"}, Opposite: "Feature::owningFeatureMembership"}, + {Name: "owningType", DefiningClass: "FeatureMembership", IRI: "https://www.omg.org/spec/SysML#FeatureMembership_owningType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Derived: true, Redefines: []string{"Membership::membershipOwningNamespace"}, Opposite: "Type::ownedFeatureMembership"}, + {Name: "referent", DefiningClass: "FeatureReferenceExpression", IRI: "https://www.omg.org/spec/SysML#FeatureReferenceExpression_referent", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Derived: true, Subsets: []string{"Namespace::member"}}, + {Name: "owningFeature", DefiningClass: "FeatureTyping", IRI: "https://www.omg.org/spec/SysML#FeatureTyping_owningFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Derived: true, Redefines: []string{"Specialization::owningType"}, Subsets: []string{"FeatureTyping::typedFeature"}, Opposite: "Feature::ownedTyping"}, + {Name: "type", DefiningClass: "FeatureTyping", IRI: "https://www.omg.org/spec/SysML#FeatureTyping_type", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Redefines: []string{"Specialization::general"}}, + {Name: "typedFeature", DefiningClass: "FeatureTyping", IRI: "https://www.omg.org/spec/SysML#FeatureTyping_typedFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Redefines: []string{"Specialization::specific"}}, + {Name: "featureWithValue", DefiningClass: "FeatureValue", IRI: "https://www.omg.org/spec/SysML#FeatureValue_featureWithValue", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Derived: true, Subsets: []string{"Membership::membershipOwningNamespace"}}, {Name: "isDefault", DefiningClass: "FeatureValue", IRI: "https://www.omg.org/spec/SysML#FeatureValue_isDefault", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean"}, {Name: "isInitial", DefiningClass: "FeatureValue", IRI: "https://www.omg.org/spec/SysML#FeatureValue_isInitial", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean"}, - {Name: "value", DefiningClass: "FeatureValue", IRI: "https://www.omg.org/spec/SysML#FeatureValue_value", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression"}, - {Name: "chainingFeature", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_chainingFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Many: true}, + {Name: "value", DefiningClass: "FeatureValue", IRI: "https://www.omg.org/spec/SysML#FeatureValue_value", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Derived: true, Redefines: []string{"OwningMembership::ownedMemberElement"}}, + {Name: "chainingFeature", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_chainingFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Many: true, Ordered: true, Derived: true}, + {Name: "crossFeature", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_crossFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Derived: true}, {Name: "direction", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_direction", Kind: DatatypeProperty, Range: "https://www.omg.org/spec/SysML#FeatureDirectionKind"}, - {Name: "endOwningType", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_endOwningType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type"}, - {Name: "featureTarget", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_featureTarget", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature"}, - {Name: "featuringType", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_featuringType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Many: true}, + {Name: "endOwningType", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_endOwningType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Derived: true, Subsets: []string{"Feature::owningType"}, Opposite: "Type::ownedEndFeature"}, + {Name: "featureTarget", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_featureTarget", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Derived: true}, + {Name: "featuringType", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_featuringType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Many: true, Ordered: true, Derived: true}, {Name: "isComposite", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_isComposite", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean"}, + {Name: "isConstant", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_isConstant", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean"}, {Name: "isDerived", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_isDerived", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean"}, {Name: "isEnd", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_isEnd", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean"}, - {Name: "isNonunique", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_isNonunique", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean"}, {Name: "isOrdered", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_isOrdered", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean"}, {Name: "isPortion", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_isPortion", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean"}, - {Name: "isReadOnly", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_isReadOnly", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean"}, {Name: "isUnique", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_isUnique", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean"}, - {Name: "ownedFeatureChaining", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_ownedFeatureChaining", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#FeatureChaining", Many: true}, - {Name: "ownedFeatureInverting", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_ownedFeatureInverting", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#FeatureInverting", Many: true}, - {Name: "ownedRedefinition", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_ownedRedefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Redefinition", Many: true}, - {Name: "ownedReferenceSubsetting", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_ownedReferenceSubsetting", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ReferenceSubsetting"}, - {Name: "ownedSubsetting", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_ownedSubsetting", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Subsetting", Many: true}, - {Name: "ownedTypeFeaturing", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_ownedTypeFeaturing", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#TypeFeaturing", Many: true}, - {Name: "ownedTyping", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_ownedTyping", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#FeatureTyping", Many: true}, - {Name: "owningFeatureMembership", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_owningFeatureMembership", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#FeatureMembership"}, - {Name: "owningType", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_owningType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type"}, - {Name: "type", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_type", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Many: true}, - {Name: "feature", DefiningClass: "Featuring", IRI: "https://www.omg.org/spec/SysML#Featuring_feature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature"}, - {Name: "type", DefiningClass: "Featuring", IRI: "https://www.omg.org/spec/SysML#Featuring_type", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type"}, - {Name: "flowConnectionDefinition", DefiningClass: "FlowConnectionUsage", IRI: "https://www.omg.org/spec/SysML#FlowConnectionUsage_flowConnectionDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Interaction", Many: true}, - {Name: "loopVariable", DefiningClass: "ForLoopActionUsage", IRI: "https://www.omg.org/spec/SysML#ForLoopActionUsage_loopVariable", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ReferenceUsage"}, - {Name: "seqArgument", DefiningClass: "ForLoopActionUsage", IRI: "https://www.omg.org/spec/SysML#ForLoopActionUsage_seqArgument", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression"}, - {Name: "ownedConcern", DefiningClass: "FramedConcernMembership", IRI: "https://www.omg.org/spec/SysML#FramedConcernMembership_ownedConcern", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConcernUsage"}, - {Name: "referencedConcern", DefiningClass: "FramedConcernMembership", IRI: "https://www.omg.org/spec/SysML#FramedConcernMembership_referencedConcern", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConcernUsage"}, - {Name: "expression", DefiningClass: "Function", IRI: "https://www.omg.org/spec/SysML#Function_expression", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Many: true}, - {Name: "isModelLevelEvaluable", DefiningClass: "Function", IRI: "https://www.omg.org/spec/SysML#Function_isModelLevelEvaluable", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean"}, - {Name: "result", DefiningClass: "Function", IRI: "https://www.omg.org/spec/SysML#Function_result", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature"}, - {Name: "elseAction", DefiningClass: "IfActionUsage", IRI: "https://www.omg.org/spec/SysML#IfActionUsage_elseAction", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ActionUsage"}, - {Name: "ifArgument", DefiningClass: "IfActionUsage", IRI: "https://www.omg.org/spec/SysML#IfActionUsage_ifArgument", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression"}, - {Name: "thenAction", DefiningClass: "IfActionUsage", IRI: "https://www.omg.org/spec/SysML#IfActionUsage_thenAction", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ActionUsage"}, - {Name: "importOwningNamespace", DefiningClass: "Import", IRI: "https://www.omg.org/spec/SysML#Import_importOwningNamespace", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Namespace"}, - {Name: "importedElement", DefiningClass: "Import", IRI: "https://www.omg.org/spec/SysML#Import_importedElement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element"}, + {Name: "isVariable", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_isVariable", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean"}, + {Name: "ownedCrossSubsetting", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_ownedCrossSubsetting", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#CrossSubsetting", Derived: true, Subsets: []string{"Feature::ownedSubsetting"}, Opposite: "CrossSubsetting::crossingFeature"}, + {Name: "ownedFeatureChaining", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_ownedFeatureChaining", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#FeatureChaining", Many: true, Ordered: true, Derived: true, Subsets: []string{"Element::ownedRelationship"}, Opposite: "FeatureChaining::featureChained"}, + {Name: "ownedFeatureInverting", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_ownedFeatureInverting", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#FeatureInverting", Many: true, Derived: true, Subsets: []string{"Element::ownedRelationship"}, Opposite: "FeatureInverting::owningFeature"}, + {Name: "ownedRedefinition", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_ownedRedefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Redefinition", Many: true, Derived: true, Subsets: []string{"Feature::ownedSubsetting"}}, + {Name: "ownedReferenceSubsetting", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_ownedReferenceSubsetting", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ReferenceSubsetting", Derived: true, Subsets: []string{"Feature::ownedSubsetting"}, Opposite: "ReferenceSubsetting::referencingFeature"}, + {Name: "ownedSubsetting", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_ownedSubsetting", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Subsetting", Many: true, Derived: true, Subsets: []string{"Type::ownedSpecialization"}, Opposite: "Subsetting::owningFeature"}, + {Name: "ownedTypeFeaturing", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_ownedTypeFeaturing", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#TypeFeaturing", Many: true, Ordered: true, Derived: true, Subsets: []string{"Element::ownedRelationship"}, Opposite: "TypeFeaturing::owningFeatureOfType"}, + {Name: "ownedTyping", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_ownedTyping", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#FeatureTyping", Many: true, Ordered: true, Derived: true, Subsets: []string{"Type::ownedSpecialization"}, Opposite: "FeatureTyping::owningFeature"}, + {Name: "owningFeatureMembership", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_owningFeatureMembership", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#FeatureMembership", Derived: true, Subsets: []string{"Element::owningMembership"}, Opposite: "FeatureMembership::ownedMemberFeature"}, + {Name: "owningType", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_owningType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Derived: true, Subsets: []string{"Element::owningNamespace", "Feature::featuringType"}, Opposite: "Type::ownedFeature"}, + {Name: "type", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_type", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Many: true, Ordered: true, Derived: true}, + {Name: "flowEnd", DefiningClass: "FlowDefinition", IRI: "https://www.omg.org/spec/SysML#FlowDefinition_flowEnd", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Usage", Many: true, Derived: true, Redefines: []string{"Association::associationEnd"}}, + {Name: "flowDefinition", DefiningClass: "FlowUsage", IRI: "https://www.omg.org/spec/SysML#FlowUsage_flowDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Interaction", Many: true, Ordered: true, Derived: true, Redefines: []string{"ActionUsage::actionDefinition", "Flow::interaction"}}, + {Name: "flowEnd", DefiningClass: "Flow", IRI: "https://www.omg.org/spec/SysML#Flow_flowEnd", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#FlowEnd", Derived: true, Subsets: []string{"Connector::connectorEnd"}}, + {Name: "interaction", DefiningClass: "Flow", IRI: "https://www.omg.org/spec/SysML#Flow_interaction", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Interaction", Many: true, Ordered: true, Derived: true, Redefines: []string{"Connector::association", "Step::behavior"}}, + {Name: "payloadFeature", DefiningClass: "Flow", IRI: "https://www.omg.org/spec/SysML#Flow_payloadFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PayloadFeature", Derived: true, Subsets: []string{"Type::ownedFeature"}}, + {Name: "payloadType", DefiningClass: "Flow", IRI: "https://www.omg.org/spec/SysML#Flow_payloadType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Classifier", Many: true, Ordered: true, Derived: true}, + {Name: "sourceOutputFeature", DefiningClass: "Flow", IRI: "https://www.omg.org/spec/SysML#Flow_sourceOutputFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Derived: true}, + {Name: "targetInputFeature", DefiningClass: "Flow", IRI: "https://www.omg.org/spec/SysML#Flow_targetInputFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Derived: true}, + {Name: "loopVariable", DefiningClass: "ForLoopActionUsage", IRI: "https://www.omg.org/spec/SysML#ForLoopActionUsage_loopVariable", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ReferenceUsage", Derived: true}, + {Name: "seqArgument", DefiningClass: "ForLoopActionUsage", IRI: "https://www.omg.org/spec/SysML#ForLoopActionUsage_seqArgument", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Derived: true}, + {Name: "ownedConcern", DefiningClass: "FramedConcernMembership", IRI: "https://www.omg.org/spec/SysML#FramedConcernMembership_ownedConcern", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConcernUsage", Derived: true, Redefines: []string{"RequirementConstraintMembership::ownedConstraint"}}, + {Name: "referencedConcern", DefiningClass: "FramedConcernMembership", IRI: "https://www.omg.org/spec/SysML#FramedConcernMembership_referencedConcern", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConcernUsage", Derived: true, Redefines: []string{"RequirementConstraintMembership::referencedConstraint"}}, + {Name: "expression", DefiningClass: "Function", IRI: "https://www.omg.org/spec/SysML#Function_expression", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Many: true, Derived: true, Subsets: []string{"Behavior::step"}}, + {Name: "isModelLevelEvaluable", DefiningClass: "Function", IRI: "https://www.omg.org/spec/SysML#Function_isModelLevelEvaluable", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean", Derived: true}, + {Name: "result", DefiningClass: "Function", IRI: "https://www.omg.org/spec/SysML#Function_result", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Derived: true, Subsets: []string{"Type::output", "Behavior::parameter"}}, + {Name: "elseAction", DefiningClass: "IfActionUsage", IRI: "https://www.omg.org/spec/SysML#IfActionUsage_elseAction", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ActionUsage", Derived: true}, + {Name: "ifArgument", DefiningClass: "IfActionUsage", IRI: "https://www.omg.org/spec/SysML#IfActionUsage_ifArgument", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Derived: true}, + {Name: "thenAction", DefiningClass: "IfActionUsage", IRI: "https://www.omg.org/spec/SysML#IfActionUsage_thenAction", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ActionUsage", Derived: true}, + {Name: "importOwningNamespace", DefiningClass: "Import", IRI: "https://www.omg.org/spec/SysML#Import_importOwningNamespace", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Namespace", Derived: true, Redefines: []string{"Relationship::source"}, Subsets: []string{"Relationship::owningRelatedElement"}, Opposite: "Namespace::ownedImport"}, + {Name: "importedElement", DefiningClass: "Import", IRI: "https://www.omg.org/spec/SysML#Import_importedElement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element", Derived: true}, {Name: "isImportAll", DefiningClass: "Import", IRI: "https://www.omg.org/spec/SysML#Import_isImportAll", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean"}, {Name: "isRecursive", DefiningClass: "Import", IRI: "https://www.omg.org/spec/SysML#Import_isRecursive", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean"}, {Name: "visibility", DefiningClass: "Import", IRI: "https://www.omg.org/spec/SysML#Import_visibility", Kind: DatatypeProperty, Range: "https://www.omg.org/spec/SysML#VisibilityKind"}, - {Name: "useCaseIncluded", DefiningClass: "IncludeUseCaseUsage", IRI: "https://www.omg.org/spec/SysML#IncludeUseCaseUsage_useCaseIncluded", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#UseCaseUsage"}, - {Name: "interfaceEnd", DefiningClass: "InterfaceDefinition", IRI: "https://www.omg.org/spec/SysML#InterfaceDefinition_interfaceEnd", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PortUsage", Many: true}, - {Name: "interfaceDefinition", DefiningClass: "InterfaceUsage", IRI: "https://www.omg.org/spec/SysML#InterfaceUsage_interfaceDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#InterfaceDefinition", Many: true}, - {Name: "intersectingType", DefiningClass: "Intersecting", IRI: "https://www.omg.org/spec/SysML#Intersecting_intersectingType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type"}, - {Name: "typeIntersected", DefiningClass: "Intersecting", IRI: "https://www.omg.org/spec/SysML#Intersecting_typeIntersected", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type"}, + {Name: "useCaseIncluded", DefiningClass: "IncludeUseCaseUsage", IRI: "https://www.omg.org/spec/SysML#IncludeUseCaseUsage_useCaseIncluded", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#UseCaseUsage", Derived: true, Redefines: []string{"PerformActionUsage::performedAction"}}, + {Name: "argument", DefiningClass: "InstantiationExpression", IRI: "https://www.omg.org/spec/SysML#InstantiationExpression_argument", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Many: true, Ordered: true, Derived: true}, + {Name: "instantiatedType", DefiningClass: "InstantiationExpression", IRI: "https://www.omg.org/spec/SysML#InstantiationExpression_instantiatedType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Derived: true, Subsets: []string{"Namespace::member"}}, + {Name: "interfaceEnd", DefiningClass: "InterfaceDefinition", IRI: "https://www.omg.org/spec/SysML#InterfaceDefinition_interfaceEnd", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PortUsage", Many: true, Ordered: true, Derived: true, Redefines: []string{"ConnectionDefinition::connectionEnd"}}, + {Name: "interfaceDefinition", DefiningClass: "InterfaceUsage", IRI: "https://www.omg.org/spec/SysML#InterfaceUsage_interfaceDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#InterfaceDefinition", Many: true, Derived: true, Redefines: []string{"ConnectionUsage::connectionDefinition"}}, + {Name: "intersectingType", DefiningClass: "Intersecting", IRI: "https://www.omg.org/spec/SysML#Intersecting_intersectingType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Redefines: []string{"Relationship::target"}}, + {Name: "typeIntersected", DefiningClass: "Intersecting", IRI: "https://www.omg.org/spec/SysML#Intersecting_typeIntersected", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Derived: true, Redefines: []string{"Relationship::source"}, Subsets: []string{"Relationship::owningRelatedElement"}, Opposite: "Type::ownedIntersecting"}, {Name: "isNegated", DefiningClass: "Invariant", IRI: "https://www.omg.org/spec/SysML#Invariant_isNegated", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean"}, - {Name: "argument", DefiningClass: "InvocationExpression", IRI: "https://www.omg.org/spec/SysML#InvocationExpression_argument", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Many: true}, - {Name: "operand", DefiningClass: "InvocationExpression", IRI: "https://www.omg.org/spec/SysML#InvocationExpression_operand", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Many: true}, - {Name: "interaction", DefiningClass: "ItemFlow", IRI: "https://www.omg.org/spec/SysML#ItemFlow_interaction", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Interaction", Many: true}, - {Name: "itemFeature", DefiningClass: "ItemFlow", IRI: "https://www.omg.org/spec/SysML#ItemFlow_itemFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ItemFeature"}, - {Name: "itemFlowEnd", DefiningClass: "ItemFlow", IRI: "https://www.omg.org/spec/SysML#ItemFlow_itemFlowEnd", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ItemFlowEnd"}, - {Name: "itemType", DefiningClass: "ItemFlow", IRI: "https://www.omg.org/spec/SysML#ItemFlow_itemType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Classifier", Many: true}, - {Name: "sourceOutputFeature", DefiningClass: "ItemFlow", IRI: "https://www.omg.org/spec/SysML#ItemFlow_sourceOutputFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature"}, - {Name: "targetInputFeature", DefiningClass: "ItemFlow", IRI: "https://www.omg.org/spec/SysML#ItemFlow_targetInputFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature"}, - {Name: "itemDefinition", DefiningClass: "ItemUsage", IRI: "https://www.omg.org/spec/SysML#ItemUsage_itemDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Structure", Many: true}, + {Name: "operand", DefiningClass: "InvocationExpression", IRI: "https://www.omg.org/spec/SysML#InvocationExpression_operand", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Many: true, Ordered: true, Derived: true}, + {Name: "itemDefinition", DefiningClass: "ItemUsage", IRI: "https://www.omg.org/spec/SysML#ItemUsage_itemDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Structure", Many: true, Ordered: true, Derived: true, Subsets: []string{"OccurrenceUsage::occurrenceDefinition"}}, {Name: "isStandard", DefiningClass: "LibraryPackage", IRI: "https://www.omg.org/spec/SysML#LibraryPackage_isStandard", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean"}, {Name: "value", DefiningClass: "LiteralBoolean", IRI: "https://www.omg.org/spec/SysML#LiteralBoolean_value", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean"}, {Name: "value", DefiningClass: "LiteralInteger", IRI: "https://www.omg.org/spec/SysML#LiteralInteger_value", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#int"}, {Name: "value", DefiningClass: "LiteralRational", IRI: "https://www.omg.org/spec/SysML#LiteralRational_value", Kind: DatatypeProperty, Range: "http://www.w3.org/2002/07/owl#real"}, {Name: "value", DefiningClass: "LiteralString", IRI: "https://www.omg.org/spec/SysML#LiteralString_value", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string"}, - {Name: "bodyAction", DefiningClass: "LoopActionUsage", IRI: "https://www.omg.org/spec/SysML#LoopActionUsage_bodyAction", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ActionUsage"}, - {Name: "importedMembership", DefiningClass: "MembershipImport", IRI: "https://www.omg.org/spec/SysML#MembershipImport_importedMembership", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Membership"}, - {Name: "memberElement", DefiningClass: "Membership", IRI: "https://www.omg.org/spec/SysML#Membership_memberElement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element"}, - {Name: "memberElementId", DefiningClass: "Membership", IRI: "https://www.omg.org/spec/SysML#Membership_memberElementId", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string"}, + {Name: "bodyAction", DefiningClass: "LoopActionUsage", IRI: "https://www.omg.org/spec/SysML#LoopActionUsage_bodyAction", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ActionUsage", Derived: true}, + {Name: "importedMembership", DefiningClass: "MembershipImport", IRI: "https://www.omg.org/spec/SysML#MembershipImport_importedMembership", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Membership", Redefines: []string{"Relationship::target"}}, + {Name: "memberElement", DefiningClass: "Membership", IRI: "https://www.omg.org/spec/SysML#Membership_memberElement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element", Redefines: []string{"Relationship::target"}}, + {Name: "memberElementId", DefiningClass: "Membership", IRI: "https://www.omg.org/spec/SysML#Membership_memberElementId", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string", Derived: true}, {Name: "memberName", DefiningClass: "Membership", IRI: "https://www.omg.org/spec/SysML#Membership_memberName", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string"}, {Name: "memberShortName", DefiningClass: "Membership", IRI: "https://www.omg.org/spec/SysML#Membership_memberShortName", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string"}, - {Name: "membershipOwningNamespace", DefiningClass: "Membership", IRI: "https://www.omg.org/spec/SysML#Membership_membershipOwningNamespace", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Namespace"}, + {Name: "membershipOwningNamespace", DefiningClass: "Membership", IRI: "https://www.omg.org/spec/SysML#Membership_membershipOwningNamespace", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Namespace", Derived: true, Redefines: []string{"Relationship::source"}, Subsets: []string{"Relationship::owningRelatedElement"}, Opposite: "Namespace::ownedMembership"}, {Name: "visibility", DefiningClass: "Membership", IRI: "https://www.omg.org/spec/SysML#Membership_visibility", Kind: DatatypeProperty, Range: "https://www.omg.org/spec/SysML#VisibilityKind"}, - {Name: "referencedElement", DefiningClass: "MetadataAccessExpression", IRI: "https://www.omg.org/spec/SysML#MetadataAccessExpression_referencedElement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element"}, - {Name: "metaclass", DefiningClass: "MetadataFeature", IRI: "https://www.omg.org/spec/SysML#MetadataFeature_metaclass", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Metaclass"}, - {Name: "metadataDefinition", DefiningClass: "MetadataUsage", IRI: "https://www.omg.org/spec/SysML#MetadataUsage_metadataDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Metaclass"}, - {Name: "bound", DefiningClass: "MultiplicityRange", IRI: "https://www.omg.org/spec/SysML#MultiplicityRange_bound", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression"}, - {Name: "lowerBound", DefiningClass: "MultiplicityRange", IRI: "https://www.omg.org/spec/SysML#MultiplicityRange_lowerBound", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression"}, - {Name: "upperBound", DefiningClass: "MultiplicityRange", IRI: "https://www.omg.org/spec/SysML#MultiplicityRange_upperBound", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression"}, - {Name: "importedNamespace", DefiningClass: "NamespaceImport", IRI: "https://www.omg.org/spec/SysML#NamespaceImport_importedNamespace", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Namespace"}, - {Name: "importedMembership", DefiningClass: "Namespace", IRI: "https://www.omg.org/spec/SysML#Namespace_importedMembership", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Membership", Many: true}, - {Name: "member", DefiningClass: "Namespace", IRI: "https://www.omg.org/spec/SysML#Namespace_member", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element", Many: true}, - {Name: "membership", DefiningClass: "Namespace", IRI: "https://www.omg.org/spec/SysML#Namespace_membership", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Membership", Many: true}, - {Name: "ownedImport", DefiningClass: "Namespace", IRI: "https://www.omg.org/spec/SysML#Namespace_ownedImport", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Import", Many: true}, - {Name: "ownedMember", DefiningClass: "Namespace", IRI: "https://www.omg.org/spec/SysML#Namespace_ownedMember", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element", Many: true}, - {Name: "ownedMembership", DefiningClass: "Namespace", IRI: "https://www.omg.org/spec/SysML#Namespace_ownedMembership", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Membership", Many: true}, - {Name: "ownedObjectiveRequirement", DefiningClass: "ObjectiveMembership", IRI: "https://www.omg.org/spec/SysML#ObjectiveMembership_ownedObjectiveRequirement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RequirementUsage"}, + {Name: "referencedElement", DefiningClass: "MetadataAccessExpression", IRI: "https://www.omg.org/spec/SysML#MetadataAccessExpression_referencedElement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element", Derived: true, Subsets: []string{"Namespace::member"}}, + {Name: "metaclass", DefiningClass: "MetadataFeature", IRI: "https://www.omg.org/spec/SysML#MetadataFeature_metaclass", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Metaclass", Derived: true, Subsets: []string{"Feature::type"}}, + {Name: "metadataDefinition", DefiningClass: "MetadataUsage", IRI: "https://www.omg.org/spec/SysML#MetadataUsage_metadataDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Metaclass", Derived: true, Redefines: []string{"ItemUsage::itemDefinition", "MetadataFeature::metaclass"}}, + {Name: "bound", DefiningClass: "MultiplicityRange", IRI: "https://www.omg.org/spec/SysML#MultiplicityRange_bound", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Derived: true, Subsets: []string{"Namespace::ownedMember"}}, + {Name: "lowerBound", DefiningClass: "MultiplicityRange", IRI: "https://www.omg.org/spec/SysML#MultiplicityRange_lowerBound", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Derived: true, Subsets: []string{"MultiplicityRange::bound"}}, + {Name: "upperBound", DefiningClass: "MultiplicityRange", IRI: "https://www.omg.org/spec/SysML#MultiplicityRange_upperBound", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Derived: true, Subsets: []string{"MultiplicityRange::bound"}}, + {Name: "importedNamespace", DefiningClass: "NamespaceImport", IRI: "https://www.omg.org/spec/SysML#NamespaceImport_importedNamespace", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Namespace", Redefines: []string{"Relationship::target"}}, + {Name: "importedMembership", DefiningClass: "Namespace", IRI: "https://www.omg.org/spec/SysML#Namespace_importedMembership", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Membership", Many: true, Ordered: true, Derived: true, Subsets: []string{"Namespace::membership"}}, + {Name: "member", DefiningClass: "Namespace", IRI: "https://www.omg.org/spec/SysML#Namespace_member", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element", Many: true, Ordered: true, Derived: true}, + {Name: "membership", DefiningClass: "Namespace", IRI: "https://www.omg.org/spec/SysML#Namespace_membership", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Membership", Many: true, Ordered: true, Derived: true}, + {Name: "ownedImport", DefiningClass: "Namespace", IRI: "https://www.omg.org/spec/SysML#Namespace_ownedImport", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Import", Many: true, Ordered: true, Derived: true, Subsets: []string{"Element::ownedRelationship"}, Opposite: "Import::importOwningNamespace"}, + {Name: "ownedMember", DefiningClass: "Namespace", IRI: "https://www.omg.org/spec/SysML#Namespace_ownedMember", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element", Many: true, Ordered: true, Derived: true, Subsets: []string{"Namespace::member"}, Opposite: "Element::owningNamespace"}, + {Name: "ownedMembership", DefiningClass: "Namespace", IRI: "https://www.omg.org/spec/SysML#Namespace_ownedMembership", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Membership", Many: true, Ordered: true, Derived: true, Subsets: []string{"Namespace::membership", "Element::ownedRelationship"}, Opposite: "Membership::membershipOwningNamespace"}, + {Name: "ownedObjectiveRequirement", DefiningClass: "ObjectiveMembership", IRI: "https://www.omg.org/spec/SysML#ObjectiveMembership_ownedObjectiveRequirement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RequirementUsage", Derived: true, Redefines: []string{"FeatureMembership::ownedMemberFeature"}}, {Name: "isIndividual", DefiningClass: "OccurrenceDefinition", IRI: "https://www.omg.org/spec/SysML#OccurrenceDefinition_isIndividual", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean"}, - {Name: "lifeClass", DefiningClass: "OccurrenceDefinition", IRI: "https://www.omg.org/spec/SysML#OccurrenceDefinition_lifeClass", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#LifeClass"}, - {Name: "individualDefinition", DefiningClass: "OccurrenceUsage", IRI: "https://www.omg.org/spec/SysML#OccurrenceUsage_individualDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#OccurrenceDefinition"}, + {Name: "individualDefinition", DefiningClass: "OccurrenceUsage", IRI: "https://www.omg.org/spec/SysML#OccurrenceUsage_individualDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#OccurrenceDefinition", Derived: true, Subsets: []string{"OccurrenceUsage::occurrenceDefinition"}}, {Name: "isIndividual", DefiningClass: "OccurrenceUsage", IRI: "https://www.omg.org/spec/SysML#OccurrenceUsage_isIndividual", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean"}, - {Name: "occurrenceDefinition", DefiningClass: "OccurrenceUsage", IRI: "https://www.omg.org/spec/SysML#OccurrenceUsage_occurrenceDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Class", Many: true}, + {Name: "occurrenceDefinition", DefiningClass: "OccurrenceUsage", IRI: "https://www.omg.org/spec/SysML#OccurrenceUsage_occurrenceDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Class", Many: true, Ordered: true, Derived: true, Redefines: []string{"Usage::definition"}}, {Name: "portionKind", DefiningClass: "OccurrenceUsage", IRI: "https://www.omg.org/spec/SysML#OccurrenceUsage_portionKind", Kind: DatatypeProperty, Range: "https://www.omg.org/spec/SysML#PortionKind"}, {Name: "operator", DefiningClass: "OperatorExpression", IRI: "https://www.omg.org/spec/SysML#OperatorExpression_operator", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string"}, - {Name: "ownedMemberElement", DefiningClass: "OwningMembership", IRI: "https://www.omg.org/spec/SysML#OwningMembership_ownedMemberElement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element"}, - {Name: "ownedMemberElementId", DefiningClass: "OwningMembership", IRI: "https://www.omg.org/spec/SysML#OwningMembership_ownedMemberElementId", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string"}, - {Name: "ownedMemberName", DefiningClass: "OwningMembership", IRI: "https://www.omg.org/spec/SysML#OwningMembership_ownedMemberName", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string"}, - {Name: "ownedMemberShortName", DefiningClass: "OwningMembership", IRI: "https://www.omg.org/spec/SysML#OwningMembership_ownedMemberShortName", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string"}, - {Name: "filterCondition", DefiningClass: "Package", IRI: "https://www.omg.org/spec/SysML#Package_filterCondition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Many: true}, - {Name: "ownedMemberParameter", DefiningClass: "ParameterMembership", IRI: "https://www.omg.org/spec/SysML#ParameterMembership_ownedMemberParameter", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature"}, - {Name: "partDefinition", DefiningClass: "PartUsage", IRI: "https://www.omg.org/spec/SysML#PartUsage_partDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PartDefinition", Many: true}, - {Name: "performedAction", DefiningClass: "PerformActionUsage", IRI: "https://www.omg.org/spec/SysML#PerformActionUsage_performedAction", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ActionUsage"}, - {Name: "conjugatedPortDefinition", DefiningClass: "PortConjugation", IRI: "https://www.omg.org/spec/SysML#PortConjugation_conjugatedPortDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConjugatedPortDefinition"}, - {Name: "originalPortDefinition", DefiningClass: "PortConjugation", IRI: "https://www.omg.org/spec/SysML#PortConjugation_originalPortDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PortDefinition"}, - {Name: "conjugatedPortDefinition", DefiningClass: "PortDefinition", IRI: "https://www.omg.org/spec/SysML#PortDefinition_conjugatedPortDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConjugatedPortDefinition"}, - {Name: "portDefinition", DefiningClass: "PortUsage", IRI: "https://www.omg.org/spec/SysML#PortUsage_portDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PortDefinition", Many: true}, - {Name: "redefinedFeature", DefiningClass: "Redefinition", IRI: "https://www.omg.org/spec/SysML#Redefinition_redefinedFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature"}, - {Name: "redefiningFeature", DefiningClass: "Redefinition", IRI: "https://www.omg.org/spec/SysML#Redefinition_redefiningFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature"}, - {Name: "referencedFeature", DefiningClass: "ReferenceSubsetting", IRI: "https://www.omg.org/spec/SysML#ReferenceSubsetting_referencedFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature"}, - {Name: "referencingFeature", DefiningClass: "ReferenceSubsetting", IRI: "https://www.omg.org/spec/SysML#ReferenceSubsetting_referencingFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature"}, + {Name: "ownedMemberElement", DefiningClass: "OwningMembership", IRI: "https://www.omg.org/spec/SysML#OwningMembership_ownedMemberElement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element", Derived: true, Redefines: []string{"Membership::memberElement"}, Subsets: []string{"Relationship::ownedRelatedElement"}, Opposite: "Element::owningMembership"}, + {Name: "ownedMemberElementId", DefiningClass: "OwningMembership", IRI: "https://www.omg.org/spec/SysML#OwningMembership_ownedMemberElementId", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string", Derived: true, Redefines: []string{"Membership::memberElementId"}}, + {Name: "ownedMemberName", DefiningClass: "OwningMembership", IRI: "https://www.omg.org/spec/SysML#OwningMembership_ownedMemberName", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string", Derived: true, Redefines: []string{"Membership::memberName"}}, + {Name: "ownedMemberShortName", DefiningClass: "OwningMembership", IRI: "https://www.omg.org/spec/SysML#OwningMembership_ownedMemberShortName", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string", Derived: true, Redefines: []string{"Membership::memberShortName"}}, + {Name: "filterCondition", DefiningClass: "Package", IRI: "https://www.omg.org/spec/SysML#Package_filterCondition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Many: true, Ordered: true, Derived: true, Subsets: []string{"Namespace::ownedMember"}}, + {Name: "ownedMemberParameter", DefiningClass: "ParameterMembership", IRI: "https://www.omg.org/spec/SysML#ParameterMembership_ownedMemberParameter", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Derived: true, Redefines: []string{"FeatureMembership::ownedMemberFeature"}}, + {Name: "partDefinition", DefiningClass: "PartUsage", IRI: "https://www.omg.org/spec/SysML#PartUsage_partDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PartDefinition", Many: true, Ordered: true, Derived: true, Subsets: []string{"ItemUsage::itemDefinition"}}, + {Name: "performedAction", DefiningClass: "PerformActionUsage", IRI: "https://www.omg.org/spec/SysML#PerformActionUsage_performedAction", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ActionUsage", Derived: true, Redefines: []string{"EventOccurrenceUsage::eventOccurrence"}}, + {Name: "conjugatedPortDefinition", DefiningClass: "PortConjugation", IRI: "https://www.omg.org/spec/SysML#PortConjugation_conjugatedPortDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConjugatedPortDefinition", Derived: true, Redefines: []string{"Conjugation::owningType"}, Opposite: "ConjugatedPortDefinition::ownedPortConjugator"}, + {Name: "originalPortDefinition", DefiningClass: "PortConjugation", IRI: "https://www.omg.org/spec/SysML#PortConjugation_originalPortDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PortDefinition", Redefines: []string{"Conjugation::originalType"}}, + {Name: "conjugatedPortDefinition", DefiningClass: "PortDefinition", IRI: "https://www.omg.org/spec/SysML#PortDefinition_conjugatedPortDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConjugatedPortDefinition", Derived: true, Subsets: []string{"Namespace::ownedMember"}, Opposite: "ConjugatedPortDefinition::originalPortDefinition"}, + {Name: "portDefinition", DefiningClass: "PortUsage", IRI: "https://www.omg.org/spec/SysML#PortUsage_portDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PortDefinition", Many: true, Ordered: true, Derived: true, Redefines: []string{"OccurrenceUsage::occurrenceDefinition"}}, + {Name: "redefinedFeature", DefiningClass: "Redefinition", IRI: "https://www.omg.org/spec/SysML#Redefinition_redefinedFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Redefines: []string{"Subsetting::subsettedFeature"}}, + {Name: "redefiningFeature", DefiningClass: "Redefinition", IRI: "https://www.omg.org/spec/SysML#Redefinition_redefiningFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Redefines: []string{"Subsetting::subsettingFeature"}}, + {Name: "referencedFeature", DefiningClass: "ReferenceSubsetting", IRI: "https://www.omg.org/spec/SysML#ReferenceSubsetting_referencedFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Redefines: []string{"Subsetting::subsettedFeature"}}, + {Name: "referencingFeature", DefiningClass: "ReferenceSubsetting", IRI: "https://www.omg.org/spec/SysML#ReferenceSubsetting_referencingFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Derived: true, Redefines: []string{"Subsetting::owningFeature", "Subsetting::subsettingFeature"}, Opposite: "Feature::ownedReferenceSubsetting"}, {Name: "isImplied", DefiningClass: "Relationship", IRI: "https://www.omg.org/spec/SysML#Relationship_isImplied", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean"}, - {Name: "ownedRelatedElement", DefiningClass: "Relationship", IRI: "https://www.omg.org/spec/SysML#Relationship_ownedRelatedElement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element", Many: true}, - {Name: "owningRelatedElement", DefiningClass: "Relationship", IRI: "https://www.omg.org/spec/SysML#Relationship_owningRelatedElement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element"}, - {Name: "relatedElement", DefiningClass: "Relationship", IRI: "https://www.omg.org/spec/SysML#Relationship_relatedElement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element", Many: true}, - {Name: "source", DefiningClass: "Relationship", IRI: "https://www.omg.org/spec/SysML#Relationship_source", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element", Many: true}, - {Name: "target", DefiningClass: "Relationship", IRI: "https://www.omg.org/spec/SysML#Relationship_target", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element", Many: true}, - {Name: "rendering", DefiningClass: "RenderingDefinition", IRI: "https://www.omg.org/spec/SysML#RenderingDefinition_rendering", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RenderingUsage", Many: true}, - {Name: "renderingDefinition", DefiningClass: "RenderingUsage", IRI: "https://www.omg.org/spec/SysML#RenderingUsage_renderingDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RenderingDefinition"}, + {Name: "ownedRelatedElement", DefiningClass: "Relationship", IRI: "https://www.omg.org/spec/SysML#Relationship_ownedRelatedElement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element", Many: true, Ordered: true, Subsets: []string{"Relationship::relatedElement"}, Opposite: "Element::owningRelationship"}, + {Name: "owningRelatedElement", DefiningClass: "Relationship", IRI: "https://www.omg.org/spec/SysML#Relationship_owningRelatedElement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element", Subsets: []string{"Relationship::relatedElement"}, Opposite: "Element::ownedRelationship"}, + {Name: "relatedElement", DefiningClass: "Relationship", IRI: "https://www.omg.org/spec/SysML#Relationship_relatedElement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element", Many: true, Ordered: true, Derived: true}, + {Name: "source", DefiningClass: "Relationship", IRI: "https://www.omg.org/spec/SysML#Relationship_source", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element", Many: true, Ordered: true, Subsets: []string{"Relationship::relatedElement"}}, + {Name: "target", DefiningClass: "Relationship", IRI: "https://www.omg.org/spec/SysML#Relationship_target", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element", Many: true, Ordered: true, Subsets: []string{"Relationship::relatedElement"}}, + {Name: "rendering", DefiningClass: "RenderingDefinition", IRI: "https://www.omg.org/spec/SysML#RenderingDefinition_rendering", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RenderingUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Definition::usage"}}, + {Name: "renderingDefinition", DefiningClass: "RenderingUsage", IRI: "https://www.omg.org/spec/SysML#RenderingUsage_renderingDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RenderingDefinition", Derived: true, Redefines: []string{"PartUsage::partDefinition"}}, {Name: "kind", DefiningClass: "RequirementConstraintMembership", IRI: "https://www.omg.org/spec/SysML#RequirementConstraintMembership_kind", Kind: DatatypeProperty, Range: "https://www.omg.org/spec/SysML#RequirementConstraintKind"}, - {Name: "ownedConstraint", DefiningClass: "RequirementConstraintMembership", IRI: "https://www.omg.org/spec/SysML#RequirementConstraintMembership_ownedConstraint", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConstraintUsage"}, - {Name: "referencedConstraint", DefiningClass: "RequirementConstraintMembership", IRI: "https://www.omg.org/spec/SysML#RequirementConstraintMembership_referencedConstraint", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConstraintUsage"}, - {Name: "actorParameter", DefiningClass: "RequirementDefinition", IRI: "https://www.omg.org/spec/SysML#RequirementDefinition_actorParameter", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PartUsage", Many: true}, - {Name: "assumedConstraint", DefiningClass: "RequirementDefinition", IRI: "https://www.omg.org/spec/SysML#RequirementDefinition_assumedConstraint", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConstraintUsage", Many: true}, - {Name: "framedConcern", DefiningClass: "RequirementDefinition", IRI: "https://www.omg.org/spec/SysML#RequirementDefinition_framedConcern", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConcernUsage", Many: true}, - {Name: "reqId", DefiningClass: "RequirementDefinition", IRI: "https://www.omg.org/spec/SysML#RequirementDefinition_reqId", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string"}, - {Name: "requiredConstraint", DefiningClass: "RequirementDefinition", IRI: "https://www.omg.org/spec/SysML#RequirementDefinition_requiredConstraint", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConstraintUsage", Many: true}, - {Name: "stakeholderParameter", DefiningClass: "RequirementDefinition", IRI: "https://www.omg.org/spec/SysML#RequirementDefinition_stakeholderParameter", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PartUsage", Many: true}, - {Name: "subjectParameter", DefiningClass: "RequirementDefinition", IRI: "https://www.omg.org/spec/SysML#RequirementDefinition_subjectParameter", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Usage"}, - {Name: "text", DefiningClass: "RequirementDefinition", IRI: "https://www.omg.org/spec/SysML#RequirementDefinition_text", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string", Many: true}, - {Name: "actorParameter", DefiningClass: "RequirementUsage", IRI: "https://www.omg.org/spec/SysML#RequirementUsage_actorParameter", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PartUsage", Many: true}, - {Name: "assumedConstraint", DefiningClass: "RequirementUsage", IRI: "https://www.omg.org/spec/SysML#RequirementUsage_assumedConstraint", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConstraintUsage", Many: true}, - {Name: "framedConcern", DefiningClass: "RequirementUsage", IRI: "https://www.omg.org/spec/SysML#RequirementUsage_framedConcern", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConcernUsage", Many: true}, - {Name: "reqId", DefiningClass: "RequirementUsage", IRI: "https://www.omg.org/spec/SysML#RequirementUsage_reqId", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string"}, - {Name: "requiredConstraint", DefiningClass: "RequirementUsage", IRI: "https://www.omg.org/spec/SysML#RequirementUsage_requiredConstraint", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConstraintUsage", Many: true}, - {Name: "requirementDefinition", DefiningClass: "RequirementUsage", IRI: "https://www.omg.org/spec/SysML#RequirementUsage_requirementDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RequirementDefinition"}, - {Name: "stakeholderParameter", DefiningClass: "RequirementUsage", IRI: "https://www.omg.org/spec/SysML#RequirementUsage_stakeholderParameter", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PartUsage", Many: true}, - {Name: "subjectParameter", DefiningClass: "RequirementUsage", IRI: "https://www.omg.org/spec/SysML#RequirementUsage_subjectParameter", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Usage"}, - {Name: "text", DefiningClass: "RequirementUsage", IRI: "https://www.omg.org/spec/SysML#RequirementUsage_text", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string", Many: true}, - {Name: "ownedRequirement", DefiningClass: "RequirementVerificationMembership", IRI: "https://www.omg.org/spec/SysML#RequirementVerificationMembership_ownedRequirement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RequirementUsage"}, - {Name: "verifiedRequirement", DefiningClass: "RequirementVerificationMembership", IRI: "https://www.omg.org/spec/SysML#RequirementVerificationMembership_verifiedRequirement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RequirementUsage"}, - {Name: "ownedResultExpression", DefiningClass: "ResultExpressionMembership", IRI: "https://www.omg.org/spec/SysML#ResultExpressionMembership_ownedResultExpression", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression"}, - {Name: "satisfiedRequirement", DefiningClass: "SatisfyRequirementUsage", IRI: "https://www.omg.org/spec/SysML#SatisfyRequirementUsage_satisfiedRequirement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RequirementUsage"}, - {Name: "satisfyingFeature", DefiningClass: "SatisfyRequirementUsage", IRI: "https://www.omg.org/spec/SysML#SatisfyRequirementUsage_satisfyingFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature"}, - {Name: "payloadArgument", DefiningClass: "SendActionUsage", IRI: "https://www.omg.org/spec/SysML#SendActionUsage_payloadArgument", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression"}, - {Name: "receiverArgument", DefiningClass: "SendActionUsage", IRI: "https://www.omg.org/spec/SysML#SendActionUsage_receiverArgument", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression"}, - {Name: "senderArgument", DefiningClass: "SendActionUsage", IRI: "https://www.omg.org/spec/SysML#SendActionUsage_senderArgument", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression"}, - {Name: "general", DefiningClass: "Specialization", IRI: "https://www.omg.org/spec/SysML#Specialization_general", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type"}, - {Name: "owningType", DefiningClass: "Specialization", IRI: "https://www.omg.org/spec/SysML#Specialization_owningType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type"}, - {Name: "specific", DefiningClass: "Specialization", IRI: "https://www.omg.org/spec/SysML#Specialization_specific", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type"}, - {Name: "ownedStakeholderParameter", DefiningClass: "StakeholderMembership", IRI: "https://www.omg.org/spec/SysML#StakeholderMembership_ownedStakeholderParameter", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PartUsage"}, - {Name: "doAction", DefiningClass: "StateDefinition", IRI: "https://www.omg.org/spec/SysML#StateDefinition_doAction", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ActionUsage"}, - {Name: "entryAction", DefiningClass: "StateDefinition", IRI: "https://www.omg.org/spec/SysML#StateDefinition_entryAction", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ActionUsage"}, - {Name: "exitAction", DefiningClass: "StateDefinition", IRI: "https://www.omg.org/spec/SysML#StateDefinition_exitAction", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ActionUsage"}, + {Name: "ownedConstraint", DefiningClass: "RequirementConstraintMembership", IRI: "https://www.omg.org/spec/SysML#RequirementConstraintMembership_ownedConstraint", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConstraintUsage", Derived: true, Redefines: []string{"FeatureMembership::ownedMemberFeature"}}, + {Name: "referencedConstraint", DefiningClass: "RequirementConstraintMembership", IRI: "https://www.omg.org/spec/SysML#RequirementConstraintMembership_referencedConstraint", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConstraintUsage", Derived: true}, + {Name: "actorParameter", DefiningClass: "RequirementDefinition", IRI: "https://www.omg.org/spec/SysML#RequirementDefinition_actorParameter", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PartUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Behavior::parameter", "Definition::usage"}}, + {Name: "assumedConstraint", DefiningClass: "RequirementDefinition", IRI: "https://www.omg.org/spec/SysML#RequirementDefinition_assumedConstraint", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConstraintUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Type::ownedFeature"}}, + {Name: "framedConcern", DefiningClass: "RequirementDefinition", IRI: "https://www.omg.org/spec/SysML#RequirementDefinition_framedConcern", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConcernUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"RequirementDefinition::requiredConstraint"}}, + {Name: "reqId", DefiningClass: "RequirementDefinition", IRI: "https://www.omg.org/spec/SysML#RequirementDefinition_reqId", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string", Redefines: []string{"Element::declaredShortName"}}, + {Name: "requiredConstraint", DefiningClass: "RequirementDefinition", IRI: "https://www.omg.org/spec/SysML#RequirementDefinition_requiredConstraint", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConstraintUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Type::ownedFeature"}}, + {Name: "stakeholderParameter", DefiningClass: "RequirementDefinition", IRI: "https://www.omg.org/spec/SysML#RequirementDefinition_stakeholderParameter", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PartUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Behavior::parameter", "Definition::usage"}}, + {Name: "subjectParameter", DefiningClass: "RequirementDefinition", IRI: "https://www.omg.org/spec/SysML#RequirementDefinition_subjectParameter", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Usage", Derived: true, Subsets: []string{"Behavior::parameter", "Definition::usage"}}, + {Name: "text", DefiningClass: "RequirementDefinition", IRI: "https://www.omg.org/spec/SysML#RequirementDefinition_text", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string", Many: true, Derived: true}, + {Name: "actorParameter", DefiningClass: "RequirementUsage", IRI: "https://www.omg.org/spec/SysML#RequirementUsage_actorParameter", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PartUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Step::parameter", "Usage::usage"}}, + {Name: "assumedConstraint", DefiningClass: "RequirementUsage", IRI: "https://www.omg.org/spec/SysML#RequirementUsage_assumedConstraint", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConstraintUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Type::ownedFeature"}}, + {Name: "framedConcern", DefiningClass: "RequirementUsage", IRI: "https://www.omg.org/spec/SysML#RequirementUsage_framedConcern", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConcernUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"RequirementUsage::requiredConstraint"}}, + {Name: "reqId", DefiningClass: "RequirementUsage", IRI: "https://www.omg.org/spec/SysML#RequirementUsage_reqId", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string", Redefines: []string{"Element::declaredShortName"}}, + {Name: "requiredConstraint", DefiningClass: "RequirementUsage", IRI: "https://www.omg.org/spec/SysML#RequirementUsage_requiredConstraint", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConstraintUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Type::ownedFeature"}}, + {Name: "requirementDefinition", DefiningClass: "RequirementUsage", IRI: "https://www.omg.org/spec/SysML#RequirementUsage_requirementDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RequirementDefinition", Derived: true, Redefines: []string{"ConstraintUsage::constraintDefinition"}}, + {Name: "stakeholderParameter", DefiningClass: "RequirementUsage", IRI: "https://www.omg.org/spec/SysML#RequirementUsage_stakeholderParameter", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PartUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Step::parameter", "Usage::usage"}}, + {Name: "subjectParameter", DefiningClass: "RequirementUsage", IRI: "https://www.omg.org/spec/SysML#RequirementUsage_subjectParameter", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Usage", Derived: true, Subsets: []string{"Step::parameter", "Usage::usage"}}, + {Name: "text", DefiningClass: "RequirementUsage", IRI: "https://www.omg.org/spec/SysML#RequirementUsage_text", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string", Many: true, Derived: true}, + {Name: "ownedRequirement", DefiningClass: "RequirementVerificationMembership", IRI: "https://www.omg.org/spec/SysML#RequirementVerificationMembership_ownedRequirement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RequirementUsage", Derived: true, Redefines: []string{"RequirementConstraintMembership::ownedConstraint"}}, + {Name: "verifiedRequirement", DefiningClass: "RequirementVerificationMembership", IRI: "https://www.omg.org/spec/SysML#RequirementVerificationMembership_verifiedRequirement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RequirementUsage", Derived: true, Redefines: []string{"RequirementConstraintMembership::referencedConstraint"}}, + {Name: "ownedResultExpression", DefiningClass: "ResultExpressionMembership", IRI: "https://www.omg.org/spec/SysML#ResultExpressionMembership_ownedResultExpression", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Derived: true, Redefines: []string{"FeatureMembership::ownedMemberFeature"}}, + {Name: "satisfiedRequirement", DefiningClass: "SatisfyRequirementUsage", IRI: "https://www.omg.org/spec/SysML#SatisfyRequirementUsage_satisfiedRequirement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RequirementUsage", Derived: true, Redefines: []string{"AssertConstraintUsage::assertedConstraint"}}, + {Name: "satisfyingFeature", DefiningClass: "SatisfyRequirementUsage", IRI: "https://www.omg.org/spec/SysML#SatisfyRequirementUsage_satisfyingFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Derived: true}, + {Name: "payloadArgument", DefiningClass: "SendActionUsage", IRI: "https://www.omg.org/spec/SysML#SendActionUsage_payloadArgument", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Derived: true}, + {Name: "receiverArgument", DefiningClass: "SendActionUsage", IRI: "https://www.omg.org/spec/SysML#SendActionUsage_receiverArgument", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Derived: true}, + {Name: "senderArgument", DefiningClass: "SendActionUsage", IRI: "https://www.omg.org/spec/SysML#SendActionUsage_senderArgument", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Derived: true}, + {Name: "general", DefiningClass: "Specialization", IRI: "https://www.omg.org/spec/SysML#Specialization_general", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Redefines: []string{"Relationship::target"}}, + {Name: "owningType", DefiningClass: "Specialization", IRI: "https://www.omg.org/spec/SysML#Specialization_owningType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Derived: true, Subsets: []string{"Relationship::owningRelatedElement", "Specialization::specific"}, Opposite: "Type::ownedSpecialization"}, + {Name: "specific", DefiningClass: "Specialization", IRI: "https://www.omg.org/spec/SysML#Specialization_specific", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Redefines: []string{"Relationship::source"}}, + {Name: "ownedStakeholderParameter", DefiningClass: "StakeholderMembership", IRI: "https://www.omg.org/spec/SysML#StakeholderMembership_ownedStakeholderParameter", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PartUsage", Derived: true, Redefines: []string{"ParameterMembership::ownedMemberParameter"}}, + {Name: "doAction", DefiningClass: "StateDefinition", IRI: "https://www.omg.org/spec/SysML#StateDefinition_doAction", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ActionUsage", Derived: true}, + {Name: "entryAction", DefiningClass: "StateDefinition", IRI: "https://www.omg.org/spec/SysML#StateDefinition_entryAction", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ActionUsage", Derived: true}, + {Name: "exitAction", DefiningClass: "StateDefinition", IRI: "https://www.omg.org/spec/SysML#StateDefinition_exitAction", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ActionUsage", Derived: true}, {Name: "isParallel", DefiningClass: "StateDefinition", IRI: "https://www.omg.org/spec/SysML#StateDefinition_isParallel", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean"}, - {Name: "state", DefiningClass: "StateDefinition", IRI: "https://www.omg.org/spec/SysML#StateDefinition_state", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#StateUsage", Many: true}, - {Name: "action", DefiningClass: "StateSubactionMembership", IRI: "https://www.omg.org/spec/SysML#StateSubactionMembership_action", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ActionUsage"}, + {Name: "state", DefiningClass: "StateDefinition", IRI: "https://www.omg.org/spec/SysML#StateDefinition_state", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#StateUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"ActionDefinition::action"}}, + {Name: "action", DefiningClass: "StateSubactionMembership", IRI: "https://www.omg.org/spec/SysML#StateSubactionMembership_action", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ActionUsage", Derived: true, Redefines: []string{"FeatureMembership::ownedMemberFeature"}}, {Name: "kind", DefiningClass: "StateSubactionMembership", IRI: "https://www.omg.org/spec/SysML#StateSubactionMembership_kind", Kind: DatatypeProperty, Range: "https://www.omg.org/spec/SysML#StateSubactionKind"}, - {Name: "doAction", DefiningClass: "StateUsage", IRI: "https://www.omg.org/spec/SysML#StateUsage_doAction", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ActionUsage"}, - {Name: "entryAction", DefiningClass: "StateUsage", IRI: "https://www.omg.org/spec/SysML#StateUsage_entryAction", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ActionUsage"}, - {Name: "exitAction", DefiningClass: "StateUsage", IRI: "https://www.omg.org/spec/SysML#StateUsage_exitAction", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ActionUsage"}, + {Name: "doAction", DefiningClass: "StateUsage", IRI: "https://www.omg.org/spec/SysML#StateUsage_doAction", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ActionUsage", Derived: true}, + {Name: "entryAction", DefiningClass: "StateUsage", IRI: "https://www.omg.org/spec/SysML#StateUsage_entryAction", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ActionUsage", Derived: true}, + {Name: "exitAction", DefiningClass: "StateUsage", IRI: "https://www.omg.org/spec/SysML#StateUsage_exitAction", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ActionUsage", Derived: true}, {Name: "isParallel", DefiningClass: "StateUsage", IRI: "https://www.omg.org/spec/SysML#StateUsage_isParallel", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean"}, - {Name: "stateDefinition", DefiningClass: "StateUsage", IRI: "https://www.omg.org/spec/SysML#StateUsage_stateDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Behavior", Many: true}, - {Name: "behavior", DefiningClass: "Step", IRI: "https://www.omg.org/spec/SysML#Step_behavior", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Behavior", Many: true}, - {Name: "parameter", DefiningClass: "Step", IRI: "https://www.omg.org/spec/SysML#Step_parameter", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Many: true}, - {Name: "owningClassifier", DefiningClass: "Subclassification", IRI: "https://www.omg.org/spec/SysML#Subclassification_owningClassifier", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Classifier"}, - {Name: "subclassifier", DefiningClass: "Subclassification", IRI: "https://www.omg.org/spec/SysML#Subclassification_subclassifier", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Classifier"}, - {Name: "superclassifier", DefiningClass: "Subclassification", IRI: "https://www.omg.org/spec/SysML#Subclassification_superclassifier", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Classifier"}, - {Name: "ownedSubjectParameter", DefiningClass: "SubjectMembership", IRI: "https://www.omg.org/spec/SysML#SubjectMembership_ownedSubjectParameter", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Usage"}, - {Name: "owningFeature", DefiningClass: "Subsetting", IRI: "https://www.omg.org/spec/SysML#Subsetting_owningFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature"}, - {Name: "subsettedFeature", DefiningClass: "Subsetting", IRI: "https://www.omg.org/spec/SysML#Subsetting_subsettedFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature"}, - {Name: "subsettingFeature", DefiningClass: "Subsetting", IRI: "https://www.omg.org/spec/SysML#Subsetting_subsettingFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature"}, - {Name: "effectStep", DefiningClass: "Succession", IRI: "https://www.omg.org/spec/SysML#Succession_effectStep", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Step", Many: true}, - {Name: "guardExpression", DefiningClass: "Succession", IRI: "https://www.omg.org/spec/SysML#Succession_guardExpression", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Many: true}, - {Name: "transitionStep", DefiningClass: "Succession", IRI: "https://www.omg.org/spec/SysML#Succession_transitionStep", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Step"}, - {Name: "triggerStep", DefiningClass: "Succession", IRI: "https://www.omg.org/spec/SysML#Succession_triggerStep", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Step", Many: true}, + {Name: "stateDefinition", DefiningClass: "StateUsage", IRI: "https://www.omg.org/spec/SysML#StateUsage_stateDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Behavior", Many: true, Ordered: true, Derived: true, Redefines: []string{"ActionUsage::actionDefinition"}}, + {Name: "behavior", DefiningClass: "Step", IRI: "https://www.omg.org/spec/SysML#Step_behavior", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Behavior", Many: true, Ordered: true, Derived: true, Subsets: []string{"Feature::type"}}, + {Name: "parameter", DefiningClass: "Step", IRI: "https://www.omg.org/spec/SysML#Step_parameter", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Many: true, Ordered: true, Derived: true, Redefines: []string{"Type::directedFeature"}}, + {Name: "owningClassifier", DefiningClass: "Subclassification", IRI: "https://www.omg.org/spec/SysML#Subclassification_owningClassifier", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Classifier", Derived: true, Redefines: []string{"Specialization::owningType"}, Opposite: "Classifier::ownedSubclassification"}, + {Name: "subclassifier", DefiningClass: "Subclassification", IRI: "https://www.omg.org/spec/SysML#Subclassification_subclassifier", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Classifier", Redefines: []string{"Specialization::specific"}}, + {Name: "superclassifier", DefiningClass: "Subclassification", IRI: "https://www.omg.org/spec/SysML#Subclassification_superclassifier", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Classifier", Redefines: []string{"Specialization::general"}}, + {Name: "ownedSubjectParameter", DefiningClass: "SubjectMembership", IRI: "https://www.omg.org/spec/SysML#SubjectMembership_ownedSubjectParameter", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Usage", Derived: true, Redefines: []string{"ParameterMembership::ownedMemberParameter"}}, + {Name: "owningFeature", DefiningClass: "Subsetting", IRI: "https://www.omg.org/spec/SysML#Subsetting_owningFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Derived: true, Redefines: []string{"Specialization::owningType"}, Subsets: []string{"Subsetting::subsettingFeature"}, Opposite: "Feature::ownedSubsetting"}, + {Name: "subsettedFeature", DefiningClass: "Subsetting", IRI: "https://www.omg.org/spec/SysML#Subsetting_subsettedFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Redefines: []string{"Specialization::general"}}, + {Name: "subsettingFeature", DefiningClass: "Subsetting", IRI: "https://www.omg.org/spec/SysML#Subsetting_subsettingFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Redefines: []string{"Specialization::specific"}}, + {Name: "terminatedOccurrenceArgument", DefiningClass: "TerminateActionUsage", IRI: "https://www.omg.org/spec/SysML#TerminateActionUsage_terminatedOccurrenceArgument", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Derived: true}, {Name: "body", DefiningClass: "TextualRepresentation", IRI: "https://www.omg.org/spec/SysML#TextualRepresentation_body", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string"}, {Name: "language", DefiningClass: "TextualRepresentation", IRI: "https://www.omg.org/spec/SysML#TextualRepresentation_language", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string"}, - {Name: "representedElement", DefiningClass: "TextualRepresentation", IRI: "https://www.omg.org/spec/SysML#TextualRepresentation_representedElement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element"}, + {Name: "representedElement", DefiningClass: "TextualRepresentation", IRI: "https://www.omg.org/spec/SysML#TextualRepresentation_representedElement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element", Derived: true, Redefines: []string{"AnnotatingElement::annotatedElement"}, Subsets: []string{"Element::owner"}, Opposite: "Element::textualRepresentation"}, {Name: "kind", DefiningClass: "TransitionFeatureMembership", IRI: "https://www.omg.org/spec/SysML#TransitionFeatureMembership_kind", Kind: DatatypeProperty, Range: "https://www.omg.org/spec/SysML#TransitionFeatureKind"}, - {Name: "transitionFeature", DefiningClass: "TransitionFeatureMembership", IRI: "https://www.omg.org/spec/SysML#TransitionFeatureMembership_transitionFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Step"}, - {Name: "effectAction", DefiningClass: "TransitionUsage", IRI: "https://www.omg.org/spec/SysML#TransitionUsage_effectAction", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ActionUsage", Many: true}, - {Name: "guardExpression", DefiningClass: "TransitionUsage", IRI: "https://www.omg.org/spec/SysML#TransitionUsage_guardExpression", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Many: true}, - {Name: "source", DefiningClass: "TransitionUsage", IRI: "https://www.omg.org/spec/SysML#TransitionUsage_source", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ActionUsage"}, - {Name: "succession", DefiningClass: "TransitionUsage", IRI: "https://www.omg.org/spec/SysML#TransitionUsage_succession", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Succession"}, - {Name: "target", DefiningClass: "TransitionUsage", IRI: "https://www.omg.org/spec/SysML#TransitionUsage_target", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ActionUsage"}, - {Name: "triggerAction", DefiningClass: "TransitionUsage", IRI: "https://www.omg.org/spec/SysML#TransitionUsage_triggerAction", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#AcceptActionUsage", Many: true}, + {Name: "transitionFeature", DefiningClass: "TransitionFeatureMembership", IRI: "https://www.omg.org/spec/SysML#TransitionFeatureMembership_transitionFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Step", Derived: true, Redefines: []string{"FeatureMembership::ownedMemberFeature"}}, + {Name: "effectAction", DefiningClass: "TransitionUsage", IRI: "https://www.omg.org/spec/SysML#TransitionUsage_effectAction", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ActionUsage", Many: true, Derived: true, Subsets: []string{"Type::feature"}}, + {Name: "guardExpression", DefiningClass: "TransitionUsage", IRI: "https://www.omg.org/spec/SysML#TransitionUsage_guardExpression", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Many: true, Derived: true, Subsets: []string{"Type::ownedFeature"}}, + {Name: "source", DefiningClass: "TransitionUsage", IRI: "https://www.omg.org/spec/SysML#TransitionUsage_source", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ActionUsage", Derived: true}, + {Name: "succession", DefiningClass: "TransitionUsage", IRI: "https://www.omg.org/spec/SysML#TransitionUsage_succession", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Succession", Derived: true, Subsets: []string{"Namespace::ownedMember"}}, + {Name: "target", DefiningClass: "TransitionUsage", IRI: "https://www.omg.org/spec/SysML#TransitionUsage_target", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ActionUsage", Derived: true}, + {Name: "triggerAction", DefiningClass: "TransitionUsage", IRI: "https://www.omg.org/spec/SysML#TransitionUsage_triggerAction", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#AcceptActionUsage", Many: true, Derived: true, Subsets: []string{"Type::ownedFeature"}}, {Name: "kind", DefiningClass: "TriggerInvocationExpression", IRI: "https://www.omg.org/spec/SysML#TriggerInvocationExpression_kind", Kind: DatatypeProperty, Range: "https://www.omg.org/spec/SysML#TriggerKind"}, - {Name: "featureOfType", DefiningClass: "TypeFeaturing", IRI: "https://www.omg.org/spec/SysML#TypeFeaturing_featureOfType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature"}, - {Name: "featuringType", DefiningClass: "TypeFeaturing", IRI: "https://www.omg.org/spec/SysML#TypeFeaturing_featuringType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type"}, - {Name: "owningFeatureOfType", DefiningClass: "TypeFeaturing", IRI: "https://www.omg.org/spec/SysML#TypeFeaturing_owningFeatureOfType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature"}, - {Name: "differencingType", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_differencingType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Many: true}, - {Name: "directedFeature", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_directedFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Many: true}, - {Name: "endFeature", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_endFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Many: true}, - {Name: "feature", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_feature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Many: true}, - {Name: "featureMembership", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_featureMembership", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#FeatureMembership", Many: true}, - {Name: "inheritedFeature", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_inheritedFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Many: true}, - {Name: "inheritedMembership", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_inheritedMembership", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Membership", Many: true}, - {Name: "input", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_input", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Many: true}, - {Name: "intersectingType", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_intersectingType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Many: true}, + {Name: "featureOfType", DefiningClass: "TypeFeaturing", IRI: "https://www.omg.org/spec/SysML#TypeFeaturing_featureOfType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Redefines: []string{"Relationship::source"}}, + {Name: "featuringType", DefiningClass: "TypeFeaturing", IRI: "https://www.omg.org/spec/SysML#TypeFeaturing_featuringType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Redefines: []string{"Relationship::target"}}, + {Name: "owningFeatureOfType", DefiningClass: "TypeFeaturing", IRI: "https://www.omg.org/spec/SysML#TypeFeaturing_owningFeatureOfType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Derived: true, Subsets: []string{"Relationship::owningRelatedElement", "TypeFeaturing::featureOfType"}, Opposite: "Feature::ownedTypeFeaturing"}, + {Name: "differencingType", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_differencingType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Many: true, Ordered: true, Derived: true}, + {Name: "directedFeature", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_directedFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Many: true, Ordered: true, Derived: true, Subsets: []string{"Type::feature"}}, + {Name: "endFeature", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_endFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Many: true, Ordered: true, Derived: true, Subsets: []string{"Type::feature"}}, + {Name: "feature", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_feature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Many: true, Ordered: true, Derived: true, Subsets: []string{"Namespace::member"}}, + {Name: "featureMembership", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_featureMembership", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#FeatureMembership", Many: true, Ordered: true, Derived: true}, + {Name: "inheritedFeature", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_inheritedFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Many: true, Ordered: true, Derived: true, Subsets: []string{"Type::feature"}}, + {Name: "inheritedMembership", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_inheritedMembership", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Membership", Many: true, Ordered: true, Derived: true, Subsets: []string{"Namespace::membership"}}, + {Name: "input", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_input", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Many: true, Ordered: true, Derived: true, Subsets: []string{"Type::directedFeature"}}, + {Name: "intersectingType", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_intersectingType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Many: true, Ordered: true, Derived: true}, {Name: "isAbstract", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_isAbstract", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean"}, - {Name: "isConjugated", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_isConjugated", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean"}, + {Name: "isConjugated", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_isConjugated", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean", Derived: true}, {Name: "isSufficient", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_isSufficient", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean"}, - {Name: "multiplicity", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_multiplicity", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Multiplicity"}, - {Name: "output", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_output", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Many: true}, - {Name: "ownedConjugator", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_ownedConjugator", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Conjugation"}, - {Name: "ownedDifferencing", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_ownedDifferencing", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Differencing", Many: true}, - {Name: "ownedDisjoining", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_ownedDisjoining", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Disjoining", Many: true}, - {Name: "ownedEndFeature", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_ownedEndFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Many: true}, - {Name: "ownedFeature", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_ownedFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Many: true}, - {Name: "ownedFeatureMembership", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_ownedFeatureMembership", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#FeatureMembership", Many: true}, - {Name: "ownedIntersecting", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_ownedIntersecting", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Intersecting", Many: true}, - {Name: "ownedSpecialization", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_ownedSpecialization", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Specialization", Many: true}, - {Name: "ownedUnioning", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_ownedUnioning", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Unioning", Many: true}, - {Name: "unioningType", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_unioningType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Many: true}, - {Name: "typeUnioned", DefiningClass: "Unioning", IRI: "https://www.omg.org/spec/SysML#Unioning_typeUnioned", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type"}, - {Name: "unioningType", DefiningClass: "Unioning", IRI: "https://www.omg.org/spec/SysML#Unioning_unioningType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type"}, - {Name: "definition", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_definition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Classifier", Many: true}, - {Name: "directedUsage", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_directedUsage", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Usage", Many: true}, - {Name: "isReference", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_isReference", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean"}, + {Name: "multiplicity", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_multiplicity", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Multiplicity", Derived: true, Subsets: []string{"Namespace::ownedMember"}}, + {Name: "output", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_output", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Many: true, Ordered: true, Derived: true, Subsets: []string{"Type::directedFeature"}}, + {Name: "ownedConjugator", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_ownedConjugator", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Conjugation", Derived: true, Subsets: []string{"Element::ownedRelationship"}, Opposite: "Conjugation::owningType"}, + {Name: "ownedDifferencing", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_ownedDifferencing", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Differencing", Many: true, Ordered: true, Derived: true, Subsets: []string{"Element::ownedRelationship"}, Opposite: "Differencing::typeDifferenced"}, + {Name: "ownedDisjoining", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_ownedDisjoining", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Disjoining", Many: true, Derived: true, Subsets: []string{"Element::ownedRelationship"}, Opposite: "Disjoining::owningType"}, + {Name: "ownedEndFeature", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_ownedEndFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Many: true, Ordered: true, Derived: true, Subsets: []string{"Type::endFeature", "Type::ownedFeature"}, Opposite: "Feature::endOwningType"}, + {Name: "ownedFeature", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_ownedFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Many: true, Ordered: true, Derived: true, Subsets: []string{"Namespace::ownedMember"}, Opposite: "Feature::owningType"}, + {Name: "ownedFeatureMembership", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_ownedFeatureMembership", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#FeatureMembership", Many: true, Ordered: true, Derived: true, Subsets: []string{"Namespace::ownedMembership", "Type::featureMembership"}, Opposite: "FeatureMembership::owningType"}, + {Name: "ownedIntersecting", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_ownedIntersecting", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Intersecting", Many: true, Ordered: true, Derived: true, Subsets: []string{"Element::ownedRelationship"}, Opposite: "Intersecting::typeIntersected"}, + {Name: "ownedSpecialization", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_ownedSpecialization", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Specialization", Many: true, Ordered: true, Derived: true, Subsets: []string{"Element::ownedRelationship"}, Opposite: "Specialization::owningType"}, + {Name: "ownedUnioning", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_ownedUnioning", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Unioning", Many: true, Ordered: true, Derived: true, Subsets: []string{"Element::ownedRelationship"}, Opposite: "Unioning::typeUnioned"}, + {Name: "unioningType", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_unioningType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Many: true, Ordered: true, Derived: true}, + {Name: "typeUnioned", DefiningClass: "Unioning", IRI: "https://www.omg.org/spec/SysML#Unioning_typeUnioned", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Derived: true, Redefines: []string{"Relationship::source"}, Subsets: []string{"Relationship::owningRelatedElement"}, Opposite: "Type::ownedUnioning"}, + {Name: "unioningType", DefiningClass: "Unioning", IRI: "https://www.omg.org/spec/SysML#Unioning_unioningType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Redefines: []string{"Relationship::target"}}, + {Name: "definition", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_definition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Classifier", Many: true, Ordered: true, Derived: true, Redefines: []string{"Feature::type"}}, + {Name: "directedUsage", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_directedUsage", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Usage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Type::directedFeature", "Usage::usage"}}, + {Name: "isReference", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_isReference", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean", Derived: true}, {Name: "isVariation", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_isVariation", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean"}, - {Name: "nestedAction", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedAction", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ActionUsage", Many: true}, - {Name: "nestedAllocation", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedAllocation", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#AllocationUsage", Many: true}, - {Name: "nestedAnalysisCase", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedAnalysisCase", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#AnalysisCaseUsage", Many: true}, - {Name: "nestedAttribute", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedAttribute", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#AttributeUsage", Many: true}, - {Name: "nestedCalculation", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedCalculation", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#CalculationUsage", Many: true}, - {Name: "nestedCase", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedCase", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#CaseUsage", Many: true}, - {Name: "nestedConcern", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedConcern", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConcernUsage", Many: true}, - {Name: "nestedConnection", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedConnection", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConnectorAsUsage", Many: true}, - {Name: "nestedConstraint", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedConstraint", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConstraintUsage", Many: true}, - {Name: "nestedEnumeration", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedEnumeration", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#EnumerationUsage", Many: true}, - {Name: "nestedFlow", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedFlow", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#FlowConnectionUsage", Many: true}, - {Name: "nestedInterface", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedInterface", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#InterfaceUsage", Many: true}, - {Name: "nestedItem", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedItem", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ItemUsage", Many: true}, - {Name: "nestedMetadata", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedMetadata", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#MetadataUsage", Many: true}, - {Name: "nestedOccurrence", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedOccurrence", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#OccurrenceUsage", Many: true}, - {Name: "nestedPart", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedPart", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PartUsage", Many: true}, - {Name: "nestedPort", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedPort", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PortUsage", Many: true}, - {Name: "nestedReference", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedReference", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ReferenceUsage", Many: true}, - {Name: "nestedRendering", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedRendering", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RenderingUsage", Many: true}, - {Name: "nestedRequirement", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedRequirement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RequirementUsage", Many: true}, - {Name: "nestedState", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedState", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#StateUsage", Many: true}, - {Name: "nestedTransition", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedTransition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#TransitionUsage", Many: true}, - {Name: "nestedUsage", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedUsage", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Usage", Many: true}, - {Name: "nestedUseCase", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedUseCase", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#UseCaseUsage", Many: true}, - {Name: "nestedVerificationCase", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedVerificationCase", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#VerificationCaseUsage", Many: true}, - {Name: "nestedView", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedView", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ViewUsage", Many: true}, - {Name: "nestedViewpoint", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedViewpoint", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ViewpointUsage", Many: true}, - {Name: "owningDefinition", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_owningDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Definition"}, - {Name: "owningUsage", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_owningUsage", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Usage"}, - {Name: "usage", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_usage", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Usage", Many: true}, - {Name: "variant", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_variant", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Usage", Many: true}, - {Name: "variantMembership", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_variantMembership", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#VariantMembership", Many: true}, - {Name: "includedUseCase", DefiningClass: "UseCaseDefinition", IRI: "https://www.omg.org/spec/SysML#UseCaseDefinition_includedUseCase", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#UseCaseUsage", Many: true}, - {Name: "includedUseCase", DefiningClass: "UseCaseUsage", IRI: "https://www.omg.org/spec/SysML#UseCaseUsage_includedUseCase", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#UseCaseUsage", Many: true}, - {Name: "useCaseDefinition", DefiningClass: "UseCaseUsage", IRI: "https://www.omg.org/spec/SysML#UseCaseUsage_useCaseDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#UseCaseDefinition"}, - {Name: "ownedVariantUsage", DefiningClass: "VariantMembership", IRI: "https://www.omg.org/spec/SysML#VariantMembership_ownedVariantUsage", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Usage"}, - {Name: "verifiedRequirement", DefiningClass: "VerificationCaseDefinition", IRI: "https://www.omg.org/spec/SysML#VerificationCaseDefinition_verifiedRequirement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RequirementUsage", Many: true}, - {Name: "verificationCaseDefinition", DefiningClass: "VerificationCaseUsage", IRI: "https://www.omg.org/spec/SysML#VerificationCaseUsage_verificationCaseDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#VerificationCaseDefinition"}, - {Name: "verifiedRequirement", DefiningClass: "VerificationCaseUsage", IRI: "https://www.omg.org/spec/SysML#VerificationCaseUsage_verifiedRequirement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RequirementUsage", Many: true}, - {Name: "satisfiedViewpoint", DefiningClass: "ViewDefinition", IRI: "https://www.omg.org/spec/SysML#ViewDefinition_satisfiedViewpoint", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ViewpointUsage", Many: true}, - {Name: "view", DefiningClass: "ViewDefinition", IRI: "https://www.omg.org/spec/SysML#ViewDefinition_view", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ViewUsage", Many: true}, - {Name: "viewCondition", DefiningClass: "ViewDefinition", IRI: "https://www.omg.org/spec/SysML#ViewDefinition_viewCondition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Many: true}, - {Name: "viewRendering", DefiningClass: "ViewDefinition", IRI: "https://www.omg.org/spec/SysML#ViewDefinition_viewRendering", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RenderingUsage"}, - {Name: "ownedRendering", DefiningClass: "ViewRenderingMembership", IRI: "https://www.omg.org/spec/SysML#ViewRenderingMembership_ownedRendering", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RenderingUsage"}, - {Name: "referencedRendering", DefiningClass: "ViewRenderingMembership", IRI: "https://www.omg.org/spec/SysML#ViewRenderingMembership_referencedRendering", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RenderingUsage"}, - {Name: "exposedElement", DefiningClass: "ViewUsage", IRI: "https://www.omg.org/spec/SysML#ViewUsage_exposedElement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element", Many: true}, - {Name: "satisfiedViewpoint", DefiningClass: "ViewUsage", IRI: "https://www.omg.org/spec/SysML#ViewUsage_satisfiedViewpoint", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ViewpointUsage", Many: true}, - {Name: "viewCondition", DefiningClass: "ViewUsage", IRI: "https://www.omg.org/spec/SysML#ViewUsage_viewCondition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Many: true}, - {Name: "viewDefinition", DefiningClass: "ViewUsage", IRI: "https://www.omg.org/spec/SysML#ViewUsage_viewDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ViewDefinition"}, - {Name: "viewRendering", DefiningClass: "ViewUsage", IRI: "https://www.omg.org/spec/SysML#ViewUsage_viewRendering", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RenderingUsage"}, - {Name: "viewpointStakeholder", DefiningClass: "ViewpointDefinition", IRI: "https://www.omg.org/spec/SysML#ViewpointDefinition_viewpointStakeholder", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PartUsage", Many: true}, - {Name: "viewpointDefinition", DefiningClass: "ViewpointUsage", IRI: "https://www.omg.org/spec/SysML#ViewpointUsage_viewpointDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ViewpointDefinition"}, - {Name: "viewpointStakeholder", DefiningClass: "ViewpointUsage", IRI: "https://www.omg.org/spec/SysML#ViewpointUsage_viewpointStakeholder", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PartUsage", Many: true}, - {Name: "untilArgument", DefiningClass: "WhileLoopActionUsage", IRI: "https://www.omg.org/spec/SysML#WhileLoopActionUsage_untilArgument", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression"}, - {Name: "whileArgument", DefiningClass: "WhileLoopActionUsage", IRI: "https://www.omg.org/spec/SysML#WhileLoopActionUsage_whileArgument", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression"}, + {Name: "mayTimeVary", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_mayTimeVary", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean", Derived: true, Redefines: []string{"Feature::isVariable"}}, + {Name: "nestedAction", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedAction", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ActionUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Usage::nestedOccurrence"}}, + {Name: "nestedAllocation", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedAllocation", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#AllocationUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Usage::nestedConnection"}}, + {Name: "nestedAnalysisCase", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedAnalysisCase", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#AnalysisCaseUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Usage::nestedCase"}}, + {Name: "nestedAttribute", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedAttribute", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#AttributeUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Usage::nestedUsage"}}, + {Name: "nestedCalculation", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedCalculation", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#CalculationUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Usage::nestedAction"}}, + {Name: "nestedCase", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedCase", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#CaseUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Usage::nestedCalculation"}}, + {Name: "nestedConcern", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedConcern", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConcernUsage", Many: true, Derived: true, Subsets: []string{"Usage::nestedRequirement"}}, + {Name: "nestedConnection", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedConnection", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConnectorAsUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Usage::nestedUsage"}}, + {Name: "nestedConstraint", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedConstraint", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConstraintUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Usage::nestedOccurrence"}}, + {Name: "nestedEnumeration", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedEnumeration", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#EnumerationUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Usage::nestedAttribute"}}, + {Name: "nestedFlow", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedFlow", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#FlowUsage", Many: true, Derived: true, Subsets: []string{"Usage::nestedConnection"}}, + {Name: "nestedInterface", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedInterface", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#InterfaceUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Usage::nestedConnection"}}, + {Name: "nestedItem", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedItem", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ItemUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Usage::nestedOccurrence"}}, + {Name: "nestedMetadata", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedMetadata", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#MetadataUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Usage::nestedItem"}}, + {Name: "nestedOccurrence", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedOccurrence", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#OccurrenceUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Usage::nestedUsage"}}, + {Name: "nestedPart", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedPart", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PartUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Usage::nestedItem"}}, + {Name: "nestedPort", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedPort", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PortUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Usage::nestedUsage"}}, + {Name: "nestedReference", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedReference", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ReferenceUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Usage::nestedUsage"}}, + {Name: "nestedRendering", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedRendering", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RenderingUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Usage::nestedPart"}}, + {Name: "nestedRequirement", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedRequirement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RequirementUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Usage::nestedConstraint"}}, + {Name: "nestedState", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedState", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#StateUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Usage::nestedAction"}}, + {Name: "nestedTransition", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedTransition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#TransitionUsage", Many: true, Derived: true, Subsets: []string{"Usage::nestedUsage"}}, + {Name: "nestedUsage", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedUsage", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Usage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Type::ownedFeature", "Usage::usage"}, Opposite: "Usage::owningUsage"}, + {Name: "nestedUseCase", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedUseCase", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#UseCaseUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Usage::nestedCase"}}, + {Name: "nestedVerificationCase", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedVerificationCase", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#VerificationCaseUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Usage::nestedCase"}}, + {Name: "nestedView", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedView", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ViewUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Usage::nestedPart"}}, + {Name: "nestedViewpoint", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedViewpoint", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ViewpointUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Usage::nestedRequirement"}}, + {Name: "owningDefinition", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_owningDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Definition", Derived: true, Subsets: []string{"Feature::owningType"}, Opposite: "Definition::ownedUsage"}, + {Name: "owningUsage", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_owningUsage", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Usage", Derived: true, Subsets: []string{"Feature::owningType"}, Opposite: "Usage::nestedUsage"}, + {Name: "usage", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_usage", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Usage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Type::feature"}}, + {Name: "variant", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_variant", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Usage", Many: true, Derived: true, Subsets: []string{"Namespace::ownedMember"}}, + {Name: "variantMembership", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_variantMembership", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#VariantMembership", Many: true, Derived: true, Subsets: []string{"Namespace::ownedMembership"}}, + {Name: "includedUseCase", DefiningClass: "UseCaseDefinition", IRI: "https://www.omg.org/spec/SysML#UseCaseDefinition_includedUseCase", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#UseCaseUsage", Many: true, Ordered: true, Derived: true}, + {Name: "includedUseCase", DefiningClass: "UseCaseUsage", IRI: "https://www.omg.org/spec/SysML#UseCaseUsage_includedUseCase", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#UseCaseUsage", Many: true, Ordered: true, Derived: true}, + {Name: "useCaseDefinition", DefiningClass: "UseCaseUsage", IRI: "https://www.omg.org/spec/SysML#UseCaseUsage_useCaseDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#UseCaseDefinition", Derived: true, Redefines: []string{"CaseUsage::caseDefinition"}}, + {Name: "ownedVariantUsage", DefiningClass: "VariantMembership", IRI: "https://www.omg.org/spec/SysML#VariantMembership_ownedVariantUsage", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Usage", Derived: true, Redefines: []string{"OwningMembership::ownedMemberElement"}}, + {Name: "verifiedRequirement", DefiningClass: "VerificationCaseDefinition", IRI: "https://www.omg.org/spec/SysML#VerificationCaseDefinition_verifiedRequirement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RequirementUsage", Many: true, Ordered: true, Derived: true}, + {Name: "verificationCaseDefinition", DefiningClass: "VerificationCaseUsage", IRI: "https://www.omg.org/spec/SysML#VerificationCaseUsage_verificationCaseDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#VerificationCaseDefinition", Derived: true, Subsets: []string{"CaseUsage::caseDefinition"}}, + {Name: "verifiedRequirement", DefiningClass: "VerificationCaseUsage", IRI: "https://www.omg.org/spec/SysML#VerificationCaseUsage_verifiedRequirement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RequirementUsage", Many: true, Ordered: true, Derived: true}, + {Name: "satisfiedViewpoint", DefiningClass: "ViewDefinition", IRI: "https://www.omg.org/spec/SysML#ViewDefinition_satisfiedViewpoint", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ViewpointUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Definition::ownedRequirement"}}, + {Name: "view", DefiningClass: "ViewDefinition", IRI: "https://www.omg.org/spec/SysML#ViewDefinition_view", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ViewUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Definition::usage"}}, + {Name: "viewCondition", DefiningClass: "ViewDefinition", IRI: "https://www.omg.org/spec/SysML#ViewDefinition_viewCondition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Many: true, Ordered: true, Derived: true, Subsets: []string{"Namespace::ownedMember"}}, + {Name: "viewRendering", DefiningClass: "ViewDefinition", IRI: "https://www.omg.org/spec/SysML#ViewDefinition_viewRendering", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RenderingUsage", Derived: true}, + {Name: "ownedRendering", DefiningClass: "ViewRenderingMembership", IRI: "https://www.omg.org/spec/SysML#ViewRenderingMembership_ownedRendering", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RenderingUsage", Derived: true, Redefines: []string{"FeatureMembership::ownedMemberFeature"}}, + {Name: "referencedRendering", DefiningClass: "ViewRenderingMembership", IRI: "https://www.omg.org/spec/SysML#ViewRenderingMembership_referencedRendering", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RenderingUsage", Derived: true}, + {Name: "exposedElement", DefiningClass: "ViewUsage", IRI: "https://www.omg.org/spec/SysML#ViewUsage_exposedElement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element", Many: true, Ordered: true, Derived: true, Subsets: []string{"Namespace::member"}}, + {Name: "satisfiedViewpoint", DefiningClass: "ViewUsage", IRI: "https://www.omg.org/spec/SysML#ViewUsage_satisfiedViewpoint", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ViewpointUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Usage::nestedRequirement"}}, + {Name: "viewCondition", DefiningClass: "ViewUsage", IRI: "https://www.omg.org/spec/SysML#ViewUsage_viewCondition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Many: true, Ordered: true, Derived: true, Subsets: []string{"Namespace::ownedMember"}}, + {Name: "viewDefinition", DefiningClass: "ViewUsage", IRI: "https://www.omg.org/spec/SysML#ViewUsage_viewDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ViewDefinition", Derived: true, Redefines: []string{"PartUsage::partDefinition"}}, + {Name: "viewRendering", DefiningClass: "ViewUsage", IRI: "https://www.omg.org/spec/SysML#ViewUsage_viewRendering", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RenderingUsage", Derived: true}, + {Name: "viewpointStakeholder", DefiningClass: "ViewpointDefinition", IRI: "https://www.omg.org/spec/SysML#ViewpointDefinition_viewpointStakeholder", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PartUsage", Many: true, Ordered: true, Derived: true}, + {Name: "viewpointDefinition", DefiningClass: "ViewpointUsage", IRI: "https://www.omg.org/spec/SysML#ViewpointUsage_viewpointDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ViewpointDefinition", Derived: true, Redefines: []string{"RequirementUsage::requirementDefinition"}}, + {Name: "viewpointStakeholder", DefiningClass: "ViewpointUsage", IRI: "https://www.omg.org/spec/SysML#ViewpointUsage_viewpointStakeholder", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PartUsage", Many: true, Ordered: true, Derived: true}, + {Name: "untilArgument", DefiningClass: "WhileLoopActionUsage", IRI: "https://www.omg.org/spec/SysML#WhileLoopActionUsage_untilArgument", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Derived: true}, + {Name: "whileArgument", DefiningClass: "WhileLoopActionUsage", IRI: "https://www.omg.org/spec/SysML#WhileLoopActionUsage_whileArgument", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Derived: true}, } -// classes holds every owl:Class the ontology declares with its named -// rdfs:subClassOf parents, ordered by name. +// classes holds every EClass the metamodel declares with its eSuperTypes, ordered by name. var classes = []Class{ {Name: "AcceptActionUsage", Parents: []string{"ActionUsage"}}, {Name: "ActionDefinition", Parents: []string{"Behavior", "OccurrenceDefinition"}}, @@ -472,10 +478,12 @@ var classes = []Class{ {Name: "ConnectionDefinition", Parents: []string{"AssociationStructure", "PartDefinition"}}, {Name: "ConnectionUsage", Parents: []string{"ConnectorAsUsage", "PartUsage"}}, {Name: "Connector", Parents: []string{"Feature", "Relationship"}}, - {Name: "ConnectorAsUsage", Parents: []string{"Connector", "Usage"}}, + {Name: "ConnectorAsUsage", Abstract: true, Parents: []string{"Connector", "Usage"}}, {Name: "ConstraintDefinition", Parents: []string{"OccurrenceDefinition", "Predicate"}}, {Name: "ConstraintUsage", Parents: []string{"BooleanExpression", "OccurrenceUsage"}}, - {Name: "ControlNode", Parents: []string{"ActionUsage"}}, + {Name: "ConstructorExpression", Parents: []string{"InstantiationExpression"}}, + {Name: "ControlNode", Abstract: true, Parents: []string{"ActionUsage"}}, + {Name: "CrossSubsetting", Parents: []string{"Subsetting"}}, {Name: "DataType", Parents: []string{"Classifier"}}, {Name: "DecisionNode", Parents: []string{"ControlNode"}}, {Name: "Definition", Parents: []string{"Classifier"}}, @@ -483,54 +491,53 @@ var classes = []Class{ {Name: "Differencing", Parents: []string{"Relationship"}}, {Name: "Disjoining", Parents: []string{"Relationship"}}, {Name: "Documentation", Parents: []string{"Comment"}}, - {Name: "Element"}, + {Name: "Element", Abstract: true}, {Name: "ElementFilterMembership", Parents: []string{"OwningMembership"}}, {Name: "EndFeatureMembership", Parents: []string{"FeatureMembership"}}, {Name: "EnumerationDefinition", Parents: []string{"AttributeDefinition"}}, {Name: "EnumerationUsage", Parents: []string{"AttributeUsage"}}, {Name: "EventOccurrenceUsage", Parents: []string{"OccurrenceUsage"}}, {Name: "ExhibitStateUsage", Parents: []string{"PerformActionUsage", "StateUsage"}}, - {Name: "Expose", Parents: []string{"Import"}}, + {Name: "Expose", Abstract: true, Parents: []string{"Import"}}, {Name: "Expression", Parents: []string{"Step"}}, {Name: "Feature", Parents: []string{"Type"}}, {Name: "FeatureChainExpression", Parents: []string{"OperatorExpression"}}, {Name: "FeatureChaining", Parents: []string{"Relationship"}}, {Name: "FeatureInverting", Parents: []string{"Relationship"}}, - {Name: "FeatureMembership", Parents: []string{"Featuring", "OwningMembership"}}, + {Name: "FeatureMembership", Parents: []string{"OwningMembership"}}, {Name: "FeatureReferenceExpression", Parents: []string{"Expression"}}, {Name: "FeatureTyping", Parents: []string{"Specialization"}}, {Name: "FeatureValue", Parents: []string{"OwningMembership"}}, - {Name: "Featuring", Parents: []string{"Relationship"}}, - {Name: "FlowConnectionDefinition", Parents: []string{"ActionDefinition", "ConnectionDefinition", "Interaction"}}, - {Name: "FlowConnectionUsage", Parents: []string{"ActionUsage", "ConnectionUsage", "ItemFlow"}}, + {Name: "Flow", Parents: []string{"Connector", "Step"}}, + {Name: "FlowDefinition", Parents: []string{"ActionDefinition", "Interaction"}}, + {Name: "FlowEnd", Parents: []string{"Feature"}}, + {Name: "FlowUsage", Parents: []string{"ActionUsage", "ConnectorAsUsage", "Flow"}}, {Name: "ForLoopActionUsage", Parents: []string{"LoopActionUsage"}}, {Name: "ForkNode", Parents: []string{"ControlNode"}}, {Name: "FramedConcernMembership", Parents: []string{"RequirementConstraintMembership"}}, {Name: "Function", Parents: []string{"Behavior"}}, {Name: "IfActionUsage", Parents: []string{"ActionUsage"}}, - {Name: "Import", Parents: []string{"Relationship"}}, + {Name: "Import", Abstract: true, Parents: []string{"Relationship"}}, {Name: "IncludeUseCaseUsage", Parents: []string{"PerformActionUsage", "UseCaseUsage"}}, + {Name: "IndexExpression", Parents: []string{"OperatorExpression"}}, + {Name: "InstantiationExpression", Abstract: true, Parents: []string{"Expression"}}, {Name: "Interaction", Parents: []string{"Association", "Behavior"}}, {Name: "InterfaceDefinition", Parents: []string{"ConnectionDefinition"}}, {Name: "InterfaceUsage", Parents: []string{"ConnectionUsage"}}, {Name: "Intersecting", Parents: []string{"Relationship"}}, {Name: "Invariant", Parents: []string{"BooleanExpression"}}, - {Name: "InvocationExpression", Parents: []string{"Expression"}}, + {Name: "InvocationExpression", Parents: []string{"InstantiationExpression"}}, {Name: "ItemDefinition", Parents: []string{"OccurrenceDefinition", "Structure"}}, - {Name: "ItemFeature", Parents: []string{"Feature"}}, - {Name: "ItemFlow", Parents: []string{"Connector", "Step"}}, - {Name: "ItemFlowEnd", Parents: []string{"Feature"}}, {Name: "ItemUsage", Parents: []string{"OccurrenceUsage"}}, {Name: "JoinNode", Parents: []string{"ControlNode"}}, {Name: "LibraryPackage", Parents: []string{"Package"}}, - {Name: "LifeClass", Parents: []string{"Class"}}, {Name: "LiteralBoolean", Parents: []string{"LiteralExpression"}}, {Name: "LiteralExpression", Parents: []string{"Expression"}}, {Name: "LiteralInfinity", Parents: []string{"LiteralExpression"}}, {Name: "LiteralInteger", Parents: []string{"LiteralExpression"}}, {Name: "LiteralRational", Parents: []string{"LiteralExpression"}}, {Name: "LiteralString", Parents: []string{"LiteralExpression"}}, - {Name: "LoopActionUsage", Parents: []string{"ActionUsage"}}, + {Name: "LoopActionUsage", Abstract: true, Parents: []string{"ActionUsage"}}, {Name: "Membership", Parents: []string{"Relationship"}}, {Name: "MembershipExpose", Parents: []string{"Expose", "MembershipImport"}}, {Name: "MembershipImport", Parents: []string{"Import"}}, @@ -555,6 +562,7 @@ var classes = []Class{ {Name: "ParameterMembership", Parents: []string{"FeatureMembership"}}, {Name: "PartDefinition", Parents: []string{"ItemDefinition"}}, {Name: "PartUsage", Parents: []string{"ItemUsage"}}, + {Name: "PayloadFeature", Parents: []string{"Feature"}}, {Name: "PerformActionUsage", Parents: []string{"ActionUsage", "EventOccurrenceUsage"}}, {Name: "PortConjugation", Parents: []string{"Conjugation"}}, {Name: "PortDefinition", Parents: []string{"OccurrenceDefinition", "Structure"}}, @@ -563,7 +571,7 @@ var classes = []Class{ {Name: "Redefinition", Parents: []string{"Subsetting"}}, {Name: "ReferenceSubsetting", Parents: []string{"Subsetting"}}, {Name: "ReferenceUsage", Parents: []string{"Usage"}}, - {Name: "Relationship", Parents: []string{"Element"}}, + {Name: "Relationship", Abstract: true, Parents: []string{"Element"}}, {Name: "RenderingDefinition", Parents: []string{"PartDefinition"}}, {Name: "RenderingUsage", Parents: []string{"PartUsage"}}, {Name: "RequirementConstraintMembership", Parents: []string{"FeatureMembership"}}, @@ -587,14 +595,15 @@ var classes = []Class{ {Name: "Subsetting", Parents: []string{"Specialization"}}, {Name: "Succession", Parents: []string{"Connector"}}, {Name: "SuccessionAsUsage", Parents: []string{"ConnectorAsUsage", "Succession"}}, - {Name: "SuccessionFlowConnectionUsage", Parents: []string{"FlowConnectionUsage", "SuccessionItemFlow"}}, - {Name: "SuccessionItemFlow", Parents: []string{"ItemFlow", "Succession"}}, + {Name: "SuccessionFlow", Parents: []string{"Flow", "Succession"}}, + {Name: "SuccessionFlowUsage", Parents: []string{"FlowUsage", "SuccessionFlow"}}, + {Name: "TerminateActionUsage", Parents: []string{"ActionUsage"}}, {Name: "TextualRepresentation", Parents: []string{"AnnotatingElement"}}, {Name: "TransitionFeatureMembership", Parents: []string{"FeatureMembership"}}, {Name: "TransitionUsage", Parents: []string{"ActionUsage"}}, {Name: "TriggerInvocationExpression", Parents: []string{"InvocationExpression"}}, {Name: "Type", Parents: []string{"Namespace"}}, - {Name: "TypeFeaturing", Parents: []string{"Featuring"}}, + {Name: "TypeFeaturing", Parents: []string{"Relationship"}}, {Name: "Unioning", Parents: []string{"Relationship"}}, {Name: "Usage", Parents: []string{"Feature"}}, {Name: "UseCaseDefinition", Parents: []string{"CaseDefinition"}}, diff --git a/internal/translate/rdf/ontology/validate.go b/internal/translate/rdf/ontology/validate.go index 67d69bf699..74da42679f 100644 --- a/internal/translate/rdf/ontology/validate.go +++ b/internal/translate/rdf/ontology/validate.go @@ -13,6 +13,9 @@ type ViolationKind string const ( // UnknownClass is an rdf:type the ontology declares no owl:Class for. UnknownClass ViolationKind = "unknown-class" + // AbstractClass is an rdf:type the metamodel declares abstract, which no + // element instantiates directly. + AbstractClass ViolationKind = "abstract-class" // UntypedSubject carries SysML properties with no rdf:type, which leaves // their domain uncheckable. UntypedSubject ViolationKind = "untyped-subject" @@ -57,8 +60,7 @@ const missing = "-" // Check reports every way the triples of g disagree with the ontology. Only // SysML-namespace predicates are checked; the RDF vocabulary and this tool's own -// extension namespace are out of the ontology's scope. The ontology records no -// abstractness, so an abstract metaclass is not a violation here. +// extension namespace are out of the ontology's scope. func Check(g *rdf.Graph) []Violation { var out []Violation hasSysMLProperty := make(map[rdf.Term]bool) @@ -79,8 +81,14 @@ func Check(g *rdf.Graph) []Violation { } continue } - if _, ok := LookupClass(classNameOf(typeIRI)); ok { + if class, ok := LookupClass(classNameOf(typeIRI)); ok { declared[subject] = true + if class.Abstract { + out = append(out, Violation{ + Kind: AbstractClass, Class: class.Name, Property: missing, Subject: subject.Value, + Detail: fmt.Sprintf("rdf:type %s is abstract in the metamodel", typeIRI), + }) + } continue } out = append(out, Violation{ diff --git a/scripts/download-pilot-metamodel.sh b/scripts/download-pilot-metamodel.sh new file mode 100755 index 0000000000..aa4389d419 --- /dev/null +++ b/scripts/download-pilot-metamodel.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env bash +# Download the OMG SysML v2 metamodel, the pilot implementation's +# org.omg.sysml/model/SysML.ecore, into build/pilot-metamodel/, for +# tools/gen/ontology, which generates internal/translate/rdf/ontology/table.go +# from it and, with -check, fails when the committed table has drifted. +# +# The metamodel is not vendored: it belongs to the OMG pilot implementation and +# is licensed there. It is pinned by scripts/pilot-pin.sh like every other pilot +# input, so the table moves with the pilot release the rest of the tree is +# measured against. The download records that pin in a .pilot-pin stamp, which +# the generator writes into the table's header, and is re-fetched when the stamp +# does not match. +set -euo pipefail + +# shellcheck source=scripts/pilot-pin.sh +. "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/pilot-pin.sh" + +repo_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +target="$repo_root/build/pilot-metamodel" + +PILOT_FETCH_GLOBS=('SysML.ecore') +pilot_fetch_subtrees "org.omg.sysml/model:$target" + +echo "Regenerate or check the metamodel table against it with:" +echo " go run -C tools ./gen/ontology [-check]" diff --git a/tests/export/cross_feature_test.go b/tests/export/cross_feature_test.go index 9130f4bfc9..ca5dcb4647 100644 --- a/tests/export/cross_feature_test.go +++ b/tests/export/cross_feature_test.go @@ -301,19 +301,19 @@ func TestCrossFeatureOrderingComesBackFromTheGraphAlone(t *testing.T) { ` g := turtleOf(t, "crossing", sysml) elmt := func(name string) string { return rdf.ElementIRI(name).Value } - for _, flag := range []struct{ end, cross, property string }{ - {"Crossing::C::x", "Crossing::C::x::x1", "isOrdered"}, - {"Crossing::C::y", "Crossing::C::y::@0", "isOrdered"}, - {"Crossing::C::y", "Crossing::C::y::@0", "isNonunique"}, - {"Crossing::C::z", "Crossing::C::z::@0", "isNonunique"}, - {"Crossing::C::w", "Crossing::C::w::@0", "isNonunique"}, + for _, flag := range []struct{ end, cross, property, value string }{ + {"Crossing::C::x", "Crossing::C::x::x1", "isOrdered", "true"}, + {"Crossing::C::y", "Crossing::C::y::@0", "isOrdered", "true"}, + {"Crossing::C::y", "Crossing::C::y::@0", "isUnique", "false"}, + {"Crossing::C::z", "Crossing::C::z::@0", "isUnique", "false"}, + {"Crossing::C::w", "Crossing::C::w::@0", "isUnique", "false"}, } { - wantLexical(t, g, elmt(flag.cross), rdf.SysML+flag.property, "true") + wantLexical(t, g, elmt(flag.cross), rdf.SysML+flag.property, flag.value) if g.HasProperty(iri(elmt(flag.end)), rdf.SysML+flag.property) { t.Errorf("the end <%s> took its cross feature's %s", flag.end, flag.property) } } - if g.HasProperty(iri(elmt("Crossing::C::x::x1")), rdf.SysML+"isNonunique") { + if g.HasProperty(iri(elmt("Crossing::C::x::x1")), rdf.SysML+"isUnique") { t.Errorf("the ordered cross feature x1 is not nonunique") } if back := toNotation(t, withoutTriples(t, idTurtle(t, sysml), "sysx:sourceText")); back != sysml { diff --git a/tests/export/testdata/convert/action_nodes.golden.ttl b/tests/export/testdata/convert/action_nodes.golden.ttl index 8e7fb4eb5f..c6a20cd8c0 100644 --- a/tests/export/testdata/convert/action_nodes.golden.ttl +++ b/tests/export/testdata/convert/action_nodes.golden.ttl @@ -164,15 +164,15 @@ elmt:ActionNodes__Drive sysml:ownedMember elmt:ActionNodes__Drive__speed, elmt:ActionNodes__Drive__log, elmt:ActionNodes__Drive__antenna, elmt:ActionNodes__Drive__Stop, elmt:ActionNodes__Drive__brake, elmt:ActionNodes__Drive__split, elmt:ActionNodes__Drive__sync, elmt:ActionNodes__Drive__gather, elmt:ActionNodes__Drive__pick, elmt:ActionNodes__Drive___4010, elmt:ActionNodes__Drive__Brake, elmt:ActionNodes__Drive___4012, elmt:ActionNodes__Drive___4013, elmt:ActionNodes__Drive___4014, elmt:ActionNodes__Drive___4015, elmt:ActionNodes__Drive___4016, elmt:ActionNodes__Drive___4017, elmt:ActionNodes__Drive___4019, elmt:ActionNodes__Drive___4020 ; sysml:ownedMembership elmt:ActionNodes__Drive__speed_om, elmt:ActionNodes__Drive__log_om, elmt:ActionNodes__Drive__antenna_om, elmt:ActionNodes__Drive__Stop_om, elmt:ActionNodes__Drive___404, elmt:ActionNodes__Drive__brake_om, elmt:ActionNodes__Drive__split_om, elmt:ActionNodes__Drive__sync_om, elmt:ActionNodes__Drive__gather_om, elmt:ActionNodes__Drive__pick_om, elmt:ActionNodes__Drive___4010_om, elmt:ActionNodes__Drive__Brake_om, elmt:ActionNodes__Drive___4012_om, elmt:ActionNodes__Drive___4013_om, elmt:ActionNodes__Drive___4014_om, elmt:ActionNodes__Drive___4015_om, elmt:ActionNodes__Drive___4016_om, elmt:ActionNodes__Drive___4017_om, elmt:ActionNodes__Drive___4018, elmt:ActionNodes__Drive___4019_om, elmt:ActionNodes__Drive___4020_om ; sysml:ownedRelationship elmt:ActionNodes__Drive__speed_om, elmt:ActionNodes__Drive__log_om, elmt:ActionNodes__Drive__antenna_om, elmt:ActionNodes__Drive__Stop_om, elmt:ActionNodes__Drive___404, elmt:ActionNodes__Drive__brake_om, elmt:ActionNodes__Drive__split_om, elmt:ActionNodes__Drive__sync_om, elmt:ActionNodes__Drive__gather_om, elmt:ActionNodes__Drive__pick_om, elmt:ActionNodes__Drive___4010_om, elmt:ActionNodes__Drive__Brake_om, elmt:ActionNodes__Drive___4012_om, elmt:ActionNodes__Drive___4013_om, elmt:ActionNodes__Drive___4014_om, elmt:ActionNodes__Drive___4015_om, elmt:ActionNodes__Drive___4016_om, elmt:ActionNodes__Drive___4017_om, elmt:ActionNodes__Drive___4018, elmt:ActionNodes__Drive___4019_om, elmt:ActionNodes__Drive___4020_om ; - sysml:ownedFeature elmt:ActionNodes__Drive__speed, elmt:ActionNodes__Drive__log, elmt:ActionNodes__Drive__antenna, elmt:ActionNodes__Drive__brake, elmt:ActionNodes__Drive__split, elmt:ActionNodes__Drive__sync, elmt:ActionNodes__Drive__gather, elmt:ActionNodes__Drive__pick, elmt:ActionNodes__Drive___4010, elmt:ActionNodes__Drive__Brake, elmt:ActionNodes__Drive___4012, elmt:ActionNodes__Drive___4013, elmt:ActionNodes__Drive___4014, elmt:ActionNodes__Drive___4015, elmt:ActionNodes__Drive___4019, elmt:ActionNodes__Drive___4020 ; - sysml:ownedFeatureMembership elmt:ActionNodes__Drive__speed_om, elmt:ActionNodes__Drive__log_om, elmt:ActionNodes__Drive__antenna_om, elmt:ActionNodes__Drive__brake_om, elmt:ActionNodes__Drive__split_om, elmt:ActionNodes__Drive__sync_om, elmt:ActionNodes__Drive__gather_om, elmt:ActionNodes__Drive__pick_om, elmt:ActionNodes__Drive___4010_om, elmt:ActionNodes__Drive__Brake_om, elmt:ActionNodes__Drive___4012_om, elmt:ActionNodes__Drive___4013_om, elmt:ActionNodes__Drive___4014_om, elmt:ActionNodes__Drive___4015_om, elmt:ActionNodes__Drive___4019_om, elmt:ActionNodes__Drive___4020_om ; + sysml:ownedFeature elmt:ActionNodes__Drive__speed, elmt:ActionNodes__Drive__log, elmt:ActionNodes__Drive__antenna, elmt:ActionNodes__Drive__brake, elmt:ActionNodes__Drive__split, elmt:ActionNodes__Drive__sync, elmt:ActionNodes__Drive__gather, elmt:ActionNodes__Drive__pick, elmt:ActionNodes__Drive___4010, elmt:ActionNodes__Drive__Brake, elmt:ActionNodes__Drive___4012, elmt:ActionNodes__Drive___4013, elmt:ActionNodes__Drive___4014, elmt:ActionNodes__Drive___4015, elmt:ActionNodes__Drive___4016, elmt:ActionNodes__Drive___4017, elmt:ActionNodes__Drive___4019, elmt:ActionNodes__Drive___4020 ; + sysml:ownedFeatureMembership elmt:ActionNodes__Drive__speed_om, elmt:ActionNodes__Drive__log_om, elmt:ActionNodes__Drive__antenna_om, elmt:ActionNodes__Drive__brake_om, elmt:ActionNodes__Drive__split_om, elmt:ActionNodes__Drive__sync_om, elmt:ActionNodes__Drive__gather_om, elmt:ActionNodes__Drive__pick_om, elmt:ActionNodes__Drive___4010_om, elmt:ActionNodes__Drive__Brake_om, elmt:ActionNodes__Drive___4012_om, elmt:ActionNodes__Drive___4013_om, elmt:ActionNodes__Drive___4014_om, elmt:ActionNodes__Drive___4015_om, elmt:ActionNodes__Drive___4016_om, elmt:ActionNodes__Drive___4017_om, elmt:ActionNodes__Drive___4019_om, elmt:ActionNodes__Drive___4020_om ; sysx:sourceText " action def Drive {\n" ; sysx:sourceTail " }\n" ; json:ownedMember "[{\"@id\":\"ActionNodes__Drive__speed\"},{\"@id\":\"ActionNodes__Drive__log\"},{\"@id\":\"ActionNodes__Drive__antenna\"},{\"@id\":\"ActionNodes__Drive__Stop\"},{\"@id\":\"ActionNodes__Drive__brake\"},{\"@id\":\"ActionNodes__Drive__split\"},{\"@id\":\"ActionNodes__Drive__sync\"},{\"@id\":\"ActionNodes__Drive__gather\"},{\"@id\":\"ActionNodes__Drive__pick\"},{\"@id\":\"ActionNodes__Drive___4010\"},{\"@id\":\"ActionNodes__Drive__Brake\"},{\"@id\":\"ActionNodes__Drive___4012\"},{\"@id\":\"ActionNodes__Drive___4013\"},{\"@id\":\"ActionNodes__Drive___4014\"},{\"@id\":\"ActionNodes__Drive___4015\"},{\"@id\":\"ActionNodes__Drive___4016\"},{\"@id\":\"ActionNodes__Drive___4017\"},{\"@id\":\"ActionNodes__Drive___4019\"},{\"@id\":\"ActionNodes__Drive___4020\"}]" ; json:ownedMembership "[{\"@id\":\"ActionNodes__Drive__speed_om\"},{\"@id\":\"ActionNodes__Drive__log_om\"},{\"@id\":\"ActionNodes__Drive__antenna_om\"},{\"@id\":\"ActionNodes__Drive__Stop_om\"},{\"@id\":\"ActionNodes__Drive___404\"},{\"@id\":\"ActionNodes__Drive__brake_om\"},{\"@id\":\"ActionNodes__Drive__split_om\"},{\"@id\":\"ActionNodes__Drive__sync_om\"},{\"@id\":\"ActionNodes__Drive__gather_om\"},{\"@id\":\"ActionNodes__Drive__pick_om\"},{\"@id\":\"ActionNodes__Drive___4010_om\"},{\"@id\":\"ActionNodes__Drive__Brake_om\"},{\"@id\":\"ActionNodes__Drive___4012_om\"},{\"@id\":\"ActionNodes__Drive___4013_om\"},{\"@id\":\"ActionNodes__Drive___4014_om\"},{\"@id\":\"ActionNodes__Drive___4015_om\"},{\"@id\":\"ActionNodes__Drive___4016_om\"},{\"@id\":\"ActionNodes__Drive___4017_om\"},{\"@id\":\"ActionNodes__Drive___4018\"},{\"@id\":\"ActionNodes__Drive___4019_om\"},{\"@id\":\"ActionNodes__Drive___4020_om\"}]" ; json:ownedRelationship "[{\"@id\":\"ActionNodes__Drive__speed_om\"},{\"@id\":\"ActionNodes__Drive__log_om\"},{\"@id\":\"ActionNodes__Drive__antenna_om\"},{\"@id\":\"ActionNodes__Drive__Stop_om\"},{\"@id\":\"ActionNodes__Drive___404\"},{\"@id\":\"ActionNodes__Drive__brake_om\"},{\"@id\":\"ActionNodes__Drive__split_om\"},{\"@id\":\"ActionNodes__Drive__sync_om\"},{\"@id\":\"ActionNodes__Drive__gather_om\"},{\"@id\":\"ActionNodes__Drive__pick_om\"},{\"@id\":\"ActionNodes__Drive___4010_om\"},{\"@id\":\"ActionNodes__Drive__Brake_om\"},{\"@id\":\"ActionNodes__Drive___4012_om\"},{\"@id\":\"ActionNodes__Drive___4013_om\"},{\"@id\":\"ActionNodes__Drive___4014_om\"},{\"@id\":\"ActionNodes__Drive___4015_om\"},{\"@id\":\"ActionNodes__Drive___4016_om\"},{\"@id\":\"ActionNodes__Drive___4017_om\"},{\"@id\":\"ActionNodes__Drive___4018\"},{\"@id\":\"ActionNodes__Drive___4019_om\"},{\"@id\":\"ActionNodes__Drive___4020_om\"}]" ; - json:ownedFeature "[{\"@id\":\"ActionNodes__Drive__speed\"},{\"@id\":\"ActionNodes__Drive__log\"},{\"@id\":\"ActionNodes__Drive__antenna\"},{\"@id\":\"ActionNodes__Drive__brake\"},{\"@id\":\"ActionNodes__Drive__split\"},{\"@id\":\"ActionNodes__Drive__sync\"},{\"@id\":\"ActionNodes__Drive__gather\"},{\"@id\":\"ActionNodes__Drive__pick\"},{\"@id\":\"ActionNodes__Drive___4010\"},{\"@id\":\"ActionNodes__Drive__Brake\"},{\"@id\":\"ActionNodes__Drive___4012\"},{\"@id\":\"ActionNodes__Drive___4013\"},{\"@id\":\"ActionNodes__Drive___4014\"},{\"@id\":\"ActionNodes__Drive___4015\"},{\"@id\":\"ActionNodes__Drive___4019\"},{\"@id\":\"ActionNodes__Drive___4020\"}]" ; - json:ownedFeatureMembership "[{\"@id\":\"ActionNodes__Drive__speed_om\"},{\"@id\":\"ActionNodes__Drive__log_om\"},{\"@id\":\"ActionNodes__Drive__antenna_om\"},{\"@id\":\"ActionNodes__Drive__brake_om\"},{\"@id\":\"ActionNodes__Drive__split_om\"},{\"@id\":\"ActionNodes__Drive__sync_om\"},{\"@id\":\"ActionNodes__Drive__gather_om\"},{\"@id\":\"ActionNodes__Drive__pick_om\"},{\"@id\":\"ActionNodes__Drive___4010_om\"},{\"@id\":\"ActionNodes__Drive__Brake_om\"},{\"@id\":\"ActionNodes__Drive___4012_om\"},{\"@id\":\"ActionNodes__Drive___4013_om\"},{\"@id\":\"ActionNodes__Drive___4014_om\"},{\"@id\":\"ActionNodes__Drive___4015_om\"},{\"@id\":\"ActionNodes__Drive___4019_om\"},{\"@id\":\"ActionNodes__Drive___4020_om\"}]" . + json:ownedFeature "[{\"@id\":\"ActionNodes__Drive__speed\"},{\"@id\":\"ActionNodes__Drive__log\"},{\"@id\":\"ActionNodes__Drive__antenna\"},{\"@id\":\"ActionNodes__Drive__brake\"},{\"@id\":\"ActionNodes__Drive__split\"},{\"@id\":\"ActionNodes__Drive__sync\"},{\"@id\":\"ActionNodes__Drive__gather\"},{\"@id\":\"ActionNodes__Drive__pick\"},{\"@id\":\"ActionNodes__Drive___4010\"},{\"@id\":\"ActionNodes__Drive__Brake\"},{\"@id\":\"ActionNodes__Drive___4012\"},{\"@id\":\"ActionNodes__Drive___4013\"},{\"@id\":\"ActionNodes__Drive___4014\"},{\"@id\":\"ActionNodes__Drive___4015\"},{\"@id\":\"ActionNodes__Drive___4016\"},{\"@id\":\"ActionNodes__Drive___4017\"},{\"@id\":\"ActionNodes__Drive___4019\"},{\"@id\":\"ActionNodes__Drive___4020\"}]" ; + json:ownedFeatureMembership "[{\"@id\":\"ActionNodes__Drive__speed_om\"},{\"@id\":\"ActionNodes__Drive__log_om\"},{\"@id\":\"ActionNodes__Drive__antenna_om\"},{\"@id\":\"ActionNodes__Drive__brake_om\"},{\"@id\":\"ActionNodes__Drive__split_om\"},{\"@id\":\"ActionNodes__Drive__sync_om\"},{\"@id\":\"ActionNodes__Drive__gather_om\"},{\"@id\":\"ActionNodes__Drive__pick_om\"},{\"@id\":\"ActionNodes__Drive___4010_om\"},{\"@id\":\"ActionNodes__Drive__Brake_om\"},{\"@id\":\"ActionNodes__Drive___4012_om\"},{\"@id\":\"ActionNodes__Drive___4013_om\"},{\"@id\":\"ActionNodes__Drive___4014_om\"},{\"@id\":\"ActionNodes__Drive___4015_om\"},{\"@id\":\"ActionNodes__Drive___4016_om\"},{\"@id\":\"ActionNodes__Drive___4017_om\"},{\"@id\":\"ActionNodes__Drive___4019_om\"},{\"@id\":\"ActionNodes__Drive___4020_om\"}]" . elmt:ActionNodes__Drive_om a sysml:OwningMembership ; @@ -1300,14 +1300,16 @@ elmt:ActionNodes__Drive___4016 sysx:sourceText " terminate;\n" . elmt:ActionNodes__Drive___4016_om - a sysml:OwningMembership ; + a sysml:FeatureMembership ; sysml:elementId "ActionNodes__Drive___4016_om" ; sysml:owner elmt:ActionNodes__Drive ; sysml:memberElement elmt:ActionNodes__Drive___4016 ; sysml:ownedMemberElement elmt:ActionNodes__Drive___4016 ; sysml:ownedRelatedElement elmt:ActionNodes__Drive___4016 ; sysml:owningRelatedElement elmt:ActionNodes__Drive ; - sysml:membershipOwningNamespace elmt:ActionNodes__Drive . + sysml:membershipOwningNamespace elmt:ActionNodes__Drive ; + sysml:ownedMemberFeature elmt:ActionNodes__Drive___4016 ; + sysml:owningType elmt:ActionNodes__Drive . elmt:ActionNodes__Drive___4017 a sysml:TerminateActionUsage ; @@ -1328,14 +1330,16 @@ elmt:ActionNodes__Drive___4017 sysx:sourceText " terminate brake;\n" . elmt:ActionNodes__Drive___4017_om - a sysml:OwningMembership ; + a sysml:FeatureMembership ; sysml:elementId "ActionNodes__Drive___4017_om" ; sysml:owner elmt:ActionNodes__Drive ; sysml:memberElement elmt:ActionNodes__Drive___4017 ; sysml:ownedMemberElement elmt:ActionNodes__Drive___4017 ; sysml:ownedRelatedElement elmt:ActionNodes__Drive___4017 ; sysml:owningRelatedElement elmt:ActionNodes__Drive ; - sysml:membershipOwningNamespace elmt:ActionNodes__Drive . + sysml:membershipOwningNamespace elmt:ActionNodes__Drive ; + sysml:ownedMemberFeature elmt:ActionNodes__Drive___4017 ; + sysml:owningType elmt:ActionNodes__Drive . expr:ActionNodes__Drive___4017_pexpression a sysml:FeatureReferenceExpression ; diff --git a/tests/export/testdata/convert/bounds.golden.ttl b/tests/export/testdata/convert/bounds.golden.ttl index f5336549c7..0d89b37540 100644 --- a/tests/export/testdata/convert/bounds.golden.ttl +++ b/tests/export/testdata/convert/bounds.golden.ttl @@ -380,7 +380,7 @@ elmt:Bounds__Fleet__loose sysml:owningMembership elmt:Bounds__Fleet__loose_om ; sysml:declaredName "loose" ; sysml:isOrdered "true"^^xsd:boolean ; - sysml:isNonunique "true"^^xsd:boolean ; + sysml:isUnique "false"^^xsd:boolean ; sysml:type elmt:Bounds__Vehicle ; sysml:multiplicity expr:Bounds__Fleet__loose_pmultiplicity ; sysml:ownedRelationship expr:Bounds__Fleet__loose_pmultiplicity_om, elmt:Bounds__Fleet__loose_ft0 ; diff --git a/tests/export/testdata/convert/end_binding_bodies.golden.ttl b/tests/export/testdata/convert/end_binding_bodies.golden.ttl index 5d6a14785b..6dca1c1597 100644 --- a/tests/export/testdata/convert/end_binding_bodies.golden.ttl +++ b/tests/export/testdata/convert/end_binding_bodies.golden.ttl @@ -1102,15 +1102,15 @@ elmt:Bodies__Ctx sysml:ownedMember elmt:Bodies__Ctx__x, elmt:Bodies__Ctx__y, elmt:Bodies__Ctx__c, elmt:Bodies__Ctx___403, elmt:Bodies__Ctx__f, elmt:Bodies__Ctx__bd, elmt:Bodies__Ctx___406, elmt:Bodies__Ctx__al, elmt:Bodies__Ctx__s, elmt:Bodies__Ctx__Act, elmt:Bodies__Ctx__Machine ; sysml:ownedMembership elmt:Bodies__Ctx__x_om, elmt:Bodies__Ctx__y_om, elmt:Bodies__Ctx__c_om, elmt:Bodies__Ctx___403_om, elmt:Bodies__Ctx__f_om, elmt:Bodies__Ctx__bd_om, elmt:Bodies__Ctx___406_om, elmt:Bodies__Ctx__al_om, elmt:Bodies__Ctx__s_om, elmt:Bodies__Ctx__Act_om, elmt:Bodies__Ctx__Machine_om ; sysml:ownedRelationship elmt:Bodies__Ctx__x_om, elmt:Bodies__Ctx__y_om, elmt:Bodies__Ctx__c_om, elmt:Bodies__Ctx___403_om, elmt:Bodies__Ctx__f_om, elmt:Bodies__Ctx__bd_om, elmt:Bodies__Ctx___406_om, elmt:Bodies__Ctx__al_om, elmt:Bodies__Ctx__s_om, elmt:Bodies__Ctx__Act_om, elmt:Bodies__Ctx__Machine_om ; - sysml:ownedFeature elmt:Bodies__Ctx__x, elmt:Bodies__Ctx__y, elmt:Bodies__Ctx__c, elmt:Bodies__Ctx___403, elmt:Bodies__Ctx__bd, elmt:Bodies__Ctx___406, elmt:Bodies__Ctx__al, elmt:Bodies__Ctx__s ; - sysml:ownedFeatureMembership elmt:Bodies__Ctx__x_om, elmt:Bodies__Ctx__y_om, elmt:Bodies__Ctx__c_om, elmt:Bodies__Ctx___403_om, elmt:Bodies__Ctx__bd_om, elmt:Bodies__Ctx___406_om, elmt:Bodies__Ctx__al_om, elmt:Bodies__Ctx__s_om ; + sysml:ownedFeature elmt:Bodies__Ctx__x, elmt:Bodies__Ctx__y, elmt:Bodies__Ctx__c, elmt:Bodies__Ctx___403, elmt:Bodies__Ctx__f, elmt:Bodies__Ctx__bd, elmt:Bodies__Ctx___406, elmt:Bodies__Ctx__al, elmt:Bodies__Ctx__s ; + sysml:ownedFeatureMembership elmt:Bodies__Ctx__x_om, elmt:Bodies__Ctx__y_om, elmt:Bodies__Ctx__c_om, elmt:Bodies__Ctx___403_om, elmt:Bodies__Ctx__f_om, elmt:Bodies__Ctx__bd_om, elmt:Bodies__Ctx___406_om, elmt:Bodies__Ctx__al_om, elmt:Bodies__Ctx__s_om ; sysx:sourceText " part def Ctx {\n" ; sysx:sourceTail " }\n" ; json:ownedMember "[{\"@id\":\"Bodies__Ctx__x\"},{\"@id\":\"Bodies__Ctx__y\"},{\"@id\":\"Bodies__Ctx__c\"},{\"@id\":\"Bodies__Ctx___403\"},{\"@id\":\"Bodies__Ctx__f\"},{\"@id\":\"Bodies__Ctx__bd\"},{\"@id\":\"Bodies__Ctx___406\"},{\"@id\":\"Bodies__Ctx__al\"},{\"@id\":\"Bodies__Ctx__s\"},{\"@id\":\"Bodies__Ctx__Act\"},{\"@id\":\"Bodies__Ctx__Machine\"}]" ; json:ownedMembership "[{\"@id\":\"Bodies__Ctx__x_om\"},{\"@id\":\"Bodies__Ctx__y_om\"},{\"@id\":\"Bodies__Ctx__c_om\"},{\"@id\":\"Bodies__Ctx___403_om\"},{\"@id\":\"Bodies__Ctx__f_om\"},{\"@id\":\"Bodies__Ctx__bd_om\"},{\"@id\":\"Bodies__Ctx___406_om\"},{\"@id\":\"Bodies__Ctx__al_om\"},{\"@id\":\"Bodies__Ctx__s_om\"},{\"@id\":\"Bodies__Ctx__Act_om\"},{\"@id\":\"Bodies__Ctx__Machine_om\"}]" ; json:ownedRelationship "[{\"@id\":\"Bodies__Ctx__x_om\"},{\"@id\":\"Bodies__Ctx__y_om\"},{\"@id\":\"Bodies__Ctx__c_om\"},{\"@id\":\"Bodies__Ctx___403_om\"},{\"@id\":\"Bodies__Ctx__f_om\"},{\"@id\":\"Bodies__Ctx__bd_om\"},{\"@id\":\"Bodies__Ctx___406_om\"},{\"@id\":\"Bodies__Ctx__al_om\"},{\"@id\":\"Bodies__Ctx__s_om\"},{\"@id\":\"Bodies__Ctx__Act_om\"},{\"@id\":\"Bodies__Ctx__Machine_om\"}]" ; - json:ownedFeature "[{\"@id\":\"Bodies__Ctx__x\"},{\"@id\":\"Bodies__Ctx__y\"},{\"@id\":\"Bodies__Ctx__c\"},{\"@id\":\"Bodies__Ctx___403\"},{\"@id\":\"Bodies__Ctx__bd\"},{\"@id\":\"Bodies__Ctx___406\"},{\"@id\":\"Bodies__Ctx__al\"},{\"@id\":\"Bodies__Ctx__s\"}]" ; - json:ownedFeatureMembership "[{\"@id\":\"Bodies__Ctx__x_om\"},{\"@id\":\"Bodies__Ctx__y_om\"},{\"@id\":\"Bodies__Ctx__c_om\"},{\"@id\":\"Bodies__Ctx___403_om\"},{\"@id\":\"Bodies__Ctx__bd_om\"},{\"@id\":\"Bodies__Ctx___406_om\"},{\"@id\":\"Bodies__Ctx__al_om\"},{\"@id\":\"Bodies__Ctx__s_om\"}]" . + json:ownedFeature "[{\"@id\":\"Bodies__Ctx__x\"},{\"@id\":\"Bodies__Ctx__y\"},{\"@id\":\"Bodies__Ctx__c\"},{\"@id\":\"Bodies__Ctx___403\"},{\"@id\":\"Bodies__Ctx__f\"},{\"@id\":\"Bodies__Ctx__bd\"},{\"@id\":\"Bodies__Ctx___406\"},{\"@id\":\"Bodies__Ctx__al\"},{\"@id\":\"Bodies__Ctx__s\"}]" ; + json:ownedFeatureMembership "[{\"@id\":\"Bodies__Ctx__x_om\"},{\"@id\":\"Bodies__Ctx__y_om\"},{\"@id\":\"Bodies__Ctx__c_om\"},{\"@id\":\"Bodies__Ctx___403_om\"},{\"@id\":\"Bodies__Ctx__f_om\"},{\"@id\":\"Bodies__Ctx__bd_om\"},{\"@id\":\"Bodies__Ctx___406_om\"},{\"@id\":\"Bodies__Ctx__al_om\"},{\"@id\":\"Bodies__Ctx__s_om\"}]" . elmt:Bodies__Ctx_om a sysml:OwningMembership ; @@ -1672,8 +1672,8 @@ elmt:Bodies__Ctx__f sysml:connectorEnd expr:Bodies__Ctx__f_pend0, expr:Bodies__Ctx__f_pend1 ; sysml:ownedRelationship expr:Bodies__Ctx__f_pend0_om, expr:Bodies__Ctx__f_pend1_om, elmt:Bodies__Ctx__f__w_om ; sysml:ownedMembership expr:Bodies__Ctx__f_pend0_om, expr:Bodies__Ctx__f_pend1_om, elmt:Bodies__Ctx__f__w_om ; - sysml:ownedFeatureMembership expr:Bodies__Ctx__f_pend0_om, expr:Bodies__Ctx__f_pend1_om ; - sysml:ownedFeature expr:Bodies__Ctx__f_pend0, expr:Bodies__Ctx__f_pend1 ; + sysml:ownedFeatureMembership expr:Bodies__Ctx__f_pend0_om, expr:Bodies__Ctx__f_pend1_om, elmt:Bodies__Ctx__f__w_om ; + sysml:ownedFeature expr:Bodies__Ctx__f_pend0, expr:Bodies__Ctx__f_pend1, elmt:Bodies__Ctx__f__w ; sysml:ownedEndFeature expr:Bodies__Ctx__f_pend0, expr:Bodies__Ctx__f_pend1 ; sysx:endForm "fromTo" ; sysx:hasBody "true"^^xsd:boolean ; @@ -1683,19 +1683,21 @@ elmt:Bodies__Ctx__f json:connectorEnd "[{\"@id\":\"Bodies__Ctx__f_pend0\"},{\"@id\":\"Bodies__Ctx__f_pend1\"}]" ; json:ownedRelationship "[{\"@id\":\"Bodies__Ctx__f_pend0_om\"},{\"@id\":\"Bodies__Ctx__f_pend1_om\"},{\"@id\":\"Bodies__Ctx__f__w_om\"}]" ; json:ownedMembership "[{\"@id\":\"Bodies__Ctx__f_pend0_om\"},{\"@id\":\"Bodies__Ctx__f_pend1_om\"},{\"@id\":\"Bodies__Ctx__f__w_om\"}]" ; - json:ownedFeatureMembership "[{\"@id\":\"Bodies__Ctx__f_pend0_om\"},{\"@id\":\"Bodies__Ctx__f_pend1_om\"}]" ; - json:ownedFeature "[{\"@id\":\"Bodies__Ctx__f_pend0\"},{\"@id\":\"Bodies__Ctx__f_pend1\"}]" ; + json:ownedFeatureMembership "[{\"@id\":\"Bodies__Ctx__f_pend0_om\"},{\"@id\":\"Bodies__Ctx__f_pend1_om\"},{\"@id\":\"Bodies__Ctx__f__w_om\"}]" ; + json:ownedFeature "[{\"@id\":\"Bodies__Ctx__f_pend0\"},{\"@id\":\"Bodies__Ctx__f_pend1\"},{\"@id\":\"Bodies__Ctx__f__w\"}]" ; json:ownedEndFeature "[{\"@id\":\"Bodies__Ctx__f_pend0\"},{\"@id\":\"Bodies__Ctx__f_pend1\"}]" . elmt:Bodies__Ctx__f_om - a sysml:OwningMembership ; + a sysml:FeatureMembership ; sysml:elementId "Bodies__Ctx__f_om" ; sysml:owner elmt:Bodies__Ctx ; sysml:memberElement elmt:Bodies__Ctx__f ; sysml:ownedMemberElement elmt:Bodies__Ctx__f ; sysml:ownedRelatedElement elmt:Bodies__Ctx__f ; sysml:owningRelatedElement elmt:Bodies__Ctx ; - sysml:membershipOwningNamespace elmt:Bodies__Ctx . + sysml:membershipOwningNamespace elmt:Bodies__Ctx ; + sysml:ownedMemberFeature elmt:Bodies__Ctx__f ; + sysml:owningType elmt:Bodies__Ctx . expr:Bodies__Ctx__f_pend0 a sysml:FlowEnd ; @@ -1853,14 +1855,16 @@ elmt:Bodies__Ctx__f__w sysx:sourceText " attribute w : Prio;\n" . elmt:Bodies__Ctx__f__w_om - a sysml:OwningMembership ; + a sysml:FeatureMembership ; sysml:elementId "Bodies__Ctx__f__w_om" ; sysml:owner elmt:Bodies__Ctx__f ; sysml:memberElement elmt:Bodies__Ctx__f__w ; sysml:ownedMemberElement elmt:Bodies__Ctx__f__w ; sysml:ownedRelatedElement elmt:Bodies__Ctx__f__w ; sysml:owningRelatedElement elmt:Bodies__Ctx__f ; - sysml:membershipOwningNamespace elmt:Bodies__Ctx__f . + sysml:membershipOwningNamespace elmt:Bodies__Ctx__f ; + sysml:ownedMemberFeature elmt:Bodies__Ctx__f__w ; + sysml:owningType elmt:Bodies__Ctx__f . elmt:Bodies__Ctx__bd a sysml:BindingConnectorAsUsage ; diff --git a/tests/export/testdata/convert/payload_declaration_bodies.golden.ttl b/tests/export/testdata/convert/payload_declaration_bodies.golden.ttl index e77e5299d5..4aeef35dd9 100644 --- a/tests/export/testdata/convert/payload_declaration_bodies.golden.ttl +++ b/tests/export/testdata/convert/payload_declaration_bodies.golden.ttl @@ -229,14 +229,14 @@ elmt:Payloads__Ctx sysml:ownedMember elmt:Payloads__Ctx__x, elmt:Payloads__Ctx__y, elmt:Payloads__Ctx___402, elmt:Payloads__Ctx__m, elmt:Payloads__Ctx___404 ; sysml:ownedMembership elmt:Payloads__Ctx__x_om, elmt:Payloads__Ctx__y_om, elmt:Payloads__Ctx___402_om, elmt:Payloads__Ctx__m_om, elmt:Payloads__Ctx___404_om ; sysml:ownedRelationship elmt:Payloads__Ctx__x_om, elmt:Payloads__Ctx__y_om, elmt:Payloads__Ctx___402_om, elmt:Payloads__Ctx__m_om, elmt:Payloads__Ctx___404_om ; - sysml:ownedFeature elmt:Payloads__Ctx__x, elmt:Payloads__Ctx__y ; - sysml:ownedFeatureMembership elmt:Payloads__Ctx__x_om, elmt:Payloads__Ctx__y_om ; + sysml:ownedFeature elmt:Payloads__Ctx__x, elmt:Payloads__Ctx__y, elmt:Payloads__Ctx___402, elmt:Payloads__Ctx__m, elmt:Payloads__Ctx___404 ; + sysml:ownedFeatureMembership elmt:Payloads__Ctx__x_om, elmt:Payloads__Ctx__y_om, elmt:Payloads__Ctx___402_om, elmt:Payloads__Ctx__m_om, elmt:Payloads__Ctx___404_om ; sysx:sourceText " part def Ctx {\n part x : A; part y : B;\n flow of fuel : Fuel from x.i to y.j { attribute w : Prio; }\n message m of cmd : Prio from x.i to y.j;\n message of cmd : Prio = m.cmd from x.i to y.j { attribute w : Prio; }\n }\n" ; json:ownedMember "[{\"@id\":\"Payloads__Ctx__x\"},{\"@id\":\"Payloads__Ctx__y\"},{\"@id\":\"Payloads__Ctx___402\"},{\"@id\":\"Payloads__Ctx__m\"},{\"@id\":\"Payloads__Ctx___404\"}]" ; json:ownedMembership "[{\"@id\":\"Payloads__Ctx__x_om\"},{\"@id\":\"Payloads__Ctx__y_om\"},{\"@id\":\"Payloads__Ctx___402_om\"},{\"@id\":\"Payloads__Ctx__m_om\"},{\"@id\":\"Payloads__Ctx___404_om\"}]" ; json:ownedRelationship "[{\"@id\":\"Payloads__Ctx__x_om\"},{\"@id\":\"Payloads__Ctx__y_om\"},{\"@id\":\"Payloads__Ctx___402_om\"},{\"@id\":\"Payloads__Ctx__m_om\"},{\"@id\":\"Payloads__Ctx___404_om\"}]" ; - json:ownedFeature "[{\"@id\":\"Payloads__Ctx__x\"},{\"@id\":\"Payloads__Ctx__y\"}]" ; - json:ownedFeatureMembership "[{\"@id\":\"Payloads__Ctx__x_om\"},{\"@id\":\"Payloads__Ctx__y_om\"}]" . + json:ownedFeature "[{\"@id\":\"Payloads__Ctx__x\"},{\"@id\":\"Payloads__Ctx__y\"},{\"@id\":\"Payloads__Ctx___402\"},{\"@id\":\"Payloads__Ctx__m\"},{\"@id\":\"Payloads__Ctx___404\"}]" ; + json:ownedFeatureMembership "[{\"@id\":\"Payloads__Ctx__x_om\"},{\"@id\":\"Payloads__Ctx__y_om\"},{\"@id\":\"Payloads__Ctx___402_om\"},{\"@id\":\"Payloads__Ctx__m_om\"},{\"@id\":\"Payloads__Ctx___404_om\"}]" . elmt:Payloads__Ctx_om a sysml:OwningMembership ; @@ -328,28 +328,30 @@ elmt:Payloads__Ctx___402 sysml:connectorEnd expr:Payloads__Ctx___402_pend0, expr:Payloads__Ctx___402_pend1 ; sysml:ownedRelationship expr:Payloads__Ctx___402_pend0_om, expr:Payloads__Ctx___402_pend1_om, elmt:Payloads__Ctx___402__fuel_om, elmt:Payloads__Ctx___402__w_om ; sysml:ownedMembership expr:Payloads__Ctx___402_pend0_om, expr:Payloads__Ctx___402_pend1_om, elmt:Payloads__Ctx___402__fuel_om, elmt:Payloads__Ctx___402__w_om ; - sysml:ownedFeatureMembership expr:Payloads__Ctx___402_pend0_om, expr:Payloads__Ctx___402_pend1_om, elmt:Payloads__Ctx___402__fuel_om ; - sysml:ownedFeature expr:Payloads__Ctx___402_pend0, expr:Payloads__Ctx___402_pend1, elmt:Payloads__Ctx___402__fuel ; + sysml:ownedFeatureMembership expr:Payloads__Ctx___402_pend0_om, expr:Payloads__Ctx___402_pend1_om, elmt:Payloads__Ctx___402__fuel_om, elmt:Payloads__Ctx___402__w_om ; + sysml:ownedFeature expr:Payloads__Ctx___402_pend0, expr:Payloads__Ctx___402_pend1, elmt:Payloads__Ctx___402__fuel, elmt:Payloads__Ctx___402__w ; sysml:ownedEndFeature expr:Payloads__Ctx___402_pend0, expr:Payloads__Ctx___402_pend1 ; sysml:ownedMember elmt:Payloads__Ctx___402__fuel, elmt:Payloads__Ctx___402__w ; sysx:hasBody "true"^^xsd:boolean ; json:connectorEnd "[{\"@id\":\"Payloads__Ctx___402_pend0\"},{\"@id\":\"Payloads__Ctx___402_pend1\"}]" ; json:ownedRelationship "[{\"@id\":\"Payloads__Ctx___402_pend0_om\"},{\"@id\":\"Payloads__Ctx___402_pend1_om\"},{\"@id\":\"Payloads__Ctx___402__fuel_om\"},{\"@id\":\"Payloads__Ctx___402__w_om\"}]" ; json:ownedMembership "[{\"@id\":\"Payloads__Ctx___402_pend0_om\"},{\"@id\":\"Payloads__Ctx___402_pend1_om\"},{\"@id\":\"Payloads__Ctx___402__fuel_om\"},{\"@id\":\"Payloads__Ctx___402__w_om\"}]" ; - json:ownedFeatureMembership "[{\"@id\":\"Payloads__Ctx___402_pend0_om\"},{\"@id\":\"Payloads__Ctx___402_pend1_om\"},{\"@id\":\"Payloads__Ctx___402__fuel_om\"}]" ; - json:ownedFeature "[{\"@id\":\"Payloads__Ctx___402_pend0\"},{\"@id\":\"Payloads__Ctx___402_pend1\"},{\"@id\":\"Payloads__Ctx___402__fuel\"}]" ; + json:ownedFeatureMembership "[{\"@id\":\"Payloads__Ctx___402_pend0_om\"},{\"@id\":\"Payloads__Ctx___402_pend1_om\"},{\"@id\":\"Payloads__Ctx___402__fuel_om\"},{\"@id\":\"Payloads__Ctx___402__w_om\"}]" ; + json:ownedFeature "[{\"@id\":\"Payloads__Ctx___402_pend0\"},{\"@id\":\"Payloads__Ctx___402_pend1\"},{\"@id\":\"Payloads__Ctx___402__fuel\"},{\"@id\":\"Payloads__Ctx___402__w\"}]" ; json:ownedEndFeature "[{\"@id\":\"Payloads__Ctx___402_pend0\"},{\"@id\":\"Payloads__Ctx___402_pend1\"}]" ; json:ownedMember "[{\"@id\":\"Payloads__Ctx___402__fuel\"},{\"@id\":\"Payloads__Ctx___402__w\"}]" . elmt:Payloads__Ctx___402_om - a sysml:OwningMembership ; + a sysml:FeatureMembership ; sysml:elementId "Payloads__Ctx___402_om" ; sysml:owner elmt:Payloads__Ctx ; sysml:memberElement elmt:Payloads__Ctx___402 ; sysml:ownedMemberElement elmt:Payloads__Ctx___402 ; sysml:ownedRelatedElement elmt:Payloads__Ctx___402 ; sysml:owningRelatedElement elmt:Payloads__Ctx ; - sysml:membershipOwningNamespace elmt:Payloads__Ctx . + sysml:membershipOwningNamespace elmt:Payloads__Ctx ; + sysml:ownedMemberFeature elmt:Payloads__Ctx___402 ; + sysml:owningType elmt:Payloads__Ctx . expr:Payloads__Ctx___402_pend0 a sysml:FlowEnd ; @@ -538,14 +540,16 @@ elmt:Payloads__Ctx___402__w sysml:ownedRelationship elmt:Payloads__Ctx___402__w_ft0 . elmt:Payloads__Ctx___402__w_om - a sysml:OwningMembership ; + a sysml:FeatureMembership ; sysml:elementId "Payloads__Ctx___402__w_om" ; sysml:owner elmt:Payloads__Ctx___402 ; sysml:memberElement elmt:Payloads__Ctx___402__w ; sysml:ownedMemberElement elmt:Payloads__Ctx___402__w ; sysml:ownedRelatedElement elmt:Payloads__Ctx___402__w ; sysml:owningRelatedElement elmt:Payloads__Ctx___402 ; - sysml:membershipOwningNamespace elmt:Payloads__Ctx___402 . + sysml:membershipOwningNamespace elmt:Payloads__Ctx___402 ; + sysml:ownedMemberFeature elmt:Payloads__Ctx___402__w ; + sysml:owningType elmt:Payloads__Ctx___402 . elmt:Payloads__Ctx__m a sysml:FlowUsage ; @@ -575,14 +579,16 @@ elmt:Payloads__Ctx__m json:parameter "[{\"@id\":\"Payloads__Ctx__m_pend0\"},{\"@id\":\"Payloads__Ctx__m_pend1\"}]" . elmt:Payloads__Ctx__m_om - a sysml:OwningMembership ; + a sysml:FeatureMembership ; sysml:elementId "Payloads__Ctx__m_om" ; sysml:owner elmt:Payloads__Ctx ; sysml:memberElement elmt:Payloads__Ctx__m ; sysml:ownedMemberElement elmt:Payloads__Ctx__m ; sysml:ownedRelatedElement elmt:Payloads__Ctx__m ; sysml:owningRelatedElement elmt:Payloads__Ctx ; - sysml:membershipOwningNamespace elmt:Payloads__Ctx . + sysml:membershipOwningNamespace elmt:Payloads__Ctx ; + sysml:ownedMemberFeature elmt:Payloads__Ctx__m ; + sysml:owningType elmt:Payloads__Ctx . expr:Payloads__Ctx__m_pend0 a sysml:EventOccurrenceUsage ; @@ -789,27 +795,29 @@ elmt:Payloads__Ctx___404 sysml:owningMembership elmt:Payloads__Ctx___404_om ; sysml:ownedRelationship expr:Payloads__Ctx___404_pend0_om, expr:Payloads__Ctx___404_pend1_om, elmt:Payloads__Ctx___404__cmd_om, elmt:Payloads__Ctx___404__w_om ; sysml:ownedMembership expr:Payloads__Ctx___404_pend0_om, expr:Payloads__Ctx___404_pend1_om, elmt:Payloads__Ctx___404__cmd_om, elmt:Payloads__Ctx___404__w_om ; - sysml:ownedFeatureMembership expr:Payloads__Ctx___404_pend0_om, expr:Payloads__Ctx___404_pend1_om, elmt:Payloads__Ctx___404__cmd_om ; - sysml:ownedFeature expr:Payloads__Ctx___404_pend0, expr:Payloads__Ctx___404_pend1, elmt:Payloads__Ctx___404__cmd ; + sysml:ownedFeatureMembership expr:Payloads__Ctx___404_pend0_om, expr:Payloads__Ctx___404_pend1_om, elmt:Payloads__Ctx___404__cmd_om, elmt:Payloads__Ctx___404__w_om ; + sysml:ownedFeature expr:Payloads__Ctx___404_pend0, expr:Payloads__Ctx___404_pend1, elmt:Payloads__Ctx___404__cmd, elmt:Payloads__Ctx___404__w ; sysml:parameter expr:Payloads__Ctx___404_pend0, expr:Payloads__Ctx___404_pend1 ; sysml:ownedMember elmt:Payloads__Ctx___404__cmd, elmt:Payloads__Ctx___404__w ; sysx:hasBody "true"^^xsd:boolean ; json:ownedRelationship "[{\"@id\":\"Payloads__Ctx___404_pend0_om\"},{\"@id\":\"Payloads__Ctx___404_pend1_om\"},{\"@id\":\"Payloads__Ctx___404__cmd_om\"},{\"@id\":\"Payloads__Ctx___404__w_om\"}]" ; json:ownedMembership "[{\"@id\":\"Payloads__Ctx___404_pend0_om\"},{\"@id\":\"Payloads__Ctx___404_pend1_om\"},{\"@id\":\"Payloads__Ctx___404__cmd_om\"},{\"@id\":\"Payloads__Ctx___404__w_om\"}]" ; - json:ownedFeatureMembership "[{\"@id\":\"Payloads__Ctx___404_pend0_om\"},{\"@id\":\"Payloads__Ctx___404_pend1_om\"},{\"@id\":\"Payloads__Ctx___404__cmd_om\"}]" ; - json:ownedFeature "[{\"@id\":\"Payloads__Ctx___404_pend0\"},{\"@id\":\"Payloads__Ctx___404_pend1\"},{\"@id\":\"Payloads__Ctx___404__cmd\"}]" ; + json:ownedFeatureMembership "[{\"@id\":\"Payloads__Ctx___404_pend0_om\"},{\"@id\":\"Payloads__Ctx___404_pend1_om\"},{\"@id\":\"Payloads__Ctx___404__cmd_om\"},{\"@id\":\"Payloads__Ctx___404__w_om\"}]" ; + json:ownedFeature "[{\"@id\":\"Payloads__Ctx___404_pend0\"},{\"@id\":\"Payloads__Ctx___404_pend1\"},{\"@id\":\"Payloads__Ctx___404__cmd\"},{\"@id\":\"Payloads__Ctx___404__w\"}]" ; json:parameter "[{\"@id\":\"Payloads__Ctx___404_pend0\"},{\"@id\":\"Payloads__Ctx___404_pend1\"}]" ; json:ownedMember "[{\"@id\":\"Payloads__Ctx___404__cmd\"},{\"@id\":\"Payloads__Ctx___404__w\"}]" . elmt:Payloads__Ctx___404_om - a sysml:OwningMembership ; + a sysml:FeatureMembership ; sysml:elementId "Payloads__Ctx___404_om" ; sysml:owner elmt:Payloads__Ctx ; sysml:memberElement elmt:Payloads__Ctx___404 ; sysml:ownedMemberElement elmt:Payloads__Ctx___404 ; sysml:ownedRelatedElement elmt:Payloads__Ctx___404 ; sysml:owningRelatedElement elmt:Payloads__Ctx ; - sysml:membershipOwningNamespace elmt:Payloads__Ctx . + sysml:membershipOwningNamespace elmt:Payloads__Ctx ; + sysml:ownedMemberFeature elmt:Payloads__Ctx___404 ; + sysml:owningType elmt:Payloads__Ctx . expr:Payloads__Ctx___404_pend0 a sysml:EventOccurrenceUsage ; @@ -1149,14 +1157,16 @@ elmt:Payloads__Ctx___404__w sysml:ownedRelationship elmt:Payloads__Ctx___404__w_ft0 . elmt:Payloads__Ctx___404__w_om - a sysml:OwningMembership ; + a sysml:FeatureMembership ; sysml:elementId "Payloads__Ctx___404__w_om" ; sysml:owner elmt:Payloads__Ctx___404 ; sysml:memberElement elmt:Payloads__Ctx___404__w ; sysml:ownedMemberElement elmt:Payloads__Ctx___404__w ; sysml:ownedRelatedElement elmt:Payloads__Ctx___404__w ; sysml:owningRelatedElement elmt:Payloads__Ctx___404 ; - sysml:membershipOwningNamespace elmt:Payloads__Ctx___404 . + sysml:membershipOwningNamespace elmt:Payloads__Ctx___404 ; + sysml:ownedMemberFeature elmt:Payloads__Ctx___404__w ; + sysml:owningType elmt:Payloads__Ctx___404 . elmt:Payloads__A__i_ft0 a sysml:FeatureTyping ; diff --git a/tests/export/testdata/convert/then_after_members.golden.ttl b/tests/export/testdata/convert/then_after_members.golden.ttl index ef8ddd9ae6..ce0d8dcd37 100644 --- a/tests/export/testdata/convert/then_after_members.golden.ttl +++ b/tests/export/testdata/convert/then_after_members.golden.ttl @@ -178,15 +178,15 @@ elmt:ThenAfterMembers__AfterFlow sysml:ownedMember elmt:ThenAfterMembers__AfterFlow__a, elmt:ThenAfterMembers__AfterFlow___401, elmt:ThenAfterMembers__AfterFlow__b, elmt:ThenAfterMembers__AfterFlow___403 ; sysml:ownedMembership elmt:ThenAfterMembers__AfterFlow__a_om, elmt:ThenAfterMembers__AfterFlow___401_om, elmt:ThenAfterMembers__AfterFlow__b_om, elmt:ThenAfterMembers__AfterFlow___403_om ; sysml:ownedRelationship elmt:ThenAfterMembers__AfterFlow__a_om, elmt:ThenAfterMembers__AfterFlow___401_om, elmt:ThenAfterMembers__AfterFlow__b_om, elmt:ThenAfterMembers__AfterFlow___403_om ; - sysml:ownedFeature elmt:ThenAfterMembers__AfterFlow__a, elmt:ThenAfterMembers__AfterFlow__b, elmt:ThenAfterMembers__AfterFlow___403 ; - sysml:ownedFeatureMembership elmt:ThenAfterMembers__AfterFlow__a_om, elmt:ThenAfterMembers__AfterFlow__b_om, elmt:ThenAfterMembers__AfterFlow___403_om ; + sysml:ownedFeature elmt:ThenAfterMembers__AfterFlow__a, elmt:ThenAfterMembers__AfterFlow___401, elmt:ThenAfterMembers__AfterFlow__b, elmt:ThenAfterMembers__AfterFlow___403 ; + sysml:ownedFeatureMembership elmt:ThenAfterMembers__AfterFlow__a_om, elmt:ThenAfterMembers__AfterFlow___401_om, elmt:ThenAfterMembers__AfterFlow__b_om, elmt:ThenAfterMembers__AfterFlow___403_om ; sysx:sourceText " action def AfterFlow {\n" ; sysx:sourceTail " }\n" ; json:ownedMember "[{\"@id\":\"ThenAfterMembers__AfterFlow__a\"},{\"@id\":\"ThenAfterMembers__AfterFlow___401\"},{\"@id\":\"ThenAfterMembers__AfterFlow__b\"},{\"@id\":\"ThenAfterMembers__AfterFlow___403\"}]" ; json:ownedMembership "[{\"@id\":\"ThenAfterMembers__AfterFlow__a_om\"},{\"@id\":\"ThenAfterMembers__AfterFlow___401_om\"},{\"@id\":\"ThenAfterMembers__AfterFlow__b_om\"},{\"@id\":\"ThenAfterMembers__AfterFlow___403_om\"}]" ; json:ownedRelationship "[{\"@id\":\"ThenAfterMembers__AfterFlow__a_om\"},{\"@id\":\"ThenAfterMembers__AfterFlow___401_om\"},{\"@id\":\"ThenAfterMembers__AfterFlow__b_om\"},{\"@id\":\"ThenAfterMembers__AfterFlow___403_om\"}]" ; - json:ownedFeature "[{\"@id\":\"ThenAfterMembers__AfterFlow__a\"},{\"@id\":\"ThenAfterMembers__AfterFlow__b\"},{\"@id\":\"ThenAfterMembers__AfterFlow___403\"}]" ; - json:ownedFeatureMembership "[{\"@id\":\"ThenAfterMembers__AfterFlow__a_om\"},{\"@id\":\"ThenAfterMembers__AfterFlow__b_om\"},{\"@id\":\"ThenAfterMembers__AfterFlow___403_om\"}]" . + json:ownedFeature "[{\"@id\":\"ThenAfterMembers__AfterFlow__a\"},{\"@id\":\"ThenAfterMembers__AfterFlow___401\"},{\"@id\":\"ThenAfterMembers__AfterFlow__b\"},{\"@id\":\"ThenAfterMembers__AfterFlow___403\"}]" ; + json:ownedFeatureMembership "[{\"@id\":\"ThenAfterMembers__AfterFlow__a_om\"},{\"@id\":\"ThenAfterMembers__AfterFlow___401_om\"},{\"@id\":\"ThenAfterMembers__AfterFlow__b_om\"},{\"@id\":\"ThenAfterMembers__AfterFlow___403_om\"}]" . elmt:ThenAfterMembers__AfterFlow_om a sysml:OwningMembership ; @@ -261,14 +261,16 @@ elmt:ThenAfterMembers__AfterFlow___401 json:ownedEndFeature "[{\"@id\":\"ThenAfterMembers__AfterFlow___401_pend0\"},{\"@id\":\"ThenAfterMembers__AfterFlow___401_pend1\"}]" . elmt:ThenAfterMembers__AfterFlow___401_om - a sysml:OwningMembership ; + a sysml:FeatureMembership ; sysml:elementId "ThenAfterMembers__AfterFlow___401_om" ; sysml:owner elmt:ThenAfterMembers__AfterFlow ; sysml:memberElement elmt:ThenAfterMembers__AfterFlow___401 ; sysml:ownedMemberElement elmt:ThenAfterMembers__AfterFlow___401 ; sysml:ownedRelatedElement elmt:ThenAfterMembers__AfterFlow___401 ; sysml:owningRelatedElement elmt:ThenAfterMembers__AfterFlow ; - sysml:membershipOwningNamespace elmt:ThenAfterMembers__AfterFlow . + sysml:membershipOwningNamespace elmt:ThenAfterMembers__AfterFlow ; + sysml:ownedMemberFeature elmt:ThenAfterMembers__AfterFlow___401 ; + sysml:owningType elmt:ThenAfterMembers__AfterFlow . expr:ThenAfterMembers__AfterFlow___401_pend0 a sysml:FlowEnd ; @@ -7110,15 +7112,15 @@ elmt:ThenAfterMembers__AfterPerform sysml:ownedMember elmt:ThenAfterMembers__AfterPerform___400, elmt:ThenAfterMembers__AfterPerform___401, elmt:ThenAfterMembers__AfterPerform__b, elmt:ThenAfterMembers__AfterPerform___403 ; sysml:ownedMembership elmt:ThenAfterMembers__AfterPerform___400_om, elmt:ThenAfterMembers__AfterPerform___401_om, elmt:ThenAfterMembers__AfterPerform__b_om, elmt:ThenAfterMembers__AfterPerform___403_om ; sysml:ownedRelationship elmt:ThenAfterMembers__AfterPerform___400_om, elmt:ThenAfterMembers__AfterPerform___401_om, elmt:ThenAfterMembers__AfterPerform__b_om, elmt:ThenAfterMembers__AfterPerform___403_om ; - sysml:ownedFeature elmt:ThenAfterMembers__AfterPerform___400, elmt:ThenAfterMembers__AfterPerform__b, elmt:ThenAfterMembers__AfterPerform___403 ; - sysml:ownedFeatureMembership elmt:ThenAfterMembers__AfterPerform___400_om, elmt:ThenAfterMembers__AfterPerform__b_om, elmt:ThenAfterMembers__AfterPerform___403_om ; + sysml:ownedFeature elmt:ThenAfterMembers__AfterPerform___400, elmt:ThenAfterMembers__AfterPerform___401, elmt:ThenAfterMembers__AfterPerform__b, elmt:ThenAfterMembers__AfterPerform___403 ; + sysml:ownedFeatureMembership elmt:ThenAfterMembers__AfterPerform___400_om, elmt:ThenAfterMembers__AfterPerform___401_om, elmt:ThenAfterMembers__AfterPerform__b_om, elmt:ThenAfterMembers__AfterPerform___403_om ; sysx:sourceText " action def AfterPerform {\n" ; sysx:sourceTail " }\n" ; json:ownedMember "[{\"@id\":\"ThenAfterMembers__AfterPerform___400\"},{\"@id\":\"ThenAfterMembers__AfterPerform___401\"},{\"@id\":\"ThenAfterMembers__AfterPerform__b\"},{\"@id\":\"ThenAfterMembers__AfterPerform___403\"}]" ; json:ownedMembership "[{\"@id\":\"ThenAfterMembers__AfterPerform___400_om\"},{\"@id\":\"ThenAfterMembers__AfterPerform___401_om\"},{\"@id\":\"ThenAfterMembers__AfterPerform__b_om\"},{\"@id\":\"ThenAfterMembers__AfterPerform___403_om\"}]" ; json:ownedRelationship "[{\"@id\":\"ThenAfterMembers__AfterPerform___400_om\"},{\"@id\":\"ThenAfterMembers__AfterPerform___401_om\"},{\"@id\":\"ThenAfterMembers__AfterPerform__b_om\"},{\"@id\":\"ThenAfterMembers__AfterPerform___403_om\"}]" ; - json:ownedFeature "[{\"@id\":\"ThenAfterMembers__AfterPerform___400\"},{\"@id\":\"ThenAfterMembers__AfterPerform__b\"},{\"@id\":\"ThenAfterMembers__AfterPerform___403\"}]" ; - json:ownedFeatureMembership "[{\"@id\":\"ThenAfterMembers__AfterPerform___400_om\"},{\"@id\":\"ThenAfterMembers__AfterPerform__b_om\"},{\"@id\":\"ThenAfterMembers__AfterPerform___403_om\"}]" . + json:ownedFeature "[{\"@id\":\"ThenAfterMembers__AfterPerform___400\"},{\"@id\":\"ThenAfterMembers__AfterPerform___401\"},{\"@id\":\"ThenAfterMembers__AfterPerform__b\"},{\"@id\":\"ThenAfterMembers__AfterPerform___403\"}]" ; + json:ownedFeatureMembership "[{\"@id\":\"ThenAfterMembers__AfterPerform___400_om\"},{\"@id\":\"ThenAfterMembers__AfterPerform___401_om\"},{\"@id\":\"ThenAfterMembers__AfterPerform__b_om\"},{\"@id\":\"ThenAfterMembers__AfterPerform___403_om\"}]" . elmt:ThenAfterMembers__AfterPerform_om a sysml:OwningMembership ; @@ -7194,14 +7196,16 @@ elmt:ThenAfterMembers__AfterPerform___401 json:ownedEndFeature "[{\"@id\":\"ThenAfterMembers__AfterPerform___401_pend0\"},{\"@id\":\"ThenAfterMembers__AfterPerform___401_pend1\"}]" . elmt:ThenAfterMembers__AfterPerform___401_om - a sysml:OwningMembership ; + a sysml:FeatureMembership ; sysml:elementId "ThenAfterMembers__AfterPerform___401_om" ; sysml:owner elmt:ThenAfterMembers__AfterPerform ; sysml:memberElement elmt:ThenAfterMembers__AfterPerform___401 ; sysml:ownedMemberElement elmt:ThenAfterMembers__AfterPerform___401 ; sysml:ownedRelatedElement elmt:ThenAfterMembers__AfterPerform___401 ; sysml:owningRelatedElement elmt:ThenAfterMembers__AfterPerform ; - sysml:membershipOwningNamespace elmt:ThenAfterMembers__AfterPerform . + sysml:membershipOwningNamespace elmt:ThenAfterMembers__AfterPerform ; + sysml:ownedMemberFeature elmt:ThenAfterMembers__AfterPerform___401 ; + sysml:owningType elmt:ThenAfterMembers__AfterPerform . expr:ThenAfterMembers__AfterPerform___401_pend0 a sysml:FlowEnd ; @@ -7489,15 +7493,15 @@ elmt:ThenAfterMembers__ThenAlone sysml:ownedMember elmt:ThenAfterMembers__ThenAlone__a, elmt:ThenAfterMembers__ThenAlone___401, elmt:ThenAfterMembers__ThenAlone___402, elmt:ThenAfterMembers__ThenAlone__b ; sysml:ownedMembership elmt:ThenAfterMembers__ThenAlone__a_om, elmt:ThenAfterMembers__ThenAlone___401_om, elmt:ThenAfterMembers__ThenAlone___402_om, elmt:ThenAfterMembers__ThenAlone__b_om ; sysml:ownedRelationship elmt:ThenAfterMembers__ThenAlone__a_om, elmt:ThenAfterMembers__ThenAlone___401_om, elmt:ThenAfterMembers__ThenAlone___402_om, elmt:ThenAfterMembers__ThenAlone__b_om ; - sysml:ownedFeature elmt:ThenAfterMembers__ThenAlone__a, elmt:ThenAfterMembers__ThenAlone___402, elmt:ThenAfterMembers__ThenAlone__b ; - sysml:ownedFeatureMembership elmt:ThenAfterMembers__ThenAlone__a_om, elmt:ThenAfterMembers__ThenAlone___402_om, elmt:ThenAfterMembers__ThenAlone__b_om ; + sysml:ownedFeature elmt:ThenAfterMembers__ThenAlone__a, elmt:ThenAfterMembers__ThenAlone___401, elmt:ThenAfterMembers__ThenAlone___402, elmt:ThenAfterMembers__ThenAlone__b ; + sysml:ownedFeatureMembership elmt:ThenAfterMembers__ThenAlone__a_om, elmt:ThenAfterMembers__ThenAlone___401_om, elmt:ThenAfterMembers__ThenAlone___402_om, elmt:ThenAfterMembers__ThenAlone__b_om ; sysx:sourceText " action def ThenAlone {\n" ; sysx:sourceTail " }\n" ; json:ownedMember "[{\"@id\":\"ThenAfterMembers__ThenAlone__a\"},{\"@id\":\"ThenAfterMembers__ThenAlone___401\"},{\"@id\":\"ThenAfterMembers__ThenAlone___402\"},{\"@id\":\"ThenAfterMembers__ThenAlone__b\"}]" ; json:ownedMembership "[{\"@id\":\"ThenAfterMembers__ThenAlone__a_om\"},{\"@id\":\"ThenAfterMembers__ThenAlone___401_om\"},{\"@id\":\"ThenAfterMembers__ThenAlone___402_om\"},{\"@id\":\"ThenAfterMembers__ThenAlone__b_om\"}]" ; json:ownedRelationship "[{\"@id\":\"ThenAfterMembers__ThenAlone__a_om\"},{\"@id\":\"ThenAfterMembers__ThenAlone___401_om\"},{\"@id\":\"ThenAfterMembers__ThenAlone___402_om\"},{\"@id\":\"ThenAfterMembers__ThenAlone__b_om\"}]" ; - json:ownedFeature "[{\"@id\":\"ThenAfterMembers__ThenAlone__a\"},{\"@id\":\"ThenAfterMembers__ThenAlone___402\"},{\"@id\":\"ThenAfterMembers__ThenAlone__b\"}]" ; - json:ownedFeatureMembership "[{\"@id\":\"ThenAfterMembers__ThenAlone__a_om\"},{\"@id\":\"ThenAfterMembers__ThenAlone___402_om\"},{\"@id\":\"ThenAfterMembers__ThenAlone__b_om\"}]" . + json:ownedFeature "[{\"@id\":\"ThenAfterMembers__ThenAlone__a\"},{\"@id\":\"ThenAfterMembers__ThenAlone___401\"},{\"@id\":\"ThenAfterMembers__ThenAlone___402\"},{\"@id\":\"ThenAfterMembers__ThenAlone__b\"}]" ; + json:ownedFeatureMembership "[{\"@id\":\"ThenAfterMembers__ThenAlone__a_om\"},{\"@id\":\"ThenAfterMembers__ThenAlone___401_om\"},{\"@id\":\"ThenAfterMembers__ThenAlone___402_om\"},{\"@id\":\"ThenAfterMembers__ThenAlone__b_om\"}]" . elmt:ThenAfterMembers__ThenAlone_om a sysml:OwningMembership ; @@ -7572,14 +7576,16 @@ elmt:ThenAfterMembers__ThenAlone___401 json:ownedEndFeature "[{\"@id\":\"ThenAfterMembers__ThenAlone___401_pend0\"},{\"@id\":\"ThenAfterMembers__ThenAlone___401_pend1\"}]" . elmt:ThenAfterMembers__ThenAlone___401_om - a sysml:OwningMembership ; + a sysml:FeatureMembership ; sysml:elementId "ThenAfterMembers__ThenAlone___401_om" ; sysml:owner elmt:ThenAfterMembers__ThenAlone ; sysml:memberElement elmt:ThenAfterMembers__ThenAlone___401 ; sysml:ownedMemberElement elmt:ThenAfterMembers__ThenAlone___401 ; sysml:ownedRelatedElement elmt:ThenAfterMembers__ThenAlone___401 ; sysml:owningRelatedElement elmt:ThenAfterMembers__ThenAlone ; - sysml:membershipOwningNamespace elmt:ThenAfterMembers__ThenAlone . + sysml:membershipOwningNamespace elmt:ThenAfterMembers__ThenAlone ; + sysml:ownedMemberFeature elmt:ThenAfterMembers__ThenAlone___401 ; + sysml:owningType elmt:ThenAfterMembers__ThenAlone . expr:ThenAfterMembers__ThenAlone___401_pend0 a sysml:FlowEnd ; diff --git a/tests/export/testdata/convert/views_flows_parameters.golden.ttl b/tests/export/testdata/convert/views_flows_parameters.golden.ttl index 56b25ca022..175b96783b 100644 --- a/tests/export/testdata/convert/views_flows_parameters.golden.ttl +++ b/tests/export/testdata/convert/views_flows_parameters.golden.ttl @@ -200,15 +200,15 @@ elmt:FlowsAndViews__FuelInterface sysml:ownedMember elmt:FlowsAndViews__FuelInterface__supplierPort, elmt:FlowsAndViews__FuelInterface__consumerPort, elmt:FlowsAndViews__FuelInterface___402 ; sysml:ownedMembership elmt:FlowsAndViews__FuelInterface__supplierPort_om, elmt:FlowsAndViews__FuelInterface__consumerPort_om, elmt:FlowsAndViews__FuelInterface___402_om ; sysml:ownedRelationship elmt:FlowsAndViews__FuelInterface__supplierPort_om, elmt:FlowsAndViews__FuelInterface__consumerPort_om, elmt:FlowsAndViews__FuelInterface___402_om ; - sysml:ownedFeature elmt:FlowsAndViews__FuelInterface__supplierPort, elmt:FlowsAndViews__FuelInterface__consumerPort ; - sysml:ownedFeatureMembership elmt:FlowsAndViews__FuelInterface__supplierPort_om, elmt:FlowsAndViews__FuelInterface__consumerPort_om ; + sysml:ownedFeature elmt:FlowsAndViews__FuelInterface__supplierPort, elmt:FlowsAndViews__FuelInterface__consumerPort, elmt:FlowsAndViews__FuelInterface___402 ; + sysml:ownedFeatureMembership elmt:FlowsAndViews__FuelInterface__supplierPort_om, elmt:FlowsAndViews__FuelInterface__consumerPort_om, elmt:FlowsAndViews__FuelInterface___402_om ; sysx:sourceText " interface def FuelInterface {\n" ; sysx:sourceTail " }\n" ; json:ownedMember "[{\"@id\":\"FlowsAndViews__FuelInterface__supplierPort\"},{\"@id\":\"FlowsAndViews__FuelInterface__consumerPort\"},{\"@id\":\"FlowsAndViews__FuelInterface___402\"}]" ; json:ownedMembership "[{\"@id\":\"FlowsAndViews__FuelInterface__supplierPort_om\"},{\"@id\":\"FlowsAndViews__FuelInterface__consumerPort_om\"},{\"@id\":\"FlowsAndViews__FuelInterface___402_om\"}]" ; json:ownedRelationship "[{\"@id\":\"FlowsAndViews__FuelInterface__supplierPort_om\"},{\"@id\":\"FlowsAndViews__FuelInterface__consumerPort_om\"},{\"@id\":\"FlowsAndViews__FuelInterface___402_om\"}]" ; - json:ownedFeature "[{\"@id\":\"FlowsAndViews__FuelInterface__supplierPort\"},{\"@id\":\"FlowsAndViews__FuelInterface__consumerPort\"}]" ; - json:ownedFeatureMembership "[{\"@id\":\"FlowsAndViews__FuelInterface__supplierPort_om\"},{\"@id\":\"FlowsAndViews__FuelInterface__consumerPort_om\"}]" . + json:ownedFeature "[{\"@id\":\"FlowsAndViews__FuelInterface__supplierPort\"},{\"@id\":\"FlowsAndViews__FuelInterface__consumerPort\"},{\"@id\":\"FlowsAndViews__FuelInterface___402\"}]" ; + json:ownedFeatureMembership "[{\"@id\":\"FlowsAndViews__FuelInterface__supplierPort_om\"},{\"@id\":\"FlowsAndViews__FuelInterface__consumerPort_om\"},{\"@id\":\"FlowsAndViews__FuelInterface___402_om\"}]" . elmt:FlowsAndViews__FuelInterface_om a sysml:OwningMembership ; @@ -318,14 +318,16 @@ elmt:FlowsAndViews__FuelInterface___402 json:ownedEndFeature "[{\"@id\":\"FlowsAndViews__FuelInterface___402_pend0\"},{\"@id\":\"FlowsAndViews__FuelInterface___402_pend1\"}]" . elmt:FlowsAndViews__FuelInterface___402_om - a sysml:OwningMembership ; + a sysml:FeatureMembership ; sysml:elementId "FlowsAndViews__FuelInterface___402_om" ; sysml:owner elmt:FlowsAndViews__FuelInterface ; sysml:memberElement elmt:FlowsAndViews__FuelInterface___402 ; sysml:ownedMemberElement elmt:FlowsAndViews__FuelInterface___402 ; sysml:ownedRelatedElement elmt:FlowsAndViews__FuelInterface___402 ; sysml:owningRelatedElement elmt:FlowsAndViews__FuelInterface ; - sysml:membershipOwningNamespace elmt:FlowsAndViews__FuelInterface . + sysml:membershipOwningNamespace elmt:FlowsAndViews__FuelInterface ; + sysml:ownedMemberFeature elmt:FlowsAndViews__FuelInterface___402 ; + sysml:owningType elmt:FlowsAndViews__FuelInterface . expr:FlowsAndViews__FuelInterface___402_pend0 a sysml:FlowEnd ; @@ -475,7 +477,7 @@ elmt:FlowsAndViews__tanks sysml:owningRelationship elmt:FlowsAndViews__tanks_om ; sysml:owningMembership elmt:FlowsAndViews__tanks_om ; sysml:declaredName "tanks" ; - sysml:isNonunique "true"^^xsd:boolean ; + sysml:isUnique "false"^^xsd:boolean ; sysml:type elmt:FlowsAndViews__Tank ; sysml:multiplicity expr:FlowsAndViews__tanks_pmultiplicity ; sysml:ownedRelationship expr:FlowsAndViews__tanks_pmultiplicity_om, elmt:FlowsAndViews__tanks_ft0 ; @@ -620,7 +622,7 @@ elmt:FlowsAndViews__vehicle__spares sysml:owningRelationship elmt:FlowsAndViews__vehicle__spares_om ; sysml:owningMembership elmt:FlowsAndViews__vehicle__spares_om ; sysml:declaredName "spares" ; - sysml:isNonunique "true"^^xsd:boolean ; + sysml:isUnique "false"^^xsd:boolean ; sysml:type elmt:FlowsAndViews__Tank ; sysml:subsets elmt:FlowsAndViews__tanks ; sysml:multiplicity expr:FlowsAndViews__vehicle__spares_pmultiplicity ; diff --git a/tests/export/testdata/ontology-known-violations.txt b/tests/export/testdata/ontology-known-violations.txt index 759a2a36ee..c284e683df 100644 --- a/tests/export/testdata/ontology-known-violations.txt +++ b/tests/export/testdata/ontology-known-violations.txt @@ -1,14 +1,13 @@ # Known disagreements between the graphs this tool writes and the OMG SysML v2 -# metamodel as Open-MBEE/sysmlv2-rdf-ontology renders it (version 202407). Each +# metamodel table generated from the pilot's SysML.ecore (version 20250201). Each # line is one violation key — ` ` — and the reason it # is expected; TestGoldenGraphsMatchOntology (internal/translate/export) fails on any # key that is not listed here, and on any listed key no fixture violates any # more. The inventory is tracked in docs/project/roadmap.md § D7 and § D8. # # A key names no element, so this list survives a change of element identity. -# The ontology records no abstractness, so a subject typed by a metaclass that is -# abstract in the metamodel would not be among these findings; every metaclass -# written is checked concrete against the pilot's ecore models by hand instead. +# A subject typed by a metaclass the ecore declares abstract is an abstract-class +# violation, and none is listed: every metaclass this tool writes is concrete. # 1. Properties the metamodel declares on a relationship or membership element # that this tool collapses into the element itself. Ownership and visibility no @@ -17,6 +16,7 @@ domain-mismatch AttributeUsage value # FeatureValue_value: the feature value is written on the usage instead of a FeatureValue membership domain-mismatch ReferenceUsage value # FeatureValue_value: same collapse on a kindless usage's value domain-mismatch AssignmentActionUsage value # FeatureValue_value: same collapse on an assignment's target value +domain-mismatch PayloadFeature value # FeatureValue_value: same collapse on a flow payload's value (`message of cmd : P = m.cmd`) domain-mismatch PartUsage lowerBound # MultiplicityRange_lowerBound: the multiplicity is written on the usage instead of a MultiplicityRange domain-mismatch PartUsage upperBound # MultiplicityRange_upperBound: the multiplicity is written on the usage instead of a MultiplicityRange domain-mismatch ReferenceUsage lowerBound # MultiplicityRange_lowerBound: same collapse on a kindless usage @@ -53,16 +53,11 @@ literal-for-object-property FeatureChaining chainingFeature # F literal-for-object-property FeatureChaining relatedElement # Relationship_relatedElement: same literal on the minted FeatureChaining's relatedElement end literal-for-object-property FeatureChaining target # Relationship_target: same literal on the minted FeatureChaining's target end -# 3. Metaclass names this tool writes into the SysML namespace that the 202407 -# rendering does not declare at all. -unknown-class FlowUsage - # 202407 names this metaclass FlowConnectionUsage; SysML.owl declares no FlowUsage -unknown-class PayloadFeature - # 202407 names this metaclass ItemFeature; SysML.owl declares no PayloadFeature -unknown-class FlowEnd - # 202407 names this metaclass ItemFlowEnd; SysML.owl declares no FlowEnd -unknown-class TerminateActionUsage - # SysML.owl declares no TerminateActionUsage at all (no Terminate* class exists in it) -unknown-class ClassUsage - # a KerML `class` written as a usage; SysML.owl declares Class, a classifier, and no ClassUsage -unknown-class IndividualDefinition - # `individual def`, standardly an OccurrenceDefinition with isIndividual; SysML.owl declares no IndividualDefinition -unknown-class IndividualUsage - # `individual` usage, standardly an OccurrenceUsage with isIndividual; SysML.owl declares no IndividualUsage -unknown-class ConstructorExpression - # KerML 1.0 `new T(...)`, an InstantiationExpression the pilot writes; the 202407 rendering predates the metaclass +# 3. Metaclass names this tool writes into the SysML namespace that the metamodel +# does not declare at all. +unknown-class ClassUsage - # a KerML `class` written as a usage; the metamodel declares Class, a classifier, and no ClassUsage +unknown-class IndividualDefinition - # `individual def`, standardly an OccurrenceDefinition with isIndividual; the metamodel declares no IndividualDefinition +unknown-class IndividualUsage - # `individual` usage, standardly an OccurrenceUsage with isIndividual; the metamodel declares no IndividualUsage # 4. Metaclasses of this tool's own extension namespace, for constructs it has no # standard metaclass for. Deliberately outside the standard vocabulary, so the @@ -105,9 +100,8 @@ unknown-property ActionUsage via # the port an accep unknown-property ReferenceUsage isAccept # notation flag for an accept parameter, no metamodel property unknown-property ReferenceUsage isResult # notation flag for a result parameter, no metamodel property unknown-property PartUsage isChain # notation flag for a feature chain, no metamodel property -unknown-property PartUsage isVariant # Usage::isVariant, which the 202407 rendering omits; the metamodel derives it from the VariantMembership +unknown-property PartUsage isVariant # Usage::isVariant, which the metamodel's ecore does not declare; the variant is its VariantMembership unknown-property EnumerationUsage isVariant # Usage::isVariant on an enumerated value, a variant of its enumeration definition; omitted the same way unknown-property Connector isAll # Type::isSufficient (`connector all from a to b`), written under the notation's own name unknown-property AttributeUsage isAll # Type::isSufficient (`portion feature all slices`), written under the notation's own name -unknown-property AttributeUsage isConstant # Feature::isReadOnly in the 202407 rendering, whose `readonly` the notation has since respelled `const`; written under the notation's own name literal-for-object-property FeatureChainExpression targetFeature # FeatureChainExpression_targetFeature: the `result` of an invocation is no element of the graph and is written as a name diff --git a/tests/migrate/relations_test.go b/tests/migrate/relations_test.go index 11a72b86be..937be53332 100644 --- a/tests/migrate/relations_test.go +++ b/tests/migrate/relations_test.go @@ -1171,7 +1171,7 @@ func TestCollectionModifiersAreWritten(t *testing.T) { if err != nil { t.Fatal(err) } - for _, want := range []string{"isOrdered", "isNonunique"} { + for _, want := range []string{"isOrdered", `isUnique "false"`} { if !strings.Contains(string(ttl), want) { t.Errorf("Turtle lacks %s", want) } diff --git a/tests/ontology/ontology_test.go b/tests/ontology/ontology_test.go index 0d339d661d..0e8f95c2b0 100644 --- a/tests/ontology/ontology_test.go +++ b/tests/ontology/ontology_test.go @@ -1,6 +1,10 @@ package ontology_test import ( + "os" + "path/filepath" + "reflect" + "regexp" "strings" "testing" @@ -13,7 +17,7 @@ import ( func TestTableShape(t *testing.T) { properties := ontology.Properties() classes := ontology.Classes() - // The counts SysML.owl 202407 declares; an ontology bump is expected to move them. + // The counts SysML.ecore 20250201 (pilot 2026-08) declares; a metamodel bump is expected to move them. object, datatype := 0, 0 for _, p := range properties { if p.Kind == ontology.ObjectProperty { @@ -22,16 +26,20 @@ func TestTableShape(t *testing.T) { datatype++ } } - if len(classes) != 172 || object != 348 || datatype != 63 { - t.Errorf("table holds %d classes, %d object and %d datatype properties; want 172, 348, 63", + if len(classes) != 175 || object != 351 || datatype != 64 { + t.Errorf("table holds %d classes, %d object and %d datatype properties; want 175, 351, 64", len(classes), object, datatype) } - if got := len(ontology.AmbiguousNames()); got != 59 { - t.Errorf("got %d unqualified names declared by more than one metaclass, want 59", got) + if got := len(ontology.AmbiguousNames()); got != 58 { + t.Errorf("got %d unqualified names declared by more than one metaclass, want 58", got) } - if ontology.Version == "" || len(ontology.SourceCommit) != 40 { - t.Errorf("table header not recorded: version %q, commit %q", - ontology.Version, ontology.SourceCommit) + if ontology.Version == "" || ontology.SourceTag == "" || len(ontology.SourceCommit) != 40 { + t.Errorf("table header not recorded: version %q, tag %q, commit %q", + ontology.Version, ontology.SourceTag, ontology.SourceCommit) + } + qualified := make(map[string]bool, len(properties)) + for _, p := range properties { + qualified[p.QualifiedName()] = true } for _, p := range properties { if p.IRI != rdf.SysML+p.DefiningClass+"_"+p.Name { @@ -43,6 +51,14 @@ func TestTableShape(t *testing.T) { if p.Range == "" { t.Errorf("%s: no declared range", p.IRI) } + if p.Ordered && !p.Many { + t.Errorf("%s: Ordered on a single-valued property", p.IRI) + } + for _, ref := range append(append(append([]string(nil), p.Redefines...), p.Subsets...), p.Opposite) { + if ref != "" && !qualified[ref] { + t.Errorf("%s: names %s, which is no declared property", p.IRI, ref) + } + } rangeName := ontology.LocalName(p.Range) _, rangeIsClass := ontology.LookupClass(rangeName) if (p.Kind == ontology.ObjectProperty) != rangeIsClass { @@ -62,7 +78,7 @@ func TestTableShape(t *testing.T) { } } -// TestLookups checks the accessors against declarations read out of SysML.owl by +// TestLookups checks the accessors against declarations read out of SysML.ecore by // hand, including a name two metaclasses declare. func TestLookups(t *testing.T) { declaredName := ontology.LookupProperty("declaredName") @@ -76,9 +92,35 @@ func TestLookups(t *testing.T) { Kind: ontology.DatatypeProperty, Range: rdf.XSD + "string", } - if declaredName[0] != want { + if !reflect.DeepEqual(declaredName[0], want) { t.Errorf("declaredName: got %+v, want %+v", declaredName[0], want) } + ownedFeature, ok := ontology.PropertyOf("Type", "ownedFeature") + wantOwnedFeature := ontology.Property{ + Name: "ownedFeature", + DefiningClass: "Type", + IRI: rdf.SysML + "Type_ownedFeature", + Kind: ontology.ObjectProperty, + Range: rdf.SysML + "Feature", + Many: true, + Ordered: true, + Derived: true, + Subsets: []string{"Namespace::ownedMember"}, + Opposite: "Feature::owningType", + } + if !ok || !reflect.DeepEqual(ownedFeature, wantOwnedFeature) { + t.Errorf("ownedFeature: got %+v, want %+v", ownedFeature, wantOwnedFeature) + } + memberFeature, _ := ontology.PropertyOf("FeatureMembership", "ownedMemberFeature") + if want := []string{"OwningMembership::ownedMemberElement"}; !reflect.DeepEqual(memberFeature.Redefines, want) { + t.Errorf("ownedMemberFeature: redefines %v, want %v", memberFeature.Redefines, want) + } + if element, _ := ontology.LookupClass("Element"); !element.Abstract { + t.Error("Element should be abstract") + } + if part, _ := ontology.LookupClass("PartUsage"); part.Abstract { + t.Error("PartUsage should be concrete") + } owner := ontology.LookupProperty("owningNamespace") if len(owner) != 1 || owner[0].Kind != ontology.ObjectProperty || owner[0].Range != rdf.SysML+"Namespace" { @@ -104,6 +146,26 @@ func TestLookups(t *testing.T) { } } +var pilotPinRe = regexp.MustCompile(`(?m)^PILOT_(TAG|COMMIT)="\$\{PILOT_(?:TAG|COMMIT):-([^}"]*)\}"`) + +// TestTableFollowsThePilotPin fails when scripts/pilot-pin.sh moves without the +// table being regenerated from the metamodel of the new pin. +func TestTableFollowsThePilotPin(t *testing.T) { + data, err := os.ReadFile(filepath.Join("..", "..", "scripts", "pilot-pin.sh")) + if err != nil { + t.Fatal(err) + } + pin := map[string]string{} + for _, m := range pilotPinRe.FindAllStringSubmatch(string(data), -1) { + pin[m[1]] = m[2] + } + if pin["TAG"] != ontology.SourceTag || pin["COMMIT"] != ontology.SourceCommit { + t.Errorf("table generated from pilot %s %s, scripts/pilot-pin.sh pins %s %s; "+ + "regenerate with ./scripts/download-pilot-metamodel.sh && go run -C tools ./gen/ontology", + ontology.SourceTag, ontology.SourceCommit, pin["TAG"], pin["COMMIT"]) + } +} + // TestCheckReportsEachKind exercises the check on a hand-built graph, one triple // per kind, independently of what the export fixtures happen to contain. func TestCheckReportsEachKind(t *testing.T) { @@ -121,6 +183,8 @@ func TestCheckReportsEachKind(t *testing.T) { graph.Add(untyped, rdf.SysMLTerm("declaredName"), rdf.String("u")) odd := rdf.ElementIRI("M::o") graph.Add(odd, rdf.IRI(rdf.RDFType), rdf.SysMLTerm("NotAMetaclass")) + imp := rdf.ElementIRI("M::i") + graph.Add(imp, rdf.IRI(rdf.RDFType), rdf.SysMLTerm("Import")) want := map[string]string{ "unknown-property PartUsage notAProperty": `named "notAProperty"`, @@ -129,6 +193,7 @@ func TestCheckReportsEachKind(t *testing.T) { "iri-for-datatype-property PartUsage declaredName": "owl:DatatypeProperty", "untyped-subject - -": "no rdf:type", "unknown-class NotAMetaclass -": "not an owl:Class", + "abstract-class Import -": "abstract in the metamodel", } got := make(map[string]string) for _, violation := range ontology.Check(graph) { diff --git a/tools/gen/ontology/main.go b/tools/gen/ontology/main.go index 3cd60fa60b..e82df32c9b 100644 --- a/tools/gen/ontology/main.go +++ b/tools/gen/ontology/main.go @@ -1,88 +1,106 @@ -// Command ontology writes internal/translate/rdf/ontology/table.go from a local -// checkout of https://github.com/Open-MBEE/sysmlv2-rdf-ontology, which is not -// vendored here. The checkout's version and commit SHA go into the header, -// making the table reproducible. +// Command ontology writes internal/translate/rdf/ontology/table.go from the OMG +// SysML v2 metamodel's SysML.ecore as the pinned pilot implementation publishes +// it. scripts/download-pilot-metamodel.sh fetches it into build/pilot-metamodel +// at the commit scripts/pilot-pin.sh pins, which the header records. // -// go run -C tools ./gen/ontology -ontology /path/to/sysmlv2-rdf-ontology +// ./scripts/download-pilot-metamodel.sh +// go run -C tools ./gen/ontology [-check] package main import ( + "bytes" "encoding/xml" "errors" "flag" "fmt" "go/format" - "io" "os" "path/filepath" "regexp" "sort" "strings" + "github.com/Open-MBEE/OpenSysML/tools/oracle/baseline" "github.com/Open-MBEE/OpenSysML/tools/oracle/repo" ) -// tablePath is the generated table, relative to the repository root. -const tablePath = "internal/translate/rdf/ontology/table.go" - const ( + // tablePath is the generated table, relative to the repository root. + tablePath = "internal/translate/rdf/ontology/table.go" + // metamodelDir is where scripts/download-pilot-metamodel.sh puts the pilot's model directory. + metamodelDir = "build/pilot-metamodel" + // ecorePath is the metamodel in that directory and in the pilot repository's org.omg.sysml/model. + ecorePath = "SysML.ecore" + stampPath = ".pilot-pin" sysmlNS = "https://www.omg.org/spec/SysML#" - owlPath = "sysml2/owl/www.omg.org/spec/SysML.owl" - ecorePath = "sysml2/ecore/SysML.ecore" - readme = "sysml2/README.md" - rdfNS = "http://www.w3.org/1999/02/22-rdf-syntax-ns#" - rdfsNS = "http://www.w3.org/2000/01/rdf-schema#" + xsdNS = "http://www.w3.org/2001/XMLSchema#" owlNS = "http://www.w3.org/2002/07/owl#" + xsiNS = "http://www.w3.org/2001/XMLSchema-instance" + regen = "./scripts/download-pilot-metamodel.sh && go run -C tools ./gen/ontology" template = `// Code generated by tools/gen/ontology. DO NOT EDIT. // -// Source: Open-MBEE/sysmlv2-rdf-ontology, %s -// Ecore: %s (property multiplicities) -// Ontology: SysML v2 metamodel version %s (generated from SysML.ecore) -// Commit: %s +// Source: %s %s, org.omg.sysml/model/SysML.ecore +// Commit: %s +// Metamodel: %s // // Regenerate with (see README.md): // -// go run -C tools ./gen/ontology -ontology +// ./scripts/download-pilot-metamodel.sh +// go run -C tools ./gen/ontology package ontology -// Version is the OMG SysML v2 metamodel version the table was generated from. +// Version is the OMG SysML v2 metamodel version the table was generated from, +// the date in the ecore's namespace URI. const Version = %q -// SourceCommit is the sysmlv2-rdf-ontology commit the table was generated from. +// SourceTag is the pilot implementation release the table was generated from. +const SourceTag = %q + +// SourceCommit is the pilot implementation commit the table was generated from. const SourceCommit = %q -// properties holds every owl:ObjectProperty and owl:DatatypeProperty the -// ontology declares, ordered by IRI. +// properties holds every eStructuralFeature the metamodel declares, ordered by IRI. var properties = []Property{ %s} -// classes holds every owl:Class the ontology declares with its named -// rdfs:subClassOf parents, ordered by name. +// classes holds every EClass the metamodel declares with its eSuperTypes, ordered by name. var classes = []Class{ %s} ` ) +// datatypeRanges maps an ecore primitive, in the pilot's own spelling and in +// Ecore's, to the XSD or OWL datatype the RDF mapping writes it as. +var datatypeRanges = map[string]string{ + "Boolean": xsdNS + "boolean", "EBoolean": xsdNS + "boolean", + "String": xsdNS + "string", "EString": xsdNS + "string", + "Integer": xsdNS + "int", "EInt": xsdNS + "int", + "Real": owlNS + "real", "EDouble": owlNS + "real", +} + func main() { - root := flag.String("ontology", "", "path to a local Open-MBEE/sysmlv2-rdf-ontology checkout") + dir := flag.String("metamodel", "", "directory holding the pilot's SysML.ecore and its .pilot-pin stamp (default "+metamodelDir+" under the repository root)") out := flag.String("out", "", "generated file to write (default "+tablePath+" under the repository root)") + check := flag.Bool("check", false, "fail if the file differs from a fresh table instead of writing it") flag.Parse() - if *root == "" { - fail(fmt.Errorf("-ontology is required: pass a local sysmlv2-rdf-ontology checkout")) + root, err := repo.Root() + if err != nil { + fail(err) } - if repo.NeedsRoot(*root, *out) { - repoRoot, err := repo.Root() - if err != nil { - fail(err) - } - *root = repo.Resolve(repoRoot, *root) - *out = repo.Resolve(repoRoot, *out) - if *out == "" { - *out = filepath.Join(repoRoot, filepath.FromSlash(tablePath)) - } + pin, err := baseline.ReadPin(root) + if err != nil { + fail(err) + } + *dir = repo.Resolve(root, *dir) + if *dir == "" { + *dir = filepath.Join(root, filepath.FromSlash(metamodelDir)) } - if err := run(*root, *out); err != nil { + *out = repo.Resolve(root, *out) + if *out == "" { + *out = filepath.Join(root, filepath.FromSlash(tablePath)) + } + if err := run(*dir, *out, *check, pin); err != nil { fail(err) } } @@ -92,456 +110,262 @@ func fail(err error) { os.Exit(1) } -func run(root, out string) error { - version, err := ontologyVersion(filepath.Join(root, readme)) +// run generates the table from dir and writes it to out, or with check +// compares it against out; the stamp in dir must name pin. +func run(dir, out string, check bool, pin baseline.Pin) error { + src, err := readStamp(filepath.Join(dir, stampPath)) if err != nil { return err } - commit, err := commitSHA(root) - if err != nil { - return err + if src.tag != pin.Tag || src.commit != pin.Commit { + return fmt.Errorf("%s holds the metamodel at %s %s, but %s pins %s %s; rerun ./scripts/download-pilot-metamodel.sh", + dir, src.tag, src.commit, baseline.PinPath, pin.Tag, pin.Commit) } - decls, err := parseOntology(filepath.Join(root, owlPath)) + pkg, err := parseEcore(filepath.Join(dir, ecorePath)) if err != nil { return err } - features, err := parseEcore(filepath.Join(root, ecorePath)) + version, err := metamodelVersion(pkg.NsURI) if err != nil { return err } - properties, classes, err := tables(decls, features) + properties, classes, err := tables(pkg) if err != nil { - return err + return fmt.Errorf("%s: %w", ecorePath, err) } - source := fmt.Sprintf(template, owlPath, ecorePath, version, commit, version, commit, + source := fmt.Sprintf(template, src.repo, src.tag, src.commit, pkg.NsURI, version, src.tag, src.commit, propertyLiterals(properties), classLiterals(classes)) formatted, err := format.Source([]byte(source)) if err != nil { return fmt.Errorf("format generated source: %w", err) } + if check { + // #nosec G304 -- the table to compare is named on the command line. + have, err := os.ReadFile(out) + if err != nil || !bytes.Equal(have, formatted) { + return fmt.Errorf("%s is stale against %s at %s; regenerate with `%s`", out, ecorePath, src.tag, regen) + } + fmt.Printf("%s is current: %d properties, %d classes (metamodel %s, pilot %s)\n", + out, len(properties), len(classes), version, src.tag) + return nil + } if err := os.WriteFile(out, formatted, 0o600); err != nil { return err } - fmt.Printf("wrote %s: %d properties, %d classes (version %s, commit %s)\n", - out, len(properties), len(classes), version, commit[:12]) + fmt.Printf("wrote %s: %d properties, %d classes (metamodel %s, pilot %s, commit %s)\n", + out, len(properties), len(classes), version, src.tag, src.commit[:12]) return nil } -var ( - versionBadge = regexp.MustCompile(`Version-(\d+)-`) - commitSHAPattern = regexp.MustCompile(`^([0-9a-f]{40}|[0-9a-f]{64})$`) -) +// source is the provenance a fetched metamodel directory's stamp records. +type source struct{ tag, commit, repo string } + +var commitSHAPattern = regexp.MustCompile(`^[0-9a-f]{40}$`) -// ontologyVersion reads the metamodel version out of the checkout's own README -// badge, so the recorded version cannot drift from the file it describes. -func ontologyVersion(path string) (string, error) { - // #nosec G304 -- the checkout to read is named on the command line. +// readStamp reads the " " stamp pilot_fetch_subtrees writes. +func readStamp(path string) (source, error) { + // #nosec G304 -- the stamp sits in the metamodel directory named on the command line. data, err := os.ReadFile(path) if err != nil { - return "", fmt.Errorf("read ontology version: %w", err) + return source{}, fmt.Errorf("read the metamodel's pin stamp (fetch it with ./scripts/download-pilot-metamodel.sh): %w", err) } - match := versionBadge.FindSubmatch(data) - if match == nil { - return "", fmt.Errorf("no Version- badge in %s", path) + fields := strings.Fields(string(data)) + if len(fields) != 3 || !commitSHAPattern.MatchString(fields[1]) { + return source{}, fmt.Errorf("%s: want \" \", got %q", path, strings.TrimSpace(string(data))) } - return string(match[1]), nil + return source{tag: fields[0], commit: fields[1], repo: fields[2]}, nil } -func commitSHA(root string) (string, error) { - gitDir, refsDir, err := gitMetadataDirs(root) - if err != nil { - return "", err - } - headPath := filepath.Join(gitDir, "HEAD") - // #nosec G304 -- git metadata path derives from the requested checkout. - head, err := os.ReadFile(headPath) - if err != nil { - return "", gitMetadataErrorf(headPath, "read HEAD: %w", err) - } - headValue := strings.TrimSpace(string(head)) - if strings.HasPrefix(headValue, "ref:") { - ref := strings.TrimSpace(strings.TrimPrefix(headValue, "ref:")) - if !validGitRef(ref) { - return "", gitMetadataErrorf(headPath, "invalid symbolic ref %q", ref) - } - return commitSHAForRef(refsDir, ref) +var nsURIVersion = regexp.MustCompile(`^https://www\.omg\.org/spec/SysML/(\d{8})$`) + +// metamodelVersion is the date the ecore's nsURI ends in, the version OMG publishes the metamodel under. +func metamodelVersion(nsURI string) (string, error) { + match := nsURIVersion.FindStringSubmatch(nsURI) + if match == nil { + return "", fmt.Errorf("%s: nsURI %q is not https://www.omg.org/spec/SysML/", ecorePath, nsURI) } - return validateCommitSHA(headValue, headPath) + return match[1], nil } -type gitMetadataError struct { - path string - err error +// ePackage and the types below are the part of the ecore XMI the table reads. +type ePackage struct { + NsURI string `xml:"nsURI,attr"` + Classifiers []eClassifier `xml:"eClassifiers"` + Subpackages []struct{} `xml:"eSubpackages"` } -func (e *gitMetadataError) Error() string { - return fmt.Sprintf("git metadata %s: %v", e.path, e.err) +type eClassifier struct { + Type string `xml:"http://www.w3.org/2001/XMLSchema-instance type,attr"` + Name string `xml:"name,attr"` + Abstract bool `xml:"abstract,attr"` + SuperTypes string `xml:"eSuperTypes,attr"` + Features []eFeature `xml:"eStructuralFeatures"` } -func (e *gitMetadataError) Unwrap() error { - return e.err +type eFeature struct { + Type string `xml:"http://www.w3.org/2001/XMLSchema-instance type,attr"` + Name string `xml:"name,attr"` + EType string `xml:"eType,attr"` + UpperBound string `xml:"upperBound,attr"` + Ordered string `xml:"ordered,attr"` + Derived bool `xml:"derived,attr"` + Opposite string `xml:"eOpposite,attr"` + Annotations []eAnnotation `xml:"eAnnotations"` } -func gitMetadataErrorf(path, format string, args ...any) error { - return &gitMetadataError{path: path, err: fmt.Errorf(format, args...)} +type eAnnotation struct { + Source string `xml:"source,attr"` + References string `xml:"references,attr"` } -func gitMetadataDirs(root string) (string, string, error) { - dotGit := filepath.Join(root, ".git") - info, err := os.Stat(dotGit) +func parseEcore(path string) (ePackage, error) { + // #nosec G304 -- the metamodel directory is named on the command line. + data, err := os.ReadFile(path) if err != nil { - return "", "", gitMetadataErrorf(dotGit, "read .git: %w", err) + return ePackage{}, err } - gitDir := dotGit - if !info.IsDir() { - // #nosec G304 -- .git is derived from the requested checkout. - data, err := os.ReadFile(dotGit) - if err != nil { - return "", "", gitMetadataErrorf(dotGit, "read gitdir: %w", err) - } - line := strings.TrimSpace(string(data)) - const prefix = "gitdir:" - if !strings.HasPrefix(line, prefix) { - return "", "", gitMetadataErrorf(dotGit, "invalid gitdir file") - } - target := strings.TrimSpace(strings.TrimPrefix(line, prefix)) - if target == "" { - return "", "", gitMetadataErrorf(dotGit, "empty gitdir path") - } - if !filepath.IsAbs(target) { - target = filepath.Join(root, target) - } - gitDir = filepath.Clean(target) - info, err = os.Stat(gitDir) - if err != nil { - return "", "", gitMetadataErrorf(dotGit, "read gitdir %s: %w", gitDir, err) - } - if !info.IsDir() { - return "", "", gitMetadataErrorf(dotGit, "gitdir %s is not a directory", gitDir) - } - } - - refsDir := gitDir - commondirPath := filepath.Join(gitDir, "commondir") - // #nosec G304 -- commondir is inside the requested Git metadata directory. - data, err := os.ReadFile(commondirPath) - if err == nil { - commonDir := strings.TrimSpace(string(data)) - if commonDir == "" { - return "", "", gitMetadataErrorf(commondirPath, "empty common directory path") - } - if !filepath.IsAbs(commonDir) { - commonDir = filepath.Join(gitDir, commonDir) - } - refsDir = filepath.Clean(commonDir) - info, err := os.Stat(refsDir) - if err != nil { - return "", "", gitMetadataErrorf(commondirPath, "read common directory %s: %w", refsDir, err) - } - if !info.IsDir() { - return "", "", gitMetadataErrorf(commondirPath, "common directory %s is not a directory", refsDir) - } - } else if !errors.Is(err, os.ErrNotExist) { - return "", "", gitMetadataErrorf(commondirPath, "read common directory: %w", err) - } - return gitDir, refsDir, nil -} - -func validGitRef(ref string) bool { - if !strings.HasPrefix(ref, "refs/") || strings.ContainsAny(ref, " \t\r\n") { - return false - } - for _, part := range strings.Split(ref, "/") { - if part == "" || part == "." || part == ".." { - return false - } - } - return true -} - -func commitSHAForRef(refsDir, ref string) (string, error) { - loosePath := filepath.Join(refsDir, filepath.FromSlash(ref)) - // #nosec G304 -- ref is validated before it is joined to the Git directory. - data, err := os.ReadFile(loosePath) - if err == nil { - return validateCommitSHA(strings.TrimSpace(string(data)), loosePath) + var pkg ePackage + if err := xml.Unmarshal(data, &pkg); err != nil { + return ePackage{}, fmt.Errorf("%s: %w", path, err) } - if !errors.Is(err, os.ErrNotExist) { - return "", gitMetadataErrorf(loosePath, "read ref %s: %w", ref, err) + if len(pkg.Subpackages) > 0 { + return ePackage{}, fmt.Errorf("%s: eSubpackages are not supported; the metamodel is one flat package", path) } - - packedPath := filepath.Join(refsDir, "packed-refs") - // #nosec G304 -- packed-refs is inside the requested Git metadata directory. - data, err = os.ReadFile(packedPath) - if err != nil { - return "", gitMetadataErrorf(packedPath, "read ref %s: %w", ref, err) + if len(pkg.Classifiers) == 0 { + return ePackage{}, fmt.Errorf("%s: no eClassifiers found", path) } - for _, line := range strings.Split(string(data), "\n") { - line = strings.TrimSpace(line) - if line == "" || strings.HasPrefix(line, "#") || strings.HasPrefix(line, "^") { - continue - } - fields := strings.Fields(line) - if len(fields) < 2 || fields[1] != ref { - continue - } - return validateCommitSHA(fields[0], packedPath) - } - return "", gitMetadataErrorf(packedPath, "ref %s not found", ref) + return pkg, nil } -func validateCommitSHA(sha, path string) (string, error) { - if !commitSHAPattern.MatchString(sha) { - return "", gitMetadataErrorf(path, "invalid commit SHA %q", sha) - } - return sha, nil +// property and class mirror the generated table's types, which cannot be imported: +// the package they live in does not compile until this has run. +type property struct { + name, definingClass, iri, kind, rangeIRI, opposite string + many, ordered, derived bool + redefines, subsets []string } -// declaration is one top-level RDF/XML declaration in the ontology: an -// owl:Class, owl:ObjectProperty or owl:DatatypeProperty. -type declaration struct { - kind string - iri string - label string - domain string - rangeIRI string +type class struct { + name string + abstract bool parents []string } -// parseOntology reads the declarations out of the RDF/XML. Only top-level elements -// of rdf:RDF are read; the anonymous owl:Restriction axioms nested inside them -// state cardinality rather than hierarchy. -func parseOntology(path string) ([]declaration, error) { - // #nosec G304 -- the checkout to read is named on the command line. - file, err := os.Open(path) - if err != nil { - return nil, err +// tables reads the classes and properties out of the package, checking every +// cross-reference resolves inside it. +func tables(pkg ePackage) ([]property, []class, error) { + kinds := map[string]string{} + features := map[string]bool{} + for _, c := range pkg.Classifiers { + if c.Name == "" { + return nil, nil, errors.New("eClassifiers without a name") + } + if _, dup := kinds[c.Name]; dup { + return nil, nil, fmt.Errorf("eClassifiers %s declared twice", c.Name) + } + kinds[c.Name] = c.Type + for _, f := range c.Features { + features[c.Name+"::"+f.Name] = true + } } - defer file.Close() - - decoder := xml.NewDecoder(file) var ( - decls []declaration - depth int + properties []property + classes []class ) - for { - token, err := decoder.Token() - if err != nil { - if errors.Is(err, io.EOF) { - break - } - return nil, fmt.Errorf("%s: %w", path, err) - } - start, ok := token.(xml.StartElement) - if !ok { - if _, isEnd := token.(xml.EndElement); isEnd { - depth-- + for _, c := range pkg.Classifiers { + if c.Type != "ecore:EClass" { + if len(c.Features) > 0 { + return nil, nil, fmt.Errorf("%s: a %s with eStructuralFeatures", c.Name, c.Type) } continue } - depth++ - if depth != 2 { - continue - } - kind := start.Name.Space + start.Name.Local - switch kind { - case owlNS + "Class", owlNS + "ObjectProperty", owlNS + "DatatypeProperty": - default: - continue - } - decl, err := readDeclaration(decoder, start) - if err != nil { - return nil, fmt.Errorf("%s: %w", path, err) - } - depth-- - decl.kind = start.Name.Local - decls = append(decls, decl) - } - if len(decls) == 0 { - return nil, fmt.Errorf("%s: no declarations found", path) - } - return decls, nil -} - -// readDeclaration consumes one declaration element, reading the direct children -// that carry the table's data and skipping the rest. -func readDeclaration(decoder *xml.Decoder, start xml.StartElement) (declaration, error) { - decl := declaration{iri: attr(start, rdfNS, "about")} - if decl.iri == "" { - return decl, fmt.Errorf("%s declaration without rdf:about", start.Name.Local) - } - for { - token, err := decoder.Token() - if err != nil { - return decl, err - } - switch t := token.(type) { - case xml.EndElement: - if t.Name == start.Name { - return decl, nil + var parents []string + for _, ref := range strings.Fields(c.SuperTypes) { + parent, ok := strings.CutPrefix(ref, "#//") + if !ok || kinds[parent] != "ecore:EClass" { + return nil, nil, fmt.Errorf("%s: eSuperTypes %s is no EClass of the package", c.Name, ref) } - case xml.StartElement: - name := t.Name.Space + t.Name.Local - resource := attr(t, rdfNS, "resource") - switch { - case name == rdfsNS+"label": - text, err := decoder.Token() - if err != nil { - return decl, err - } - if chars, ok := text.(xml.CharData); ok { - decl.label = strings.TrimSpace(string(chars)) - } - case name == rdfsNS+"domain" && resource != "": - decl.domain = resource - case name == rdfsNS+"range" && resource != "": - decl.rangeIRI = resource - case name == rdfsNS+"subClassOf" && resource != "": - decl.parents = append(decl.parents, resource) - default: - if resource == "" { - if err := decoder.Skip(); err != nil { - return decl, err - } - } + parents = append(parents, parent) + } + sort.Strings(parents) + classes = append(classes, class{name: c.Name, abstract: c.Abstract, parents: parents}) + for _, f := range c.Features { + p, err := newProperty(c.Name, f, kinds, features) + if err != nil { + return nil, nil, fmt.Errorf("%s::%s: %w", c.Name, f.Name, err) } + properties = append(properties, p) } } + sort.Slice(properties, func(i, j int) bool { return properties[i].iri < properties[j].iri }) + sort.Slice(classes, func(i, j int) bool { return classes[i].name < classes[j].name }) + return properties, classes, nil } -// parseEcore reads the metamodel's own ecore into a feature table: -// ecoreFeatures[class][feature] is the feature's upperBound attribute, "-1" -// for an unbounded multiplicity. eStructuralFeatures are read under their -// owning eClassifiers element wherever it sits in the package tree. -type ecoreFeatures map[string]map[string]string - -func parseEcore(path string) (ecoreFeatures, error) { - // #nosec G304 -- the checkout to read is named on the command line. - file, err := os.Open(path) - if err != nil { - return nil, err - } - defer file.Close() - - features := ecoreFeatures{} - var classes []string - decoder := xml.NewDecoder(file) - for { - token, err := decoder.Token() - if err != nil { - if errors.Is(err, io.EOF) { - break - } - return nil, fmt.Errorf("%s: %w", path, err) - } - switch t := token.(type) { - case xml.StartElement: - switch t.Name.Local { - case "eClassifiers": - classes = append(classes, attr(t, "", "name")) - case "eStructuralFeatures": - if len(classes) == 0 { - return nil, fmt.Errorf("%s: eStructuralFeatures outside any eClassifiers", path) - } - name := attr(t, "", "name") - class := classes[len(classes)-1] - if features[class] == nil { - features[class] = map[string]string{} - } - features[class][name] = attr(t, "", "upperBound") - } - case xml.EndElement: - if t.Name.Local == "eClassifiers" && len(classes) > 0 { - classes = classes[:len(classes)-1] - } +func newProperty(defining string, f eFeature, kinds map[string]string, features map[string]bool) (property, error) { + if f.Name == "" || strings.Contains(f.Name, "_") { + return property{}, fmt.Errorf("feature name %q cannot form a _ IRI", f.Name) + } + p := property{ + name: f.Name, + definingClass: defining, + iri: sysmlNS + defining + "_" + f.Name, + many: f.UpperBound == "-1", + derived: f.Derived, + } + p.ordered = p.many && f.Ordered != "false" + local, isLocal := strings.CutPrefix(f.EType, "#//") + switch { + case f.Type == "ecore:EReference" && isLocal && kinds[local] == "ecore:EClass": + p.kind, p.rangeIRI = "ObjectProperty", sysmlNS+local + case f.Type == "ecore:EAttribute" && isLocal && kinds[local] == "ecore:EEnum": + p.kind, p.rangeIRI = "DatatypeProperty", sysmlNS+local + case f.Type == "ecore:EAttribute" && !isLocal: + _, primitive, _ := strings.Cut(f.EType, "#//") + if p.rangeIRI = datatypeRanges[primitive]; p.rangeIRI == "" { + return property{}, fmt.Errorf("eType %q is no primitive the table maps", f.EType) + } + p.kind = "DatatypeProperty" + default: + return property{}, fmt.Errorf("a %s typed %q, which the table cannot range over", f.Type, f.EType) + } + var err error + if f.Opposite != "" { + var opposite []string + if opposite, err = featureRefs(f.Opposite, features); err != nil { + return property{}, fmt.Errorf("eOpposite: %w", err) + } + if len(opposite) != 1 { + return property{}, fmt.Errorf("eOpposite %q names %d features", f.Opposite, len(opposite)) + } + p.opposite = opposite[0] + } + for _, a := range f.Annotations { + switch a.Source { + case "redefines": + p.redefines, err = featureRefs(a.References, features) + case "subsets": + p.subsets, err = featureRefs(a.References, features) } - } - if len(features) == 0 { - return nil, fmt.Errorf("%s: no eStructuralFeatures found", path) - } - return features, nil -} - -func attr(element xml.StartElement, space, local string) string { - for _, a := range element.Attr { - if a.Name.Local == local && (a.Name.Space == space || a.Name.Space == "") { - return a.Value + if err != nil { + return property{}, fmt.Errorf("%s: %w", a.Source, err) } } - return "" -} - -// property and class mirror the generated table's types, which cannot be imported: -// the package they live in does not compile until this has run. -type property struct { - name, definingClass, iri, kind, rangeIRI string - many bool -} - -type class struct { - name string - parents []string + return p, nil } -func tables(decls []declaration, features ecoreFeatures) ([]property, []class, error) { - var ( - properties []property - classes []class - ) - for _, decl := range decls { - if !strings.HasPrefix(decl.iri, sysmlNS) { - return nil, nil, fmt.Errorf("declaration outside the SysML namespace: %s", decl.iri) - } - local := strings.TrimPrefix(decl.iri, sysmlNS) - if decl.kind == "Class" { - var parents []string - for _, parent := range decl.parents { - if strings.HasPrefix(parent, sysmlNS) { - parents = append(parents, strings.TrimPrefix(parent, sysmlNS)) - } - } - sort.Strings(parents) - classes = append(classes, class{name: local, parents: parents}) - continue - } - defining, name, ok := strings.Cut(local, "_") - if !ok { - return nil, nil, fmt.Errorf("property IRI is not _: %s", decl.iri) +// featureRefs turns "#//Class/feature ..." references into "Class::feature" names, each a declared feature. +func featureRefs(refs string, features map[string]bool) ([]string, error) { + var out []string + for _, ref := range strings.Fields(refs) { + path, ok := strings.CutPrefix(ref, "#//") + owner, name, qualified := strings.Cut(path, "/") + if !ok || !qualified || !features[owner+"::"+name] { + return nil, fmt.Errorf("%s is no eStructuralFeature of the package", ref) } - // The label is the unqualified name; disagreement with the IRI would - // mean the two conventions cannot be mapped onto each other by name. - if decl.label != "" && decl.label != name { - return nil, nil, fmt.Errorf("%s: rdfs:label %q does not match the IRI's property name %q", - decl.iri, decl.label, name) - } - if decl.domain == "" { - return nil, nil, fmt.Errorf("%s: no rdfs:domain", decl.iri) - } - if domain := strings.TrimPrefix(decl.domain, sysmlNS); domain != defining { - return nil, nil, fmt.Errorf("%s: rdfs:domain %s is not the qualifying metaclass %s", - decl.iri, domain, defining) - } - kind := "ObjectProperty" - if decl.kind == "DatatypeProperty" { - kind = "DatatypeProperty" - } - upper, ok := features[defining][name] - if !ok { - return nil, nil, fmt.Errorf("%s: no eStructuralFeatures %s.%s in %s", - decl.iri, defining, name, ecorePath) - } - properties = append(properties, property{ - name: name, - definingClass: defining, - iri: decl.iri, - kind: kind, - rangeIRI: decl.rangeIRI, - many: upper == "-1", - }) + out = append(out, owner+"::"+name) } - sort.Slice(properties, func(i, j int) bool { return properties[i].iri < properties[j].iri }) - sort.Slice(classes, func(i, j int) bool { return classes[i].name < classes[j].name }) - return properties, classes, nil + return out, nil } func propertyLiterals(properties []property) string { @@ -549,8 +373,22 @@ func propertyLiterals(properties []property) string { for _, p := range properties { fmt.Fprintf(&b, "\t{Name: %q, DefiningClass: %q, IRI: %q, Kind: %s, Range: %q", p.name, p.definingClass, p.iri, p.kind, p.rangeIRI) - if p.many { - b.WriteString(", Many: true") + for _, flag := range []struct { + name string + set bool + }{{"Many", p.many}, {"Ordered", p.ordered}, {"Derived", p.derived}} { + if flag.set { + fmt.Fprintf(&b, ", %s: true", flag.name) + } + } + if len(p.redefines) > 0 { + fmt.Fprintf(&b, ", Redefines: %s", stringSlice(p.redefines)) + } + if len(p.subsets) > 0 { + fmt.Fprintf(&b, ", Subsets: %s", stringSlice(p.subsets)) + } + if p.opposite != "" { + fmt.Fprintf(&b, ", Opposite: %q", p.opposite) } b.WriteString("},\n") } @@ -560,15 +398,22 @@ func propertyLiterals(properties []property) string { func classLiterals(classes []class) string { var b strings.Builder for _, c := range classes { - if len(c.parents) == 0 { - fmt.Fprintf(&b, "\t{Name: %q},\n", c.name) - continue + fmt.Fprintf(&b, "\t{Name: %q", c.name) + if c.abstract { + b.WriteString(", Abstract: true") } - quoted := make([]string, len(c.parents)) - for i, parent := range c.parents { - quoted[i] = fmt.Sprintf("%q", parent) + if len(c.parents) > 0 { + fmt.Fprintf(&b, ", Parents: %s", stringSlice(c.parents)) } - fmt.Fprintf(&b, "\t{Name: %q, Parents: []string{%s}},\n", c.name, strings.Join(quoted, ", ")) + b.WriteString("},\n") } return b.String() } + +func stringSlice(values []string) string { + quoted := make([]string, len(values)) + for i, v := range values { + quoted[i] = fmt.Sprintf("%q", v) + } + return "[]string{" + strings.Join(quoted, ", ") + "}" +} diff --git a/tools/gen/ontology/main_test.go b/tools/gen/ontology/main_test.go deleted file mode 100644 index f64d55b3f1..0000000000 --- a/tools/gen/ontology/main_test.go +++ /dev/null @@ -1,117 +0,0 @@ -package main - -import ( - "errors" - "os" - "path/filepath" - "strings" - "testing" -) - -const testCommitSHA = "0123456789abcdef0123456789abcdef01234567" - -func TestCommitSHASymrefLooseRef(t *testing.T) { - root := newGitTestRoot(t) - writeGitTestFile(t, filepath.Join(root, ".git", "HEAD"), "ref: refs/heads/main\n") - writeGitTestFile(t, filepath.Join(root, ".git", "refs", "heads", "main"), testCommitSHA+"\n") - - assertCommitSHA(t, root, testCommitSHA) -} - -func TestCommitSHASymrefPackedRefs(t *testing.T) { - root := newGitTestRoot(t) - writeGitTestFile(t, filepath.Join(root, ".git", "HEAD"), "ref: refs/heads/main\n") - writeGitTestFile(t, filepath.Join(root, ".git", "packed-refs"), - "# pack-refs with: peeled fully-peeled\n"+testCommitSHA+" refs/heads/main\n") - - assertCommitSHA(t, root, testCommitSHA) -} - -func TestCommitSHADetachedHead(t *testing.T) { - root := newGitTestRoot(t) - writeGitTestFile(t, filepath.Join(root, ".git", "HEAD"), testCommitSHA+"\n") - - assertCommitSHA(t, root, testCommitSHA) -} - -func TestCommitSHA256DetachedHead(t *testing.T) { - root := newGitTestRoot(t) - sha := strings.Repeat("a", 64) - writeGitTestFile(t, filepath.Join(root, ".git", "HEAD"), sha+"\n") - - assertCommitSHA(t, root, sha) -} - -func TestCommitSHAGitdirFile(t *testing.T) { - root := t.TempDir() - gitDir := filepath.Join(root, "gitdir") - if err := os.MkdirAll(gitDir, 0o700); err != nil { - t.Fatal(err) - } - writeGitTestFile(t, filepath.Join(root, ".git"), "gitdir: gitdir\n") - writeGitTestFile(t, filepath.Join(gitDir, "HEAD"), testCommitSHA+"\n") - - assertCommitSHA(t, root, testCommitSHA) -} - -func TestCommitSHAMissingHead(t *testing.T) { - root := newGitTestRoot(t) - - _, err := commitSHA(root) - assertGitMetadataError(t, err) - if !strings.Contains(err.Error(), filepath.Join(".git", "HEAD")) { - t.Fatalf("error %q does not name HEAD", err) - } -} - -func TestCommitSHAMalformedHead(t *testing.T) { - root := newGitTestRoot(t) - writeGitTestFile(t, filepath.Join(root, ".git", "HEAD"), "deadbeef\n") - - _, err := commitSHA(root) - assertGitMetadataError(t, err) - if !strings.Contains(err.Error(), "invalid commit SHA") { - t.Fatalf("error %q does not identify the invalid SHA", err) - } -} - -func newGitTestRoot(t *testing.T) string { - t.Helper() - root := t.TempDir() - if err := os.Mkdir(filepath.Join(root, ".git"), 0o700); err != nil { - t.Fatal(err) - } - return root -} - -func writeGitTestFile(t *testing.T, path, contents string) { - t.Helper() - if err := os.MkdirAll(filepath.Dir(path), 0o700); err != nil { - t.Fatal(err) - } - if err := os.WriteFile(path, []byte(contents), 0o600); err != nil { - t.Fatal(err) - } -} - -func assertCommitSHA(t *testing.T, root, want string) { - t.Helper() - got, err := commitSHA(root) - if err != nil { - t.Fatalf("commitSHA: %v", err) - } - if got != want { - t.Fatalf("commitSHA = %q, want %q", got, want) - } -} - -func assertGitMetadataError(t *testing.T, err error) { - t.Helper() - if err == nil { - t.Fatal("commitSHA returned nil error") - } - var metadataErr *gitMetadataError - if !errors.As(err, &metadataErr) { - t.Fatalf("error %T is not a gitMetadataError: %v", err, err) - } -} diff --git a/tools/gen/ontology/run_test.go b/tools/gen/ontology/run_test.go index c01c05abe0..b9f5f51257 100644 --- a/tools/gen/ontology/run_test.go +++ b/tools/gen/ontology/run_test.go @@ -5,102 +5,122 @@ import ( "path/filepath" "strings" "testing" + + "github.com/Open-MBEE/OpenSysML/tools/oracle/baseline" ) -// sampleOntology is a checkout-shaped excerpt: two classes, an object property, a -// datatype property, a nested restriction (skipped) and a foreign parent (dropped). -const sampleOntology = ` - - - - PartUsage - - - - - - - 0 - - - - - - partDefinition - - - - - - - - -` +const ( + testTag = "2026-08" + testCommitSHA = "0123456789abcdef0123456789abcdef01234567" + testRepo = "https://github.com/Systems-Modeling/SysML-v2-Pilot-Implementation.git" +) -// sampleEcore carries the features the sample ontology's properties name. +var testPin = baseline.Pin{Tag: testTag, Commit: testCommitSHA} + +// sampleEcore is a SysML.ecore excerpt: an abstract root, a class with two +// supertypes, an enumeration, every primitive spelling, and every flag the table records. const sampleEcore = ` - - - + + + + + + + + + + + + - - + + + + + + + + + + + + + ` const wantTable = `// Code generated by tools/gen/ontology. DO NOT EDIT. // -// Source: Open-MBEE/sysmlv2-rdf-ontology, sysml2/owl/www.omg.org/spec/SysML.owl -// Ecore: sysml2/ecore/SysML.ecore (property multiplicities) -// Ontology: SysML v2 metamodel version 202407 (generated from SysML.ecore) -// Commit: 0123456789abcdef0123456789abcdef01234567 +// Source: https://github.com/Systems-Modeling/SysML-v2-Pilot-Implementation.git 2026-08, org.omg.sysml/model/SysML.ecore +// Commit: 0123456789abcdef0123456789abcdef01234567 +// Metamodel: https://www.omg.org/spec/SysML/20250201 // // Regenerate with (see README.md): // -// go run -C tools ./gen/ontology -ontology +// ./scripts/download-pilot-metamodel.sh +// go run -C tools ./gen/ontology package ontology -// Version is the OMG SysML v2 metamodel version the table was generated from. -const Version = "202407" +// Version is the OMG SysML v2 metamodel version the table was generated from, +// the date in the ecore's namespace URI. +const Version = "20250201" + +// SourceTag is the pilot implementation release the table was generated from. +const SourceTag = "2026-08" -// SourceCommit is the sysmlv2-rdf-ontology commit the table was generated from. +// SourceCommit is the pilot implementation commit the table was generated from. const SourceCommit = "0123456789abcdef0123456789abcdef01234567" -// properties holds every owl:ObjectProperty and owl:DatatypeProperty the -// ontology declares, ordered by IRI. +// properties holds every eStructuralFeature the metamodel declares, ordered by IRI. var properties = []Property{ + {Name: "isLibraryElement", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_isLibraryElement", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean"}, {Name: "name", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_name", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string"}, - {Name: "partDefinition", DefiningClass: "PartUsage", IRI: "https://www.omg.org/spec/SysML#PartUsage_partDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PartDefinition", Many: true}, + {Name: "ownedRelationship", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_ownedRelationship", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element", Many: true, Ordered: true, Opposite: "Element::owningRelatedElement"}, + {Name: "owningRelatedElement", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_owningRelatedElement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element", Opposite: "Element::ownedRelationship"}, + {Name: "visibility", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_visibility", Kind: DatatypeProperty, Range: "https://www.omg.org/spec/SysML#VisibilityKind"}, + {Name: "itemDefinition", DefiningClass: "ItemUsage", IRI: "https://www.omg.org/spec/SysML#ItemUsage_itemDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PartDefinition", Many: true, Derived: true}, + {Name: "ownedPart", DefiningClass: "PartDefinition", IRI: "https://www.omg.org/spec/SysML#PartDefinition_ownedPart", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PartUsage", Many: true, Ordered: true, Derived: true, Redefines: []string{"Element::ownedRelationship", "ItemUsage::itemDefinition"}}, + {Name: "partDefinition", DefiningClass: "PartUsage", IRI: "https://www.omg.org/spec/SysML#PartUsage_partDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PartDefinition", Many: true, Derived: true, Subsets: []string{"ItemUsage::itemDefinition"}}, + {Name: "weight", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_weight", Kind: DatatypeProperty, Range: "http://www.w3.org/2002/07/owl#real"}, } -// classes holds every owl:Class the ontology declares with its named -// rdfs:subClassOf parents, ordered by name. +// classes holds every EClass the metamodel declares with its eSuperTypes, ordered by name. var classes = []Class{ - {Name: "Element"}, + {Name: "Element", Abstract: true}, + {Name: "ItemUsage", Parents: []string{"Usage"}}, + {Name: "PartDefinition", Parents: []string{"Element"}}, {Name: "PartUsage", Parents: []string{"ItemUsage", "Usage"}}, + {Name: "Usage", Parents: []string{"Element"}}, } ` -// newCheckout lays out the files run reads from a sysmlv2-rdf-ontology checkout. -func newCheckout(t *testing.T, owl string) string { +// newMetamodel lays out the directory scripts/download-pilot-metamodel.sh fetches. +func newMetamodel(t *testing.T, ecore string) string { t.Helper() - root := newGitTestRoot(t) - writeGitTestFile(t, filepath.Join(root, ".git", "HEAD"), testCommitSHA+"\n") - writeGitTestFile(t, filepath.Join(root, readme), - "# SysML v2 ontology\n\n![version](https://img.shields.io/badge/Version-202407-blue)\n") - writeGitTestFile(t, filepath.Join(root, owlPath), owl) - writeGitTestFile(t, filepath.Join(root, ecorePath), sampleEcore) - return root + dir := t.TempDir() + writeFile(t, filepath.Join(dir, stampPath), testTag+" "+testCommitSHA+" "+testRepo+"\n") + writeFile(t, filepath.Join(dir, ecorePath), ecore) + return dir +} + +func writeFile(t *testing.T, path, contents string) { + t.Helper() + if err := os.WriteFile(path, []byte(contents), 0o600); err != nil { + t.Fatal(err) + } } func TestRunWritesTheTable(t *testing.T) { - root := newCheckout(t, sampleOntology) + dir := newMetamodel(t, sampleEcore) out := filepath.Join(t.TempDir(), "table.go") - if err := run(root, out); err != nil { + if err := run(dir, out, false, testPin); err != nil { t.Fatalf("run: %v", err) } got, err := os.ReadFile(out) @@ -112,65 +132,84 @@ func TestRunWritesTheTable(t *testing.T) { } } -func TestRunRejectsAnOntologyTheTableCannotHold(t *testing.T) { - property := func(iri, label, domain string) string { - var b strings.Builder - b.WriteString(``) - if label != "" { - b.WriteString(`` + label + ``) - } - if domain != "" { - b.WriteString(``) - } - b.WriteString(``) - return b.String() +func TestCheckFailsOnlyOnDrift(t *testing.T) { + dir := newMetamodel(t, sampleEcore) + out := filepath.Join(t.TempDir(), "table.go") + if err := run(dir, out, true, testPin); err == nil || !strings.Contains(err.Error(), "is stale") { + t.Fatalf("check without a table: error %v, want it stale", err) + } + writeFile(t, out, wantTable) + if err := run(dir, out, true, testPin); err != nil { + t.Fatalf("check of the current table: %v", err) + } + writeFile(t, out, strings.Replace(wantTable, `, Derived: true, Subsets`, `, Subsets`, 1)) + if err := run(dir, out, true, testPin); err == nil || !strings.Contains(err.Error(), "is stale") { + t.Fatalf("check of a drifted table: error %v, want it stale", err) + } + if got, _ := os.ReadFile(out); strings.Contains(string(got), `Derived: true, Subsets`) { + t.Fatal("check rewrote the table") + } +} + +func TestRunRefusesAMetamodelOfAnotherPin(t *testing.T) { + dir := newMetamodel(t, sampleEcore) + out := filepath.Join(t.TempDir(), "table.go") + moved := baseline.Pin{Tag: "2026-09", Commit: strings.Repeat("f", 40)} + if err := run(dir, out, false, moved); err == nil || !strings.Contains(err.Error(), "rerun ./scripts/download-pilot-metamodel.sh") { + t.Fatalf("run: error %v, want the stale download named", err) } + if err := os.Remove(filepath.Join(dir, stampPath)); err != nil { + t.Fatal(err) + } + if err := run(dir, out, false, testPin); err == nil || !strings.Contains(err.Error(), "pin stamp") { + t.Fatalf("run: error %v, want the missing stamp", err) + } + writeFile(t, filepath.Join(dir, stampPath), "2026-08 deadbeef\n") + if err := run(dir, out, false, testPin); err == nil || !strings.Contains(err.Error(), " ") { + t.Fatalf("run: error %v, want the malformed stamp", err) + } +} + +func TestRunRejectsAMetamodelTheTableCannotHold(t *testing.T) { wrap := func(body string) string { - return `` + - body + `` + return `` + body + `` + } + class := func(name, attrs, body string) string { + return `` + body + `` + } + feature := func(kind, name, attrs, body string) string { + return `` + body + `` } + element := func(body string) string { return class("Element", "", body) } cases := []struct { - name, owl, want string + name, ecore, want string }{ - {"no declarations", wrap(``), "no declarations found"}, - {"missing rdf:about", wrap(``), "Class declaration without rdf:about"}, - {"foreign namespace", wrap(``), - "declaration outside the SysML namespace"}, - {"unqualified property", wrap(property(sysmlNS+"name", "", sysmlNS+"Element")), - "property IRI is not _"}, - {"label disagrees", wrap(property(sysmlNS+"Element_name", "title", sysmlNS+"Element")), - `rdfs:label "title" does not match the IRI's property name "name"`}, - {"no domain", wrap(property(sysmlNS+"Element_name", "", "")), "no rdfs:domain"}, - {"domain disagrees", wrap(property(sysmlNS+"Element_name", "", sysmlNS+"Usage")), - "rdfs:domain Usage is not the qualifying metaclass Element"}, - {"truncated file", ``, - "unexpected EOF"}, - {"no ecore feature", wrap(property(sysmlNS+"Element_title", "title", sysmlNS+"Element")), - "no eStructuralFeatures Element.title"}, + {"no classifiers", wrap(``), "no eClassifiers found"}, + {"bad nsURI", strings.Replace(wrap(element("")), "SysML/20250201", "SysML", 1), "is not https://www.omg.org/spec/SysML/"}, + {"subpackage", wrap(element("") + ``), "eSubpackages are not supported"}, + {"duplicate class", wrap(element("") + element("")), "eClassifiers Element declared twice"}, + {"foreign supertype", wrap(class("Usage", `eSuperTypes="#//Thing"`, "")), "eSuperTypes #//Thing is no EClass"}, + {"underscore name", wrap(element(feature("EAttribute", "a_b", `eType="types.ecore#//String"`, ""))), + "cannot form a _ IRI"}, + {"unknown primitive", wrap(element(feature("EAttribute", "n", `eType="types.ecore#//Char"`, ""))), + "no primitive the table maps"}, + {"reference to a primitive", wrap(element(feature("EReference", "n", `eType="types.ecore#//String"`, ""))), + "which the table cannot range over"}, + {"dangling opposite", wrap(element(feature("EReference", "n", `eType="#//Element" eOpposite="#//Element/m"`, ""))), + "eOpposite: #//Element/m is no eStructuralFeature"}, + {"dangling subsets", wrap(element(feature("EReference", "n", `eType="#//Element"`, + ``))), "subsets: #//Element/m is no eStructuralFeature"}, + {"unqualified redefines", wrap(element(feature("EReference", "n", `eType="#//Element"`, + ``))), "redefines: #//Element is no eStructuralFeature"}, + {"truncated file", ``, "unexpected EOF"}, } for _, tc := range cases { t.Run(tc.name, func(t *testing.T) { - root := newCheckout(t, tc.owl) - err := run(root, filepath.Join(t.TempDir(), "table.go")) + err := run(newMetamodel(t, tc.ecore), filepath.Join(t.TempDir(), "table.go"), false, testPin) if err == nil || !strings.Contains(err.Error(), tc.want) { t.Fatalf("run: error %v, want one containing %q", err, tc.want) } }) } } - -func TestRunNeedsTheCheckoutsVersionBadge(t *testing.T) { - root := newCheckout(t, sampleOntology) - writeGitTestFile(t, filepath.Join(root, readme), "# no badge here\n") - err := run(root, filepath.Join(t.TempDir(), "table.go")) - if err == nil || !strings.Contains(err.Error(), "no Version- badge") { - t.Fatalf("run: error %v, want the missing badge", err) - } - if err := os.Remove(filepath.Join(root, readme)); err != nil { - t.Fatal(err) - } - err = run(root, filepath.Join(t.TempDir(), "table.go")) - if err == nil || !strings.Contains(err.Error(), "read ontology version") { - t.Fatalf("run: error %v, want the unreadable README", err) - } -} From 473cafa9ddf5c91d34a2a76bd5bcf5a88885bbff Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Sun, 4 Oct 2026 00:19:42 +0000 Subject: [PATCH 2/4] fix(ontology): check a multiply-typed subject as its most specific rdf:type Co-Authored-By: jason.han --- internal/translate/export/rdf_in.go | 27 +----------- internal/translate/rdf/ontology/validate.go | 47 ++++++++++++++++++++- tests/ontology/ontology_test.go | 16 +++++++ 3 files changed, 62 insertions(+), 28 deletions(-) diff --git a/internal/translate/export/rdf_in.go b/internal/translate/export/rdf_in.go index 6c907bf038..6086236d30 100644 --- a/internal/translate/export/rdf_in.go +++ b/internal/translate/export/rdf_in.go @@ -302,7 +302,7 @@ func checkTypes(graph *rdf.Graph) (map[rdf.Term]string, error) { } metaclasses := make(map[rdf.Term]string, len(stated)) for _, subject := range subjects { - class, ok := mostSpecific(stated[subject]) + class, ok := ontology.MostSpecific(stated[subject]) if !ok { return nil, &UnsupportedError{ What: fmt.Sprintf("the subject <%s>", subject.Value), @@ -314,31 +314,6 @@ func checkTypes(graph *rdf.Graph) (map[rdf.Term]string, error) { return metaclasses, nil } -// mostSpecific picks the class among those stated that every other is a -// superclass of, reporting false when there is none. -func mostSpecific(classes []string) (string, bool) { - for _, class := range classes { - specific := true - for _, other := range classes { - if !subclassOf(class, other) { - specific = false - break - } - } - if specific { - return class, true - } - } - return "", false -} - -// subclassOf reports whether the class iri is ancestor or a subclass of it in -// the SysML ontology; a class of this mapping's extension has no superclass. -func subclassOf(class, ancestor string) bool { - return class == ancestor || strings.HasPrefix(class, rdf.SysML) && strings.HasPrefix(ancestor, rdf.SysML) && - ontology.IsAncestorOrSelf(rdf.LocalName(class), rdf.LocalName(ancestor)) -} - // metaclass returns the local name of the class subject is written as, or "" // when it states none. func (d *decoder) metaclass(subject rdf.Term) string { diff --git a/internal/translate/rdf/ontology/validate.go b/internal/translate/rdf/ontology/validate.go index 74da42679f..16efc3d28b 100644 --- a/internal/translate/rdf/ontology/validate.go +++ b/internal/translate/rdf/ontology/validate.go @@ -70,8 +70,10 @@ func Check(g *rdf.Graph) []Violation { } } declared := make(map[rdf.Term]bool) + types := make(map[rdf.Term]string) for _, subject := range g.Subjects() { - typeIRI := g.Type(subject) + typeIRI := subjectType(g, subject) + types[subject] = typeIRI if typeIRI == "" { if hasSysMLProperty[subject] { out = append(out, Violation{ @@ -100,7 +102,7 @@ func Check(g *rdf.Graph) []Violation { if !strings.HasPrefix(triple.Predicate.Value, rdf.SysML) { continue } - class := classNameOf(g.Type(triple.Subject)) + class := classNameOf(types[triple.Subject]) if class == "" { continue // already reported as an untyped subject } @@ -166,6 +168,47 @@ func objectMatchesKind(kind PropertyKind, object rdf.Term) bool { // classNameOf returns the local name of an rdf:type IRI, or "" when there is // none. An IRI outside the SysML namespace is kept whole, to stay recognizable. +// MostSpecific picks the class IRI among those stated that every other is a +// superclass of, reporting false when there is none. +func MostSpecific(classIRIs []string) (string, bool) { + for _, class := range classIRIs { + specific := true + for _, other := range classIRIs { + if !subclassOf(class, other) { + specific = false + break + } + } + if specific { + return class, true + } + } + return "", false +} + +// subclassOf reports whether the class iri is ancestor or a subclass of it in +// the SysML ontology; a class outside the SysML namespace has no superclass. +func subclassOf(class, ancestor string) bool { + return class == ancestor || strings.HasPrefix(class, rdf.SysML) && strings.HasPrefix(ancestor, rdf.SysML) && + IsAncestorOrSelf(rdf.LocalName(class), rdf.LocalName(ancestor)) +} + +// subjectType returns the class subject is read as: its most specific stated +// rdf:type, or the first one when the stated types are unrelated. +func subjectType(g *rdf.Graph, subject rdf.Term) string { + var stated []string + for _, object := range g.Objects(subject, rdf.RDFType) { + stated = append(stated, object.Value) + } + if len(stated) == 0 { + return "" + } + if class, ok := MostSpecific(stated); ok { + return class + } + return stated[0] +} + func classNameOf(typeIRI string) string { if typeIRI == "" { return "" diff --git a/tests/ontology/ontology_test.go b/tests/ontology/ontology_test.go index 0e8f95c2b0..c0b5e2adb3 100644 --- a/tests/ontology/ontology_test.go +++ b/tests/ontology/ontology_test.go @@ -215,3 +215,19 @@ func TestCheckReportsEachKind(t *testing.T) { } } } + +// TestCheckReadsTheMostSpecificType checks a subject stating several rdf:types as +// the class the graph reader selects, whatever order the types are stated in. +func TestCheckReadsTheMostSpecificType(t *testing.T) { + for _, order := range [][]string{{"Element", "PartUsage"}, {"PartUsage", "Element"}} { + graph := rdf.NewGraph() + part := rdf.ElementIRI("M::p") + for _, class := range order { + graph.Add(part, rdf.IRI(rdf.RDFType), rdf.SysMLTerm(class)) + } + graph.Add(part, rdf.SysMLTerm("isComposite"), rdf.Bool(true)) // declared on Feature + if got := ontology.Check(graph); len(got) != 0 { + t.Errorf("types %v: unexpected violations %v", order, got) + } + } +} From 9a7a0acde4b6ffcb6b6ec486a78a530b99b40d07 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Sun, 4 Oct 2026 03:34:43 +0000 Subject: [PATCH 3/4] fix(ontology): treat an ecore upper bound above one as multi-valued Co-Authored-By: jason.han --- .../unreleased/ontology-bounded-many.fixed.md | 1 + internal/translate/rdf/ontology/ontology.go | 4 +-- internal/translate/rdf/ontology/table.go | 4 +-- tests/ontology/ontology_test.go | 6 ++++ tools/gen/ontology/main.go | 21 ++++++++++-- tools/gen/ontology/run_test.go | 34 +++++++++++++++++++ 6 files changed, 64 insertions(+), 6 deletions(-) create mode 100644 changes/unreleased/ontology-bounded-many.fixed.md diff --git a/changes/unreleased/ontology-bounded-many.fixed.md b/changes/unreleased/ontology-bounded-many.fixed.md new file mode 100644 index 0000000000..ee585aec5c --- /dev/null +++ b/changes/unreleased/ontology-bounded-many.fixed.md @@ -0,0 +1 @@ +- **Ecore upper bounds above one are multi-valued in the ontology table.** `MultiplicityRange::bound` and `Flow::flowEnd` (upper bound 2) were marked single-valued; they are now `Many`, so api-json writes them as arrays. diff --git a/internal/translate/rdf/ontology/ontology.go b/internal/translate/rdf/ontology/ontology.go index 749975b96a..b019cd24ae 100644 --- a/internal/translate/rdf/ontology/ontology.go +++ b/internal/translate/rdf/ontology/ontology.go @@ -43,8 +43,8 @@ type Property struct { // Range is the rdfs:range IRI: a metaclass or enumeration in the SysML // namespace, or the XSD/OWL datatype of an ecore primitive. Range string - // Many reports an unbounded upper multiplicity (ecore upperBound -1): - // the API JSON shape is an array. + // Many reports an upper multiplicity above 1 or unbounded (ecore upperBound + // -1): the API JSON shape is an array. Many bool // Ordered reports a Many property whose values are ordered (ecore // ordered, which defaults to true); a single-valued property is never Ordered. diff --git a/internal/translate/rdf/ontology/table.go b/internal/translate/rdf/ontology/table.go index 027a335ef6..b245126680 100644 --- a/internal/translate/rdf/ontology/table.go +++ b/internal/translate/rdf/ontology/table.go @@ -195,7 +195,7 @@ var properties = []Property{ {Name: "type", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_type", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Many: true, Ordered: true, Derived: true}, {Name: "flowEnd", DefiningClass: "FlowDefinition", IRI: "https://www.omg.org/spec/SysML#FlowDefinition_flowEnd", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Usage", Many: true, Derived: true, Redefines: []string{"Association::associationEnd"}}, {Name: "flowDefinition", DefiningClass: "FlowUsage", IRI: "https://www.omg.org/spec/SysML#FlowUsage_flowDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Interaction", Many: true, Ordered: true, Derived: true, Redefines: []string{"ActionUsage::actionDefinition", "Flow::interaction"}}, - {Name: "flowEnd", DefiningClass: "Flow", IRI: "https://www.omg.org/spec/SysML#Flow_flowEnd", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#FlowEnd", Derived: true, Subsets: []string{"Connector::connectorEnd"}}, + {Name: "flowEnd", DefiningClass: "Flow", IRI: "https://www.omg.org/spec/SysML#Flow_flowEnd", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#FlowEnd", Many: true, Ordered: true, Derived: true, Subsets: []string{"Connector::connectorEnd"}}, {Name: "interaction", DefiningClass: "Flow", IRI: "https://www.omg.org/spec/SysML#Flow_interaction", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Interaction", Many: true, Ordered: true, Derived: true, Redefines: []string{"Connector::association", "Step::behavior"}}, {Name: "payloadFeature", DefiningClass: "Flow", IRI: "https://www.omg.org/spec/SysML#Flow_payloadFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PayloadFeature", Derived: true, Subsets: []string{"Type::ownedFeature"}}, {Name: "payloadType", DefiningClass: "Flow", IRI: "https://www.omg.org/spec/SysML#Flow_payloadType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Classifier", Many: true, Ordered: true, Derived: true}, @@ -242,7 +242,7 @@ var properties = []Property{ {Name: "referencedElement", DefiningClass: "MetadataAccessExpression", IRI: "https://www.omg.org/spec/SysML#MetadataAccessExpression_referencedElement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element", Derived: true, Subsets: []string{"Namespace::member"}}, {Name: "metaclass", DefiningClass: "MetadataFeature", IRI: "https://www.omg.org/spec/SysML#MetadataFeature_metaclass", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Metaclass", Derived: true, Subsets: []string{"Feature::type"}}, {Name: "metadataDefinition", DefiningClass: "MetadataUsage", IRI: "https://www.omg.org/spec/SysML#MetadataUsage_metadataDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Metaclass", Derived: true, Redefines: []string{"ItemUsage::itemDefinition", "MetadataFeature::metaclass"}}, - {Name: "bound", DefiningClass: "MultiplicityRange", IRI: "https://www.omg.org/spec/SysML#MultiplicityRange_bound", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Derived: true, Subsets: []string{"Namespace::ownedMember"}}, + {Name: "bound", DefiningClass: "MultiplicityRange", IRI: "https://www.omg.org/spec/SysML#MultiplicityRange_bound", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Many: true, Ordered: true, Derived: true, Subsets: []string{"Namespace::ownedMember"}}, {Name: "lowerBound", DefiningClass: "MultiplicityRange", IRI: "https://www.omg.org/spec/SysML#MultiplicityRange_lowerBound", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Derived: true, Subsets: []string{"MultiplicityRange::bound"}}, {Name: "upperBound", DefiningClass: "MultiplicityRange", IRI: "https://www.omg.org/spec/SysML#MultiplicityRange_upperBound", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Derived: true, Subsets: []string{"MultiplicityRange::bound"}}, {Name: "importedNamespace", DefiningClass: "NamespaceImport", IRI: "https://www.omg.org/spec/SysML#NamespaceImport_importedNamespace", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Namespace", Redefines: []string{"Relationship::target"}}, diff --git a/tests/ontology/ontology_test.go b/tests/ontology/ontology_test.go index c0b5e2adb3..3b02ed479e 100644 --- a/tests/ontology/ontology_test.go +++ b/tests/ontology/ontology_test.go @@ -30,6 +30,12 @@ func TestTableShape(t *testing.T) { t.Errorf("table holds %d classes, %d object and %d datatype properties; want 175, 351, 64", len(classes), object, datatype) } + for _, bounded := range [][2]string{{"MultiplicityRange", "bound"}, {"Flow", "flowEnd"}} { + // Both have ecore upperBound 2, so their API JSON shape is an array. + if declared, ok := ontology.PropertyOf(bounded[0], bounded[1]); !ok || !declared.Many { + t.Errorf("%s::%s should be Many", bounded[0], bounded[1]) + } + } if got := len(ontology.AmbiguousNames()); got != 58 { t.Errorf("got %d unqualified names declared by more than one metaclass, want 58", got) } diff --git a/tools/gen/ontology/main.go b/tools/gen/ontology/main.go index e82df32c9b..b20769eb27 100644 --- a/tools/gen/ontology/main.go +++ b/tools/gen/ontology/main.go @@ -18,6 +18,7 @@ import ( "path/filepath" "regexp" "sort" + "strconv" "strings" "github.com/Open-MBEE/OpenSysML/tools/oracle/baseline" @@ -306,11 +307,15 @@ func newProperty(defining string, f eFeature, kinds map[string]string, features if f.Name == "" || strings.Contains(f.Name, "_") { return property{}, fmt.Errorf("feature name %q cannot form a _ IRI", f.Name) } + many, err := isMany(f.UpperBound) + if err != nil { + return property{}, err + } p := property{ name: f.Name, definingClass: defining, iri: sysmlNS + defining + "_" + f.Name, - many: f.UpperBound == "-1", + many: many, derived: f.Derived, } p.ordered = p.many && f.Ordered != "false" @@ -329,7 +334,6 @@ func newProperty(defining string, f eFeature, kinds map[string]string, features default: return property{}, fmt.Errorf("a %s typed %q, which the table cannot range over", f.Type, f.EType) } - var err error if f.Opposite != "" { var opposite []string if opposite, err = featureRefs(f.Opposite, features); err != nil { @@ -355,6 +359,19 @@ func newProperty(defining string, f eFeature, kinds map[string]string, features } // featureRefs turns "#//Class/feature ..." references into "Class::feature" names, each a declared feature. +// isMany reports whether an ecore upperBound admits more than one value: any bound +// above 1, or -1 (unbounded). An absent upperBound is ecore's default, 1. +func isMany(upperBound string) (bool, error) { + if upperBound == "" { + return false, nil + } + n, err := strconv.Atoi(upperBound) + if err != nil || n == 0 || n < -1 { + return false, fmt.Errorf("upperBound %q is neither a positive integer nor -1 (unbounded)", upperBound) + } + return n != 1, nil +} + func featureRefs(refs string, features map[string]bool) ([]string, error) { var out []string for _, ref := range strings.Fields(refs) { diff --git a/tools/gen/ontology/run_test.go b/tools/gen/ontology/run_test.go index b9f5f51257..ca8da134a9 100644 --- a/tools/gen/ontology/run_test.go +++ b/tools/gen/ontology/run_test.go @@ -132,6 +132,38 @@ func TestRunWritesTheTable(t *testing.T) { } } +// TestUpperBoundMultiplicity pins the rule: upper bound 1 (ecore's default) is +// single-valued; any bound above 1, or -1 (unbounded), is multi-valued. +func TestUpperBoundMultiplicity(t *testing.T) { + for upper, want := range map[string]bool{"": false, "1": false, "2": true, "5": true, "-1": true} { + got, err := isMany(upper) + if err != nil || got != want { + t.Errorf("isMany(%q) = %v, %v; want %v", upper, got, err, want) + } + } + for _, upper := range []string{"0", "-2", "many"} { + if _, err := isMany(upper); err == nil { + t.Errorf("isMany(%q) accepted an upper bound ecore cannot mean", upper) + } + } +} + +func TestRunWritesABoundedManyProperty(t *testing.T) { + ecore := strings.Replace(sampleEcore, `name="weight" eType=`, `name="weight" upperBound="2" eType=`, 1) + out := filepath.Join(t.TempDir(), "table.go") + if err := run(newMetamodel(t, ecore), out, false, testPin); err != nil { + t.Fatalf("run: %v", err) + } + generated, err := os.ReadFile(out) + if err != nil { + t.Fatal(err) + } + want := `IRI: "https://www.omg.org/spec/SysML#Usage_weight", Kind: DatatypeProperty, Range: "http://www.w3.org/2002/07/owl#real", Many: true, Ordered: true}` + if !strings.Contains(string(generated), want) { + t.Fatalf("upperBound 2 was not generated as Many:\n%s", generated) + } +} + func TestCheckFailsOnlyOnDrift(t *testing.T) { dir := newMetamodel(t, sampleEcore) out := filepath.Join(t.TempDir(), "table.go") @@ -194,6 +226,8 @@ func TestRunRejectsAMetamodelTheTableCannotHold(t *testing.T) { "cannot form a _ IRI"}, {"unknown primitive", wrap(element(feature("EAttribute", "n", `eType="types.ecore#//Char"`, ""))), "no primitive the table maps"}, + {"zero upper bound", wrap(element(feature("EAttribute", "n", `upperBound="0" eType="types.ecore#//String"`, ""))), + `upperBound "0" is neither a positive integer nor -1`}, {"reference to a primitive", wrap(element(feature("EReference", "n", `eType="types.ecore#//String"`, ""))), "which the table cannot range over"}, {"dangling opposite", wrap(element(feature("EReference", "n", `eType="#//Element" eOpposite="#//Element/m"`, ""))), From d94fb1ec0f2f1543d5e7eb3945fa57ab72a299fe Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Sun, 4 Oct 2026 03:47:55 +0000 Subject: [PATCH 4/4] fix(ontology): read ecore upper bounds as EMF does, -2 unspecified included Co-Authored-By: jason.han --- tools/gen/ontology/main.go | 12 ++++++------ tools/gen/ontology/run_test.go | 10 +++++----- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/tools/gen/ontology/main.go b/tools/gen/ontology/main.go index b20769eb27..a37781affd 100644 --- a/tools/gen/ontology/main.go +++ b/tools/gen/ontology/main.go @@ -358,20 +358,20 @@ func newProperty(defining string, f eFeature, kinds map[string]string, features return p, nil } -// featureRefs turns "#//Class/feature ..." references into "Class::feature" names, each a declared feature. -// isMany reports whether an ecore upperBound admits more than one value: any bound -// above 1, or -1 (unbounded). An absent upperBound is ecore's default, 1. +// isMany is EMF's ETypedElement.isMany: a bound above 1, or -1 (unbounded). An absent +// bound is ecore's default 1; -2 (unspecified) is single-valued, and EcoreValidator rejects the rest. func isMany(upperBound string) (bool, error) { if upperBound == "" { return false, nil } n, err := strconv.Atoi(upperBound) - if err != nil || n == 0 || n < -1 { - return false, fmt.Errorf("upperBound %q is neither a positive integer nor -1 (unbounded)", upperBound) + if err != nil || n == 0 || n < -2 { + return false, fmt.Errorf("upperBound %q is not -2, -1 or a positive integer, as ecore requires", upperBound) } - return n != 1, nil + return n > 1 || n == -1, nil } +// featureRefs turns "#//Class/feature ..." references into "Class::feature" names, each a declared feature. func featureRefs(refs string, features map[string]bool) ([]string, error) { var out []string for _, ref := range strings.Fields(refs) { diff --git a/tools/gen/ontology/run_test.go b/tools/gen/ontology/run_test.go index ca8da134a9..108b879b2b 100644 --- a/tools/gen/ontology/run_test.go +++ b/tools/gen/ontology/run_test.go @@ -132,16 +132,16 @@ func TestRunWritesTheTable(t *testing.T) { } } -// TestUpperBoundMultiplicity pins the rule: upper bound 1 (ecore's default) is -// single-valued; any bound above 1, or -1 (unbounded), is multi-valued. +// TestUpperBoundMultiplicity pins EMF's rule: upper bound 1 (the default) or -2 (unspecified) +// is single-valued; any bound above 1, or -1 (unbounded), is multi-valued. func TestUpperBoundMultiplicity(t *testing.T) { - for upper, want := range map[string]bool{"": false, "1": false, "2": true, "5": true, "-1": true} { + for upper, want := range map[string]bool{"": false, "1": false, "-2": false, "2": true, "5": true, "-1": true} { got, err := isMany(upper) if err != nil || got != want { t.Errorf("isMany(%q) = %v, %v; want %v", upper, got, err, want) } } - for _, upper := range []string{"0", "-2", "many"} { + for _, upper := range []string{"0", "-3", "many"} { if _, err := isMany(upper); err == nil { t.Errorf("isMany(%q) accepted an upper bound ecore cannot mean", upper) } @@ -227,7 +227,7 @@ func TestRunRejectsAMetamodelTheTableCannotHold(t *testing.T) { {"unknown primitive", wrap(element(feature("EAttribute", "n", `eType="types.ecore#//Char"`, ""))), "no primitive the table maps"}, {"zero upper bound", wrap(element(feature("EAttribute", "n", `upperBound="0" eType="types.ecore#//String"`, ""))), - `upperBound "0" is neither a positive integer nor -1`}, + `upperBound "0" is not -2, -1 or a positive integer`}, {"reference to a primitive", wrap(element(feature("EReference", "n", `eType="types.ecore#//String"`, ""))), "which the table cannot range over"}, {"dangling opposite", wrap(element(feature("EReference", "n", `eType="#//Element" eOpposite="#//Element/m"`, ""))),