Pernod Ricard Data Meta Model
type: Ontology
version IRI: https://ontology.pernod-ricard.com/metamodel/1.0
prior version: https://ontology.pernod-ricard.com/metamodel/0.9
creator: Bastien Gourdon
modified: 2026-07-25
version info: 1.0.0-draft-2026-07-25
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.

denotes
type: AnnotationProperty
comment: Links a documentation record (Business Object, Business Concept, Data Object) to the CLASS it describes in a domain ontology. Example: ex:BO_16_03_001 pr:denotes fin:Invoice .

denotes property
type: AnnotationProperty
comment: Links a Data Element or Business Concept to the PROPERTY it describes in a domain ontology. Example: ex:DE_16_03_0001 pr:denotesProperty fin:netAmount .

denotes activity
type: AnnotationProperty
comment: Links a Metric or Business Object to the PROCESS or EVENT it describes, typically a prov:Activity subclass. Example: ex:M_16_03_001 pr:denotesActivity fin:InvoiceIssuance .

harvest source
type: AnnotationProperty
comment: For Observed terms: the system view or API that populates this term. Documents the contract between the meta model and the harvester.

curation mode
type: AnnotationProperty
comment: ASSERTED (governance writes it), HARVESTED (a job writes it) or PROPOSED_CONFIRMED (a job proposes, a steward confirms).

Meta Model Object
type: Class
comment: Anything the meta model describes. Actors are deliberately NOT Meta Model Objects.

Curated Object
type: Class
subclass of: Meta Model Object
curation mode: ASSERTED
comment: Asserted by governance, edited through pull request on the domain TTL file, subject to the full ownership and lifecycle shape (identifier, name, owner, owning Data Domain, status, version).

Observed Object
type: Class
subclass of: Meta Model Object
curation mode: HARVESTED
comment: Harvested from a running system and rebuilt on every run. Never hand-edited. Carries sourceIdentifier, fullyQualifiedName and harvestedOn instead of curated ownership: attribution is INFERRED through the Data Element it is mapped to, not asserted on the node.

Ownership & Categorization Layer Object
type: Class
subclass of: Curated Object

Business Layer Object
type: Class
subclass of: Curated Object

Logical Layer Object
type: Class
subclass of: Curated Object

Physical Layer Object
type: Class
subclass of: Observed Object

Consumption Layer Object
type: Class
subclass of: Observed Object
comment: The BI estate. Separate from Physical because BI assets have their own lifecycle and their own owner: a dashboard belongs to its author, not to the Data Domain that owns the underlying data.

Data Domain
type: Class
subclass of: Ownership & Categorization Layer Object

Sub-Domain
type: Class
subclass of: Ownership & Categorization Layer Object

Business Object
type: Class
subclass of: Ownership & Categorization Layer Object
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.

Business Concept
type: Class
subclass of: Business Layer Object
comment: A shared business notion WITHOUT a formula. The presence of a formula is the sole discriminator against Metric (rule BR-003).

Metric
type: Class
subclass of: Business Layer Object
comment: A quantifiable measurement WITH a formula, a unit and a grain. Under BR-013 a Metric carries the harmonised CALCULATION RULE; variants that differ only by analysis context are Data Elements linked back via computedBy.

Key Performance Indicator
type: Class
subclass of: Metric
comment: An elevated Metric. Use this class rather than the deprecated isKPI flag.

Data Object
type: Class
subclass of: Logical Layer Object
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.

Data Element
type: Class
subclass of: Logical Layer Object
curation mode: PROPOSED_CONFIRMED
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.

Data Asset
type: Class
subclass of: Logical Layer Object
comment: Directly consumable by a business user. A reusable building block is a Data Object, not a Data Asset (rule BR-009).

Data Product
type: Class
subclass of: Logical Layer Object
comment: The unit of delivery: packages Data Assets and is governed by a Data Contract. Candidate alignment: dcat:Dataset / DPROD.

Data Contract
type: Class
subclass of: Logical Layer Object
comment: The service commitment attached to a Data Product: schema, freshness, quality thresholds, support. Candidate alignment: ODCS (Bitol).

System
type: Class
subclass of: Physical Layer Object
harvest source: Manually seeded once, then referenced. Replaces the free-text hasSourceSystem.
comment: A real system: Snowflake, MDM Product, MDM Customer, a panel provider feed, Tableau Server, Looker. Making this a node rather than a string is what makes 'what depends on MDM Product?' answerable.

Database
type: Class
subclass of: Physical Layer Object
harvest source: SNOWFLAKE.INFORMATION_SCHEMA.DATABASES

Schema
type: Class
subclass of: Physical Layer Object
harvest source: SNOWFLAKE.INFORMATION_SCHEMA.SCHEMATA

Physical Relation
type: Class
subclass of: Physical Layer Object
harvest source: SNOWFLAKE.INFORMATION_SCHEMA.TABLES
comment: Abstract parent of everything with columns. Specialised because impact traversal differs by kind: a View propagates impact to whatever it reads.

Base Table
type: Class
subclass of: Physical Relation

View
type: Class
subclass of: Physical Relation
comment: Depends on other relations through dependsOn, so impact is transitive.

Materialized View
type: Class
subclass of: Physical Relation

External Table
type: Class
subclass of: Physical Relation
comment: Backed by files outside the warehouse. Marks the boundary where lineage leaves Snowflake.

Table (deprecated)
type: Class
subclass of: Physical Relation
deprecated: true
is replaced by: Base Table
comment: v0.9 term. Kept so that existing assertions still classify. Use BaseTable.

Field
type: Class
subclass of: Physical Layer Object
harvest source: SNOWFLAKE.INFORMATION_SCHEMA.COLUMNS
comment: A physical column. The anchor of impact analysis: everything upstream reaches a Field, everything downstream starts from one.

Key Constraint
type: Class
subclass of: Physical Layer Object
harvest source: SNOWFLAKE.INFORMATION_SCHEMA.TABLE_CONSTRAINTS + KEY_COLUMN_USAGE
comment: Gives foreign keys a home. Rule OW-006 says an FK is not a Data Element - true, but it still needs somewhere to live, and it lets the asserted DataObject-references-DataObject edge be checked against reality.

Primary Key
type: Class
subclass of: Key Constraint

Foreign Key Constraint
type: Class
subclass of: Key Constraint

Transformation
type: Class
subclass of: Physical Layer Object
subclass of: Activity
harvest source: dbt manifest.json, Snowflake TASKS, Azure Data Factory pipelines
comment: The code that turns inputs into outputs: a dbt model, a Snowflake task, an ADF pipeline. Subclass of prov:Activity so that lineage is expressed in a standard vocabulary rather than a private one.

BI Workspace
type: Class
subclass of: Consumption Layer Object
harvest source: Tableau Metadata API (Project/Site) ; Looker API (Model)

BI Data Source
type: Class
subclass of: Consumption Layer Object
harvest source: Tableau Published Datasource ; Looker Explore
comment: The semantic surface a report is built on. This is where BI meets the warehouse.

BI Field
type: Class
subclass of: Consumption Layer Object
harvest source: Tableau calculated fields ; LookML measures and dimensions
comment: A field as a business user sees it. realizesMetric is what turns a certified Metric from a definition on paper into something measurable against the real BI estate.

BI Report
type: Class
subclass of: Consumption Layer Object
harvest source: Tableau Workbook/Sheet ; Looker Look/Dashboard
comment: What a Data Governance Lead actually cares about in an impact analysis: not that a column changed, but which reports break and who to warn.

Actor
type: Class
comment: A person or a team. Deliberately NOT a MetaModelObject: people are not subject to ownership and lifecycle rules.

Data Domain Owner
type: Class
subclass of: Actor

Data Governance Lead (DGL)
type: Class
subclass of: Actor

Data Steward
type: Class
subclass of: Actor

Activation Status
type: Class

Not Activated
type: Activation Status

Light Activation
type: Activation Status

Full Activation
type: Activation Status

Environment
type: Class
comment: Same logical object, several physical incarnations. Kept as a vocabulary rather than folded into the name so that DEV drift never pollutes PROD lineage.

Development
type: Environment

User Acceptance
type: Environment

Production
type: Environment

System Type
type: Class

Source Application
type: System Type

Master Data System
type: System Type

Data Platform
type: System Type

BI Tool
type: System Type

External Provider
type: System Type

belongs to domain
type: ObjectProperty
type: FunctionalProperty
domain: Sub-Domain
range: Data Domain

belongs to sub-domain
type: ObjectProperty
type: FunctionalProperty
domain: Business Object
range: Sub-Domain

composed of
type: ObjectProperty
domain: Business Object
range: Business Concept
inverse of: is component of
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.

is component of
type: ObjectProperty
domain: Business Concept
range: Business Object

describes (deprecated)
type: ObjectProperty
deprecated: true
is replaced by: is component of
comment: Removed as a genuine relation. Its only use was as a false inverse of composedOf.

has metric
type: ObjectProperty
domain: Business Object
range: Metric

measures
type: ObjectProperty
domain: Metric
range: Business Concept

has grain dimension
type: ObjectProperty
domain: Metric
range: Data Object
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.

computed by
type: ObjectProperty
sub property of: wasDerivedFrom
domain: Metric
range: Data Element
comment: BR-013. Links a mother Metric to the granular Data Elements that implement it in a given analysis context (period, promo status, scope, unit, currency).

implements
type: ObjectProperty
type: FunctionalProperty
domain: Data Object
range: Business Object
comment: The pivot. Exactly one, enforced by SHACL (BR-006).

has element
type: ObjectProperty
domain: Data Object
range: Data Element

references
type: ObjectProperty
domain: Data Object
range: Data Object
comment: Foreign-key reference between Data Objects. NOT ownership. Now checkable against the harvested ForeignKeyConstraint objects.

uses Data Object
type: ObjectProperty
domain: Data Asset
range: Data Object

packages
type: ObjectProperty
domain: Data Product
range: Data Asset

governed by
type: ObjectProperty
domain: Data Product
range: Data Contract

materialized as
type: ObjectProperty
domain: Data Object
range: Physical Relation
curation mode: PROPOSED_CONFIRMED
comment: Data Object to physical relation. Not functional: the same Data Object exists in DEV, UAT and PROD, and sometimes across several tables.

physicalized in
type: ObjectProperty
domain: Data Element
range: Field
curation mode: PROPOSED_CONFIRMED
comment: Data Element to physical column, 1..n. Proposed by the reconciliation job on fullyQualifiedName and type, confirmed by a Data Steward. This single edge is what makes end-to-end impact analysis possible.

sourced from
type: ObjectProperty
range: System
comment: Replaces the free-text hasSourceSystem. Domain deliberately omitted: applies to Data Elements, Physical Relations and BI Data Sources alike.

has system type
type: ObjectProperty
type: FunctionalProperty
domain: System
range: System Type

hosted on
type: ObjectProperty
type: FunctionalProperty
domain: Database
range: System

in database
type: ObjectProperty
type: FunctionalProperty
domain: Schema
range: Database

in schema
type: ObjectProperty
type: FunctionalProperty
domain: Physical Relation
range: Schema

has field
type: ObjectProperty
domain: Physical Relation
range: Field
inverse of: lives in
comment: Domain widened from Table to PhysicalRelation so that views and external tables carry columns too. Inverse now declared - in v0.9 hasField and livesIn were inverses in fact but not in the model, so they were free to diverge.

lives in
type: ObjectProperty
type: FunctionalProperty
domain: Field
range: Physical Relation

deployed in
type: ObjectProperty
type: FunctionalProperty
domain: Observed Object
range: Environment

constrains relation
type: ObjectProperty
type: FunctionalProperty
domain: Key Constraint
range: Physical Relation

constrains field
type: ObjectProperty
domain: Key Constraint
range: Field
comment: Several fields for a composite key.

from field
type: ObjectProperty
domain: Foreign Key Constraint
range: Field

to field
type: ObjectProperty
domain: Foreign Key Constraint
range: Field

consumes
type: ObjectProperty
sub property of: used
domain: Transformation
range: Physical Relation

produces
type: ObjectProperty
domain: Transformation
range: Physical Relation

depends on
type: ObjectProperty
type: TransitiveProperty
domain: Physical Relation
range: Physical Relation
harvest source: SNOWFLAKE.ACCOUNT_USAGE.OBJECT_DEPENDENCIES
comment: Relation-level dependency, view to table. Transitive by nature; in practice compute the closure at query time in Snowflake rather than materialising it with a reasoner.

derived from
type: ObjectProperty
type: TransitiveProperty
sub property of: wasDerivedFrom
domain: Field
range: Field
harvest source: SNOWFLAKE.ACCOUNT_USAGE.ACCESS_HISTORY (column lineage) ; dbt manifest
comment: Column-to-column lineage. The single highest-value edge in the model, and largely free: Snowflake already computes it.

in workspace
type: ObjectProperty
type: FunctionalProperty
domain: Consumption Layer Object
range: BI Workspace

BI consumes
type: ObjectProperty
domain: BI Data Source
range: Physical Relation
harvest source: Tableau Metadata API (GraphQL) ; Looker Explore SQL

has BI field
type: ObjectProperty
domain: BI Data Source
range: BI Field
inverse of: in BI data source

in BI data source
type: ObjectProperty
type: FunctionalProperty
domain: BI Field
range: BI Data Source

BI derived from
type: ObjectProperty
sub property of: wasDerivedFrom
domain: BI Field
range: Field
comment: Closes the last gap in the impact chain: from a dashboard field back to the warehouse column.

realizes metric
type: ObjectProperty
type: FunctionalProperty
domain: BI Field
range: Metric
curation mode: PROPOSED_CONFIRMED
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.

uses BI data source
type: ObjectProperty
domain: BI Report
range: BI Data Source

has BI owner
type: ObjectProperty
domain: Consumption Layer Object
range: Actor
comment: The author or publisher. This is who gets notified by an impact analysis, and it is NOT the Data Domain owner.

owned by
type: ObjectProperty
range: Actor

owning Data Domain
type: ObjectProperty
type: FunctionalProperty
range: Data Domain
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.

has Data Steward
type: ObjectProperty
range: Data Steward

has DGL
type: ObjectProperty
type: FunctionalProperty
domain: Data Domain
range: Data Governance Lead (DGL)

activation status
type: ObjectProperty
type: FunctionalProperty
domain: Data Domain
range: Activation Status

identifier
type: DatatypeProperty
type: FunctionalProperty
range: string

canonical name
type: DatatypeProperty
type: FunctionalProperty
range: string

status
type: DatatypeProperty
range: string

version
type: DatatypeProperty
range: string

created on
type: DatatypeProperty
range: date

last reviewed on
type: DatatypeProperty
range: date

back-doc source
type: DatatypeProperty
range: string

arbitration status
type: DatatypeProperty
range: string
comment: TO_ARBITRATE blocks publication (OW-007). Use this on the object rather than tracking arbitration in a side spreadsheet.

business definition
type: DatatypeProperty
range: string

technical definition
type: DatatypeProperty
range: string

acronym
type: DatatypeProperty
range: string

synonym
type: DatatypeProperty
range: string

business rule
type: DatatypeProperty
range: string

formula
type: DatatypeProperty
range: string

unit
type: DatatypeProperty
range: string
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.

granularity (label)
type: DatatypeProperty
range: string
comment: Human-readable grain label, e.g. 'SKU x Customer x Day'. Keep in sync with hasGrainDimension, which is the machine-readable form.

time aggregation
type: DatatypeProperty
range: string

is KPI (deprecated)
type: DatatypeProperty
range: boolean
deprecated: true
is replaced by: Key Performance Indicator
comment: Duplicated the KPI class. Two ways to say the same thing are two ways to diverge.

logical format
type: DatatypeProperty
range: string

example value
type: DatatypeProperty
range: string

source system (deprecated)
type: DatatypeProperty
range: string
deprecated: true
is replaced by: sourced from
comment: Free text. 'Which objects depend on MDM Product?' was unanswerable because MDM Product was a string, not a node.

schema name (deprecated)
type: DatatypeProperty
range: string
deprecated: true
is replaced by: Schema

physical name
type: DatatypeProperty
type: FunctionalProperty
range: string
comment: Recorded verbatim, never altered (NR-009). Must NOT be carried by a Metric - that is a layer leak; under BR-013 the physical name belongs on the Data Element.

fully qualified name
type: DatatypeProperty
type: FunctionalProperty
range: string
comment: DATABASE.SCHEMA.RELATION[.COLUMN]. The actual join key against INFORMATION_SCHEMA: a bare physical name is ambiguous as soon as the same column name exists in two tables.

source identifier
type: DatatypeProperty
type: FunctionalProperty
range: string
comment: Native immutable id in the source system (Snowflake object id, Tableau LUID, Looker id). Makes reconciliation idempotent and survives renames, which names do not.

harvested on
type: DatatypeProperty
range: dateTime
comment: Staleness marker. An Observed Object not refreshed by the last run is a deletion candidate, not a fact.

physical data type
type: DatatypeProperty
range: string

is nullable
type: DatatypeProperty
range: boolean

ordinal position
type: DatatypeProperty
range: integer

view definition
type: DatatypeProperty
range: string

vendor
type: DatatypeProperty
range: string

defined by (code URI)
type: DatatypeProperty
range: anyURI
comment: Git URI of the code behind a Transformation. Connects the graph to the repository.

approximate row count
type: DatatypeProperty
range: integer

last queried on
type: DatatypeProperty
range: dateTime
harvest source: SNOWFLAKE.ACCOUNT_USAGE.ACCESS_HISTORY
comment: Lets the model say 'documented but unused for eight months'. A rationalisation argument that costs nothing and is denominated in warehouse spend.

query count (30 days)
type: DatatypeProperty
range: integer

BI expression
type: DatatypeProperty
range: string
comment: The calculated-field formula, Tableau or LookML. Compared against the Metric formula to detect definition drift.