Pernod Ricard Data Meta Model
type: Ontology
creator: Bastien Gourdon
modified: 2026-07-30
comment: OWL T-Box. Six layers (Ownership, Business, Logical, Delivery, Physical, Consumption) crossed with a provenance axis (Defined vs Captured). Defined objects are written by governance and reviewed; Captured objects are read from Snowflake, Tableau and Looker and are rebuilt, never edited. Bridge annotation properties are declared for future alignment with domain ontologies.
prior version: https://ontology.pernod-ricard.com/metamodel/1.5
version IRI: https://ontology.pernod-ricard.com/metamodel/2.0
version info: 1.6.0-draft-2026-07-30

BI Tool
type: System Type

Data Platform
type: System Type

External Provider
type: System Type

Key Performance Indicator
type: Class
comment: An elevated Metric. Use this class rather than the deprecated isKPI flag.
subclass of: Metric
acronym: KPI
is Abstract: false
short Label: KPI

Master Data System
type: System Type

Source Application
type: System Type

acronym
type: AnnotationProperty
range: string

activation Status
type: DatatypeProperty
type: FunctionalProperty
domain: Data Domain
range: string

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

authoring Mode
type: AnnotationProperty
comment: Who writes this, in practice: ASSERTED (a person does), HARVESTED (a job does) or PROPOSED_CONFIRMED (a job proposes and a person accepts). Renamed from curationMode along with the classes: 'curation' belonged to the same jargon family as 'curated'.

belongs To
type: FunctionalProperty
type: ObjectProperty
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.

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

business Rule
type: DatatypeProperty
range: string

canonical Name
type: DatatypeProperty
type: FunctionalProperty
range: string

computed By
type: ObjectProperty
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).
domain: Metric
range: Data Element
sub property of: wasDerivedFrom

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

consumes
type: ObjectProperty
domain: Transformation
range: Data Structure
sub property of: used

contains BI Field
type: ObjectProperty
domain: Business Intelligence Data Source
range: Business Intelligence Field
inverse of: is In BI Data Source

creation Date
type: DatatypeProperty
range: date

definition Address
type: DatatypeProperty
comment: Git URI of the code behind a Transformation. Connects the graph to the repository.
range: anyURI

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 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 .

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 .

depends On
type: ObjectProperty
type: TransitiveProperty
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.
domain: Data Structure
range: Data Structure
harvest Source: SNOWFLAKE.ACCOUNT_USAGE.OBJECT_DEPENDENCIES

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

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

environment
type: DatatypeProperty
type: FunctionalProperty
domain: Captured Object
range: string

example Value
type: DatatypeProperty
range: string

exposes
type: ObjectProperty
comment: The channels through which the product is actually consumed.
domain: Data Product
range: Data Interface

exposes Metric
type: FunctionalProperty
type: ObjectProperty
comment: The harmonisation measure: how many distinct BI Fields expose 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.
domain: Business Intelligence Field
range: Metric
authoring Mode: PROPOSED_CONFIRMED

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

formula
type: DatatypeProperty
range: string

fully Qualified Name
type: DatatypeProperty
type: FunctionalProperty
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.
range: string

governed By
type: FunctionalProperty
type: ObjectProperty
domain: Data Product
range: Data Contract

harvest Date
type: DatatypeProperty
comment: Staleness marker. A Captured Object not refreshed by the last run is a deletion candidate, not a fact.
range: dateTime

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

has Domain Owner
type: FunctionalProperty
type: ObjectProperty
domain: Data Domain
range: Data Domain Owner

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

has Field
type: ObjectProperty
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.
domain: Data Structure
range: Field
inverse of: lives In

has Governance Lead
type: FunctionalProperty
type: ObjectProperty
domain: Data Domain
range: Data Governance Lead

has Grain Element
type: ObjectProperty
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.
domain: Data Object
range: Data Element

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

has Product Owner
type: FunctionalProperty
type: ObjectProperty
comment: Exactly one. Belongs to the operating Sub-Domain -- checkable, not just conventional.
domain: Data Product
range: Data Product Owner

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

has Sub Domain Owner
type: FunctionalProperty
type: ObjectProperty
domain: Data Sub Domain
range: Data Sub Domain Owner

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

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

identifier
type: DatatypeProperty
type: FunctionalProperty
range: string

is About
type: FunctionalProperty
type: ObjectProperty
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.
domain: Business Object
range: Business Concept

is Abstract
type: AnnotationProperty
comment: True on a class that exists only to give its specialisations a common parent and a common shape, and is never instantiated. Declared rather than inferred: a viewer that guessed it from 'has subclasses' flagged Metric as abstract, one of the most instantiated classes in the model, whose only crime is having KPI beneath it. Whether a class is instantiated is a modelling decision.

is In BI Workspace
type: FunctionalProperty
type: ObjectProperty
domain: Consumption Layer Object
range: Business Intelligence Workspace

is In Database
type: FunctionalProperty
type: ObjectProperty
domain: Schema
range: Database

is In Schema
type: FunctionalProperty
type: ObjectProperty
comment: Domain deliberately not declared, and the shapes must keep this OPTIONAL: Neo4j has no schema and BigQuery calls the level a dataset. A minCount 1 would break on the first harvest outside Snowflake. It is also the only property that would distinguish a tabular Dataset from a Graph, which is why that intermediate level is not declared yet -- one client does not pay for a level of hierarchy.
range: Schema

is Nullable
type: DatatypeProperty
range: boolean

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

last Review Date
type: DatatypeProperty
range: date

logical Format
type: DatatypeProperty
range: string

measures
type: ObjectProperty
domain: Metric
range: Business Concept

monitored By
type: ObjectProperty
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.
range: Data Steward

operated By
type: FunctionalProperty
type: ObjectProperty
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.
domain: Data Product
range: Data Sub Domain

ordinal Position
type: DatatypeProperty
range: integer

owned By
type: ObjectProperty
range: Actor

owned By Domain
type: FunctionalProperty
type: ObjectProperty
comment: The single Data Domain with authority to define the object's rule. Absent on Captured 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.
range: Data Domain

packages
type: ObjectProperty
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.
domain: Data Product
range: Data Object

physical Data Type
type: DatatypeProperty
range: string

physical Name
type: DatatypeProperty
type: FunctionalProperty
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.
range: string

primarily Stored In
type: FunctionalProperty
type: ObjectProperty
comment: The authoritative Field among the several a Data Element may sit in -- the others being copies, replicas or downstream materialisations. A SUB-PROPERTY of storedIn on purpose, not a parallel relation. Entailment then guarantees the primary location is always among the locations, so the two can never disagree; two independent properties would allow a Field marked primary here and absent from storedIn there. Primary and replica rather than master and slave: the industry has moved on, and it reads better to the business.
domain: Data Element
range: Field
sub property of: stored In
authoring Mode: PROPOSED_CONFIRMED

produces
type: ObjectProperty
domain: Transformation
range: Data Structure

qualified By
type: ObjectProperty
comment: The Data Objects that give this one its analysis context: a fact dataset is qualified by Product, Customer, Currency and Date. Physically a foreign key, which is why it is checkable against the harvested ForeignKeyConstraint objects -- but the name says the reason rather than the mechanism. NOT ownership. It is also what carries the grain of a fact object, whose own elements are measures and whose keys are not Data Elements (OW-006).
domain: Data Object
range: Data Object

query Count
type: DatatypeProperty
range: integer

references Source Field
type: ObjectProperty
domain: Foreign Key
range: Field

references Target Field
type: ObjectProperty
domain: Foreign Key
range: Field

represents
type: ObjectProperty
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.

served By
type: ObjectProperty
comment: What physically backs the interface: the shared relations, the extract source.
domain: Data Interface
range: Data Structure

short Label
type: AnnotationProperty
type: FunctionalProperty
comment: The name screens use, where the canonical name is the exhaustive one: Domain for Data Domain, SODH Gold for Sell Out Data Hub - Gold. Declared rather than left to each interface. The same object was being called two different things depending on where you looked, because every viewer kept a display dictionary of its own. One name is authoritative, the other is short, and both live in the model.
range: string

source Identifier
type: DatatypeProperty
type: FunctionalProperty
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.
range: string

sourced From
type: ObjectProperty
comment: The System holding the authoritative data for this object. Replaces the free-text hasSource, and answers a question that text could not: which objects depend on MDM Product. Domain deliberately omitted -- it applies to Data Elements, Data Structures, Metrics and BI Data Sources alike, and the scope lives in the shapes. It also settles a naming collision. As a string, "source" meant a system here and a BI surface in BIDataSource, two readings of one word. As a relation towards System, the two are different kinds of thing and the ambiguity disappears.
range: System

status
type: DatatypeProperty
range: string

synonym
type: DatatypeProperty
range: string

technical Definition
type: DatatypeProperty
range: string

time Aggregation
type: DatatypeProperty
range: string

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

uses BI Data Source
type: ObjectProperty
domain: Business Intelligence Report
range: Business Intelligence Data Source

uses Concept
type: ObjectProperty
comment: The other notions required to read this object correctly. Zero or more, and zero is a legitimate answer.
domain: Business Object
range: Business Concept

version
type: DatatypeProperty
range: string

view Definition
type: DatatypeProperty
range: string

Base Table
type: Class
comment: A structure that physically holds its rows, as opposed to one that derives them. The common case in a warehouse Gold layer, and where impact analysis usually bottoms out.
subclass of: Data Structure
is Abstract: false

Data Contract
type: Class
comment: The service commitment attached to a Data Product: schema, freshness, quality thresholds, support, breaking-change notice period. Candidate alignment: ODCS (Bitol).
subclass of: Defined Object
subclass of: Delivery Layer Object
is Abstract: false

Data Domain Owner
type: Class
comment: Accountable for a Data Domain. Exactly one per domain.
subclass of: Actor
acronym: DDO
is Abstract: false
short Label: Domain Owner

Data Governance Lead
type: Class
comment: Runs governance for a Data Domain. The acronym belongs in hasAcronym, not in the label (rule NR-005).
subclass of: Actor
acronym: DGL
is Abstract: false
short Label: Governance Lead

Data Product Owner
type: Class
comment: Runs a Data Product day to day: releases, changelog, support, consumer communication. Belongs to the Sub-Domain that operates the product.
subclass of: Actor
acronym: PO
is Abstract: false
short Label: Product Owner

Data Steward
type: Class
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'.
subclass of: Actor
is Abstract: false
short Label: Steward

Data Sub Domain Owner
type: Class
comment: Accountable for a Sub-Domain, exactly one per sub-domain. Named to match Data Domain Owner: the two roles are the same responsibility at two levels of the tree, and calling one 'Data Domain Owner' and the other 'Sub-Domain Owner' suggested a difference that does not exist.
subclass of: Actor
acronym: SDO
is Abstract: false
short Label: Sub Domain Owner

External Table
type: Class
comment: Backed by files outside the warehouse. Marks the boundary where lineage leaves Snowflake.
subclass of: Data Structure
is Abstract: false

Governance Layer Object
type: Class
comment: Root of the governance layer. Holds the actors and governance objects that are not data objects and therefore sit outside the data layers. Created by insertion above Actor rather than by renaming it, so that every range pointing at Actor keeps stating the nature of its target rather than its position in the model.
subclass of: Meta Model Object
is Abstract: true
short Label: Governance Layer

Primary Key
type: Class
comment: The column or set of columns whose values make a row unique. Once harvested it makes a declared grain checkable: a hasGrainElement that does not match the real key is an automatic finding.
subclass of: Key Constraint
is Abstract: false

View
type: Class
comment: Depends on other relations through dependsOn, so impact is transitive.
subclass of: Data Structure
is Abstract: false

is In BI Data Source
type: FunctionalProperty
type: ObjectProperty
domain: Business Intelligence Field
range: Business Intelligence Data Source

lives In
type: FunctionalProperty
type: ObjectProperty
domain: Field
range: Data Structure

stored In
type: ObjectProperty
comment: Where a logical artefact actually sits. One relation at two granularities, like represents: DataObject storedIn DataStructure (a table, a view, later a node label) DataElement storedIn Field (a column, later a node property) Range left open and scoped by SHACL per class, because the two uses have different targets. THE SEAM. This is the one relation crossing from what governance defines to what a harvester captures, and the one thing a steward confirms: the reconciliation job proposes the mapping on fully qualified name and type, a person accepts it. It is also what makes end-to-end impact analysis possible. Not functional: the same object exists in DEV, UAT and PROD, and a Data Element may sit in several Fields -- see primaryLocation for the authoritative one. Renamed from physicalizedIn, which was jargon.
authoring Mode: PROPOSED_CONFIRMED

Business Intelligence Report
type: Class
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.
subclass of: Captured Object
subclass of: Consumption Layer Object
harvest Source: Tableau Workbook/Sheet ; Looker Look/Dashboard
is Abstract: false
short Label: BI Report

Business Intelligence Workspace
type: Class
comment: The container a BI tool organises its content in: a Tableau project or site, a Looker model. Useful mainly for attribution -- it is where you look to find who publishes what.
subclass of: Captured Object
subclass of: Consumption Layer Object
harvest Source: Tableau Metadata API (Project/Site) ; Looker API (Model)
is Abstract: false
short Label: BI Workspace

Data Sub Domain
type: Class
comment: A coherent slice of a Data Domain, grouping the business objects that belong together: Sell Out inside Sales Performance, Fiscal Calendar inside Financial Performance. It exists so that governance can be delegated and reviewed at a size a person can hold in their head.
subclass of: Defined Object
subclass of: Ownership Layer Object
acronym: SD
is Abstract: false
short Label: Sub Domain

Database
type: Class
comment: The top container of a storage engine: a Snowflake database, a Databricks catalog, a BigQuery project. Named differently by every vendor, which is why the class carries the generic name and the vendor word lives in the harvest annotation.
subclass of: Captured Object
subclass of: Physical Layer Object
harvest Source: SNOWFLAKE.INFORMATION_SCHEMA.DATABASES
is Abstract: false

Schema
type: Class
comment: The namespace grouping structures inside a database. Optional on purpose: Neo4j has no schema and BigQuery calls the level a dataset, so nothing in the shapes may require it.
subclass of: Captured Object
subclass of: Physical Layer Object
harvest Source: SNOWFLAKE.INFORMATION_SCHEMA.SCHEMATA
is Abstract: false

Transformation
type: Class
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.
subclass of: Activity
subclass of: Captured Object
subclass of: Physical Layer Object
harvest Source: dbt manifest.json, Snowflake TASKS, Azure Data Factory pipelines
is Abstract: false

Business Layer Object
type: Class
comment: What the business means: the shared vocabulary and the measures built on it. A layer root, so it says nothing about provenance.
subclass of: Meta Model Object
is Abstract: true
short Label: Business Layer

Data Interface
type: Class
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.
subclass of: Defined Object
subclass of: Delivery Layer Object
is Abstract: false

Foreign Key
type: Class
comment: A column, or set of columns, whose values must exist in another structure. Rule OW-006 keeps it out of the Data Elements -- it carries no business notion of its own, it is joining plumbing -- but it still needs somewhere to live, and here it makes the asserted qualifiedBy between Data Objects checkable against what the warehouse really enforces.
subclass of: Key Constraint
is Abstract: false

Key Constraint
type: Class
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.
subclass of: Captured Object
subclass of: Physical Layer Object
harvest Source: SNOWFLAKE.INFORMATION_SCHEMA.TABLE_CONSTRAINTS + KEY_COLUMN_USAGE
is Abstract: true

Logical Layer Object
type: Class
comment: How the data is structured.
subclass of: Meta Model Object
is Abstract: true
short Label: Logical Layer

System
type: Class
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.
subclass of: Defined Object
subclass of: Physical Layer Object
authoring Mode: ASSERTED
is Abstract: false

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

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

Business Object
type: Class
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.
subclass of: Defined Object
subclass of: Ownership Layer Object
acronym: BO
is Abstract: false

Data Domain
type: Class
comment: A durable area of the business that owns the meaning of its data: Sales Performance, Product & Material, Financial Performance. It is the unit of accountability -- one owner, one governance lead -- and the top of the categorisation tree. Domains are stable; the projects and systems inside them are not.
subclass of: Defined Object
subclass of: Ownership Layer Object
acronym: DD
is Abstract: false
short Label: Domain

Data Element
type: Class
comment: The finest defined unit. Its mapping to a physical Field is the ONLY place where the defined graph and the captured graph meet: proposed automatically by name and type matching, confirmed by a Data Steward.
subclass of: Defined Object
subclass of: Logical Layer Object
authoring Mode: PROPOSED_CONFIRMED
is Abstract: false
short Label: Element

Delivery Layer Object
type: Class
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.
subclass of: Meta Model Object
is Abstract: true
short Label: Delivery Layer

Ownership Layer Object
type: Class
comment: Who is accountable, and how the estate is categorised: domains, sub-domains, and the business objects they answer for. A layer root, so it says nothing about provenance.
subclass of: Meta Model Object
is Abstract: true
short Label: Ownership Layer

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

Data Object
type: Class
comment: The pivot of the whole model: it represents exactly one Business Object, groups the Data Elements that make it up, and is stored in one or more Data Structures. The single junction between what governance defines and what actually runs -- everything upstream is meaning, everything downstream is machinery.
subclass of: Defined Object
subclass of: Logical Layer Object
is Abstract: false

Data Product
type: Class
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.
subclass of: Defined Object
subclass of: Delivery Layer Object
is Abstract: false

Metric
type: Class
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.
subclass of: Business Layer Object
subclass of: Defined Object
is Abstract: false

System Type
type: Class
comment: What kind of system this is -- source application, master data system, data platform, BI tool, external provider. Coarse on purpose: it exists to group systems in a view, not to model them.
is Abstract: false

Actor
type: Class
comment: A person or a team. Deliberately NOT a MetaModelObject: people are not subject to ownership and lifecycle rules.
subclass of: Governance Layer Object
is Abstract: true

Consumption Layer Object
type: Class
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.
subclass of: Meta Model Object
is Abstract: true
short Label: Consumption Layer

Physical Layer Object
type: Class
comment: What actually runs: the systems, containers, structures, columns, keys and code that hold the data. Like every layer root, this class says nothing about provenance -- and this layer is the one that shows why that matters. A System is DEFINED: somebody decides that MDM Product is a system worth tracking, and names it. Nobody harvests the list of systems that matter. Everything beneath a system is CAPTURED: databases, schemas, data structures, fields, keys and transformations are read from what is running. Until v1.4 this class was itself declared a kind of Captured Object, which made every physical class captured by construction and put the five seeded Systems in breach of the harvest rules. v1.6 extended the correction to all six layers: a layer says what an object IS, never how it got here.
subclass of: Meta Model Object
is Abstract: true
short Label: Physical Layer

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

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

Data Structure
type: Class
comment: Anything that carries Fields and reads as a set of rows. Never instantiated directly: a harvest types the concrete kind, and a viewer shows that kind rather than this parent. WHY THE PARENT EXISTS. Three properties need exactly this set as their scope: storedIn from a Data Object, hasField and its inverse livesIn, and dependsOn. Without it each would have to be tripled, once per concrete kind, and the checks would go with them. WHY THE NAME CHANGED. It was PhysicalRelation, from Codd, where a relation IS a table. In an ontology "relation" reads as a property, and the word locks the class into the tabular world. A Neo4j node label, a Mongo collection and a Kafka topic all carry fields; none is a relation. EXTENSION POINT for non-tabular storage. Nothing at Pernod Ricard is non-tabular today, so no such class is declared -- four terms were deprecated in v1.2 precisely because nobody instantiated them. The day a graph enters scope, the insertion is additive and touches no instance, because subClassOf is transitive: pr:Dataset rdfs:subClassOf pr:DataStructure . pr:Graph rdfs:subClassOf pr:DataStructure . pr:BaseTable rdfs:subClassOf pr:Dataset . # instead of DataStructure pr:inSchema rdfs:domain pr:Dataset . # instead of nothing Existing BaseTable assertions stay DataStructure by entailment, every shape targeting DataStructure keeps working, and storedIn does not move. The extension point is paid once; the extension is paid when it arrives.
subclass of: Captured Object
subclass of: Physical Layer Object
harvest Source: SNOWFLAKE.INFORMATION_SCHEMA.TABLES
is Abstract: true

Captured Object
type: Class
comment: Read from a running system and rebuilt on every run. Never hand-edited. Carries sourceIdentifier, fullyQualifiedName and harvestedOn instead of declared ownership: attribution is INFERRED through the Data Element it is mapped to, never asserted on the node.
subclass of: Meta Model Object
authoring Mode: HARVESTED
is Abstract: true

Defined Object
type: Class
comment: Somebody decided it. Written by governance, edited through a pull request on the domain TTL file, and subject to the full identity and lifecycle shape: identifier, name, owner, owning Data Domain, status, version.
subclass of: Meta Model Object
authoring Mode: ASSERTED
is Abstract: true