diff --git a/.circleci/config.yml b/.circleci/config.yml index 46f515ad18..70ed85772f 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 e564d2bc49..2d45811125 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-sysml-wasm build-release-wasm 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-sysml-wasm build-release-wasm 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. @@ -322,6 +322,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-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/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 9d5a16843b..8a9e1488ce 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..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 { @@ -1671,6 +1646,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 +1666,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 +2315,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 +3531,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 +4084,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..b019cd24ae 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 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. + 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..b245126680 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", 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}, + {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", 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"}}, + {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..16efc3d28b 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) @@ -68,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{ @@ -79,8 +83,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{ @@ -92,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 } @@ -158,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/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..3b02ed479e 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,26 @@ 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) + 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) + } + 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) } - if ontology.Version == "" || len(ontology.SourceCommit) != 40 { - t.Errorf("table header not recorded: version %q, commit %q", - ontology.Version, 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 +57,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 +84,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 +98,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 +152,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 +189,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 +199,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) { @@ -150,3 +221,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) + } + } +} diff --git a/tools/gen/ontology/main.go b/tools/gen/ontology/main.go index 3cd60fa60b..a37781affd 100644 --- a/tools/gen/ontology/main.go +++ b/tools/gen/ontology/main.go @@ -1,88 +1,107 @@ -// 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" + "strconv" "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)) + } + *out = repo.Resolve(root, *out) + if *out == "" { + *out = filepath.Join(root, filepath.FromSlash(tablePath)) } - if err := run(*root, *out); err != nil { + if err := run(*dir, *out, *check, pin); err != nil { fail(err) } } @@ -92,456 +111,278 @@ 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) - } - 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) + return ePackage{}, err } - if !errors.Is(err, os.ErrNotExist) { - return "", gitMetadataErrorf(loosePath, "read ref %s: %w", ref, err) + var pkg ePackage + if err := xml.Unmarshal(data, &pkg); err != nil { + return ePackage{}, fmt.Errorf("%s: %w", path, err) } - - 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.Subpackages) > 0 { + return ePackage{}, fmt.Errorf("%s: eSubpackages are not supported; the metamodel is one flat package", 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) + if len(pkg.Classifiers) == 0 { + return ePackage{}, fmt.Errorf("%s: no eClassifiers found", path) } - 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 + 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) } - return nil, fmt.Errorf("%s: %w", path, err) - } - start, ok := token.(xml.StartElement) - if !ok { - if _, isEnd := token.(xml.EndElement); isEnd { - depth-- - } - 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 +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) } - 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) + many, err := isMany(f.UpperBound) + if err != nil { + return property{}, err + } + p := property{ + name: f.Name, + definingClass: defining, + iri: sysmlNS + defining + "_" + f.Name, + many: many, + 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) + } + 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) } - 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] - } + if err != nil { + return property{}, fmt.Errorf("%s: %w", a.Source, err) } } - if len(features) == 0 { - return nil, fmt.Errorf("%s: no eStructuralFeatures found", path) - } - return features, nil + return p, 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 - } +// 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 } - 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 + n, err := strconv.Atoi(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 || n == -1, 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) - } - // 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) +// 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) } - 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 +390,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 +415,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..108b879b2b 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" +) + +var testPin = baseline.Pin{Tag: testTag, Commit: testCommitSHA} -// sampleEcore carries the features the sample ontology's properties name. +// 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,118 @@ 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 + ``) +// 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": 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) } - if domain != "" { - b.WriteString(``) + } + 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) } - b.WriteString(``) - return b.String() } +} + +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") + 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"}, + {"zero upper bound", wrap(element(feature("EAttribute", "n", `upperBound="0" eType="types.ecore#//String"`, ""))), + `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"`, ""))), + "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) - } -}