@prefix sh:     <http://www.w3.org/ns/shacl#> .
@prefix xsd:    <http://www.w3.org/2001/XMLSchema#> .
@prefix rdfs:   <http://www.w3.org/2000/01/rdf-schema#> .
@prefix owl:    <http://www.w3.org/2002/07/owl#> .
@prefix dcterms: <http://purl.org/dc/terms/> .
@prefix dpp:    <https://www.dpp-interoperability.wiki/vocab/v1/dpp#> .
@prefix lcaef:  <https://www.dpp-interoperability.wiki/vocab/v1/lca-ef#> .
@prefix qudt:   <http://qudt.org/schema/qudt/> .


<https://www.dpp-interoperability.wiki/vocab/v1/lca-ef.shacl>
    a owl:Ontology ;
    rdfs:label "LCA-EF Extension SHACL Shapes" ;
    rdfs:comment "SHACL validation shapes for the DPP LCA/Environmental Footprint Extension vocabulary v0.3. Covers carbon footprint, lifecycle stages, impact categories, methodology, data quality, circularity metrics, and water footprint." ;
    owl:versionInfo "0.3" ;
    dcterms:created "2026-03-05"^^xsd:date ;
    rdfs:seeAlso <https://www.dpp-interoperability.wiki/vocab/v1/lca-ef#> .

lcaef:LcaEfExtensionShape
    a sh:NodeShape ;
    sh:targetClass lcaef:LcaEfExtension ;
    rdfs:label "LCA-EF Extension shape" ;
    sh:property [
        sh:path lcaef:carbonFootprint ;
        sh:class lcaef:CarbonFootprint ;
        sh:minCount 1 ;
        sh:name "carbonFootprint" ;
    ] ;
    sh:property [
        sh:path lcaef:impactCategories ;
        sh:class lcaef:ImpactCategory ;
        sh:name "impactCategories" ;
    ] ;
    sh:property [
        sh:path lcaef:methodology ;
        sh:class lcaef:Methodology ;
        sh:maxCount 1 ;
        sh:name "methodology" ;
    ] ;
    sh:property [
        sh:path lcaef:dataQuality ;
        sh:class lcaef:DataQuality ;
        sh:maxCount 1 ;
        sh:name "dataQuality" ;
    ] ;
    sh:property [
        sh:path lcaef:circularityMetrics ;
        sh:class lcaef:CircularityMetrics ;
        sh:maxCount 1 ;
        sh:name "circularityMetrics" ;
    ] ;
    sh:property [
        sh:path lcaef:waterFootprint ;
        sh:class lcaef:WaterFootprint ;
        sh:maxCount 1 ;
        sh:name "waterFootprint" ;
    ] ;
    sh:property [
        sh:path lcaef:performedBy ;
        sh:class lcaef:Performer ;
        sh:maxCount 1 ;
        sh:name "performedBy" ;
    ] ;
    sh:property [
        sh:path lcaef:reviewedBy ;
        sh:class lcaef:Reviewer ;
        sh:maxCount 1 ;
        sh:name "reviewedBy" ;
    ] ;
    sh:property [
        sh:path lcaef:reportLink ;
        sh:datatype xsd:anyURI ;
        sh:maxCount 1 ;
        sh:name "reportLink" ;
    ] .

lcaef:CarbonFootprintShape
    a sh:NodeShape ;
    sh:targetClass lcaef:CarbonFootprint ;
    rdfs:label "Carbon Footprint shape" ;
    sh:property [
        sh:path lcaef:totalCarbonFootprint ;
        sh:datatype xsd:double ;
        sh:minInclusive 0.0 ;
        sh:maxCount 1 ;
        sh:name "totalCarbonFootprint" ;
    ] ;
    sh:property [
        sh:path lcaef:carbonFootprintUnit ;
        sh:datatype xsd:string ;
        sh:maxCount 1 ;
        sh:name "carbonFootprintUnit" ;
    ] ;
    sh:property [
        sh:path lcaef:functionalUnit ;
        sh:datatype xsd:string ;
        sh:maxCount 1 ;
        sh:name "functionalUnit" ;
    ] ;
    sh:property [
        sh:path lcaef:lifecycleStages ;
        sh:class lcaef:LifecycleStage ;
        sh:name "lifecycleStages" ;
    ] .

lcaef:LifecycleStageShape
    a sh:NodeShape ;
    sh:targetClass lcaef:LifecycleStage ;
    rdfs:label "Lifecycle Stage shape" ;
    sh:property [
        sh:path lcaef:stageName ;
        sh:datatype xsd:string ;
        sh:maxCount 1 ;
        sh:name "stageName" ;
    ] ;
    sh:property [
        sh:path lcaef:stageImpact ;
        sh:datatype xsd:double ;
        sh:maxCount 1 ;
        sh:name "stageImpact" ;
    ] ;
    sh:property [
        sh:path lcaef:usePhaseAssumptions ;
        sh:datatype xsd:string ;
        sh:maxCount 1 ;
        sh:name "usePhaseAssumptions" ;
    ] ;
    sh:property [
        sh:path lcaef:endOfLifeScenarios ;
        sh:datatype xsd:string ;
        sh:maxCount 1 ;
        sh:name "endOfLifeScenarios" ;
    ] .

lcaef:ImpactCategoryShape
    a sh:NodeShape ;
    sh:targetClass lcaef:ImpactCategory ;
    rdfs:label "Impact Category shape" ;
    sh:property [
        sh:path lcaef:categoryName ;
        sh:datatype xsd:string ;
        sh:maxCount 1 ;
        sh:name "categoryName" ;
    ] ;
    sh:property [
        sh:path lcaef:characterisationModel ;
        sh:datatype xsd:string ;
        sh:maxCount 1 ;
        sh:name "characterisationModel" ;
    ] ;
    sh:property [
        sh:path lcaef:indicators ;
        sh:class lcaef:ImpactIndicator ;
        sh:name "indicators" ;
    ] .

lcaef:ImpactIndicatorShape
    a sh:NodeShape ;
    sh:targetClass lcaef:ImpactIndicator ;
    rdfs:label "Impact Indicator shape" ;
    sh:property [
        sh:path lcaef:indicatorName ;
        sh:datatype xsd:string ;
        sh:maxCount 1 ;
        sh:name "indicatorName" ;
    ] ;
    sh:property [
        sh:path lcaef:unit ;
        sh:datatype xsd:string ;
        sh:maxCount 1 ;
        sh:name "unit" ;
    ] ;
    sh:property [
        sh:path lcaef:indicatorValue ;
        sh:class qudt:QuantityValue ;
        sh:maxCount 1 ;
        sh:name "indicatorValue" ;
    ] .

lcaef:MethodologyShape
    a sh:NodeShape ;
    sh:targetClass lcaef:Methodology ;
    rdfs:label "Methodology shape" ;
    sh:property [
        sh:path lcaef:standard ;
        sh:datatype xsd:string ;
        sh:maxCount 1 ;
        sh:name "standard" ;
    ] ;
    sh:property [
        sh:path lcaef:systemBoundary ;
        sh:datatype xsd:string ;
        sh:maxCount 1 ;
        sh:name "systemBoundary" ;
    ] ;
    sh:property [
        sh:path lcaef:allocationMethod ;
        sh:datatype xsd:string ;
        sh:maxCount 1 ;
        sh:name "allocationMethod" ;
    ] ;
    sh:property [
        sh:path lcaef:cutOffCriteria ;
        sh:datatype xsd:string ;
        sh:maxCount 1 ;
        sh:name "cutOffCriteria" ;
    ] .

lcaef:DataQualityShape
    a sh:NodeShape ;
    sh:targetClass lcaef:DataQuality ;
    rdfs:label "Data Quality shape" ;
    sh:property [
        sh:path lcaef:temporalCoverage ;
        sh:datatype xsd:string ;
        sh:maxCount 1 ;
        sh:name "temporalCoverage" ;
    ] ;
    sh:property [
        sh:path lcaef:geographicalCoverage ;
        sh:datatype xsd:string ;
        sh:maxCount 1 ;
        sh:name "geographicalCoverage" ;
    ] ;
    sh:property [
        sh:path lcaef:technologyCoverage ;
        sh:datatype xsd:string ;
        sh:maxCount 1 ;
        sh:name "technologyCoverage" ;
    ] ;
    sh:property [
        sh:path lcaef:primaryDataPercentage ;
        sh:datatype xsd:double ;
        sh:minInclusive 0.0 ;
        sh:maxInclusive 100.0 ;
        sh:maxCount 1 ;
        sh:name "primaryDataPercentage" ;
    ] .

lcaef:CircularityMetricsShape
    a sh:NodeShape ;
    sh:targetClass lcaef:CircularityMetrics ;
    rdfs:label "Circularity Metrics shape" ;
    sh:property [
        sh:path lcaef:recyclabilityRate ;
        sh:datatype xsd:double ;
        sh:minInclusive 0.0 ;
        sh:maxInclusive 100.0 ;
        sh:maxCount 1 ;
        sh:name "recyclabilityRate" ;
    ] ;
    sh:property [
        sh:path lcaef:recycledContentRate ;
        sh:datatype xsd:double ;
        sh:minInclusive 0.0 ;
        sh:maxInclusive 100.0 ;
        sh:maxCount 1 ;
        sh:name "recycledContentRate" ;
    ] ;
    sh:property [
        sh:path lcaef:repairabilityScore ;
        sh:datatype xsd:double ;
        sh:minInclusive 0.0 ;
        sh:maxCount 1 ;
        sh:name "repairabilityScore" ;
    ] ;
    sh:property [
        sh:path lcaef:materialCircularityIndicator ;
        sh:datatype xsd:double ;
        sh:minInclusive 0.0 ;
        sh:maxInclusive 1.0 ;
        sh:maxCount 1 ;
        sh:name "materialCircularityIndicator" ;
    ] ;
    sh:property [
        sh:path lcaef:durabilityIndicator ;
        sh:datatype xsd:string ;
        sh:maxCount 1 ;
        sh:name "durabilityIndicator" ;
    ] .

lcaef:WaterFootprintShape
    a sh:NodeShape ;
    sh:targetClass lcaef:WaterFootprint ;
    rdfs:label "Water Footprint shape" ;
    sh:property [
        sh:path lcaef:blueWater ;
        sh:datatype xsd:double ;
        sh:minInclusive 0.0 ;
        sh:maxCount 1 ;
        sh:name "blueWater" ;
    ] ;
    sh:property [
        sh:path lcaef:greenWater ;
        sh:datatype xsd:double ;
        sh:minInclusive 0.0 ;
        sh:maxCount 1 ;
        sh:name "greenWater" ;
    ] ;
    sh:property [
        sh:path lcaef:greyWater ;
        sh:datatype xsd:double ;
        sh:minInclusive 0.0 ;
        sh:maxCount 1 ;
        sh:name "greyWater" ;
    ] .

lcaef:PerformerShape
    a sh:NodeShape ;
    sh:targetClass lcaef:Performer ;
    rdfs:label "Performer shape" ;
    sh:property [
        sh:path lcaef:performingOrganization ;
        sh:datatype xsd:string ;
        sh:maxCount 1 ;
        sh:name "performingOrganization" ;
    ] ;
    sh:property [
        sh:path lcaef:contactInfo ;
        sh:datatype xsd:string ;
        sh:maxCount 1 ;
        sh:name "contactInfo" ;
    ] ;
    sh:property [
        sh:path lcaef:accreditation ;
        sh:datatype xsd:string ;
        sh:maxCount 1 ;
        sh:name "accreditation" ;
    ] ;
    sh:property [
        sh:path lcaef:performedDate ;
        sh:datatype xsd:date ;
        sh:maxCount 1 ;
        sh:name "performedDate" ;
    ] .

lcaef:ReviewerShape
    a sh:NodeShape ;
    sh:targetClass lcaef:Reviewer ;
    rdfs:label "Reviewer shape" ;
    sh:property [
        sh:path lcaef:reviewer ;
        sh:datatype xsd:string ;
        sh:maxCount 1 ;
        sh:name "reviewer" ;
    ] ;
    sh:property [
        sh:path lcaef:reviewDate ;
        sh:datatype xsd:date ;
        sh:maxCount 1 ;
        sh:name "reviewDate" ;
    ] ;
    sh:property [
        sh:path lcaef:reviewType ;
        sh:datatype xsd:string ;
        sh:maxCount 1 ;
        sh:name "reviewType" ;
    ] .


