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

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
comment: How the data is structured.

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

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

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

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 (deprecated)
type: Class
subclass of: Logical Layer Object
deprecated: true
is replaced by: Data Interface
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.

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

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

Data Contract
type: Class
subclass of: Delivery Layer Object
comment: The service commitment attached to a Data Product: schema, freshness, quality thresholds, support, breaking-change notice period. 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 (deprecated)
type: Class
subclass of: Physical Relation
deprecated: true
is replaced by: View
comment: A class standing in for an attribute: what distinguishes it is being derived, which dependsOn already states.

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

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
comment: Accountable for a Data Domain. Exactly one per domain.

Sub-Domain Owner
type: Class
subclass of: Actor
comment: Accountable for a Sub-Domain. Exactly one per sub-domain.

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

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

Data Steward
type: Class
subclass of: Actor
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'.

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

belongs to domain (deprecated)
type: ObjectProperty
type: FunctionalProperty
deprecated: true
is replaced by: belongs to

belongs to sub-domain (deprecated)
type: ObjectProperty
type: FunctionalProperty
deprecated: true
is replaced by: belongs to

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

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

composed of (deprecated)
type: ObjectProperty
deprecated: true
is replaced by: uses concept
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.

is component of (deprecated)
type: ObjectProperty
deprecated: true
is replaced by: uses concept

describes (deprecated)
type: ObjectProperty
deprecated: true
is replaced by: is component of (deprecated)
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 element
type: ObjectProperty
domain: Data Object
range: Data Element
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.

has grain dimension (deprecated)
type: ObjectProperty
deprecated: true
is replaced by: has grain element
comment: Put grain on the Metric, which confounded a declarative statement with a structural fact. See hasGrainElement.

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

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.

implements (deprecated)
type: ObjectProperty
type: FunctionalProperty
deprecated: true
is replaced by: represents

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.

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

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

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

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

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

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

uses Data Object (deprecated)
type: ObjectProperty
deprecated: true
is replaced by: packages

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.

stored 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. Renamed from physicalizedIn, which was jargon: the relation says where the data sits.

physicalized in (deprecated)
type: ObjectProperty
deprecated: true
is replaced by: stored in

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 (deprecated)
type: ObjectProperty
type: FunctionalProperty
deprecated: true
comment: Derivable: constrainsField then livesIn gives the relation. An asserted edge redundant with an existing path is a divergence waiting to happen.

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

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

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

has Data Steward (deprecated)
type: ObjectProperty
deprecated: true
is replaced by: monitored by

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

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

has sub-domain owner
type: ObjectProperty
type: FunctionalProperty
domain: Sub-Domain
range: Sub-Domain Owner

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

source of truth
type: DatatypeProperty
range: string
comment: The system holding the authoritative data for this object: SODH Gold, MDM Product, Group Finance. ONE MEANING ONLY. It had drifted into naming the document a record came from ("SODH back-doc v0.7"), and into packing a system and a relation into one string ("SODH Gold / F_SELL_OUT"). The relation belongs in physicalName; the document belongs nowhere -- provenance of a record is not a property of the thing it describes. MUST NOT appear on a Business Concept: a concept has no data source. Its authority is its owning domain and its definition is published in the glossary. Enforced by SHACL. On a Metric it is asserted rather than derived, by exception, because "where can I get this metric" is a first-order question and the derivation chain (computedBy, then the data object holding the element) will have gaps before harvesting. A shape checks the assertion against the elements.

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

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 (deprecated)
type: DatatypeProperty
range: string
deprecated: true
is replaced by: has grain element
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.

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 (deprecated)
type: DatatypeProperty
range: string
deprecated: true

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 (deprecated)
type: DatatypeProperty
range: integer
deprecated: true
comment: Volumetry with no identified use. queryCount30d and lastQueriedOn carry the rationalisation argument; row count does not.

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.