@prefix food:    <https://www.dpp-interoperability.wiki/vocab/v1/food#> .
@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 skos:    <http://www.w3.org/2004/02/skos/core#> .
@prefix vann:    <http://purl.org/vocab/vann/> .

# =============================================================================
# DPP Food Extension Vocabulary v0.2
# =============================================================================

<https://www.dpp-interoperability.wiki/vocab/v1/food>
  a owl:Ontology ;
  owl:versionIRI   <https://www.dpp-interoperability.wiki/vocab/v1/food/0.2> ;
  owl:versionInfo  "0.2" ;
  owl:imports      <https://www.dpp-interoperability.wiki/vocab/v1/dpp> ;
  rdfs:label       "DPP Food Product Extension Vocabulary"@en ;
  rdfs:comment     "Food product extension to the DPP Core Vocabulary. Covers EU FIC Regulation 1169/2011 nutrition declarations, allergen disclosures, ingredient lists, storage conditions, and food safety certifications."@en ;
  dcterms:description
    "Food product extension vocabulary for the DPP Interoperability Platform. Covers nutrition, allergens, ingredients, storage, dietary labels, and food safety per EU FIC Regulation 1169/2011 and Codex Alimentarius."@en ;
  dcterms:creator   "Jorge Renato Leon Chumpitaz" ;
  dcterms:publisher "VU Amsterdam / LUT University" ;
  dcterms:created   "2026-02-19"^^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", "Food Information", "EU FIC",
                    "Nutrition", "Allergens", "Regulation 1169/2011" ;
  rdfs:seeAlso      <https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:32011R1169> ,
                    <https://www.fao.org/fao-who-codexalimentarius/en/> ,
                    <https://www.dpp-interoperability.wiki/vocab/v1/food.shacl.ttl> ;
  vann:preferredNamespacePrefix "food" ;
  vann:preferredNamespaceUri    "https://www.dpp-interoperability.wiki/vocab/v1/food#" .

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

food:FoodExtension
  a owl:Class ;
  #       (dpp:Extension) is satisfied and the extension tree is coherent.
  rdfs:subClassOf  dpp:Extension ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/food> ;
  rdfs:label   "Food Extension"@en ;
  rdfs:comment "Container class for food-specific DPP data. Groups nutrition, allergens, ingredients, storage, and safety information per EU FIC Regulation 1169/2011 Articles 9 (mandatory particulars), 24 (date of minimum durability), and 30 (nutrition declaration)."@en ;
  skos:definition
    "A dpp:Extension which groups food-specific data within a Digital Product Passport, including nutrition declarations per Article 30, allergen disclosures per Annex II, ingredient lists per Article 18, storage conditions per Article 25, and food safety certifications, all aligned with EU FIC Regulation 1169/2011 and the Codex Alimentarius."@en ;
  rdfs:seeAlso <https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:32011R1169> ,
               <https://www.fao.org/fao-who-codexalimentarius/en/> .

food:NutritionInformation
  a owl:Class ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/food> ;
  rdfs:label   "Nutrition Information"@en ;
  rdfs:comment "Nutrition declaration per EU FIC Regulation 1169/2011 Article 30."@en ;
  skos:definition
    "A food:FoodExtension component which declares the mandatory nutritional values (energy, fat, saturated fat, carbohydrate, sugars, fibre, protein, salt) per reference serving size, as required by EU FIC Regulation 1169/2011 Article 30."@en ;
  rdfs:seeAlso schema:NutritionInformation ,
               <https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:32011R1169> .

food:Allergen
  a owl:Class ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/food> ;
  rdfs:label   "Allergen"@en ;
  rdfs:comment "Allergen declaration per EU FIC Regulation Annex II (14 major allergens)."@en ;
  skos:definition
    "A food:FoodExtension component which identifies one of the 14 allergens listed in EU FIC Regulation 1169/2011 Annex II present in the food product, together with its presence status (contains, may_contain, or free_from)."@en ;
  rdfs:seeAlso <https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:32011R1169> .

food:Ingredient
  a owl:Class ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/food> ;
  rdfs:label   "Ingredient"@en ;
  rdfs:comment "A single ingredient in the food product, with optional origin and organic status."@en ;
  skos:definition
    "A food:FoodExtension component which describes one substance or product used in the manufacture of a food item, including its name, optional percentage by weight, geographic origin, and organic certification status."@en .

food:StorageConditions
  a owl:Class ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/food> ;
  rdfs:label   "Storage Conditions"@en ;
  rdfs:comment "Required storage conditions: temperature range, humidity, and special instructions."@en ;
  skos:definition
    "A food:FoodExtension component which specifies the environmental conditions (temperature range, humidity, light exposure, and special handling instructions) required to preserve the safety and quality of the food product."@en .

food:FoodSafetyDeclaration
  a owl:Class ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/food> ;
  rdfs:label   "Food Safety Declaration"@en ;
  rdfs:comment "Food safety management certification (e.g. HACCP, ISO 22000, BRC, IFS)."@en ;
  skos:definition
    "A food:FoodExtension component which attests that the food product has been produced under a recognised food safety management system (such as HACCP, ISO 22000, BRC, or IFS), identifying the issuing body and certificate validity period."@en ;
  rdfs:seeAlso <https://www.iso.org/standard/65464.html> .

# Disjointness — preserved from original
food:NutritionInformation owl:disjointWith food:Allergen, food:Ingredient,
                                             food:StorageConditions, food:FoodSafetyDeclaration .
food:Allergen             owl:disjointWith food:Ingredient, food:StorageConditions .
food:StorageConditions    owl:disjointWith food:FoodSafetyDeclaration .

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

food:nutritionInformation
  a owl:ObjectProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/food> ;
  rdfs:label    "nutritionInformation"@en ;
  rdfs:comment  "Links food extension to its nutrition declaration."@en ;
  rdfs:domain   food:FoodExtension ;
  rdfs:range    food:NutritionInformation ;
  owl:inverseOf food:isNutritionInformationOf .

food:isNutritionInformationOf
  a owl:ObjectProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/food> ;
  rdfs:label   "isNutritionInformationOf"@en ;
  rdfs:comment "Inverse of food:nutritionInformation."@en ;
  rdfs:domain  food:NutritionInformation ;
  rdfs:range   food:FoodExtension .

food:allergens
  a owl:ObjectProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/food> ;
  rdfs:label   "allergens"@en ;
  rdfs:comment "Links food extension to its allergen declarations."@en ;
  rdfs:domain  food:FoodExtension ;
  rdfs:range   food:Allergen .

food:ingredients
  a owl:ObjectProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/food> ;
  rdfs:label   "ingredients"@en ;
  rdfs:comment "Links food extension to its ingredient list in descending order of weight per EU FIC Article 18."@en ;
  rdfs:domain  food:FoodExtension ;
  rdfs:range   food:Ingredient .

food:storageConditions
  a owl:ObjectProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/food> ;
  rdfs:label   "storageConditions"@en ;
  rdfs:comment "Links food extension to required storage conditions."@en ;
  rdfs:domain  food:FoodExtension ;
  rdfs:range   food:StorageConditions .

food:foodSafetyDeclarations
  a owl:ObjectProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/food> ;
  rdfs:label   "foodSafetyDeclarations"@en ;
  rdfs:comment "Links food extension to food safety certifications."@en ;
  rdfs:domain  food:FoodExtension ;
  rdfs:range   food:FoodSafetyDeclaration ;
  # Cross-reference: compliance extension provides general certification support
  rdfs:seeAlso <https://www.dpp-interoperability.wiki/vocab/v1/compliance#Certification> .

# =============================================================================
# Cardinality Constraints
#            food:FoodExtension (nutritionInformation, allergens, ingredients).
# =============================================================================

food:FoodExtension
  rdfs:subClassOf
    [ a owl:Restriction ;
      owl:onProperty   food:nutritionInformation ;
      owl:minCardinality 1 ] ,
    [ a owl:Restriction ;
      owl:onProperty   food:allergens ;
      owl:minCardinality 1 ] ,
    [ a owl:Restriction ;
      owl:onProperty   food:ingredients ;
      owl:minCardinality 1 ] ,
    [ a owl:Restriction ;
      owl:onProperty   food:nutritionInformation ;
      owl:maxCardinality 1 ] ,
    [ a owl:Restriction ;
      owl:onProperty   food:storageConditions ;
      owl:maxCardinality 1 ] .

# =============================================================================
# Datatype Properties — Nutrition
#            standard nutrition properties that have a direct Schema.org
#            counterpart (schema:calories, schema:fatContent, etc.).
# =============================================================================

food:servingSize
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/food> ;
  rdfs:label   "servingSize"@en ;
  rdfs:comment "Reference serving size (e.g. '100g', '250ml', '1 portion (30g)')."@en ;
  rdfs:domain  food:NutritionInformation ;
  rdfs:range   xsd:string ;
  owl:equivalentProperty schema:servingSize .

food:energyKj
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/food> ;
  rdfs:label   "energyKj"@en ;
  rdfs:comment "Energy value in kilojoules per serving size."@en ;
  rdfs:domain  food:NutritionInformation ;
  rdfs:range   xsd:double ;
  #             since schema:calories does not distinguish kJ vs kcal.
  rdfs:seeAlso schema:calories .

food:energyKcal
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/food> ;
  rdfs:label   "energyKcal"@en ;
  rdfs:comment "Energy value in kilocalories per serving size."@en ;
  rdfs:domain  food:NutritionInformation ;
  rdfs:range   xsd:double ;
  owl:equivalentProperty schema:calories .

food:fat
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/food> ;
  rdfs:label   "fat"@en ;
  rdfs:comment "Total fat content in grams per serving size."@en ;
  rdfs:domain  food:NutritionInformation ;
  rdfs:range   xsd:double ;
  owl:equivalentProperty schema:fatContent .

food:saturatedFat
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/food> ;
  rdfs:label   "saturatedFat"@en ;
  rdfs:comment "Saturated fat in grams per serving size."@en ;
  rdfs:domain  food:NutritionInformation ;
  rdfs:range   xsd:double ;
  owl:equivalentProperty schema:saturatedFatContent .

food:carbohydrate
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/food> ;
  rdfs:label   "carbohydrate"@en ;
  rdfs:comment "Total carbohydrate in grams per serving size."@en ;
  rdfs:domain  food:NutritionInformation ;
  rdfs:range   xsd:double ;
  owl:equivalentProperty schema:carbohydrateContent .

food:sugars
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/food> ;
  rdfs:label   "sugars"@en ;
  rdfs:comment "Total sugars in grams per serving size."@en ;
  rdfs:domain  food:NutritionInformation ;
  rdfs:range   xsd:double ;
  owl:equivalentProperty schema:sugarContent .

food:fibre
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/food> ;
  rdfs:label   "fibre"@en ;
  rdfs:comment "Dietary fibre in grams per serving size."@en ;
  rdfs:domain  food:NutritionInformation ;
  rdfs:range   xsd:double ;
  owl:equivalentProperty schema:fiberContent .

food:protein
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/food> ;
  rdfs:label   "protein"@en ;
  rdfs:comment "Protein in grams per serving size."@en ;
  rdfs:domain  food:NutritionInformation ;
  rdfs:range   xsd:double ;
  owl:equivalentProperty schema:proteinContent .

food:salt
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/food> ;
  rdfs:label   "salt"@en ;
  rdfs:comment "Salt in grams per serving size (sodium × 2.5 per EU FIC)."@en ;
  rdfs:domain  food:NutritionInformation ;
  rdfs:range   xsd:double ;
  #             (salt = sodium × 2.5; minor semantic overlap but best available)
  owl:equivalentProperty schema:sodiumContent .

food:sodium
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/food> ;
  rdfs:label   "sodium"@en ;
  rdfs:comment "Sodium in milligrams per serving size."@en ;
  rdfs:domain  food:NutritionInformation ;
  rdfs:range   xsd:double .

# =============================================================================
# Datatype Properties — Allergens
# =============================================================================

food:allergenName
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/food> ;
  rdfs:label   "allergenName"@en ;
  rdfs:comment "Name of the allergen (one of the 14 EU FIC Annex II allergens)."@en ;
  rdfs:domain  food:Allergen ;
  rdfs:range   xsd:string .

food:allergenPresence
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/food> ;
  rdfs:label   "allergenPresence"@en ;
  rdfs:comment "Presence status: 'contains', 'may_contain', or 'free_from'."@en ;
  rdfs:domain  food:Allergen ;
  rdfs:range   xsd:string .

# =============================================================================
# Datatype Properties — Ingredients
# =============================================================================

food:ingredientName
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/food> ;
  rdfs:label   "ingredientName"@en ;
  rdfs:comment "Name of the ingredient."@en ;
  rdfs:domain  food:Ingredient ;
  rdfs:range   xsd:string .

food:ingredientPercentage
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/food> ;
  rdfs:label   "ingredientPercentage"@en ;
  rdfs:comment "Percentage of the ingredient (required by EU FIC when highlighted or pictured)."@en ;
  rdfs:domain  food:Ingredient ;
  rdfs:range   xsd:double .

food:ingredientOrigin
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/food> ;
  rdfs:label   "ingredientOrigin"@en ;
  rdfs:comment "Country or region of origin (ISO 3166-1 alpha-2 or region name)."@en ;
  rdfs:domain  food:Ingredient ;
  rdfs:range   xsd:string .

food:organic
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/food> ;
  rdfs:label   "organic"@en ;
  rdfs:comment "Whether the ingredient is certified organic."@en ;
  rdfs:domain  food:Ingredient ;
  rdfs:range   xsd:boolean .

# =============================================================================
# Datatype Properties — Storage Conditions
# FIX from original: food:expiryType and food:shelfLifeDays moved from
# food:FoodExtension to food:StorageConditions where all physical storage
# data lives — preserved from prior audit iteration.
# =============================================================================

food:temperatureMin
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/food> ;
  rdfs:label   "temperatureMin"@en ;
  rdfs:comment "Minimum storage temperature (°C)."@en ;
  rdfs:domain  food:StorageConditions ;
  rdfs:range   xsd:double .

food:temperatureMax
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/food> ;
  rdfs:label   "temperatureMax"@en ;
  rdfs:comment "Maximum storage temperature (°C)."@en ;
  rdfs:domain  food:StorageConditions ;
  rdfs:range   xsd:double .

food:humidity
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/food> ;
  rdfs:label   "humidity"@en ;
  rdfs:comment "Required storage humidity range description."@en ;
  rdfs:domain  food:StorageConditions ;
  rdfs:range   xsd:string .

food:storageInstructions
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/food> ;
  rdfs:label   "storageInstructions"@en ;
  rdfs:comment "Free-text special storage instructions (e.g. 'Keep away from direct sunlight', 'Store in a dry place')."@en ;
  rdfs:domain  food:StorageConditions ;
  rdfs:range   xsd:string .

food:expiryType
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/food> ;
  rdfs:label   "expiryType"@en ;
  rdfs:comment "Expiry labelling type: 'best_before' or 'use_by' per EU FIC Regulation Article 24."@en ;
  rdfs:domain  food:StorageConditions ;
  rdfs:range   xsd:string ;
  rdfs:seeAlso <https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:32011R1169> .

food:shelfLifeDays
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/food> ;
  rdfs:label   "shelfLifeDays"@en ;
  rdfs:comment "Shelf life in days from date of manufacture under standard storage conditions."@en ;
  rdfs:domain  food:StorageConditions ;
  rdfs:range   xsd:integer .

# =============================================================================
# Datatype Properties — Food Safety Declaration
# =============================================================================

food:certificationStandard
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/food> ;
  rdfs:label   "certificationStandard"@en ;
  rdfs:comment "Name of the food safety certification standard (e.g. HACCP, ISO 22000, BRC, IFS)."@en ;
  rdfs:domain  food:FoodSafetyDeclaration ;
  rdfs:range   xsd:string .

food:certificationBody
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/food> ;
  rdfs:label   "certificationBody"@en ;
  rdfs:comment "Name of the accredited body that issued the food safety certificate."@en ;
  rdfs:domain  food:FoodSafetyDeclaration ;
  rdfs:range   xsd:string .

food:certificationValidFrom
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/food> ;
  rdfs:label   "certificationValidFrom"@en ;
  rdfs:comment "Date from which the food safety certificate is valid."@en ;
  rdfs:domain  food:FoodSafetyDeclaration ;
  rdfs:range   xsd:date .

food:certificationValidUntil
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/food> ;
  rdfs:label   "certificationValidUntil"@en ;
  rdfs:comment "Expiry date of the food safety certificate."@en ;
  rdfs:domain  food:FoodSafetyDeclaration ;
  rdfs:range   xsd:date .

# =============================================================================
# Datatype Properties — FoodExtension top-level
# =============================================================================

food:countryOfOrigin
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/food> ;
  rdfs:label   "countryOfOrigin"@en ;
  rdfs:comment "Primary country of origin of the food product (ISO 3166-1 alpha-2)."@en ;
  rdfs:domain  food:FoodExtension ;
  rdfs:range   xsd:string ;
  rdfs:seeAlso <https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:32011R1169> .

food:netQuantity
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/food> ;
  rdfs:label   "netQuantity"@en ;
  rdfs:comment "Net quantity declared on the label (e.g. '500g', '1L') per EU FIC Article 23."@en ;
  rdfs:domain  food:FoodExtension ;
  rdfs:range   xsd:string .

food:drainedWeight
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/food> ;
  rdfs:label   "drainedWeight"@en ;
  rdfs:comment "Drained weight of the food product in grams (applicable to foods in liquid medium)."@en ;
  rdfs:domain  food:FoodExtension ;
  rdfs:range   xsd:double .

food:dietaryLabels
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/food> ;
  rdfs:label   "dietaryLabels"@en ;
  rdfs:comment "Dietary or lifestyle labels applicable to the product (e.g. 'vegan', 'vegetarian', 'gluten-free', 'halal', 'kosher')."@en ;
  rdfs:domain  food:FoodExtension ;
  rdfs:range   xsd:string .

food:organicCertification
  a owl:DatatypeProperty ;
  rdfs:isDefinedBy <https://www.dpp-interoperability.wiki/vocab/v1/food> ;
  rdfs:label   "organicCertification"@en ;
  rdfs:comment "Organic certification scheme and certificate reference (e.g. EU Organic Regulation 2018/848)."@en ;
  rdfs:domain  food:FoodExtension ;
  rdfs:range   xsd:string ;
  rdfs:seeAlso <https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:32018R0848> .
