tbox: v1.1 - belongsTo unifie, implements devient represents, aboutConcept/usesConcept remplacent composedOf, monitoredBy sur BO seul, grain deplace du Metric au DataObject, couche Delivery et DataInterface. shapes v0.2 scindees curated/observed avec XOR de sens sur DataElement. instances SODH migrees et arbitrees : 12 BO, 12 BC, 6 concepts empruntes en TO_ARBITRATE. Validation : 52 bloquants, dont 52 leves par la migration BR-013 restante
This commit is contained in:
+241
-55
@@ -7,11 +7,79 @@
|
||||
@prefix pr: <https://ontology.pernod-ricard.com/metamodel/> .
|
||||
|
||||
#################################################################
|
||||
# PERNOD RICARD DATA META MODEL - T-Box v1.0
|
||||
# PERNOD RICARD DATA META MODEL - T-Box v1.1
|
||||
# Owner: Bastien Gourdon - Data Governance Office
|
||||
#
|
||||
# WHAT CHANGED vs v0.9.2
|
||||
# ----------------------
|
||||
# WHAT CHANGED vs v1.0
|
||||
# --------------------
|
||||
# A. RELATIONS SIMPLIFIED AND GIVEN HONEST NAMES
|
||||
# belongsToDomain + belongsToSubDomain -> belongsTo (one property,
|
||||
# scoped per class by SHACL; reusable if a domain family appears).
|
||||
# implements -> represents
|
||||
# composedOf -> aboutConcept (exactly 1, the
|
||||
# subject) + usesConcept (0..n, notions needed to read the object).
|
||||
# composedOf carried three different meanings depending on the object
|
||||
# (dependency, subject, part-whole); that vagueness is what let BR-004
|
||||
# be satisfied with padding in v0.6.
|
||||
#
|
||||
# B. represents WORKS AT TWO GRANULARITIES
|
||||
# DataObject represents BusinessObject
|
||||
# DataElement represents BusinessConcept
|
||||
# Same relation -- "this logical artefact is the data-side counterpart of
|
||||
# that business notion" -- at two levels of detail.
|
||||
# A Data Element reaches business meaning by EXACTLY ONE of two routes:
|
||||
# dimensional -> represents a BusinessConcept
|
||||
# measure -> is computedBy a Metric, which measures the Concept
|
||||
# Never both, never neither. Enforced by sh:xone.
|
||||
#
|
||||
# C. STEWARDSHIP DECLARED ONCE, INHERITED EVERYWHERE
|
||||
# monitoredBy sits on BusinessObject only (plus DataProduct, which
|
||||
# spans several Business Objects and cannot inherit). Data Objects and
|
||||
# Data Elements inherit through represents / hasElement. Declaring a
|
||||
# steward at several levels means two answers to "who watches this
|
||||
# column". BusinessObject therefore STAYS in the Ownership layer: it is
|
||||
# the single anchor of accountability, which is what that layer is for.
|
||||
# owningDomain is the exception: inherited by default, but re-declarable
|
||||
# on a Data Element, because OW-002 attributes an element to the domain
|
||||
# that defines its rule. A DE that re-declares is a borrowed element --
|
||||
# a signal to check against its represents, not an anomaly.
|
||||
#
|
||||
# D. BUSINESS MEANING LIVES IN ONE PLACE
|
||||
# hasBusinessDefinition is removed from BusinessObject. Meaning belongs to
|
||||
# the BusinessConcept; a Business Object gets its meaning through
|
||||
# aboutConcept. Two definitions for one notion are two definitions free to
|
||||
# diverge.
|
||||
#
|
||||
# E. GRAIN MOVED OFF THE METRIC
|
||||
# hasGrainDimension (Metric -> DataObject) and hasGranularity are gone.
|
||||
# Grain is a property of a DATASET, not of a calculation rule: a Metric
|
||||
# has no rows. hasGrainElement (DataObject -> DataElement) replaces them
|
||||
# and is CHECKABLE against the harvested PrimaryKey. A Metric's grain
|
||||
# becomes derivable from where it lands.
|
||||
#
|
||||
# F. DELIVERY IS ITS OWN LAYER
|
||||
# DataProduct / DataInterface / DataContract answer "what do we promise,
|
||||
# to whom, until when" -- a different question from "how is it
|
||||
# structured". DataAsset is renamed DataInterface and redefined as the
|
||||
# CHANNEL through which a consumer actually gets data (a Snowflake share
|
||||
# or grant, a file extract, an API), which is verifiable, rather than
|
||||
# "directly consumable by a business user", which was a judgement call and
|
||||
# produced zero instances in a year.
|
||||
# Every Data Product is operated by exactly one Sub-Domain and has exactly
|
||||
# one Product Owner: it is a consumable, and there must be no ambiguity
|
||||
# about who runs it.
|
||||
#
|
||||
# G. realizesMetric KEPT AS A TRANSITIONAL CONTROL
|
||||
# Declared, required on certified BI fields, and that is all. No rule is
|
||||
# written against the lineage chain: making the assertion conditional on
|
||||
# intermediate mappings existing would create confusion and discourage
|
||||
# people from filling it in at all.
|
||||
#
|
||||
# Deprecated terms are kept, never deleted (LC-002): existing assertions keep
|
||||
# classifying, and the migration can be staged.
|
||||
#
|
||||
# WHAT CHANGED vs v0.9.2 (kept for reference)
|
||||
# -------------------------------------------
|
||||
# 1. TERM NAMESPACE IS NOW VERSION-INDEPENDENT.
|
||||
# Terms live at .../metamodel/ (no version segment).
|
||||
# The VERSION lives in owl:versionIRI only.
|
||||
@@ -49,13 +117,13 @@
|
||||
|
||||
<https://ontology.pernod-ricard.com/metamodel/>
|
||||
a owl:Ontology ;
|
||||
owl:versionIRI <https://ontology.pernod-ricard.com/metamodel/1.0> ;
|
||||
owl:priorVersion <https://ontology.pernod-ricard.com/metamodel/0.9> ;
|
||||
owl:versionIRI <https://ontology.pernod-ricard.com/metamodel/1.1> ;
|
||||
owl:priorVersion <https://ontology.pernod-ricard.com/metamodel/1.0> ;
|
||||
dcterms:title "Pernod Ricard Data Meta Model" ;
|
||||
dcterms:creator "Bastien Gourdon" ;
|
||||
dcterms:modified "2026-07-25"^^xsd:date ;
|
||||
owl:versionInfo "1.0.0-draft-2026-07-25" ;
|
||||
rdfs:comment """OWL T-Box. Five layers (Ownership, Business, Logical, Physical, Consumption) crossed with a provenance axis (Curated vs Observed). Curated objects are asserted by governance and reviewed; Observed objects are harvested from Snowflake, Tableau and Looker and are rebuilt, never edited. Bridge annotation properties are declared for future alignment with domain ontologies.""" .
|
||||
dcterms:modified "2026-07-26"^^xsd:date ;
|
||||
owl:versionInfo "1.1.0-draft-2026-07-26" ;
|
||||
rdfs:comment """OWL T-Box. Six layers (Ownership, Business, Logical, Delivery, Physical, Consumption) crossed with a provenance axis (Curated vs Observed). Curated objects are asserted by governance and reviewed; Observed objects are harvested from Snowflake, Tableau and Looker and are rebuilt, never edited. Bridge annotation properties are declared for future alignment with domain ontologies.""" .
|
||||
|
||||
|
||||
#################################################################
|
||||
@@ -115,7 +183,11 @@ pr:OwnershipLayerObject a owl:Class ; rdfs:subClassOf pr:CuratedObject ;
|
||||
pr:BusinessLayerObject a owl:Class ; rdfs:subClassOf pr:CuratedObject ;
|
||||
rdfs:label "Business Layer Object" .
|
||||
pr:LogicalLayerObject a owl:Class ; rdfs:subClassOf pr:CuratedObject ;
|
||||
rdfs:label "Logical Layer Object" .
|
||||
rdfs:label "Logical Layer Object" ;
|
||||
rdfs:comment "How the data is structured." .
|
||||
pr:DeliveryLayerObject a owl:Class ; rdfs:subClassOf pr:CuratedObject ;
|
||||
rdfs:label "Delivery Layer Object" ;
|
||||
rdfs:comment "What we promise, to whom, until when. A different question from how the data is structured, hence a layer of its own: version, owner, changelog, support channel, consumers to warn." .
|
||||
pr:PhysicalLayerObject a owl:Class ; rdfs:subClassOf pr:ObservedObject ;
|
||||
rdfs:label "Physical Layer Object" .
|
||||
pr:ConsumptionLayerObject a owl:Class ; rdfs:subClassOf pr:ObservedObject ;
|
||||
@@ -135,7 +207,7 @@ pr:SubDomain a owl:Class ; rdfs:subClassOf pr:OwnershipLayerObject ;
|
||||
|
||||
pr:BusinessObject a owl:Class ; rdfs:subClassOf pr:OwnershipLayerObject ;
|
||||
rdfs:label "Business Object" ;
|
||||
rdfs:comment "The unit of ownership attribution. Sits in the Ownership layer rather than the Business layer on purpose: a Business Object is what a Data Domain is accountable for, and what a Data Object implements. Its business meaning is carried by the Business Concepts it groups." .
|
||||
rdfs:comment "The single anchor of accountability, which is why it stays in the Ownership layer: it is the one object where a steward is declared, and Data Objects and Data Elements inherit from it. It carries NO business definition of its own -- its meaning comes from its aboutConcept. What it does carry is a perimeter: the subject it is about, and the notions needed to read it." .
|
||||
|
||||
|
||||
#################################################################
|
||||
@@ -161,7 +233,7 @@ pr:KPI a owl:Class ; rdfs:subClassOf pr:Metric ;
|
||||
|
||||
pr:DataObject a owl:Class ; rdfs:subClassOf pr:LogicalLayerObject ;
|
||||
rdfs:label "Data Object" ;
|
||||
rdfs:comment "The pivot: implements exactly one Business Object, is composed of Data Elements, and is materialized as one or more Physical Relations. The single junction between governance and technology." .
|
||||
rdfs:comment "The pivot: represents exactly one Business Object, is composed of Data Elements, and is materialized as one or more Physical Relations. The single junction between governance and technology." .
|
||||
|
||||
pr:DataElement a owl:Class ; rdfs:subClassOf pr:LogicalLayerObject ;
|
||||
rdfs:label "Data Element" ;
|
||||
@@ -169,20 +241,31 @@ pr:DataElement a owl:Class ; rdfs:subClassOf pr:LogicalLayerObject ;
|
||||
rdfs:comment "The finest curated unit. Its mapping to a physical Field is the ONLY place where the curated graph and the observed graph meet: proposed automatically by name and type matching, confirmed by a Data Steward." .
|
||||
|
||||
pr:DataAsset a owl:Class ; rdfs:subClassOf pr:LogicalLayerObject ;
|
||||
rdfs:label "Data Asset" ;
|
||||
rdfs:comment "Directly consumable by a business user. A reusable building block is a Data Object, not a Data Asset (rule BR-009)." .
|
||||
|
||||
pr:DataProduct a owl:Class ; rdfs:subClassOf pr:LogicalLayerObject ;
|
||||
rdfs:label "Data Product" ;
|
||||
rdfs:comment "The unit of delivery: packages Data Assets and is governed by a Data Contract. Candidate alignment: dcat:Dataset / DPROD." .
|
||||
|
||||
pr:DataContract a owl:Class ; rdfs:subClassOf pr:LogicalLayerObject ;
|
||||
rdfs:label "Data Contract" ;
|
||||
rdfs:comment "The service commitment attached to a Data Product: schema, freshness, quality thresholds, support. Candidate alignment: ODCS (Bitol)." .
|
||||
rdfs:label "Data Asset (deprecated)" ;
|
||||
owl:deprecated true ;
|
||||
dcterms:isReplacedBy pr:DataInterface ;
|
||||
rdfs:comment "v1.0 term, defined as 'directly consumable by a business user' -- a judgement, not a structural test, which is why it collected zero instances in a year. Use DataInterface." .
|
||||
|
||||
|
||||
#################################################################
|
||||
# LAYER 4 - PHYSICAL (observed)
|
||||
# LAYER 4 - DELIVERY (curated)
|
||||
#################################################################
|
||||
|
||||
pr:DataProduct a owl:Class ; rdfs:subClassOf pr:DeliveryLayerObject ;
|
||||
rdfs:label "Data Product" ;
|
||||
rdfs:comment "The unit of delivery: what carries a version number, an owner, a changelog, a support channel and a list of consumers to warn. It has no single technical counterpart, and should not: physically it often lands on a Snowflake schema or a dbt project, but that is not what defines it. Operated by exactly one Sub-Domain -- it is a consumable, and there must be no ambiguity about who runs it. Candidate alignment: dcat:Dataset / DPROD." .
|
||||
|
||||
pr:DataInterface a owl:Class ; rdfs:subClassOf pr:DeliveryLayerObject ;
|
||||
rdfs:label "Data Interface" ;
|
||||
rdfs:comment "The channel through which a consumer actually gets the data: a Snowflake secure share or listing, a consumption schema with its grants, a file extract to a panel partner, an API or reverse-ETL feed. Not a Data Object (that is structure) and not a BI Data Source (that is one consumer among others). Verifiable: a grant, a share or an endpoint either exists or it does not. The output port in data-mesh terms." .
|
||||
|
||||
pr:DataContract a owl:Class ; rdfs:subClassOf pr:DeliveryLayerObject ;
|
||||
rdfs:label "Data Contract" ;
|
||||
rdfs:comment "The service commitment attached to a Data Product: schema, freshness, quality thresholds, support, breaking-change notice period. Candidate alignment: ODCS (Bitol)." .
|
||||
|
||||
|
||||
#################################################################
|
||||
# LAYER 5 - PHYSICAL (observed)
|
||||
#################################################################
|
||||
|
||||
pr:System a owl:Class ; rdfs:subClassOf pr:PhysicalLayerObject ;
|
||||
@@ -246,7 +329,7 @@ pr:Transformation a owl:Class ; rdfs:subClassOf pr:PhysicalLayerObject , prov:Ac
|
||||
|
||||
|
||||
#################################################################
|
||||
# LAYER 5 - CONSUMPTION (observed)
|
||||
# LAYER 6 - CONSUMPTION (observed)
|
||||
#################################################################
|
||||
|
||||
pr:BIWorkspace a owl:Class ; rdfs:subClassOf pr:ConsumptionLayerObject ;
|
||||
@@ -276,9 +359,26 @@ pr:BIReport a owl:Class ; rdfs:subClassOf pr:ConsumptionLayerObject ;
|
||||
pr:Actor a owl:Class ; rdfs:label "Actor" ;
|
||||
rdfs:comment "A person or a team. Deliberately NOT a MetaModelObject: people are not subject to ownership and lifecycle rules." .
|
||||
|
||||
pr:DataDomainOwner a owl:Class ; rdfs:subClassOf pr:Actor ; rdfs:label "Data Domain Owner" .
|
||||
pr:DataGovernanceLead a owl:Class ; rdfs:subClassOf pr:Actor ; rdfs:label "Data Governance Lead (DGL)" .
|
||||
pr:DataSteward a owl:Class ; rdfs:subClassOf pr:Actor ; rdfs:label "Data Steward" .
|
||||
pr:DataDomainOwner a owl:Class ; rdfs:subClassOf pr:Actor ;
|
||||
rdfs:label "Data Domain Owner" ;
|
||||
rdfs:comment "Accountable for a Data Domain. Exactly one per domain." .
|
||||
|
||||
pr:SubDomainOwner a owl:Class ; rdfs:subClassOf pr:Actor ;
|
||||
rdfs:label "Sub-Domain Owner" ;
|
||||
rdfs:comment "Accountable for a Sub-Domain. Exactly one per sub-domain." .
|
||||
|
||||
pr:DataGovernanceLead a owl:Class ; rdfs:subClassOf pr:Actor ;
|
||||
rdfs:label "Data Governance Lead" ;
|
||||
pr:hasAcronym "DGL" ;
|
||||
rdfs:comment "Runs governance for a Data Domain. The acronym belongs in hasAcronym, not in the label (rule NR-005)." .
|
||||
|
||||
pr:DataProductOwner a owl:Class ; rdfs:subClassOf pr:Actor ;
|
||||
rdfs:label "Data Product Owner" ;
|
||||
rdfs:comment "Runs a Data Product day to day: releases, changelog, support, consumer communication. Belongs to the Sub-Domain that operates the product." .
|
||||
|
||||
pr:DataSteward a owl:Class ; rdfs:subClassOf pr:Actor ;
|
||||
rdfs:label "Data Steward" ;
|
||||
rdfs:comment "Monitors a Business Object. Declared there and nowhere else: Data Objects and Data Elements inherit their steward, so that no column can ever have two answers to 'who watches this'." .
|
||||
|
||||
|
||||
#################################################################
|
||||
@@ -308,23 +408,36 @@ pr:ExternalProvider a pr:SystemType ; rdfs:label "External Provider" .
|
||||
# OBJECT PROPERTIES - Ownership & Business
|
||||
#################################################################
|
||||
|
||||
pr:belongsTo a owl:ObjectProperty , owl:FunctionalProperty ;
|
||||
rdfs:label "belongs to" ;
|
||||
rdfs:comment "Position in the categorization tree. One property for the whole tree: SubDomain belongs to DataDomain, BusinessObject belongs to SubDomain. Scope is enforced per class by SHACL rather than by two near-identical properties, and the same relation will serve if a domain family ever appears. Deliberately NOT transitive: entailment would produce two values and break the maxCount 1 shape. To walk the ancestry, use the property path belongsTo+ in the query." .
|
||||
|
||||
pr:belongsToDomain a owl:ObjectProperty , owl:FunctionalProperty ;
|
||||
rdfs:label "belongs to domain" ;
|
||||
rdfs:domain pr:SubDomain ; rdfs:range pr:DataDomain .
|
||||
rdfs:label "belongs to domain (deprecated)" ;
|
||||
owl:deprecated true ; dcterms:isReplacedBy pr:belongsTo .
|
||||
|
||||
pr:belongsToSubDomain a owl:ObjectProperty , owl:FunctionalProperty ;
|
||||
rdfs:label "belongs to sub-domain" ;
|
||||
rdfs:domain pr:BusinessObject ; rdfs:range pr:SubDomain .
|
||||
rdfs:label "belongs to sub-domain (deprecated)" ;
|
||||
owl:deprecated true ; dcterms:isReplacedBy pr:belongsTo .
|
||||
|
||||
pr:aboutConcept a owl:ObjectProperty , owl:FunctionalProperty ;
|
||||
rdfs:label "is about" ;
|
||||
rdfs:domain pr:BusinessObject ; rdfs:range pr:BusinessConcept ;
|
||||
rdfs:comment "The single subject of this Business Object, and where its meaning comes from -- a Business Object carries no definition of its own. Exactly one. If the subject cannot be named, the object is not scoped, and that is the most useful thing the rule can tell you. Replaces the 3..10 minimum of BR-004, which was satisfied in v0.6 by attaching unrelated concepts." .
|
||||
|
||||
pr:usesConcept a owl:ObjectProperty ;
|
||||
rdfs:label "uses concept" ;
|
||||
rdfs:domain pr:BusinessObject ; rdfs:range pr:BusinessConcept ;
|
||||
rdfs:comment "The other notions required to read this object correctly. Zero or more, and zero is a legitimate answer." .
|
||||
|
||||
pr:composedOf a owl:ObjectProperty ;
|
||||
rdfs:label "composed of" ;
|
||||
rdfs:domain pr:BusinessObject ; rdfs:range pr:BusinessConcept ;
|
||||
owl:inverseOf pr:isComponentOf ;
|
||||
rdfs:comment "Part-whole. In v0.9 this was declared owl:inverseOf pr:describes, which was semantically wrong: composition and aboutness are different relations, and a reasoner would infer that every Concept describing an Object is also a component of it." .
|
||||
rdfs:label "composed of (deprecated)" ;
|
||||
owl:deprecated true ; dcterms:isReplacedBy pr:usesConcept ;
|
||||
rdfs:comment "Carried three different meanings depending on the object: dependency (Sell Out Volume), subject (Retailer Stock), part-whole (Calendar). One word for three relations is what allowed the v0.6 padding. Split into aboutConcept and usesConcept." .
|
||||
|
||||
pr:isComponentOf a owl:ObjectProperty ;
|
||||
rdfs:label "is component of" ;
|
||||
rdfs:domain pr:BusinessConcept ; rdfs:range pr:BusinessObject .
|
||||
rdfs:label "is component of (deprecated)" ;
|
||||
owl:deprecated true ; dcterms:isReplacedBy pr:usesConcept .
|
||||
|
||||
pr:describes a owl:ObjectProperty ;
|
||||
rdfs:label "describes (deprecated)" ;
|
||||
@@ -340,10 +453,15 @@ pr:measures a owl:ObjectProperty ;
|
||||
rdfs:label "measures" ;
|
||||
rdfs:domain pr:Metric ; rdfs:range pr:BusinessConcept .
|
||||
|
||||
pr:hasGrainElement a owl:ObjectProperty ;
|
||||
rdfs:label "has grain element" ;
|
||||
rdfs:domain pr:DataObject ; rdfs:range pr:DataElement ;
|
||||
rdfs:comment "The elements whose combination makes a row unique. Grain belongs to a DATASET, not to a calculation rule: a Metric has no rows, so it cannot have a grain of its own -- its grain is derivable from the Data Objects it lands in. Stated at element level rather than object level because it is then CHECKABLE against the harvested PrimaryKey: a declared grain that does not match the real key is an automatic finding." .
|
||||
|
||||
pr:hasGrainDimension a owl:ObjectProperty ;
|
||||
rdfs:label "has grain dimension" ;
|
||||
rdfs:domain pr:Metric ; rdfs:range pr:DataObject ;
|
||||
rdfs:comment "The dimensional Data Objects that define the Metric's grain. Replaces reading grain out of the free-text hasGranularity string: only a real reference lets you detect that two Metrics cannot be aggregated together." .
|
||||
rdfs:label "has grain dimension (deprecated)" ;
|
||||
owl:deprecated true ; dcterms:isReplacedBy pr:hasGrainElement ;
|
||||
rdfs:comment "Put grain on the Metric, which confounded a declarative statement with a structural fact. See hasGrainElement." .
|
||||
|
||||
pr:computedBy a owl:ObjectProperty ;
|
||||
rdfs:subPropertyOf prov:wasDerivedFrom ;
|
||||
@@ -356,10 +474,22 @@ pr:computedBy a owl:ObjectProperty ;
|
||||
# OBJECT PROPERTIES - Logical
|
||||
#################################################################
|
||||
|
||||
pr:represents a owl:ObjectProperty ;
|
||||
rdfs:label "represents" ;
|
||||
rdfs:comment """The business notion a logical artefact is the data-side counterpart of. One relation at two granularities:
|
||||
DataObject represents BusinessObject (exactly one -- the pivot, BR-006)
|
||||
DataElement represents BusinessConcept (at most one)
|
||||
Renamed from 'implements', which carried software-engineering baggage: a Data Object does not implement a Business Object the way a class implements an interface.
|
||||
|
||||
Range is deliberately left open and scoped by SHACL per class, because the two uses have different targets.
|
||||
|
||||
A Data Element uses this ONLY when it is dimensional. A measure element reaches meaning through Metric -> computedBy, which says more: it names WHICH metric the meaning travels through. Never both routes on one element.
|
||||
|
||||
Functional at DataObject level only -- not declared owl:FunctionalProperty here, since a single global cardinality would be wrong for one of the two uses.""" .
|
||||
|
||||
pr:implements a owl:ObjectProperty , owl:FunctionalProperty ;
|
||||
rdfs:label "implements" ;
|
||||
rdfs:domain pr:DataObject ; rdfs:range pr:BusinessObject ;
|
||||
rdfs:comment "The pivot. Exactly one, enforced by SHACL (BR-006)." .
|
||||
rdfs:label "implements (deprecated)" ;
|
||||
owl:deprecated true ; dcterms:isReplacedBy pr:represents .
|
||||
|
||||
pr:hasElement a owl:ObjectProperty ;
|
||||
rdfs:label "has element" ;
|
||||
@@ -370,18 +500,43 @@ pr:references a owl:ObjectProperty ;
|
||||
rdfs:domain pr:DataObject ; rdfs:range pr:DataObject ;
|
||||
rdfs:comment "Foreign-key reference between Data Objects. NOT ownership. Now checkable against the harvested ForeignKeyConstraint objects." .
|
||||
|
||||
pr:usesDataObject a owl:ObjectProperty ;
|
||||
rdfs:label "uses Data Object" ;
|
||||
rdfs:domain pr:DataAsset ; rdfs:range pr:DataObject .
|
||||
#################################################################
|
||||
# OBJECT PROPERTIES - Delivery
|
||||
#################################################################
|
||||
|
||||
pr:packages a owl:ObjectProperty ;
|
||||
rdfs:label "packages" ;
|
||||
rdfs:domain pr:DataProduct ; rdfs:range pr:DataAsset .
|
||||
rdfs:domain pr:DataProduct ; rdfs:range pr:DataObject ;
|
||||
rdfs:comment "The scope of the product. Through these Data Objects and their represents, the Business Objects a product makes available are derivable -- which is why a product needs no direct link to a Business Object." .
|
||||
|
||||
pr:governedBy a owl:ObjectProperty ;
|
||||
pr:exposes a owl:ObjectProperty ;
|
||||
rdfs:label "exposes" ;
|
||||
rdfs:domain pr:DataProduct ; rdfs:range pr:DataInterface ;
|
||||
rdfs:comment "The channels through which the product is actually consumed." .
|
||||
|
||||
pr:servedBy a owl:ObjectProperty ;
|
||||
rdfs:label "served by" ;
|
||||
rdfs:domain pr:DataInterface ; rdfs:range pr:PhysicalRelation ;
|
||||
rdfs:comment "What physically backs the interface: the shared relations, the extract source." .
|
||||
|
||||
pr:governedBy a owl:ObjectProperty , owl:FunctionalProperty ;
|
||||
rdfs:label "governed by" ;
|
||||
rdfs:domain pr:DataProduct ; rdfs:range pr:DataContract .
|
||||
|
||||
pr:operatedBy a owl:ObjectProperty , owl:FunctionalProperty ;
|
||||
rdfs:label "operated by" ;
|
||||
rdfs:domain pr:DataProduct ; rdfs:range pr:SubDomain ;
|
||||
rdfs:comment "The single Sub-Domain that runs this product. A Data Product spans several Business Objects and therefore cannot inherit accountability the way a Data Object does -- so it declares its own, and exactly one. It is a consumable: there must be no ambiguity about who runs it." .
|
||||
|
||||
pr:hasProductOwner a owl:ObjectProperty , owl:FunctionalProperty ;
|
||||
rdfs:label "has product owner" ;
|
||||
rdfs:domain pr:DataProduct ; rdfs:range pr:DataProductOwner ;
|
||||
rdfs:comment "Exactly one. Belongs to the operating Sub-Domain -- checkable, not just conventional." .
|
||||
|
||||
pr:usesDataObject a owl:ObjectProperty ;
|
||||
rdfs:label "uses Data Object (deprecated)" ;
|
||||
owl:deprecated true ; dcterms:isReplacedBy pr:packages .
|
||||
|
||||
|
||||
#################################################################
|
||||
# OBJECT PROPERTIES - the curated / observed seam
|
||||
@@ -513,7 +668,13 @@ pr:realizesMetric a owl:ObjectProperty , owl:FunctionalProperty ;
|
||||
rdfs:label "realizes metric" ;
|
||||
rdfs:domain pr:BIField ; rdfs:range pr:Metric ;
|
||||
pr:curationMode "PROPOSED_CONFIRMED" ;
|
||||
rdfs:comment "The harmonisation proof. Counting distinct BI Fields realizing one certified Metric, and comparing their expressions, turns 'we harmonised the definitions' from a claim into a measurement over the real BI estate." .
|
||||
rdfs:comment """The harmonisation measure: how many distinct BI Fields realize one certified Metric, and do their expressions agree. Turns 'we harmonised the definitions' from a claim into a count over the real BI estate.
|
||||
|
||||
In principle this is derivable from the lineage chain Metric -> DataElement -> Field -> BIField, since lineage carries semantic inheritance. In practice that chain will have holes -- four hops, one of them PROPOSED_CONFIRMED, another harvested from an API that does not resolve custom SQL, extracts or cascaded calculated fields -- and the question it answers is too important to depend on them.
|
||||
|
||||
So: TRANSITIONAL CONTROL. Asserted directly, and that is all. No rule is written against the lineage chain: making the assertion conditional on intermediate mappings would create confusion and discourage people from filling it in.
|
||||
|
||||
Retirement criterion, to be measured rather than debated: when the lineage chain reproduces the asserted link for more than 95% of certified BI fields across three consecutive reconciliation cycles, the direct link is derivable and can go.""" .
|
||||
|
||||
pr:usesBIDataSource a owl:ObjectProperty ;
|
||||
rdfs:label "uses BI data source" ;
|
||||
@@ -534,15 +695,34 @@ pr:ownedBy a owl:ObjectProperty ;
|
||||
|
||||
pr:owningDomain a owl:ObjectProperty , owl:FunctionalProperty ;
|
||||
rdfs:label "owning Data Domain" ; rdfs:range pr:DataDomain ;
|
||||
rdfs:comment "The single Data Domain with authority to define the object's rule. Required on Curated Objects, absent on Observed Objects: a Snowflake column is attributed through the Data Element mapped to it, never asserted directly." .
|
||||
rdfs:comment """The single Data Domain with authority to define the object's rule. Absent on Observed Objects: a Snowflake column is attributed through the Data Element mapped to it, never asserted directly.
|
||||
|
||||
Unlike the steward, this one is RE-DECLARABLE on a Data Element. It is inherited by default from the parent chain, but OW-002 attributes an element to the domain that defines its RULE, and a borrowed element -- Brand Code sitting in a Sell Out fact object -- has its rule elsewhere. A Data Element whose owningDomain differs from its parent's is a borrowed element: a signal to check against its represents, not an anomaly to fix.""" .
|
||||
|
||||
pr:monitoredBy a owl:ObjectProperty ;
|
||||
rdfs:label "monitored by" ; rdfs:range pr:DataSteward ;
|
||||
rdfs:comment """Declared on BusinessObject, and on DataProduct, and NOWHERE ELSE. Data Objects inherit through represents, Data Elements through hasElement. Declaring a steward at several levels would allow two answers to 'who watches this column'.
|
||||
|
||||
Says what the steward DOES, where the deprecated hasSteward only stated a membership.
|
||||
|
||||
DataProduct is the one exception to inheritance: it packages Data Objects belonging to several Business Objects, so it cannot inherit a single steward and declares its own.""" .
|
||||
|
||||
pr:hasSteward a owl:ObjectProperty ;
|
||||
rdfs:label "has Data Steward" ; rdfs:range pr:DataSteward .
|
||||
rdfs:label "has Data Steward (deprecated)" ;
|
||||
owl:deprecated true ; dcterms:isReplacedBy pr:monitoredBy .
|
||||
|
||||
pr:hasDGL a owl:ObjectProperty , owl:FunctionalProperty ;
|
||||
rdfs:label "has DGL" ;
|
||||
rdfs:domain pr:DataDomain ; rdfs:range pr:DataGovernanceLead .
|
||||
|
||||
pr:hasDomainOwner a owl:ObjectProperty , owl:FunctionalProperty ;
|
||||
rdfs:label "has domain owner" ;
|
||||
rdfs:domain pr:DataDomain ; rdfs:range pr:DataDomainOwner .
|
||||
|
||||
pr:hasSubDomainOwner a owl:ObjectProperty , owl:FunctionalProperty ;
|
||||
rdfs:label "has sub-domain owner" ;
|
||||
rdfs:domain pr:SubDomain ; rdfs:range pr:SubDomainOwner .
|
||||
|
||||
pr:hasActivationStatus a owl:ObjectProperty , owl:FunctionalProperty ;
|
||||
rdfs:label "activation status" ;
|
||||
rdfs:domain pr:DataDomain ; rdfs:range pr:ActivationStatus .
|
||||
@@ -563,7 +743,12 @@ pr:arbitrationStatus a owl:DatatypeProperty ; rdfs:label "arbitration status" ;
|
||||
rdfs:comment "TO_ARBITRATE blocks publication (OW-007). Use this on the object rather than tracking arbitration in a side spreadsheet." .
|
||||
|
||||
# ---- Business semantics
|
||||
pr:hasBusinessDefinition a owl:DatatypeProperty ; rdfs:label "business definition" ; rdfs:range xsd:string .
|
||||
pr:hasBusinessDefinition a owl:DatatypeProperty ; rdfs:label "business definition" ; rdfs:range xsd:string ;
|
||||
rdfs:comment """The meaning of a business notion. Belongs to the BusinessConcept.
|
||||
|
||||
MUST NOT be carried by a BusinessObject: an object gets its meaning through aboutConcept. Two definitions for one notion are two definitions free to diverge. Enforced by SHACL rather than by rdfs:domain, because Data Elements legitimately carry one too and a declared domain would make them entail BusinessConcept -- which the disjointness axioms would then reject.
|
||||
|
||||
MIGRATION: text currently on a Business Object moves to the Concept named by its aboutConcept.""" .
|
||||
pr:hasTechnicalDefinition a owl:DatatypeProperty ; rdfs:label "technical definition" ; rdfs:range xsd:string .
|
||||
pr:hasAcronym a owl:DatatypeProperty ; rdfs:label "acronym" ; rdfs:range xsd:string .
|
||||
pr:hasSynonym a owl:DatatypeProperty ; rdfs:label "synonym" ; rdfs:range xsd:string .
|
||||
@@ -573,8 +758,9 @@ pr:hasBusinessRule a owl:DatatypeProperty ; rdfs:label "business rule" ; rdfs:ra
|
||||
pr:hasFormula a owl:DatatypeProperty ; rdfs:label "formula" ; rdfs:range xsd:string .
|
||||
pr:hasUnit a owl:DatatypeProperty ; rdfs:label "unit" ; rdfs:range xsd:string ;
|
||||
rdfs:comment "From the Units LoV. Note the LoV currently mixes physical units, currencies (ISO 4217) and value types (Index, Rate, Count) - three different concepts that should eventually be split." .
|
||||
pr:hasGranularity a owl:DatatypeProperty ; rdfs:label "granularity (label)" ; rdfs:range xsd:string ;
|
||||
rdfs:comment "Human-readable grain label, e.g. 'SKU x Customer x Day'. Keep in sync with hasGrainDimension, which is the machine-readable form." .
|
||||
pr:hasGranularity a owl:DatatypeProperty ; rdfs:label "granularity (deprecated)" ; rdfs:range xsd:string ;
|
||||
owl:deprecated true ; dcterms:isReplacedBy pr:hasGrainElement ;
|
||||
rdfs:comment "Free-text grain label on a Metric, e.g. 'SKU x Customer x Day'. Kept a second, unverifiable copy of something now stated structurally on the Data Object. Grain is a property of a dataset, not of a calculation rule." .
|
||||
pr:hasTimeAggregation a owl:DatatypeProperty ; rdfs:label "time aggregation" ; rdfs:range xsd:string .
|
||||
|
||||
pr:isKPI a owl:DatatypeProperty ; rdfs:label "is KPI (deprecated)" ; rdfs:range xsd:boolean ;
|
||||
@@ -636,10 +822,10 @@ pr:hasExpression a owl:DatatypeProperty ; rdfs:label "BI expression" ; rdfs:rang
|
||||
|
||||
[] a owl:AllDisjointClasses ; owl:members (
|
||||
pr:OwnershipLayerObject pr:BusinessLayerObject pr:LogicalLayerObject
|
||||
pr:PhysicalLayerObject pr:ConsumptionLayerObject ) .
|
||||
pr:DeliveryLayerObject pr:PhysicalLayerObject pr:ConsumptionLayerObject ) .
|
||||
|
||||
[] a owl:AllDisjointClasses ; owl:members (
|
||||
pr:BusinessObject pr:DataObject pr:DataAsset pr:DataProduct ) .
|
||||
pr:BusinessObject pr:DataObject pr:DataInterface pr:DataProduct ) .
|
||||
|
||||
[] a owl:AllDisjointClasses ; owl:members ( pr:BusinessConcept pr:Metric ) .
|
||||
|
||||
|
||||
Reference in New Issue
Block a user