@prefix : <http://w3id.org/CEON/ontology/product/> .
@prefix actorODP: <http://w3id.org/CEON/ontology/actorODP/> .
@prefix dcterms: <http://purl.org/dc/terms/> .
@prefix odp: <http://www.ontologydesignpatterns.org/schemas/cpannotationschema.owl#> .
@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 resourceODP: <http://w3id.org/CEON/ontology/resourceODP/> .
@prefix vann: <http://purl.org/vocab/vann/> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

actorODP:ResourceRelation a owl:Class .

: a owl:Ontology ;
    dcterms:contributor "Eva Blomqvist" ;
    dcterms:created "2025-03-19"^^xsd:date ;
    dcterms:creator "Huanyu Li" ;
    dcterms:description "The Product module of CEON (Circular Economy Ontology Network)." ;
    dcterms:issued "2025-06-30"^^xsd:date ;
    dcterms:license "https://creativecommons.org/licenses/by/4.0/" ;
    dcterms:publisher "Onto-DESIDE" ;
    dcterms:title "Circular Economy Ontology Network (CEON) - Product Module" ;
    vann:preferredNamespacePrefix "ceon-product" ;
    vann:preferredNamespaceUri "http://w3id.org/CEON/ontology/product/" ;
    odp:coversRequirements "In addition to requirements covered by imported ODPs, covers the following requirements from Onto-DESIDE D3.1: CVN-Resource-2, CVN-ResrouceType-4, C11-2, C12-1, C13-3, E2-1, T8-3.",
        "In addition to requirements covered by imported ODPs, covers the following requirements from Onto-DESIDE D3.2: CE5-2, C1-4, C2-5, C5-3, C11-2, C12-1, C13-3, C13-4, C13-9, E1-4, E1-5, E1-15, E2-1, E3-2, E3-5, E4-1, E4-2, E4-8, E4-9, E6-7, T4-3, T4-5, T6-1, T8-3, T9-2." ;
    rdfs:seeAlso <https://github.com/LiUSemWeb/CEON> ;
    owl:imports <http://w3id.org/CEON/ontology/actorODP/0.4/>,
        <http://w3id.org/CEON/ontology/resourceODP/0.5/> ;
    owl:priorVersion 0.4 ;
    owl:versionIRI <http://w3id.org/CEON/ontology/product/0.5/> ;
    owl:versionInfo 0.5 .

:ISOCompliance a owl:Class ;
    rdfs:label "ISO Compliance" ;
    rdfs:comment "ISO compliance is a compliance issuing thay sth (e.g., organization's structure, business operations, practices or policies) follows a specific ISO standard." ;
    rdfs:subClassOf :Compliance .

:REACHCompliance a owl:Class ;
    rdfs:label "REACH Compliance" ;
    rdfs:comment "REACH (Regulation on the registration, evaluation, authorisation and restriction of chemicals) compliance is a compliance issueing that the REACH regulation is satisfied." ;
    rdfs:seeAlso "https://environment.ec.europa.eu/topics/chemicals/reach-regulation_en" ;
    rdfs:subClassOf :Compliance ;
    owl:equivalentClass [ a owl:Restriction ;
            owl:hasValue :REACH ;
            owl:onProperty :complianceWith ] .

:RoHSCompliance a owl:Class ;
    rdfs:label "RoHS Compliance" ;
    rdfs:comment "RoHS (Restriction of Hazardous Substances in Electrical and Electronic Equipment) compliance is a compliance issuing that RoHS objectives are satisfied." ;
    rdfs:seeAlso "https://environment.ec.europa.eu/topics/waste-and-recycling/rohs-directive_en" ;
    rdfs:subClassOf :Compliance ;
    owl:equivalentClass [ a owl:Restriction ;
            owl:hasValue :RoHS ;
            owl:onProperty :complianceWith ] .

:SupplierLocation a owl:Class ;
    rdfs:label "Supplier Location" ;
    rdfs:comment "The location of supplier of a product or item." ;
    rdfs:subClassOf <http://w3id.org/CEON/ontology/location/Location> .

:compositionOf a owl:ObjectProperty ;
    rdfs:label "composition of" ;
    rdfs:comment "Represents what the composition is a composition of (i.e., the product, the product object or matter that is broken down into its components)." ;
    rdfs:domain :Composition ;
    rdfs:range [ a owl:Class ;
            owl:unionOf ( :Item :Product resourceODP:Matter ) ] .

:compositionQuantity a owl:DatatypeProperty ;
    rdfs:label "composition quantity" ;
    rdfs:comment "compositionQuantity represents the quantity of elements of a composition." ;
    rdfs:domain :Composition ;
    rdfs:range xsd:double .

:hasBrand a owl:DatatypeProperty ;
    rdfs:label "has brand" ;
    rdfs:comment "The brand name of a product." ;
    rdfs:range xsd:string .

:hasCertificate a owl:DatatypeProperty ;
    rdfs:label "has certificate" ;
    rdfs:comment "Link to the the certificate that certifies the compliance" ;
    rdfs:domain :Compliance .

:hasCompliance a owl:ObjectProperty ;
    rdfs:label "has compliance" ;
    rdfs:comment "Used to link something (e.g., product or process) to a compliance." ;
    rdfs:domain [ a owl:Class ;
            owl:unionOf ( actorODP:Actor <http://w3id.org/CEON/ontology/processODP/Process> :Item :Product ) ] ;
    rdfs:range :Compliance .

:hasGlobalTradeItemNumber a owl:DatatypeProperty ;
    rdfs:label "Global Trade Item Number (GTIN)" ;
    rdfs:range xsd:string ;
    rdfs:seeAlso "https://www.gs1.org/standards/id-keys/gtin" .

:hasProductComponent a owl:ObjectProperty ;
    rdfs:label "has product component" ;
    rdfs:comment "hasProductComponent intends to represent that a product can have other product components." ;
    rdfs:domain :Product ;
    rdfs:range :Product .

:hasProductName a owl:DatatypeProperty ;
    rdfs:label "product name" ;
    rdfs:comment "The name of a product." ;
    rdfs:range xsd:string .

:hasProductObjectComponent a owl:ObjectProperty ;
    rdfs:label "has product object component" ;
    rdfs:domain :Item ;
    rdfs:range :Item .

actorODP:Actor a owl:Class .

<http://w3id.org/CEON/ontology/processODP/Process> a owl:Class .

:ProductObjectComposition a owl:Class ;
    rdfs:label "Product Object Composition" ;
    rdfs:comment "A product object composition is the composed information of a product object in terms of a specific component, in which such a component is also a product object." ;
    rdfs:subClassOf [ a owl:Restriction ;
            owl:onClass :Item ;
            owl:onProperty :associatedWithProductObject ;
            owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ],
        :Composition .

:REACH a :Regulation,
        owl:NamedIndividual .

:RoHS a :Regulation,
        owl:NamedIndividual .

:Solution a owl:Class ;
    rdfs:label "Solution" ;
    rdfs:comment "Product or service, or a combination thereof, that fulfils a need of an interested party." ;
    rdfs:isDefinedBy "ISO 59004:2024 - 3.2.1 solution" .

:associatedWithMatter a owl:ObjectProperty ;
    rdfs:label "associated with matter" ;
    rdfs:comment "associatedWithMatter intends to represent the matter to which a matter compopsition information regards to." ;
    rdfs:domain :MatterComposition ;
    rdfs:range resourceODP:Matter .

:associatedWithProductModel a owl:ObjectProperty ;
    rdfs:label "associated with product model" ;
    rdfs:comment "associatedWithProductModel intends to represent the product model to which a product compopsition information regards to." ;
    rdfs:domain :ProductComposition ;
    rdfs:range :Product .

:associatedWithProductObject a owl:ObjectProperty ;
    rdfs:label "associated with product object" ;
    rdfs:comment "associatedWithProductObject intends to represent the item (product object) to which a product object compopsition information regards to." ;
    rdfs:domain :ProductObjectComposition ;
    rdfs:range :Item ;
    rdfs:subPropertyOf owl:topObjectProperty .

:batchOfProduct a owl:ObjectProperty ;
    rdfs:label "batch of products" ;
    rdfs:comment "batchOfProduct intends to represent what is the model product of a batch of objects." ;
    rdfs:domain resourceODP:BatchOfObjects ;
    rdfs:range :Product .

:countryOfAssembly a owl:DatatypeProperty ;
    rdfs:label "Country of assembly" ;
    rdfs:comment "Used to represent the country of assembly of a product or product object (item)." ;
    rdfs:domain :AssemblyLocation ;
    rdfs:range xsd:string ;
    rdfs:subPropertyOf <http://w3id.org/CEON/ontology/location/hasCountry> .

:countryOfManufacture a owl:DatatypeProperty ;
    rdfs:label "Country of manufacture" ;
    rdfs:comment "Used to represent the country of manufacture of a product or product object (item)." ;
    rdfs:domain :ManufactureLocation ;
    rdfs:range xsd:string ;
    rdfs:subPropertyOf <http://w3id.org/CEON/ontology/location/hasCountry> .

:countryOfOrigin a owl:DatatypeProperty ;
    rdfs:label "Country of origin" ;
    rdfs:comment "Used to represent the country of origin of a product or product object (item)." ;
    rdfs:domain :OriginLocation ;
    rdfs:range xsd:string ;
    rdfs:subPropertyOf <http://w3id.org/CEON/ontology/location/hasCountry> .

:countryOfProduction a owl:DatatypeProperty ;
    rdfs:label "Country of production" ;
    rdfs:comment "Used to represent the country of production of a product or product object (item)." ;
    rdfs:domain :ProductionLocation ;
    rdfs:range xsd:string ;
    rdfs:subPropertyOf <http://w3id.org/CEON/ontology/location/hasCountry> .

:hasAssemblyLocation a owl:ObjectProperty ;
    rdfs:label "has assembly location" ;
    rdfs:comment "Used to represent the location of assembly of a product or product object (item)." ;
    rdfs:domain [ a owl:Class ;
            owl:unionOf ( :Item :Product ) ] ;
    rdfs:range :AssemblyLocation ;
    rdfs:subPropertyOf <http://w3id.org/CEON/ontology/location/hasLocation> .

:hasManufacturerLocation a owl:ObjectProperty ;
    rdfs:label "has manufacture location" ;
    rdfs:comment "Used to represent the location of manufacturer of a product or product object (item)." ;
    rdfs:domain [ a owl:Class ;
            owl:unionOf ( :Item :Product ) ] ;
    rdfs:range :ManufactureLocation ;
    rdfs:subPropertyOf <http://w3id.org/CEON/ontology/location/hasLocation> .

:hasOriginLocation a owl:ObjectProperty ;
    rdfs:label "has origin location" ;
    rdfs:comment "Used to represent the location of origin of a product or product object (item)." ;
    rdfs:domain [ a owl:Class ;
            owl:unionOf ( :Item :Product ) ] ;
    rdfs:range :OriginLocation ;
    rdfs:subPropertyOf <http://w3id.org/CEON/ontology/location/hasLocation> .

:modelledBy a owl:ObjectProperty ;
    rdfs:label "modelled by" ;
    rdfs:comment "modelledBy intends to represent that product objects follow particular product models." ;
    rdfs:domain :Item ;
    rdfs:range :Product .

:productionSite a owl:DatatypeProperty ;
    rdfs:label "production site" ;
    rdfs:comment "The name of a production site location" ;
    rdfs:domain :ProductionLocation ;
    rdfs:range xsd:string .

resourceODP:BatchOfObjects a owl:Class ;
    rdfs:subClassOf [ a owl:Restriction ;
            owl:onClass :Product ;
            owl:onProperty :batchOfProduct ;
            owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ] .

:MatterComposition a owl:Class ;
    rdfs:label "Matter composition" ;
    rdfs:comment "A product composition is the composed information of a product in terms of a specific component, in which such a component is also a matter." ;
    rdfs:subClassOf [ a owl:Restriction ;
            owl:onClass resourceODP:Matter ;
            owl:onProperty :associatedWithMatter ;
            owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ],
        :Composition .

:ProductComposition a owl:Class ;
    rdfs:label "Product composition" ;
    rdfs:comment "A product composition is the composed information of a product in terms of a specific component, in which such a component is also a product." ;
    rdfs:subClassOf [ a owl:Restriction ;
            owl:onClass :Product ;
            owl:onProperty :associatedWithProductModel ;
            owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ],
        :Composition .

:ProductionLocation a owl:Class ;
    rdfs:label "Production Location" ;
    rdfs:comment "The production location of a physical object" ;
    rdfs:subClassOf [ a owl:Restriction ;
            owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ;
            owl:onDataRange xsd:string ;
            owl:onProperty <http://w3id.org/CEON/ontology/location/hasCity> ],
        [ a owl:Restriction ;
            owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ;
            owl:onDataRange xsd:string ;
            owl:onProperty <http://w3id.org/CEON/ontology/location/hasPostalCode> ],
        [ a owl:Restriction ;
            owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ;
            owl:onDataRange xsd:string ;
            owl:onProperty <http://w3id.org/CEON/ontology/location/hasStreetAddress> ],
        [ a owl:Restriction ;
            owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ;
            owl:onDataRange xsd:string ;
            owl:onProperty :countryOfProduction ],
        [ a owl:Restriction ;
            owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ;
            owl:onDataRange xsd:string ;
            owl:onProperty :productionSite ],
        <http://w3id.org/CEON/ontology/location/Location> .

:Regulation a owl:Class ;
    rdfs:label "Regulation" ;
    rdfs:comment "The rules or restrictions made or maintained by authorities." .

:complianceWith a owl:ObjectProperty ;
    rdfs:label "compliance with" ;
    rdfs:comment "Represents what the compliance is compliant with (e.g. a standard or regulation)." ;
    rdfs:domain :Compliance .

:hasComposition a owl:ObjectProperty ;
    rdfs:label "has composition" ;
    rdfs:comment "hasComposition intends to represent that a product model or physical object can have compostition information." ;
    rdfs:domain [ a owl:Class ;
            owl:unionOf ( :Product resourceODP:PhysicalObject ) ] ;
    rdfs:range :Composition .

resourceODP:PhysicalObject a owl:Class .

<http://w3id.org/CEON/ontology/location/hasLocation> a owl:ObjectProperty .

:AssemblyLocation a owl:Class ;
    rdfs:label "Assembly Location" ;
    rdfs:comment "The location where a physical object is assembled." ;
    rdfs:subClassOf [ a owl:Restriction ;
            owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ;
            owl:onDataRange xsd:string ;
            owl:onProperty <http://w3id.org/CEON/ontology/location/hasCity> ],
        [ a owl:Restriction ;
            owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ;
            owl:onDataRange xsd:string ;
            owl:onProperty <http://w3id.org/CEON/ontology/location/hasPostalCode> ],
        [ a owl:Restriction ;
            owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ;
            owl:onDataRange xsd:string ;
            owl:onProperty <http://w3id.org/CEON/ontology/location/hasStreetAddress> ],
        [ a owl:Restriction ;
            owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ;
            owl:onDataRange xsd:string ;
            owl:onProperty :countryOfAssembly ],
        <http://w3id.org/CEON/ontology/location/Location> .

:ManufactureLocation a owl:Class ;
    rdfs:label "Manufacture Location" ;
    rdfs:comment "The location where a physical object is manufactured." ;
    rdfs:subClassOf [ a owl:Restriction ;
            owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ;
            owl:onDataRange xsd:string ;
            owl:onProperty <http://w3id.org/CEON/ontology/location/hasCity> ],
        [ a owl:Restriction ;
            owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ;
            owl:onDataRange xsd:string ;
            owl:onProperty <http://w3id.org/CEON/ontology/location/hasPostalCode> ],
        [ a owl:Restriction ;
            owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ;
            owl:onDataRange xsd:string ;
            owl:onProperty <http://w3id.org/CEON/ontology/location/hasStreetAddress> ],
        [ a owl:Restriction ;
            owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ;
            owl:onDataRange xsd:string ;
            owl:onProperty :countryOfManufacture ],
        <http://w3id.org/CEON/ontology/location/Location> .

:OriginLocation a owl:Class ;
    rdfs:label "Origin Location" ;
    rdfs:comment "The origin location of a physical object" ;
    rdfs:subClassOf [ a owl:Restriction ;
            owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ;
            owl:onDataRange xsd:string ;
            owl:onProperty <http://w3id.org/CEON/ontology/location/hasCity> ],
        [ a owl:Restriction ;
            owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ;
            owl:onDataRange xsd:string ;
            owl:onProperty <http://w3id.org/CEON/ontology/location/hasPostalCode> ],
        [ a owl:Restriction ;
            owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ;
            owl:onDataRange xsd:string ;
            owl:onProperty <http://w3id.org/CEON/ontology/location/hasStreetAddress> ],
        [ a owl:Restriction ;
            owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ;
            owl:onDataRange xsd:string ;
            owl:onProperty :countryOfOrigin ],
        <http://w3id.org/CEON/ontology/location/Location> .

resourceODP:Matter a owl:Class .

<http://w3id.org/CEON/ontology/location/hasCity> a owl:DatatypeProperty ;
    rdfs:subPropertyOf owl:topDataProperty .

<http://w3id.org/CEON/ontology/location/hasCountry> a owl:DatatypeProperty .

<http://w3id.org/CEON/ontology/location/hasPostalCode> a owl:DatatypeProperty ;
    rdfs:subPropertyOf owl:topDataProperty .

<http://w3id.org/CEON/ontology/location/hasStreetAddress> a owl:DatatypeProperty ;
    rdfs:subPropertyOf owl:topDataProperty .

<http://w3id.org/CEON/ontology/location/Location> a owl:Class .

:Compliance a owl:Class ;
    rdfs:label "Compliance" ;
    rdfs:comment "Represents that something is compliant with some standard or has a received a certain certification." .

:Composition a owl:Class ;
    rdfs:label "Composition" ;
    rdfs:comment "A relation that represents a composing relation." ;
    rdfs:subClassOf actorODP:ResourceParticipation .

:Item a owl:Class ;
    rdfs:label "Item" ;
    rdfs:comment "An item is a physical object put into a market for sale, i.e. corresponding to an individual of a product. The item can be a thing that grows naturally or produced through some chemical or manufacturing processes." ;
    rdfs:subClassOf [ a owl:Restriction ;
            owl:onClass :Product ;
            owl:onProperty :modelledBy ;
            owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ],
        resourceODP:PhysicalObject .

:Product a owl:Class ;
    rdfs:label "Product" ;
    rdfs:comment "Physical-based object designed for or utilized with a purpose. A product can be, for example: goods of any type; hardware (e.g. engine mechanical part, spare parts, consumables); electrical or electronic hardware devices or components (e.g. computers, communication equipment and sensors); processed materials (e.g. lubricant, cement).",
        "Represents the common sense notion of a product, i.e. the abstract notion of a product type, which is a model that is used for manufacturing items of that product." ;
    rdfs:isDefinedBy "ISO 59004:2024 -3.2.2 product" ;
    rdfs:subClassOf [ a owl:Restriction ;
            owl:onProperty :hasComposition ;
            owl:someValuesFrom :MatterComposition ],
        [ a owl:Restriction ;
            owl:onProperty :hasComposition ;
            owl:someValuesFrom :ProductComposition ],
        [ a owl:Restriction ;
            owl:allValuesFrom :AssemblyLocation ;
            owl:onProperty :hasAssemblyLocation ],
        [ a owl:Restriction ;
            owl:allValuesFrom :ManufactureLocation ;
            owl:onProperty :hasManufacturerLocation ],
        [ a owl:Restriction ;
            owl:allValuesFrom :OriginLocation ;
            owl:onProperty :hasOriginLocation ],
        :Solution,
        resourceODP:Resource .

