@prefix dpp:     <https://www.dpp-interoperability.wiki/vocab/v1/dpp#> .
@prefix owl:     <http://www.w3.org/2002/07/owl#> .
@prefix rdf:     <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs:    <http://www.w3.org/2000/01/rdf-schema#> .
@prefix xsd:     <http://www.w3.org/2001/XMLSchema#> .
@prefix dcterms: <http://purl.org/dc/terms/> .
@prefix schema:  <https://schema.org/> .
@prefix prov:    <http://www.w3.org/ns/prov#> .
@prefix qudt:    <http://qudt.org/schema/qudt/> .
@prefix gs1:     <https://www.gs1.org/voc/> .
@prefix skos:    <http://www.w3.org/2004/02/skos/core#> .
@prefix vann:    <http://purl.org/vocab/vann/> .

# =============================================================================
# DPP Interoperability Core Vocabulary v0.2
# =============================================================================
# Registered extensions:
#   dpp:extensions → battery:BatteryExtension  (https://www.dpp-interoperability.wiki/vocab/v1/battery)
#   dpp:extensions → lcaef:LcaEfExtension      (https://www.dpp-interoperability.wiki/vocab/v1/lca-ef)
#   dpp:extensions → soc:SocExtension          (https://www.dpp-interoperability.wiki/vocab/v1/soc)
#   dpp:extensions → food:FoodExtension        (https://www.dpp-interoperability.wiki/vocab/v1/food)
#   dpp:extensions → compliance:ComplianceExtension (https://www.dpp-interoperability.wiki/vocab/v1/compliance)
# =============================================================================
# REFACTORING CHANGES (v0.2 → v0.2.1):
#         dpp:InformationObject, dpp:SoftwareEntity
# =============================================================================

<https://www.dpp-interoperability.wiki/vocab/v1/dpp>
  a owl:Ontology ;
  owl:versionIRI     <https://www.dpp-interoperability.wiki/vocab/v1/dpp/0.2> ;
  rdfs:seeAlso      <https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:32024R1781> ,
                    <https://cirpassproject.eu/> ,
                    <https://www.gs1.org/standards/gs1-digital-link> ,
                    <https://hadea.ec.europa.eu/programmes/digital-europe/actions/digital-product-passport_en> ;
  owl:versionInfo    "0.2" ;
  rdfs:label         "DPP Interoperability Core Vocabulary"@en ;
  dcterms:description
    "Core vocabulary for the Digital Product Passport Interoperability Platform. Defines product-agnostic classes and properties for the Shared Core Schema v0.2."@en ;
  dcterms:creator    "Jorge Renato Leon Chumpitaz" ;
  dcterms:publisher  "VU Amsterdam / LUT University" ;
  dcterms:created    "2026-02-06"^^xsd:date ;
  dcterms:modified   "2026-02-27"^^xsd:date ;
  dcterms:license    <https://creativecommons.org/licenses/by/4.0/> ;
  dcterms:rights     "CC BY 4.0 — Jorge Renato Leon Chumpitaz" ;
  dcterms:subject    "Digital Product Passport", "EU ESPR", "Interoperability" ;
  rdfs:seeAlso       <https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:32024R1781> ,
                     <https://www.dpp-interoperability.wiki/contexts/core/v0.2.jsonld> ,
                     <https://www.dpp-interoperability.wiki/vocab/v1/dpp.shacl.ttl> ;
  vann:preferredNamespacePrefix "dpp" ;
  vann:preferredNamespaceUri    "https://www.dpp-interoperability.wiki/vocab/v1/dpp#" ;
  rdfs:comment       "Developed as part of a Design Science Research thesis on DPP interoperability (VU Amsterdam / LUT University)."@en .

# =============================================================================
# Abstract Superclasses  [FIX H1]
# Introduced to build an is_a-complete backbone hierarchy. All existing
# domain classes are assigned exactly one parent below.
# =============================================================================

dpp:Agent
  a owl:Class ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "Agent"@en ;
  skos:definition "An agent is a person or organization that bears some form of responsibility with respect to a Digital Product Passport or the product it describes."@en ;
  rdfs:comment "Abstract superclass for legal entities involved in a product's lifecycle."@en ;
  rdfs:seeAlso prov:Agent .

dpp:PhysicalEntity
  a owl:Class ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "Physical Entity"@en ;
  skos:definition "A physical entity is a tangible object or place that exists in the physical world and is relevant to a Digital Product Passport."@en ;
  rdfs:comment "Abstract superclass for physical things described in or associated with a DPP."@en .

dpp:InformationObject
  a owl:Class ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "Information Object"@en ;
  skos:definition "An information object is a digital or conceptual artifact that carries structured data about a product or its passport."@en ;
  rdfs:comment "Abstract superclass for all information-bearing entities in the core vocabulary."@en ;
  rdfs:seeAlso prov:Entity .

dpp:SoftwareEntity
  a owl:Class ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "Software Entity"@en ;
  skos:definition "A software entity is a computational artifact that processes or transforms data within the DPP Interoperability Platform."@en ;
  rdfs:comment "Abstract superclass for software components defined in the core vocabulary."@en ;
  rdfs:seeAlso prov:SoftwareAgent .

dpp:LegalEntity
  a owl:Class ;
  rdfs:subClassOf dpp:Agent ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "Legal Entity"@en ;
  skos:definition "A legal entity is an organization or person that has a legal identity and is registered under applicable law."@en ;
  rdfs:comment "Superclass for Manufacturer and EconomicOperator, capturing shared name, id, and address properties."@en ;
  rdfs:seeAlso schema:Organization .

# =============================================================================
# Classes
# =============================================================================

dpp:DigitalProductPassport
  a owl:Class ;
  rdfs:subClassOf dpp:InformationObject ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "Digital Product Passport"@en ;
  skos:definition "A Digital Product Passport is an information object that documents a product across its entire lifecycle in conformance with EU ESPR Regulation 2024/1781, specifically Articles 8-12 defining DPP content, access, and technical requirements."@en ;
  rdfs:comment "Root entity describing a product across its lifecycle, conforming to EU ESPR Articles 8-12. The DPP aggregates product identification, manufacturer data, composition, environmental footprint, compliance, and sector-specific extensions into a single machine-readable document."@en ;
  rdfs:seeAlso <https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:32024R1781> ,
               <https://cirpassproject.eu/> .

dpp:Product
  a owl:Class ;
  rdfs:subClassOf dpp:PhysicalEntity ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "Product"@en ;
  skos:definition "A product is a physical or digital item placed on the EU market and described by a Digital Product Passport."@en ;
  rdfs:comment "The physical or digital product described by a DPP."@en ;
  rdfs:seeAlso schema:Product .

dpp:Manufacturer
  a owl:Class ;
  rdfs:subClassOf dpp:LegalEntity ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "Manufacturer"@en ;
  skos:definition "A manufacturer is a legal entity responsible for designing, producing, or assembling the product described by a Digital Product Passport."@en ;
  rdfs:comment "The organization responsible for manufacturing the product."@en ;
  rdfs:seeAlso schema:Organization .

dpp:Identifier
  a owl:Class ;
  rdfs:subClassOf dpp:InformationObject ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "Identifier"@en ;
  skos:definition "An identifier is an information object that provides a unique reference to a product or passport using a recognized scheme such as GTIN, UUID, VIN, DID, LGTIN, serial number, or manufacturer part number per EU ESPR Article 9."@en ;
  rdfs:comment "A product or passport identifier (GTIN, UUID, VIN, DID, LGTIN, serial, manufacturer part number). ESPR Article 9 requires unique product identifiers to be included in the DPP, supporting interoperability through GS1 Digital Link and other standards."@en ;
  rdfs:seeAlso gs1:GTIN ,
               <https://www.gs1.org/standards/gs1-digital-link> .

dpp:Evidence
  a owl:Class ;
  rdfs:subClassOf dpp:InformationObject ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "Evidence"@en ;
  skos:definition "Evidence is an information object that supports or corroborates the result of an identifier resolution process, recording the source, match type, and confidence."@en ;
  rdfs:comment "Evidence supporting an identifier resolution result."@en ;
  rdfs:seeAlso prov:Entity .

dpp:FieldProvenance
  a owl:Class ;
  rdfs:subClassOf dpp:InformationObject ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "Field Provenance"@en ;
  skos:definition "Field provenance is an information object that records the origin, method, and confidence of the value assigned to a single field in a Digital Product Passport, aligned with W3C PROV-O."@en ;
  rdfs:comment "Per-field provenance metadata aligned with W3C PROV-O."@en ;
  rdfs:seeAlso prov:Entity .

dpp:Address
  a owl:Class ;
  rdfs:subClassOf dpp:InformationObject ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "Address"@en ;
  skos:definition "An address is an information object that specifies the postal location of a manufacturer or facility."@en ;
  rdfs:comment "Postal address of a manufacturer or facility."@en ;
  rdfs:seeAlso schema:PostalAddress .

dpp:Facility
  a owl:Class ;
  rdfs:subClassOf dpp:PhysicalEntity ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "Facility"@en ;
  skos:definition "A facility is a physical place where a product or one of its components is manufactured."@en ;
  rdfs:comment "Manufacturing facility where the product was produced."@en ;
  rdfs:seeAlso schema:Place .

# DEPRECATED — kept for backward compatibility
dpp:Composition
  a owl:Class ;
  rdfs:subClassOf dpp:InformationObject ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "Composition"@en ;
  skos:definition "A composition is an information object that describes the set of materials comprising a product, together with recycled content declarations."@en ;
  rdfs:comment "Product composition containing component materials and recycled content."@en .

dpp:MaterialEntry
  a owl:Class ;
  rdfs:subClassOf dpp:InformationObject ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "Material Entry"@en ;
  skos:definition "A material entry is an information object that represents a single material in a product's composition, recording its name, mass, and recycled content."@en ;
  rdfs:comment "A single material in a product's composition."@en .

# DEPRECATED — kept for backward compatibility
# DEPRECATED — kept for backward compatibility
dpp:EconomicOperator
  a owl:Class ;
  rdfs:subClassOf dpp:LegalEntity ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "Economic Operator"@en ;
  skos:definition "An economic operator is a legal entity responsible for placing a product on the EU market under applicable regulations."@en ;
  rdfs:comment "Economic operator responsible for placing the product on the market."@en .

dpp:DataCarrier
  a owl:Class ;
  rdfs:subClassOf dpp:InformationObject ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "Data Carrier"@en ;
  skos:definition "A data carrier is an information object that encodes a machine-readable reference to a product or its Digital Product Passport, such as a QR code, RFID tag, or NFC label, as required by EU ESPR Article 9(3)."@en ;
  rdfs:comment "Data carrier (QR code, Data Matrix, RFID, NFC, GS1 Digital Link) linking to the physical product. ESPR Article 9(3) mandates that the data carrier shall be physically present on the product and link to its DPP."@en ;
  rdfs:seeAlso <https://www.gs1.org/standards/gs1-digital-link> .

dpp:MappingGap
  a owl:Class ;
  rdfs:subClassOf dpp:InformationObject ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "Mapping Gap"@en ;
  skos:definition "A mapping gap is an information object that records a target field in the Shared Core Schema that could not be populated from a source payload during normalization."@en ;
  rdfs:comment "A gap identified during normalization where a target field could not be populated from the source payload."@en .

dpp:Adapter
  a owl:Class ;
  rdfs:subClassOf dpp:SoftwareEntity ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "Adapter"@en ;
  skos:definition "An adapter is a software entity that transforms an initiative-specific data payload into the Shared Core Schema of the DPP Interoperability Platform."@en ;
  rdfs:comment "Software adapter that transforms initiative-specific payloads into the Shared Core Schema."@en ;
  rdfs:seeAlso prov:SoftwareAgent .

dpp:DataCoverage
  a owl:Class ;
  rdfs:subClassOf dpp:InformationObject ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "Data Coverage"@en ;
  skos:definition "Data coverage is an information object that records quantitative metrics about how many fields of the Shared Core Schema were successfully populated during a normalization run."@en ;
  rdfs:comment "Metrics describing how many target fields were populated by a normalization run."@en .

dpp:CoreData
  a owl:Class ;
  rdfs:subClassOf dpp:InformationObject ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "Core Data"@en ;
  skos:definition "Core data is an information object that groups all product-agnostic fields of a Digital Product Passport as defined by the Shared Core Schema."@en ;
  rdfs:comment "Groups all product-agnostic core fields of a Digital Product Passport."@en .

dpp:ProvenanceRecord
  a owl:Class ;
  rdfs:subClassOf dpp:InformationObject ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "Provenance Record"@en ;
  skos:definition "A provenance record is an information object that aggregates adapter identification and per-field provenance entries for a Digital Product Passport normalization event."@en ;
  rdfs:comment "Provenance metadata including adapter info and per-field tracking."@en ;
  rdfs:seeAlso prov:Bundle .

dpp:Extension
  a owl:Class ;
  rdfs:subClassOf dpp:InformationObject ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "Extension"@en ;
  skos:definition "An abstract superclass for all domain-specific extension root classes registered with the DPP Interoperability Platform via dpp:extensions." @en ;
  rdfs:comment "Abstract superclass for all registered DPP extension root classes."@en .


dpp:PassportStatus
  a owl:Class ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "Passport Status"@en ;
  skos:definition "The passport status is a controlled term that expresses the lifecycle stage of a Digital Product Passport."@en ;
  rdfs:comment "Passport lifecycle status: draft, active, revoked, expired, superseded."@en ;
  owl:oneOf (
    dpp:PassportStatusDraft
    dpp:PassportStatusActive
    dpp:PassportStatusRevoked
    dpp:PassportStatusExpired
    dpp:PassportStatusSuperseded
  ) .

dpp:PassportStatusDraft
  a dpp:PassportStatus ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "draft"@en ;
  rdfs:comment "The passport is being authored and has not yet been published."@en .

dpp:PassportStatusActive
  a dpp:PassportStatus ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "active"@en ;
  rdfs:comment "The passport is published and in active use."@en .

dpp:PassportStatusRevoked
  a dpp:PassportStatus ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "revoked"@en ;
  rdfs:comment "The passport has been revoked and is no longer valid."@en .

dpp:PassportStatusExpired
  a dpp:PassportStatus ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "expired"@en ;
  rdfs:comment "The passport has passed its validity period and is expired."@en .

dpp:PassportStatusSuperseded
  a dpp:PassportStatus ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "superseded"@en ;
  rdfs:comment "The passport has been superseded by a newer version."@en .

# Disjointness — unchanged from original
dpp:Product      owl:disjointWith dpp:Manufacturer, dpp:Identifier, dpp:Evidence,
                                  dpp:FieldProvenance, dpp:Composition .
dpp:Manufacturer owl:disjointWith dpp:Identifier, dpp:Evidence, dpp:Composition .

# =============================================================================
# Object Properties
# =============================================================================

dpp:product
  a owl:ObjectProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "product"@en ;
  rdfs:comment "Links a DPP to the product it describes."@en ;
  rdfs:domain  dpp:DigitalProductPassport ;
  rdfs:range   dpp:Product ;
  owl:equivalentProperty schema:itemReviewed .

dpp:manufacturer
  a owl:ObjectProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "manufacturer"@en ;
  rdfs:comment "Links a DPP to the manufacturer."@en ;
  rdfs:domain  dpp:DigitalProductPassport ;
  rdfs:range   dpp:Manufacturer ;
  owl:equivalentProperty schema:manufacturer .

dpp:identifiers
  a owl:ObjectProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "identifiers"@en ;
  rdfs:comment "Set of identifiers associated with the passport."@en ;
  rdfs:domain  dpp:DigitalProductPassport ;
  rdfs:range   dpp:Identifier .

dpp:evidence
  a owl:ObjectProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "evidence"@en ;
  rdfs:comment "Evidence entries supporting an identifier resolution result."@en ;
  rdfs:domain  dpp:DigitalProductPassport ;
  rdfs:range   dpp:Evidence .

dpp:extensions
  a owl:ObjectProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "extensions"@en ;
  rdfs:comment "Modular domain-specific extension data. Range is open to support any registered extension root class."@en ;
  rdfs:domain  dpp:DigitalProductPassport ;
  rdfs:range   dpp:Extension .

dpp:provenanceFields
  a owl:ObjectProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "provenanceFields"@en ;
  rdfs:comment "Per-field provenance tracking. Aligned with W3C PROV-O."@en ;
  rdfs:domain  dpp:DigitalProductPassport ;
  rdfs:range   dpp:FieldProvenance ;
  rdfs:seeAlso prov:entity .

dpp:address
  a owl:ObjectProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "address"@en ;
  rdfs:comment "Postal address of a manufacturer or facility."@en ;
  rdfs:domain  dpp:Manufacturer ;
  rdfs:range   dpp:Address ;
  owl:equivalentProperty schema:address .

dpp:facility
  a owl:ObjectProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "facility"@en ;
  rdfs:comment "Manufacturing facility where the product was produced."@en ;
  rdfs:domain  dpp:Manufacturer ;
  rdfs:range   dpp:Facility ;
  rdfs:seeAlso schema:location .

# DEPRECATED — kept for backward compatibility
dpp:composition
  a owl:ObjectProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "composition"@en ;
  rdfs:comment "Product composition with component materials and recycled content."@en ;
  rdfs:domain  dpp:DigitalProductPassport ;
  rdfs:range   dpp:Composition ;
  # Cross-reference: battery extension specialises this as battery:materials
  rdfs:seeAlso <https://www.dpp-interoperability.wiki/vocab/v1/battery#materials> .

dpp:componentMaterials
  a owl:ObjectProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "componentMaterials"@en ;
  rdfs:comment "List of materials comprising the product."@en ;
  rdfs:domain  dpp:Composition ;
  rdfs:range   dpp:MaterialEntry .

dpp:recycledContent
  a owl:ObjectProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "recycledContent"@en ;
  rdfs:comment "Recycled content declarations by material."@en ;
  rdfs:domain  dpp:Composition ;
  rdfs:range   dpp:MaterialEntry .

dpp:economicOperator
  a owl:ObjectProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "economicOperator"@en ;
  rdfs:comment "Economic operator responsible for placing product on market."@en ;
  rdfs:domain  dpp:DigitalProductPassport ;
  rdfs:range   dpp:EconomicOperator .

dpp:dataCarrierObj
  a owl:ObjectProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "dataCarrierObj"@en ;
  rdfs:comment "Data carrier linking to the physical product."@en ;
  rdfs:domain  dpp:DigitalProductPassport ;
  rdfs:range   dpp:DataCarrier .

# DEPRECATED — kept for backward compatibility
# DEPRECATED — kept for backward compatibility
dpp:materialMass
  a owl:ObjectProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "materialMass"@en ;
  rdfs:comment "Mass of the material expressed as a qudt:QuantityValue."@en ;
  rdfs:domain  dpp:MaterialEntry ;
  rdfs:range   qudt:QuantityValue .

dpp:coreData
  a owl:ObjectProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "coreData"@en ;
  rdfs:comment "Groups all product-agnostic core fields of a Digital Product Passport."@en ;
  rdfs:domain  dpp:DigitalProductPassport ;
  rdfs:range   dpp:CoreData .

dpp:gaps
  a owl:ObjectProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "gaps"@en ;
  rdfs:comment "Set of mapping gaps identified during normalization."@en ;
  rdfs:domain  dpp:DigitalProductPassport ;
  rdfs:range   dpp:MappingGap .

dpp:provenanceLinkedData
  a owl:ObjectProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "provenanceLinkedData"@en ;
  rdfs:comment "PROV-O aligned provenance representation for linked-data consumers."@en ;
  rdfs:domain  dpp:DigitalProductPassport ;
  rdfs:range   prov:Activity .

dpp:provenance
  a owl:ObjectProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "provenance"@en ;
  rdfs:comment "Provenance metadata including adapter info and per-field tracking."@en ;
  rdfs:domain  dpp:DigitalProductPassport ;
  rdfs:range   dpp:ProvenanceRecord .

dpp:adapter
  a owl:ObjectProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "adapter"@en ;
  rdfs:comment "Adapter that performed the normalization."@en ;
  rdfs:domain  dpp:DigitalProductPassport ;
  rdfs:range   dpp:Adapter .

dpp:dataCoverage
  a owl:ObjectProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "dataCoverage"@en ;
  rdfs:comment "Data coverage metrics for a normalization run."@en ;
  rdfs:domain  dpp:DigitalProductPassport ;
  rdfs:range   dpp:DataCoverage .

# =============================================================================
# Datatype Properties
# =============================================================================

# FIX: dpp:image and dpp:dataCarrier remain DatatypeProperty/xsd:anyURI (correct in original)
dpp:image
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "image"@en ;
  rdfs:comment "URL of the product image. Required by EU Battery Regulation Article 77."@en ;
  rdfs:domain  dpp:Product ;
  rdfs:range   xsd:anyURI ;
  owl:equivalentProperty schema:image .

dpp:dataCarrier
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "dataCarrier"@en ;
  rdfs:comment "URL of the data carrier (QR code, Data Matrix, GS1 Digital Link). Required by EU Battery Regulation Article 77."@en ;
  rdfs:domain  dpp:DigitalProductPassport ;
  rdfs:range   xsd:anyURI .

dpp:passportId
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "passportId"@en ;
  rdfs:comment "Unique identifier for the DPP, typically a URN."@en ;
  rdfs:domain  dpp:DigitalProductPassport ;
  rdfs:range   xsd:anyURI ;
  owl:equivalentProperty dcterms:identifier .

dpp:version
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "version"@en ;
  rdfs:comment "Schema version of the passport."@en ;
  rdfs:domain  dpp:DigitalProductPassport ;
  rdfs:range   xsd:string ;
  owl:equivalentProperty dcterms:hasVersion .

dpp:lastUpdated
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "lastUpdated"@en ;
  rdfs:comment "ISO 8601 timestamp of the last update."@en ;
  rdfs:domain  dpp:DigitalProductPassport ;
  rdfs:range   xsd:dateTime .

dpp:productType
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "productType"@en ;
  rdfs:comment "High-level product type (e.g. \'Battery\', \'Electronics\', \'Food\'). Now nested under product."@en ;
  rdfs:domain  dpp:Product ;
  rdfs:range   xsd:string .

dpp:productCategory
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "productCategory"@en ;
  rdfs:comment "Category classification (e.g. \'Industrial Cell\', \'ESS Module\')."@en ;
  rdfs:domain  dpp:Product ;
  rdfs:range   xsd:string ;
  rdfs:seeAlso schema:additionalType .

dpp:productModel
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "productModel"@en ;
  rdfs:comment "Model name or number."@en ;
  rdfs:domain  dpp:Product ;
  rdfs:range   xsd:string ;
  owl:equivalentProperty schema:model .

# DEPRECATED — kept for backward compatibility
# should be represented via dpp:identifiers with identifierType "SERIAL".
# types.ts already does not include serialNumber on the Product interface.
# DEPRECATED — kept for backward compatibility
# (manufacturing date is a property of the physical product, not the document)
dpp:manufacturingDate
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "manufacturingDate"@en ;
  rdfs:comment "Date the product was manufactured."@en ;
  rdfs:domain  dpp:Product ;
  rdfs:range   xsd:date ;
  owl:equivalentProperty schema:dateProduced .

# DEPRECATED — kept for backward compatibility
dpp:placingOnMarket
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "placingOnMarket"@en ;
  rdfs:comment "Date first placed on the EU market."@en ;
  rdfs:domain  dpp:DigitalProductPassport ;
  rdfs:range   xsd:date .

dpp:passportStatus
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "passportStatus"@en ;
  rdfs:comment "Passport lifecycle status: draft, active, revoked, expired, superseded."@en ;
  rdfs:domain  dpp:DigitalProductPassport ;
  rdfs:range   xsd:string .
  # NOTE: The preferred typed form is to use the dpp:PassportStatus named individuals.
  # The xsd:string range is preserved for backward compatibility.
  # Use dpp:hasPassportStatus (ObjectProperty) for the type-safe form below.

# Type-safe alternative for passportStatus using named individuals
dpp:hasPassportStatus
  a owl:ObjectProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "hasPassportStatus"@en ;
  rdfs:comment "Links a DPP to its lifecycle status using the dpp:PassportStatus controlled vocabulary."@en ;
  rdfs:domain  dpp:DigitalProductPassport ;
  rdfs:range   dpp:PassportStatus .

dpp:economicOperatorName
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "economicOperatorName"@en ;
  rdfs:comment "Name of the economic operator."@en ;
  rdfs:domain  dpp:EconomicOperator ;
  rdfs:range   xsd:string .

dpp:economicOperatorId
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "economicOperatorId"@en ;
  rdfs:comment "Identifier of the economic operator."@en ;
  rdfs:domain  dpp:EconomicOperator ;
  rdfs:range   xsd:string .

dpp:dataCarrierUrl
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "dataCarrierUrl"@en ;
  rdfs:comment "URL encoded in the data carrier."@en ;
  rdfs:domain  dpp:DataCarrier ;
  rdfs:range   xsd:anyURI .

dpp:dataCarrierType
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "dataCarrierType"@en ;
  rdfs:comment "Type of data carrier (QR, DataMatrix, RFID, NFC)."@en ;
  rdfs:domain  dpp:DataCarrier ;
  rdfs:range   xsd:string .

dpp:percentage
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "percentage"@en ;
  rdfs:comment "Percentage by weight."@en ;
  rdfs:domain  dpp:MaterialEntry ;
  rdfs:range   xsd:double .

dpp:materialName
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "materialName"@en ;
  rdfs:comment "Name of a material in composition."@en ;
  rdfs:domain  dpp:MaterialEntry ;
  rdfs:range   xsd:string .

dpp:dateIntoService
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "dateIntoService"@en ;
  rdfs:comment "Date the product was placed into service."@en ;
  rdfs:domain  dpp:Product ;
  rdfs:range   xsd:date .

# dateIntoService is ESPR-aligned and is the canonical property.
dpp:expiryDate
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "expiryDate"@en ;
  rdfs:comment "Expiry or end-of-life date."@en ;
  rdfs:domain  dpp:Product ;
  rdfs:range   xsd:date .

dpp:identifierType
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "identifierType"@en ;
  rdfs:comment "Type: UUID, GTIN, VIN, SERIAL, MANUFACTURER_PART, DID, or LGTIN."@en ;
  rdfs:domain  dpp:Identifier ;
  rdfs:range   xsd:string .

dpp:identifierValue
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "identifierValue"@en ;
  rdfs:comment "The string value of the identifier."@en ;
  rdfs:domain  dpp:Identifier ;
  rdfs:range   xsd:string .

dpp:identifierGranularity
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "identifierGranularity"@en ;
  rdfs:comment "Granularity: item, batch, or model."@en ;
  rdfs:domain  dpp:Identifier ;
  rdfs:range   xsd:string .

dpp:identifierIssuedBy
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "identifierIssuedBy"@en ;
  rdfs:comment "Organization that issued the identifier."@en ;
  rdfs:domain  dpp:Identifier ;
  rdfs:range   xsd:string .

dpp:evidenceSource
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "evidenceSource"@en ;
  rdfs:comment "Source system or registry."@en ;
  rdfs:domain  dpp:Evidence ;
  rdfs:range   xsd:string .

dpp:evidenceMatchType
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "evidenceMatchType"@en ;
  rdfs:comment "Type of match (exact, pattern, prefix, etc.)."@en ;
  rdfs:domain  dpp:Evidence ;
  rdfs:range   xsd:string .

dpp:evidenceConfidence
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "evidenceConfidence"@en ;
  rdfs:comment "Confidence score (0.0 to 1.0). Enforced by companion SHACL shape."@en ;
  rdfs:domain  dpp:Evidence ;
  rdfs:range   xsd:double .

dpp:evidenceMatchedValue
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "evidenceMatchedValue"@en ;
  rdfs:comment "The identifier value matched by the evidence source."@en ;
  rdfs:domain  dpp:Evidence ;
  rdfs:range   xsd:string .

dpp:evidenceTimestamp
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "evidenceTimestamp"@en ;
  rdfs:comment "Timestamp when evidence was collected."@en ;
  rdfs:domain  dpp:Evidence ;
  rdfs:range   xsd:dateTime .

dpp:manufacturerName
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "manufacturerName"@en ;
  rdfs:comment "Legal or trading name of the manufacturer."@en ;
  rdfs:domain  dpp:Manufacturer ;
  rdfs:range   xsd:string ;
  owl:equivalentProperty schema:legalName .

dpp:manufacturerId
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "manufacturerId"@en ;
  rdfs:comment "Unique identifier (e.g. VAT, DUNS)."@en ;
  rdfs:domain  dpp:Manufacturer ;
  rdfs:range   xsd:string ;
  rdfs:seeAlso schema:taxID .

dpp:street
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "street"@en ;
  rdfs:comment "Street address line."@en ;
  rdfs:domain  dpp:Address ;
  rdfs:range   xsd:string ;
  owl:equivalentProperty schema:streetAddress .

dpp:city
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "city"@en ;
  rdfs:comment "City or locality."@en ;
  rdfs:domain  dpp:Address ;
  rdfs:range   xsd:string ;
  owl:equivalentProperty schema:addressLocality .

dpp:postalCode
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "postalCode"@en ;
  rdfs:comment "Postal or ZIP code."@en ;
  rdfs:domain  dpp:Address ;
  rdfs:range   xsd:string ;
  owl:equivalentProperty schema:postalCode .

dpp:country
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "country"@en ;
  rdfs:comment "ISO 3166-1 alpha-2 country code."@en ;
  rdfs:domain  dpp:Address ;
  rdfs:range   xsd:string ;
  owl:equivalentProperty schema:addressCountry .

dpp:sourceField
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "sourceField"@en ;
  rdfs:comment "Path of the source field in the original initiative payload."@en ;
  rdfs:domain  dpp:FieldProvenance ;
  rdfs:range   xsd:string .

dpp:provenanceSource
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "provenanceSource"@en ;
  rdfs:comment "Initiative or system that provided the source data."@en ;
  rdfs:domain  dpp:FieldProvenance ;
  rdfs:range   xsd:string ;
  rdfs:seeAlso prov:wasAttributedTo .

dpp:provenanceMethod
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "provenanceMethod"@en ;
  rdfs:comment "Mapping method: direct_mapping, transformation, computation, or default."@en ;
  rdfs:domain  dpp:FieldProvenance ;
  rdfs:range   xsd:string .

dpp:provenanceConfidence
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "provenanceConfidence"@en ;
  rdfs:comment "Confidence score (0.0 to 1.0). Enforced by companion SHACL shape."@en ;
  rdfs:domain  dpp:FieldProvenance ;
  rdfs:range   xsd:double .

dpp:provenanceTimestamp
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "provenanceTimestamp"@en ;
  rdfs:comment "Timestamp when the field was mapped."@en ;
  rdfs:domain  dpp:FieldProvenance ;
  rdfs:range   xsd:dateTime ;
  rdfs:seeAlso prov:generatedAtTime .

dpp:provenanceTransformation
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "provenanceTransformation"@en ;
  rdfs:comment "Description of the transformation applied (e.g. unit conversion)."@en ;
  rdfs:domain  dpp:FieldProvenance ;
  rdfs:range   xsd:string .

dpp:materialRecycledContent
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "materialRecycledContent"@en ;
  rdfs:comment "Percentage of recycled content (0.0 to 100.0)."@en ;
  rdfs:domain  dpp:MaterialEntry ;
  rdfs:range   xsd:double .

dpp:criticalRawMaterials
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "criticalRawMaterials"@en ;
  rdfs:comment "Critical raw materials per EU CRM Act."@en ;
  rdfs:domain  dpp:Materials ;
  rdfs:range   xsd:string ;
  rdfs:seeAlso <https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:32024R0903> .

# Properties on deprecated dpp:CarbonFootprint — retained for backward compatibility
dpp:cfTotal
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "cfTotal"@en ;
  rdfs:comment "Total carbon footprint value."@en ;
  rdfs:domain  dpp:CarbonFootprint ;
  rdfs:range   xsd:double .

dpp:cfUnit
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "cfUnit"@en ;
  rdfs:comment "Unit (e.g. \'kg CO2e/kWh\')."@en ;
  rdfs:domain  dpp:CarbonFootprint ;
  rdfs:range   xsd:string .

dpp:cfMethodology
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "cfMethodology"@en ;
  rdfs:comment "Methodology (e.g. PEF, GHG Protocol)."@en ;
  rdfs:domain  dpp:CarbonFootprint ;
  rdfs:range   xsd:string .

dpp:declarations
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "declarations"@en ;
  rdfs:comment "Regulatory compliance declarations."@en ;
  rdfs:domain  dpp:Compliance ;
  rdfs:range   xsd:string .

# -- Gap sub-properties -------------------------------------------------------

dpp:gapField
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "gapField"@en ;
  rdfs:comment "Target field that could not be populated during normalization."@en ;
  rdfs:domain  dpp:MappingGap ;
  rdfs:range   xsd:string .

dpp:gapReason
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "gapReason"@en ;
  rdfs:comment "Reason why the field is missing (e.g. not_in_source, unmappable)."@en ;
  rdfs:domain  dpp:MappingGap ;
  rdfs:range   xsd:string .

dpp:gapSeverity
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "gapSeverity"@en ;
  rdfs:comment "Severity level of the gap (error, warning, info)."@en ;
  rdfs:domain  dpp:MappingGap ;
  rdfs:range   xsd:string .

dpp:gapExplanation
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "gapExplanation"@en ;
  rdfs:comment "Human-readable explanation of the gap."@en ;
  rdfs:domain  dpp:MappingGap ;
  rdfs:range   xsd:string .

dpp:gapCategory
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "gapCategory"@en ;
  rdfs:comment "Category of the gap (e.g. core, extension)."@en ;
  rdfs:domain  dpp:MappingGap ;
  rdfs:range   xsd:string .

# -- Adapter sub-properties ---------------------------------------------------

dpp:adapterVersion
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "adapterVersion"@en ;
  rdfs:comment "Version of the adapter that performed the transformation."@en ;
  rdfs:domain  dpp:Adapter ;
  rdfs:range   xsd:string .

dpp:targetSchema
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "targetSchema"@en ;
  rdfs:comment "Target Shared Core Schema version (e.g. 0.2.0)."@en ;
  rdfs:domain  dpp:Adapter ;
  rdfs:range   xsd:string .

# -- DataCoverage sub-properties -----------------------------------------------

dpp:coverageScore
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "coverageScore"@en ;
  rdfs:comment "Overall coverage score (0.0 to 1.0). Enforced by companion SHACL shape."@en ;
  rdfs:domain  dpp:DataCoverage ;
  rdfs:range   xsd:double .

dpp:populatedFields
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "populatedFields"@en ;
  rdfs:comment "Number of fields successfully populated."@en ;
  rdfs:domain  dpp:DataCoverage ;
  rdfs:range   xsd:integer .

dpp:expectedFields
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label   "expectedFields"@en ;
  rdfs:comment "Total number of expected fields."@en ;
  rdfs:domain  dpp:DataCoverage ;
  rdfs:range   xsd:integer .

# =============================================================================
# Cardinality Constraints — unchanged from original + new CoreData/ProvenanceRecord
# =============================================================================

dpp:DigitalProductPassport
  rdfs:subClassOf
    [ a owl:Restriction ;
      owl:onProperty   dpp:passportId ;
      owl:maxCardinality 1 ] ,
    [ a owl:Restriction ;
      owl:onProperty   dpp:product ;
      owl:maxCardinality 1 ] ,
    [ a owl:Restriction ;
      owl:onProperty   dpp:manufacturer ;
      owl:maxCardinality 1 ] ,
    [ a owl:Restriction ;
      owl:onProperty   dpp:coreData ;
      owl:maxCardinality 1 ] ,
    [ a owl:Restriction ;
      owl:onProperty   dpp:provenance ;
      owl:maxCardinality 1 ] ,
    [ a owl:Restriction ;
      owl:onProperty   dpp:dataCoverage ;
      owl:maxCardinality 1 ] .
