Bounded-Context Representation
Context and Problem Statement
The UK property transaction is modelled as Domain-Driven Design bounded contexts — six primary industry contexts (Estate Agency, Conveyancing, Mortgage Lending, Surveying, Property Data Services, Property Technology), five upstream contexts (HMLR, Local Authority, MHCLG Material Information, Identity & Verification, Trust & Verifiable Claims) and two spanning concerns (Transaction lifecycle; Participants & roles). PDTF is their Published Language (/modelling/bounded-contexts). Two representation questions were open: (1) how to denote a term’s bounded-context membership in the ontology — a separate namespace per context, SKOS, or both; and (2) how to disambiguate a term whose label carries different meanings in different contexts (“how do I say this property as defined in Context A vs in Context B?”).
The answer is constrained by ratified foundations. The single opda: namespace was fixed 9-0 at Session 001 Q7 (ODR-0004) — per-form/per-overlay namespaces were evaluated and rejected as “scatters one concept across many namespaces.” owl:sameAs is forbidden for identity (ODR-0005 Rule 5). Spanning leaves that recur across overlays collapse to one opda: term, with per-context variation pushed onto SHACL overlay profiles (ODR-0008 declare-once-reconcile-overlays; ODR-0010). The decisive empirical fact, surfaced during deliberation: a single entity belongs to many bounded contexts (opda:Address is used across ~10 contexts; one Participant plays role-typed parts in several). Because an IRI inhabits exactly one namespace string, per-context namespaces would force either duplicated classes or owl:sameAs to re-link them — both prohibited.
This ODR was deliberated as a two-round Linked Data Council (session-019; Queen: Kendall (FIBO); Devil’s Advocate: Davis; panel: Evans & Vernon, Gandon, Hendler, Baker, Cagle, Guizzardi). Both rounds returned 7–0: round 1 rejected per-context namespaces and “both”; round 2 confirmed that homonyms are disambiguated by local name, not namespace. It is kind: pattern per ODR-0001 A9 — UFO meta-category (bounded context = a perspectival community of practice, a SKOS-classifiable non-rigid facet), identity criterion over named hard cases (charge, valuation), and an artefact realisation (the SKOS scheme + opda:definedInContext triple shape + the derivation rule).
Considered Options
- Option A (chosen) — Single namespace + SKOS-context-scheme + profile-derived membership + local-name homonym disambiguation. The chosen approach, ratified by Council Session 019 (two rounds, both 7–0).
- Option B — A separate namespace per bounded context. Rejected 7–0: an entity belongs to many contexts, so per-context namespaces force duplicated terms or
owl:sameAs(forbidden, ODR-0005); re-confirms the S001 Q7 / ODR-0004 namespace decision. - Option C — Both (namespaces and SKOS). Rejected 7–0: inherits Option B’s defect for nil benefit; the namespace half is the part that breaks.
- Option D — Hand-authored SKOS membership tags. Rejected as the primary mechanism: re-encodes the overlay→term facts the profiles already carry and drifts the moment an overlay moves context.
- Option E — Per-context namespace “to disambiguate” a homonym. Rejected: an IRI is opaque (RFC 3986) and disambiguates on its whole string — a distinct local name gives a fully distinct identifier already; the namespace adds zero disambiguating power and re-imports the multi-membership break for the non-homonym majority.
- Option F — Build per-context
skos:scopeNote/ SKOS-XL polysemy machinery now. Rejected as YAGNI: ~0 genuine homonyms are attested; the pattern is ratified but gated (Rule 8).
The diagram maps each rejected option to its fatal flaw.
duplication or owl:sameAs (ODR-0005)"| X{"Driver check"}:::warning A2 -->|"Rejected: inherits the
namespace defect of A1"| X A3 -->|"Rejected: drift; re-encodes
profile data (ODR-0008 declare-once)"| X A4 -->|"Rejected: local name already
disambiguates; namespace adds nil"| X X --> C["Chosen: one opda: namespace +
SKOS context scheme +
profile-derived membership +
local-name homonym disambiguation"]:::success
Decision Outcome
Chosen option: “Single namespace + SKOS-context-scheme + profile-derived membership”, because a bounded context is a perspective on shared terms (not a minting authority), context-of-use is many-to-many (multi-membership is the rule), and per-context namespaces would require the forbidden owl:sameAs to re-link the shared majority of terms.
Adopt a single-namespace + SKOS-context-scheme + profile-derived-membership representation: keep the one opda: minting namespace; model the bounded contexts as a skos:ConceptScheme of skos:Concepts in opda:; derive each term’s context membership from the existing SHACL overlay profiles (single source of truth) rather than hand-authoring it; and disambiguate a term that genuinely means different things in different contexts by minting distinct local names in the one namespace (governed by the Identity-Criterion test below), never by a distinct namespace — chosen because a bounded context is a perspective on shared terms, not a minting authority, so context-of-use is a many-to-many classification (multi-membership is the rule) while a namespace can only encode a single definition-home, and per-context namespaces would require the forbidden owl:sameAs to re-link the shared majority of terms.
Consequences
- Build now. Emit
opda:PDTFBoundedContextSchemeand the 13 context concepts as SKOS reference data inopda:, reusingopda:hasSteward(Rule 2). Mintopda:definedInContextandopda:servesContextasowl:AnnotationProperty(membership, not logical typing). - Derive, gated. Author the profile→context SHACL-AF derivation rule (
implements: ODR-0017); it ships dormant, switched on only when Rule 8’s gate clears. Re-pointopda:overlaysContext(currently a profile-layer IRI) onto the new…Contextconcepts so derivation has a real target. - Homonyms. Apply the Rule 4 decision table whenever a same-label/two-meaning candidate appears; build no polysemy scaffolding below the gate.
opda:Valuationstays one class until a consumer proves distinct ICs. - Hand-off. The exact
skos:Conceptshapes, labels, definitions and steward assignments for the 13 contexts go to ODR-0011’s SKOS steward (concept-shape discipline); the derivation rule follows ODR-0017. odr-reviewlint extension. Flag anyopda:term whose IRI encodes a context prefix; flag anyrdfs:subClassOf/rdf:typewhose object is a context concept; flag anyowl:sameAsbetween homonym siblings.- Namespace block. Generator output for this ODR’s
opda:declarations may carrydct:status "draft"as a publication-grade marker (the namespace string is ratified — greenfield, no WG; inherited ODR-0004 block lifted); the record itself isacceptedbecause the namespace question it answers is already settled by ODR-0004.
More Information
- Methodology: ODR-0001 §What an ODR records (per-kind discipline; A9
kind: pattern). - Council deliberation provenance: session-019 — Bounded-Context Representation (two rounds; Queen Kendall; DA Davis; panel Evans & Vernon, Gandon, Hendler, Baker, Cagle, Guizzardi; both rounds 7–0).
- Implementation-planning follow-on: session-021 — Bounded-Context Implementation Plan (2026-05-30; Queen Kendall; DA Davis) proposed splitting Rule 8 to un-gate a generated
opda:definedInContexthome. This was reversed the same day by session-022 — Form↔SHACL Profile Convention (Queen Baker; DA Davis; 6–0), which founddefinedInContextreinventsrdfs:isDefinedBy+dct:source+dct:subjectand retired it (Rules 5 + 8, above). S022 governs; the home is the three standard predicates, community-ownership authored-or-absent under the gate. Amendments council-ratified — greenfield, no WG. - Foundations: ODR-0004 (single
opda:namespace — S001 Q7 9-0; the home this pattern refuses to multiply); ODR-0005 Rule 5 (noowl:sameAs— the reason per-context namespaces fail); ODR-0008 (declare-once-reconcile-overlays — constraint divergence is not term divergence); ODR-0010 (overlay profiles — where context constraints live and the source of derived membership); ODR-0011 (SKOS scheme + steward discipline); ODR-0006 (roles/phases stay one Kind — the boundary that keeps homonym-splitting from swallowing role-modelling); ODR-0002 (vocabulary catalogue — the new scheme is catalogued there); ODR-0017 (the derivation rule’s pattern). - Industry context map:
/modelling/bounded-contexts(the 6 + 5 + 2 contexts and the overlay→context table). - W3C / spec: SKOS Reference (Miles & Bechhofer 2009) —
skos:Concept,skos:ConceptScheme, mapping relations; DCMI Terms —dct:subject,dct:source; RFC 3986 (IRI opacity — meaning is fixed by triples, not by the#//split). - DDD: Evans 2003 Domain-Driven Design (Bounded Context; Published Language; Context Map; Anti-Corruption Layer); FIBO modular methodology (namespace-by-module-of-definition; homonym co-residence —
MarketValue/LiquidationValue). - Foundational ontology: Guizzardi 2005 Ontological Foundations Ch. 4 (Kinds, Roles, anti-rigidity); OntoClean (Guarino & Welty) — identity-criterion test for counting Kinds.
- Related ODRs: programme anchor ODR-0003.
The graph shows ODR-0019’s declared dependency and implementing relationships.
Bounded-Context Representation"]:::user ODR01["ODR-0001 Methodology"]:::process ODR02["ODR-0002 Vocabulary Catalogue"]:::process ODR04["ODR-0004 Foundation / Namespace"]:::process ODR05["ODR-0005 Identity / no owl:sameAs"]:::process ODR06["ODR-0006 Agents & Roles"]:::process ODR08["ODR-0008 Descriptive / declare-once"]:::process ODR10["ODR-0010 Overlay Profiles"]:::process ODR11["ODR-0011 SKOS Schemes"]:::process ODR03["ODR-0003 Programme"]:::process ODR19 -->|"depends-on"| ODR01 ODR19 -->|"depends-on"| ODR02 ODR19 -->|"depends-on"| ODR04 ODR19 -->|"depends-on"| ODR05 ODR19 -->|"depends-on"| ODR06 ODR19 -->|"depends-on"| ODR08 ODR19 -->|"depends-on"| ODR10 ODR19 -->|"depends-on"| ODR11 ODR19 -->|"implements"| ODR03
Rules
These rules are normative for all bounded-context representation in the OPDA ontology.
1. Single namespace — no per-context namespaces
All OPDA-minted terms live in the one opda: (https://w3id.org/opda/#) namespace, per ODR-0004. A bounded context MUST NOT be encoded as an IRI namespace/prefix (estate-agency:, conveyancing:, …). Rationale, load-bearing: an entity belongs to many contexts; a namespace encodes a single home; per-context namespaces therefore force duplication or owl:sameAs (forbidden, ODR-0005 Rule 5). Modularity by ontological concern (the seven TTL module files sharing opda:) is unaffected — that is namespace-by-module-of-definition, which is sound; this rule forbids only namespace-by-context-of-use.
2. Bounded contexts as a SKOS scheme
Each bounded context is a skos:Concept (NOT an owl:Class — context membership is anti-rigid and perspectival; subclassing or typing would weld a perspective into rigid identity), organised by one skos:ConceptScheme in opda:. The scheme reuses the existing opda:hasSteward annotation property to carry steward plurality without namespace plurality.
opda:PDTFBoundedContextScheme a skos:ConceptScheme ;
skos:prefLabel "PDTF Bounded Contexts"@en ;
opda:hasSteward "OPDA Architecture WG"@en .
opda:ConveyancingContext a skos:Concept ;
skos:inScheme opda:PDTFBoundedContextScheme ;
skos:prefLabel "Conveyancing"@en ;
skos:definition "DDD bounded context for legal transfer of title."@en ;
opda:hasSteward "Law Society / SRA"@en .
# … 12 more: EstateAgency, MortgageLending, Surveying, PropertyDataServices,
# PropertyTechnology (6 industry); the 5 upstream; the 2 spanning.
3. Term→context membership is DERIVED, not hand-authored
Which terms serve which context is derived from the SHACL overlay profiles (the overlay a payload arrives through is its context: piq→Surveying, fme1→Mortgage Lending, ta6→Conveyancing). A generator-emitted SHACL-AF rule (ODR-0017) reads opda:ValidationContext → opda:requires → <term> and materialises <term> opda:servesContext <context> — a generated view, never hand-edited. The profiles are the single source of truth (ODR-0008 declare-once). Note: today opda:overlaysContext targets a profile-layer IRI (profiles/foundation), not an industry context; the derivation rule MUST map the profile-layer target onto the new …Context concepts of Rule 2. Hand-authored dct:subject membership is permitted only for a term that no profile references (a pure domain class with no overlay edge).
4. Homonym disambiguation — the Identity-Criterion decision rule
A shared label is not a shared Universal. Apply Guizzardi’s OntoClean question — “what makes it the same one over time?” — and branch. Identity lives in the local name, never the namespace.
| # | Test outcome | Construct | Authority |
|---|---|---|---|
| (i) Homonym | Two readings have different identity criteria → two Kinds | Two distinct LOCAL NAMES in opda: (opda:LegalCharge, opda:LocalLandCharge); a neutral supertype where one IC is shared (⊑ opda:RegisteredCharge); skos:related/skos:closeMatch where none. Mint two OWL classes ONLY here. | Guizzardi IC test; Evans & Vernon homonymy rule |
| (ii) Same Kind, divergent constraint | One IC; contexts differ only in cardinality / enum / format | ONE opda: term + a SHACL overlay profile per context. No new term. | ODR-0008 + ODR-0010 |
| (iii) Same Kind, perspectival gloss | One IC, one datatype; only emphasis/wording differs by context | ONE opda: term + per-context skos:scopeNote + dct:source. No new OWL class. | Baker concept-layer rule |
Concept-layer firewall (Baker): two SKOS concept-glosses do NOT compel two OWL classes. When the datatype is shared, stay at the concept layer — case (iii). Climb to two OWL classes only when a reasoner or SHACL must treat them as different Kinds — case (i). Provenance short-circuit (Cagle): the overlay disambiguates at validation time, so a consumer never meets a free-floating homonym on a single path; the profile binds the context-correct term before (i)–(iii) is consulted at runtime.
UFO meta-category of the disambiguated terms (per Guizzardi’s OntoClean analysis — the literal categories that ground the IC test): a valuation is a Relator/Mode (a valuation result individuated by its generating activity and standard) → three Substance Kinds (opda:MortgageValuation / opda:RedBookValuation / opda:AVMValuation, all ⊑ opda:Valuation) only when their lifecycles prove distinct identity criteria to a real consumer (today PDTF emits one opda:Valuation, which is correct restraint); charge spans a Relator (a legal encumbrance over the estate, opda:LegalCharge), a Quality/Mode (a monetary amount, opda:Fee), and a second Relator (the statutory opda:LocalLandCharge) → three Kinds. A bounded context itself is none of these — it is an anti-rigid, perspectival Role-like community of practice, which is exactly why it is a SKOS facet (Rule 2) and never a namespace, a subclass, or an identity-bearing term. Roles and phases are not new Kinds (Rule 8).
5. Term home & provenance — rdfs:isDefinedBy + dct:source (+ gated dct:subject); opda:definedInContext RETIRED
Amended by Council Session 022 (2026-05-30; 6–0; council-ratified — greenfield, no WG) — supersedes the original opda:definedInContext design retained below for history. S022 found opda:definedInContext reinvents three published standards and retired it, decomposing “a term’s home” into three orthogonal axes, each a standard predicate:
- (a) module-of-origin (ontological concern) →
rdfs:isDefinedBy→ the owning moduleowl:OntologyIRI (RDFS §2.6). Always emitted; currently 0× in the corpus. NB OPDA’s modules partition by concern (property/agent/claim/…), NOT by the six contexts — so this answers “which module defines it,” not “which community owns it.” - (b) provenance / source authority →
dct:source(+prov:wasAttributedTo) — already emitted per term (verified: it points at ODR sections + legislation/EUR-Lex/OIDC, never a context). - (c) community-ownership →
dct:subject→ a Rule 2 Context concept (DCMI aboutness) — authored-or-absent, NEVER derived (not fromdct:source, not fromservesContextdegree — that would be the OntoClean level-confusion), and gated (Rule 8) to the non-derivable residue (genuine homonym / steward-disputed ownership), empty today.
No bespoke opda:definedInContext predicate is minted; rdfs:isDefinedBy cannot serve the community axis (its object is a defining document, not a community). Council provenance: [session-022], reversing [session-021]‘s “author a generated home for every term” decision (S021 Queen Kendall retracted that chairing). opda:servesContext (usage) remains a derived dormant rule per ODR-0020 Rule 5.
Original S021/S020 design (RETIRED, retained for history): opda:definedInContext (an owl:AnnotationProperty; object = a Rule 2 Context concept) records the context a term’s definition originates in. Per-context definition is rdfs:comment + dct:source; per-context provenance of a payload is reinforced by opda:profileURI on the ValidationContext. “The term as defined in Context A” is answered by triples, never by parsing a prefix.
opda:LegalCharge a owl:Class ; rdfs:subClassOf opda:RegisteredCharge ;
rdfs:comment "Mortgage instrument securing a debt against the estate."@en ;
opda:definedInContext opda:MortgageLendingContext ;
dct:source <https://www.legislation.gov.uk/ukpga/2002/9> . # LRA 2002
opda:LocalLandCharge a owl:Class ; rdfs:subClassOf opda:RegisteredCharge ;
rdfs:comment "Encumbrance registered in the Local Land Charges Register."@en ;
opda:definedInContext opda:ConveyancingContext ;
dct:source <https://www.legislation.gov.uk/ukpga/1975/76> . # LLCA 1975
# "the charge AS DEFINED IN Conveyancing" — triples, not a namespace lookup
SELECT ?term ?def WHERE {
?term opda:definedInContext opda:ConveyancingContext ; rdfs:comment ?def .
}
6. Cross-term linking — SKOS mapping, never owl:sameAs
Disambiguated sibling terms relate by SKOS mapping — skos:closeMatch (lexical cousins, not identical), skos:relatedMatch (associative), skos:broadMatch (hierarchical) — or a neutral rdfs:subClassOf supertype where an IC is shared. owl:sameAs is forbidden (ODR-0005 Rule 5); instance co-reference uses opda:identifiesSameProperty.
7. Naming convention
Disambiguation is carried by the local name, qualified by sense (opda:registeredCharge vs opda:serviceCharge; opda:buildingRegulationsCompletion vs opda:completionAndMoving — both already in PDTF). Context concepts use the …Context local-name suffix (opda:ConveyancingContext). The namespace never varies to disambiguate.
8. YAGNI activation gate
Restored to its pre-S021 form and refined by Council Session 022 (2026-05-30; 6–0; council-ratified — greenfield, no WG). S021’s “un-gate the bare opda:definedInContext home annotation” carve-out is WITHDRAWN: S022 found definedInContext reinvents three published standards and retired it (see Rule 5). There is no always-emitted home predicate to un-gate — recording a term’s module-of-origin via rdfs:isDefinedBy is ordinary module hygiene (not gated, not polysemy machinery), and community-ownership via dct:subject is authored-or-absent under the gate below.
Roles and phases stay ONE Kind (ODR-0006) — a valuer or a withdrawn valuation is a role/phase, not a new Kind. Context-scoped-definition machinery (per-context skos:scopeNote registries, SKOS-XL label resources, a sense register) is ratified as a dormant pattern but MUST NOT be built until both: (a) ≥3 attested same-label / contradictory-definition collisions exist that distinct local names cannot already separate; and (b) a named consumer needs a community-scoped home that the standard predicates of Rule 5 (rdfs:isDefinedBy + dct:source + a gated dct:subject) cannot already answer. Below that line the standing instruction is: mint two plainly-named terms, write two rdfs:comments, stop. The corpus today attests zero genuine domain homonyms (duplicate-prefLabel: 0; the one same-label/two-definition dictionary hit is free-text boilerplate); PDTF already disambiguates at local-name grain.
Anti-patterns
The flowchart routes a candidate “same term, two contexts” through the decision rule.
(what makes it the same one over time?)"}:::warning B -->|"yes — different Kind"| C["Two distinct LOCAL NAMES in opda:
(+ neutral supertype / skos:related)"]:::success B -->|"no — same Kind"| D{"Differs only in
cardinality / enum / format?"}:::warning D -->|"yes"| E["ONE term + SHACL overlay profile
(ODR-0008 / ODR-0010)"]:::success D -->|"no — only wording differs"| F["ONE term + per-context
skos:scopeNote + dct:source"]:::success A -.->|"FORBIDDEN"| X["Per-context NAMESPACE
(forces owl:sameAs — ODR-0005)"]:::error C -.->|"NEVER link with"| Y["owl:sameAs"]:::error
- Never put the bounded-context perspective in the IRI namespace (Rule 1).
- Never
rdfs:subClassOfa context concept, nor type a term as a context (Rule 2 — context is a SKOS facet, not a Kind). - Never
owl:sameAsbetween homonym siblings or across contexts (Rule 6). - Never hand-maintain term→context membership that a profile already implies (Rule 3).
- Never build polysemy machinery below the activation gate (Rule 8).
Comments
Loading comments…
Sign in to post a comment