diff --git a/pvcollada_onto.ttl b/pvcollada_onto.ttl
new file mode 100644
index 0000000..8c2c44a
--- /dev/null
+++ b/pvcollada_onto.ttl
@@ -0,0 +1,1710 @@
+###############################################################################
+# PV-Collada Ontology — pvcollada_onto.ttl
+# Derived from: pvcollada_schema_2.0.xsd + pvcollada_business_2.0.sch
+# pvcollada_references_2.0.sch
+#
+# Conforms to:
+# OWL 2 Web Ontology Language (W3C, Second Edition)
+# MDS-Onto FindTheDocs conventions https://cwrusdle.bitbucket.io/
+#
+# Namespace: pvc:
+# Domain: mds:builtenv
+# Sub-domain: pvcollada
+#
+# MDS-Onto reconciliation (v0.3.1.31):
+# Class hierarchy bridges:
+# pvc:Module rdfs:subClassOf mds:PhotovoltaicModule
+# pvc:Inverter rdfs:subClassOf mds:Inverter
+# pvc:Rack rdfs:subClassOf mds:Racking
+# pvc:Project rdfs:subClassOf mds:PhotovoltaicSite
+# Enumeration close-matches:
+# pvc:CellArchitecture skos:closeMatch mds:CellTechnology / mds:CellTechnologyType
+# pvc:RackType skos:closeMatch mds:RackingType
+# Named individual:
+# pvc:PERC skos:exactMatch mds:PassivatedEmitterRearCell
+# Data property links (rdfs:seeAlso → MDS measurement class):
+# pvc:nomPower / iSc / iMpp / vOc / vMpp / tCoefPower / tCoefIsc /
+# tCoefVoc / numCells / numCellsSeries / numStrings / manufacturer
+###############################################################################
+
+@prefix : .
+@prefix pvc: .
+@prefix mds: .
+@prefix owl: .
+@prefix rdf: .
+@prefix xml: .
+@prefix xsd: .
+@prefix rdfs: .
+@prefix skos: .
+@prefix qudt: .
+@prefix unit: .
+@prefix prov: .
+@prefix cco: .
+
+
+###############################################################################
+# O N T O L O G Y H E A D E R
+###############################################################################
+
+
+ a owl:Ontology ;
+ owl:versionIRI ;
+ owl:imports ;
+ rdfs:label "PV-Collada Ontology"@en ;
+ skos:definition
+ """OWL 2 ontology derived from the PV-Collada 2.0 XSD schema. Provides vocabulary for PV system circuit topology, physical layout geometry, and component product data, within the MDS-Onto builtenv domain."""@en ;
+ skos:scopeNote
+ """Covers three interlocking layers: (1) a product library of typed PV components (modules, inverters, cables, etc.); (2) a circuit topology describing how those components are wired together; and (3) a physical 3-D layout associating circuit positions with geometric rack instances. ModuleLayout is the cross-domain bridge between layers 2 and 3."""@en ;
+ rdfs:seeAlso ;
+ cco:ont00001754 "https://github.com/ucf-photovoltaics/pv-ontology"^^xsd:anyURI .
+
+
+###############################################################################
+# A B S T R A C T P A R E N T C L A S S E S
+###############################################################################
+
+pvc:PVColladaEntity
+ a owl:Class ;
+ rdfs:label "PV-Collada Entity"@en ;
+ skos:definition
+ "Abstract root class for all entities described in the PV-Collada schema."@en ;
+ mds:hasDomain "builtenv"^^xsd:string ;
+ mds:hasSubDomain "pvcollada"^^xsd:string .
+
+pvc:PVComponent
+ a owl:Class ;
+ rdfs:subClassOf pvc:PVColladaEntity ;
+ rdfs:label "PV Component"@en ;
+ skos:definition
+ """A typed product specification for a physical PV balance-of-system component, as declared in the PV-Collada components library."""@en ;
+ mds:hasDomain "builtenv"^^xsd:string ;
+ mds:hasSubDomain "pvcollada"^^xsd:string ;
+ mds:hasStudyStage "Characterization"^^xsd:string .
+
+pvc:CircuitInstance
+ a owl:Class ;
+ rdfs:subClassOf pvc:PVColladaEntity ;
+ rdfs:label "Circuit Instance"@en ;
+ skos:definition
+ """An instantiated element in the electrical circuit topology of a PV system, referencing a PVComponent product specification."""@en ;
+ mds:hasDomain "builtenv"^^xsd:string ;
+ mds:hasSubDomain "pvcollada"^^xsd:string ;
+ mds:hasStudyStage "Simulation"^^xsd:string .
+
+pvc:PhysicalAsset
+ a owl:Class ;
+ rdfs:subClassOf pvc:PVColladaEntity ;
+ rdfs:label "Physical Asset"@en ;
+ skos:definition
+ """A physical or geometric object in the 3-D layout of a PV installation, represented in the COLLADA scene graph."""@en ;
+ mds:hasDomain "builtenv"^^xsd:string ;
+ mds:hasSubDomain "pvcollada"^^xsd:string ;
+ mds:hasStudyStage "Simulation"^^xsd:string .
+
+
+###############################################################################
+# E N U M E R A T I O N C L A S S E S & N A M E D I N D I V I D U A L S
+#
+# XSD simpleType restrictions are modelled as owl:Class + owl:oneOf individuals.
+###############################################################################
+
+# ── CellMaterial ─────────────────────────────────────────────────────────────
+
+pvc:CellMaterial
+ a owl:Class ;
+ rdfs:subClassOf pvc:PVColladaEntity ;
+ rdfs:label "Cell Material"@en ;
+ skos:definition
+ "Enumeration of absorber semiconductor materials used in PV cells."@en ;
+ owl:equivalentClass [ a owl:Class ;
+ owl:oneOf ( pvc:MonoSi pvc:PolySi pvc:ASi pvc:CdTe ) ] ;
+ mds:hasDomain "builtenv"^^xsd:string ;
+ mds:hasSubDomain "pvcollada"^^xsd:string ;
+ mds:hasStudyStage "Characterization"^^xsd:string .
+
+pvc:MonoSi a owl:NamedIndividual , pvc:CellMaterial ;
+ rdfs:label "monocrystalline silicon"@en ;
+ skos:altLabel "monoSi"@en .
+
+pvc:PolySi a owl:NamedIndividual , pvc:CellMaterial ;
+ rdfs:label "polycrystalline silicon"@en ;
+ skos:altLabel "polySi"@en .
+
+pvc:ASi a owl:NamedIndividual , pvc:CellMaterial ;
+ rdfs:label "amorphous silicon"@en ;
+ skos:altLabel "aSi"@en .
+
+pvc:CdTe a owl:NamedIndividual , pvc:CellMaterial ;
+ rdfs:label "cadmium telluride"@en ;
+ skos:altLabel "cdTe"@en .
+
+# ── CellArchitecture ─────────────────────────────────────────────────────────
+
+pvc:CellArchitecture
+ a owl:Class ;
+ rdfs:subClassOf pvc:PVColladaEntity ;
+ rdfs:label "Cell Architecture"@en ;
+ skos:definition
+ "Enumeration of cell junction or contact architectures used in PV modules."@en ;
+ skos:closeMatch mds:CellTechnology , mds:CellTechnologyType ;
+ owl:equivalentClass [ a owl:Class ;
+ owl:oneOf ( pvc:SingleJunction pvc:Heterojunction pvc:IBC
+ pvc:PERC pvc:TOPcon pvc:TandemPerovskite ) ] ;
+ mds:hasDomain "builtenv"^^xsd:string ;
+ mds:hasSubDomain "pvcollada"^^xsd:string ;
+ mds:hasStudyStage "Characterization"^^xsd:string .
+
+pvc:SingleJunction a owl:NamedIndividual , pvc:CellArchitecture ;
+ rdfs:label "single junction"@en ; skos:altLabel "single_junction"@en .
+pvc:Heterojunction a owl:NamedIndividual , pvc:CellArchitecture ;
+ rdfs:label "heterojunction"@en .
+pvc:IBC a owl:NamedIndividual , pvc:CellArchitecture ;
+ rdfs:label "interdigitated back contact"@en ; skos:altLabel "IBC"@en .
+pvc:PERC a owl:NamedIndividual , pvc:CellArchitecture ;
+ rdfs:label "passivated emitter and rear cell"@en ; skos:altLabel "PERC"@en ;
+ skos:exactMatch mds:PassivatedEmitterRearCell .
+pvc:TOPcon a owl:NamedIndividual , pvc:CellArchitecture ;
+ rdfs:label "tunnel oxide passivated contact"@en ; skos:altLabel "TOPcon"@en .
+pvc:TandemPerovskite a owl:NamedIndividual , pvc:CellArchitecture ;
+ rdfs:label "tandem perovskite"@en ; skos:altLabel "tandem-perovskite"@en .
+
+# ── ModuleType ───────────────────────────────────────────────────────────────
+
+pvc:ModuleType
+ a owl:Class ;
+ rdfs:subClassOf pvc:PVColladaEntity ;
+ rdfs:label "Module Type"@en ;
+ skos:definition "Enumeration of PV module form-factor types."@en ;
+ owl:equivalentClass [ a owl:Class ;
+ owl:oneOf ( pvc:Monofacial pvc:Bifacial pvc:CPV pvc:Shingle ) ] ;
+ mds:hasDomain "builtenv"^^xsd:string ; mds:hasSubDomain "pvcollada"^^xsd:string .
+
+pvc:Monofacial a owl:NamedIndividual , pvc:ModuleType ;
+ rdfs:label "monofacial module"@en ; skos:altLabel "monofacial"@en .
+pvc:Bifacial a owl:NamedIndividual , pvc:ModuleType ;
+ rdfs:label "bifacial module"@en ; skos:altLabel "bifacial"@en .
+pvc:CPV a owl:NamedIndividual , pvc:ModuleType ;
+ rdfs:label "concentrating photovoltaic module"@en ; skos:altLabel "cpv"@en .
+pvc:Shingle a owl:NamedIndividual , pvc:ModuleType ;
+ rdfs:label "shingle module"@en ; skos:altLabel "shingle"@en .
+
+# ── InverterType ─────────────────────────────────────────────────────────────
+
+pvc:InverterType
+ a owl:Class ;
+ rdfs:subClassOf pvc:PVColladaEntity ;
+ rdfs:label "Inverter Type"@en ;
+ skos:definition "Enumeration of PV inverter deployment topologies."@en ;
+ owl:equivalentClass [ a owl:Class ;
+ owl:oneOf ( pvc:CentralInverter pvc:StringInverter pvc:Microinverter ) ] ;
+ mds:hasDomain "builtenv"^^xsd:string ; mds:hasSubDomain "pvcollada"^^xsd:string .
+
+pvc:CentralInverter a owl:NamedIndividual , pvc:InverterType ;
+ rdfs:label "central inverter"@en ; skos:altLabel "central"@en .
+pvc:StringInverter a owl:NamedIndividual , pvc:InverterType ;
+ rdfs:label "string inverter"@en ; skos:altLabel "string"@en .
+pvc:Microinverter a owl:NamedIndividual , pvc:InverterType ;
+ rdfs:label "microinverter"@en .
+
+# ── RackType ─────────────────────────────────────────────────────────────────
+
+pvc:RackType
+ a owl:Class ;
+ rdfs:subClassOf pvc:PVColladaEntity ;
+ rdfs:label "Rack Type"@en ;
+ skos:definition "Enumeration of rack mounting strategies."@en ;
+ skos:closeMatch mds:RackingType ;
+ owl:equivalentClass [ a owl:Class ;
+ owl:oneOf ( pvc:FixedTilt pvc:TrackerRackType ) ] ;
+ mds:hasDomain "builtenv"^^xsd:string ; mds:hasSubDomain "pvcollada"^^xsd:string .
+
+pvc:FixedTilt a owl:NamedIndividual , pvc:RackType ;
+ rdfs:label "fixed tilt"@en ; skos:altLabel "fixed_tilt"@en .
+pvc:TrackerRackType a owl:NamedIndividual , pvc:RackType ;
+ rdfs:label "tracker rack"@en ; skos:altLabel "tracker"@en .
+
+# ── TableType ────────────────────────────────────────────────────────────────
+
+pvc:TableType
+ a owl:Class ;
+ rdfs:subClassOf pvc:PVColladaEntity ;
+ rdfs:label "Table Type"@en ;
+ skos:definition "Enumeration of table mounting types."@en ;
+ owl:equivalentClass [ a owl:Class ;
+ owl:oneOf ( pvc:FixedTable pvc:TrackerTable ) ] ;
+ mds:hasDomain "builtenv"^^xsd:string ; mds:hasSubDomain "pvcollada"^^xsd:string .
+
+pvc:FixedTable a owl:NamedIndividual , pvc:TableType ;
+ rdfs:label "fixed table"@en ; skos:altLabel "fixed"@en .
+pvc:TrackerTable a owl:NamedIndividual , pvc:TableType ;
+ rdfs:label "tracker table"@en ; skos:altLabel "tracker"@en .
+
+# ── TrackerType ──────────────────────────────────────────────────────────────
+
+pvc:TrackerType
+ a owl:Class ;
+ rdfs:subClassOf pvc:PVColladaEntity ;
+ rdfs:label "Tracker Type"@en ;
+ skos:definition "Enumeration of solar tracker axis configurations."@en ;
+ owl:equivalentClass [ a owl:Class ;
+ owl:oneOf ( pvc:SingleAxisTracker pvc:DualAxisTracker ) ] ;
+ mds:hasDomain "builtenv"^^xsd:string ; mds:hasSubDomain "pvcollada"^^xsd:string .
+
+pvc:SingleAxisTracker a owl:NamedIndividual , pvc:TrackerType ;
+ rdfs:label "single axis tracker"@en ; skos:altLabel "single_axis"@en .
+pvc:DualAxisTracker a owl:NamedIndividual , pvc:TrackerType ;
+ rdfs:label "dual axis tracker"@en ; skos:altLabel "dual_axis"@en .
+
+# ── TorqueTubeShape ──────────────────────────────────────────────────────────
+
+pvc:TorqueTubeShape
+ a owl:Class ;
+ rdfs:subClassOf pvc:PVColladaEntity ;
+ rdfs:label "Torque Tube Shape"@en ;
+ skos:definition
+ "Enumeration of cross-sectional shapes for a single-axis tracker torque tube."@en ;
+ owl:equivalentClass [ a owl:Class ;
+ owl:oneOf ( pvc:CircularTube pvc:RectangularTube pvc:OctagonalTube ) ] ;
+ mds:hasDomain "builtenv"^^xsd:string ; mds:hasSubDomain "pvcollada"^^xsd:string .
+
+pvc:CircularTube a owl:NamedIndividual , pvc:TorqueTubeShape ;
+ rdfs:label "circular torque tube"@en ; skos:altLabel "circle"@en .
+pvc:RectangularTube a owl:NamedIndividual , pvc:TorqueTubeShape ;
+ rdfs:label "rectangular torque tube"@en ; skos:altLabel "rectangle"@en .
+pvc:OctagonalTube a owl:NamedIndividual , pvc:TorqueTubeShape ;
+ rdfs:label "octagonal torque tube"@en ; skos:altLabel "octogon"@en .
+
+# ── DriveType ────────────────────────────────────────────────────────────────
+
+pvc:DriveType
+ a owl:Class ;
+ rdfs:subClassOf pvc:PVColladaEntity ;
+ rdfs:label "Drive Type"@en ;
+ skos:definition
+ "Enumeration of drive coupling configurations for single-axis trackers."@en ;
+ owl:equivalentClass [ a owl:Class ;
+ owl:oneOf ( pvc:IndependentDrive pvc:LinkedDrive ) ] ;
+ mds:hasDomain "builtenv"^^xsd:string ; mds:hasSubDomain "pvcollada"^^xsd:string .
+
+pvc:IndependentDrive a owl:NamedIndividual , pvc:DriveType ;
+ rdfs:label "independent drive"@en ; skos:altLabel "independent"@en .
+pvc:LinkedDrive a owl:NamedIndividual , pvc:DriveType ;
+ rdfs:label "linked drive"@en ; skos:altLabel "linked"@en .
+
+# ── PostType ─────────────────────────────────────────────────────────────────
+
+pvc:PostType
+ a owl:Class ;
+ rdfs:subClassOf pvc:PVColladaEntity ;
+ rdfs:label "Post Type"@en ;
+ skos:definition "Enumeration of structural post functions."@en ;
+ owl:equivalentClass [ a owl:Class ;
+ owl:oneOf ( pvc:RackPost pvc:TrackerPost pvc:FencePost ) ] ;
+ mds:hasDomain "builtenv"^^xsd:string ; mds:hasSubDomain "pvcollada"^^xsd:string .
+
+pvc:RackPost a owl:NamedIndividual , pvc:PostType ;
+ rdfs:label "rack post"@en ; skos:altLabel "rack"@en .
+pvc:TrackerPost a owl:NamedIndividual , pvc:PostType ;
+ rdfs:label "tracker post"@en ; skos:altLabel "tracker"@en .
+pvc:FencePost a owl:NamedIndividual , pvc:PostType ;
+ rdfs:label "fence post"@en ; skos:altLabel "fence"@en .
+
+# ── PostShape ────────────────────────────────────────────────────────────────
+
+pvc:PostShape
+ a owl:Class ;
+ rdfs:subClassOf pvc:PVColladaEntity ;
+ rdfs:label "Post Shape"@en ;
+ skos:definition "Enumeration of structural post cross-section shapes."@en ;
+ owl:equivalentClass [ a owl:Class ;
+ owl:oneOf ( pvc:RectangularPost pvc:CircularPost pvc:HShapePost ) ] ;
+ mds:hasDomain "builtenv"^^xsd:string ; mds:hasSubDomain "pvcollada"^^xsd:string .
+
+pvc:RectangularPost a owl:NamedIndividual , pvc:PostShape ;
+ rdfs:label "rectangular post"@en ; skos:altLabel "rectangle"@en .
+pvc:CircularPost a owl:NamedIndividual , pvc:PostShape ;
+ rdfs:label "circular post"@en ; skos:altLabel "circle"@en .
+pvc:HShapePost a owl:NamedIndividual , pvc:PostShape ;
+ rdfs:label "H-shape post"@en ; skos:altLabel "h-shape"@en .
+
+# ── PostInclination ──────────────────────────────────────────────────────────
+
+pvc:PostInclination
+ a owl:Class ;
+ rdfs:subClassOf pvc:PVColladaEntity ;
+ rdfs:label "Post Inclination"@en ;
+ skos:definition "Enumeration of post installation inclination modes."@en ;
+ owl:equivalentClass [ a owl:Class ;
+ owl:oneOf ( pvc:VerticalPost pvc:PerpendicularPost ) ] ;
+ mds:hasDomain "builtenv"^^xsd:string ; mds:hasSubDomain "pvcollada"^^xsd:string .
+
+pvc:VerticalPost a owl:NamedIndividual , pvc:PostInclination ;
+ rdfs:label "vertical post"@en ; skos:altLabel "vertical"@en .
+pvc:PerpendicularPost a owl:NamedIndividual , pvc:PostInclination ;
+ rdfs:label "perpendicular post"@en ; skos:altLabel "perpendicular"@en .
+
+# ── GapType ──────────────────────────────────────────────────────────────────
+
+pvc:GapType
+ a owl:Class ;
+ rdfs:subClassOf pvc:PVColladaEntity ;
+ rdfs:label "Gap Type"@en ;
+ skos:definition
+ "Enumeration of gap categories between racks on a tracker torque tube."@en ;
+ owl:equivalentClass [ a owl:Class ;
+ owl:oneOf ( pvc:MotorGap pvc:JointGap ) ] ;
+ mds:hasDomain "builtenv"^^xsd:string ; mds:hasSubDomain "pvcollada"^^xsd:string .
+
+pvc:MotorGap a owl:NamedIndividual , pvc:GapType ;
+ rdfs:label "motor gap"@en ; skos:altLabel "motor"@en .
+pvc:JointGap a owl:NamedIndividual , pvc:GapType ;
+ rdfs:label "joint gap"@en ; skos:altLabel "joint"@en .
+
+# ── ModuleOrientation ────────────────────────────────────────────────────────
+
+pvc:ModuleOrientation
+ a owl:Class ;
+ rdfs:subClassOf pvc:PVColladaEntity ;
+ rdfs:label "Module Orientation"@en ;
+ skos:definition "Enumeration of module mounting orientations on a rack."@en ;
+ owl:equivalentClass [ a owl:Class ;
+ owl:oneOf ( pvc:Portrait pvc:Landscape ) ] ;
+ mds:hasDomain "builtenv"^^xsd:string ; mds:hasSubDomain "pvcollada"^^xsd:string .
+
+pvc:Portrait a owl:NamedIndividual , pvc:ModuleOrientation ;
+ rdfs:label "portrait orientation"@en ; skos:altLabel "portrait"@en .
+pvc:Landscape a owl:NamedIndividual , pvc:ModuleOrientation ;
+ rdfs:label "landscape orientation"@en ; skos:altLabel "landscape"@en .
+
+# ── ConductorMaterial ────────────────────────────────────────────────────────
+
+pvc:ConductorMaterial
+ a owl:Class ;
+ rdfs:subClassOf pvc:PVColladaEntity ;
+ rdfs:label "Conductor Material"@en ;
+ skos:definition "Enumeration of cable conductor materials."@en ;
+ owl:equivalentClass [ a owl:Class ;
+ owl:oneOf ( pvc:CopperConductor pvc:AluminumConductor ) ] ;
+ mds:hasDomain "builtenv"^^xsd:string ; mds:hasSubDomain "pvcollada"^^xsd:string .
+
+pvc:CopperConductor a owl:NamedIndividual , pvc:ConductorMaterial ;
+ rdfs:label "copper conductor"@en ; skos:altLabel "copper"@en .
+pvc:AluminumConductor a owl:NamedIndividual , pvc:ConductorMaterial ;
+ rdfs:label "aluminum conductor"@en ; skos:altLabel "aluminum"@en .
+
+# ── PowerType ────────────────────────────────────────────────────────────────
+
+pvc:PowerType
+ a owl:Class ;
+ rdfs:subClassOf pvc:PVColladaEntity ;
+ rdfs:label "Power Type"@en ;
+ skos:definition "Enumeration of electrical power type (AC or DC) for cables."@en ;
+ owl:equivalentClass [ a owl:Class ;
+ owl:oneOf ( pvc:ACPower pvc:DCPower ) ] ;
+ mds:hasDomain "builtenv"^^xsd:string ; mds:hasSubDomain "pvcollada"^^xsd:string .
+
+pvc:ACPower a owl:NamedIndividual , pvc:PowerType ;
+ rdfs:label "alternating current"@en ; skos:altLabel "ac"@en .
+pvc:DCPower a owl:NamedIndividual , pvc:PowerType ;
+ rdfs:label "direct current"@en ; skos:altLabel "dc"@en .
+
+# ── EfficiencyStandardType (inline enum in XSD inverter_type_object) ─────
+
+pvc:EfficiencyStandardType
+ a owl:Class ;
+ rdfs:subClassOf pvc:PVColladaEntity ;
+ rdfs:label "Efficiency Standard Type"@en ;
+ skos:definition
+ "Enumeration of rating standards used for inverter efficiency measurement."@en ;
+ owl:equivalentClass [ a owl:Class ;
+ owl:oneOf ( pvc:CECEfficiency pvc:EUEfficiency ) ] ;
+ mds:hasDomain "builtenv"^^xsd:string ; mds:hasSubDomain "pvcollada"^^xsd:string .
+
+pvc:CECEfficiency a owl:NamedIndividual , pvc:EfficiencyStandardType ;
+ rdfs:label "CEC efficiency standard"@en ; skos:altLabel "CEC"@en .
+pvc:EUEfficiency a owl:NamedIndividual , pvc:EfficiencyStandardType ;
+ rdfs:label "EU efficiency standard"@en ; skos:altLabel "EU"@en .
+
+
+###############################################################################
+# C O M P O N E N T T Y P E C L A S S E S
+# (product library — XSD complexTypes ending in _type_object)
+###############################################################################
+
+pvc:Module
+ a owl:Class ;
+ rdfs:subClassOf pvc:PVComponent ,
+ mds:PhotovoltaicModule ;
+ rdfs:label "PV Module Product"@en ;
+ skos:definition
+ """Product-level specification for a PV module, capturing its physical dimensions, electrical parameters at STC, and cell technology."""@en ;
+ skos:scopeNote
+ """Corresponds to module_type_object in pvcollada_schema_2.0.xsd. Declared as a subclass of mds:PhotovoltaicModule to align with the MDS-Onto builtenv PV-module hierarchy."""@en ;
+ mds:hasDomain "builtenv"^^xsd:string ;
+ mds:hasSubDomain "pvcollada"^^xsd:string ;
+ mds:hasStudyStage "Characterization"^^xsd:string .
+
+pvc:Inverter
+ a owl:Class ;
+ rdfs:subClassOf pvc:PVComponent ,
+ mds:Inverter ;
+ rdfs:label "PV Inverter Product"@en ;
+ skos:definition
+ """Product-level specification for a PV inverter, capturing its AC/DC power ratings, MPPT voltage window, efficiency, and parasitic consumption."""@en ;
+ skos:scopeNote
+ """Corresponds to inverter_type_object. Declared as a subclass of mds:Inverter to align with MDS-Onto."""@en ;
+ mds:hasDomain "builtenv"^^xsd:string ;
+ mds:hasSubDomain "pvcollada"^^xsd:string ;
+ mds:hasStudyStage "Characterization"^^xsd:string .
+
+pvc:MPPTUnit
+ a owl:Class ;
+ rdfs:subClassOf pvc:PVComponent ;
+ rdfs:label "MPPT Unit Product"@en ;
+ skos:definition
+ """Product-level specification for a single maximum-power-point-tracking channel on an inverter, recording the number of parallel input strings."""@en ;
+ skos:scopeNote "Corresponds to mppt_type_object."@en ;
+ mds:hasDomain "builtenv"^^xsd:string ;
+ mds:hasSubDomain "pvcollada"^^xsd:string ;
+ mds:hasStudyStage "Characterization"^^xsd:string .
+
+pvc:Transformer
+ a owl:Class ;
+ rdfs:subClassOf pvc:PVComponent ;
+ rdfs:label "Transformer Product"@en ;
+ skos:definition
+ """Product-level specification for an AC step-up or isolation transformer, including rated power, voltage ratio, efficiency, and loss parameters."""@en ;
+ skos:scopeNote "Corresponds to transformer_type_object."@en ;
+ mds:hasDomain "builtenv"^^xsd:string ;
+ mds:hasSubDomain "pvcollada"^^xsd:string ;
+ mds:hasStudyStage "Characterization"^^xsd:string .
+
+pvc:Cable
+ a owl:Class ;
+ rdfs:subClassOf pvc:PVComponent ;
+ rdfs:label "Cable Product"@en ;
+ skos:definition
+ """Product-level specification for a PV cable, including cross-sectional area, conductor count, material, and electrical resistance."""@en ;
+ skos:scopeNote "Corresponds to cable_type_object."@en ;
+ mds:hasDomain "builtenv"^^xsd:string ;
+ mds:hasSubDomain "pvcollada"^^xsd:string ;
+ mds:hasStudyStage "Characterization"^^xsd:string .
+
+pvc:DCCombiner
+ a owl:Class ;
+ rdfs:subClassOf pvc:PVComponent ;
+ rdfs:label "DC Combiner Product"@en ;
+ skos:definition
+ "Product-level specification for a DC string combiner box."@en ;
+ skos:scopeNote "Corresponds to combiner_dc_type_object."@en ;
+ mds:hasDomain "builtenv"^^xsd:string ;
+ mds:hasSubDomain "pvcollada"^^xsd:string ;
+ mds:hasStudyStage "Characterization"^^xsd:string .
+
+pvc:ACCombiner
+ a owl:Class ;
+ rdfs:subClassOf pvc:PVComponent ;
+ rdfs:label "AC Combiner Product"@en ;
+ skos:definition
+ "Product-level specification for an AC inverter combiner panel."@en ;
+ skos:scopeNote "Corresponds to combiner_ac_type_object."@en ;
+ mds:hasDomain "builtenv"^^xsd:string ;
+ mds:hasSubDomain "pvcollada"^^xsd:string ;
+ mds:hasStudyStage "Characterization"^^xsd:string .
+
+pvc:Optimizer
+ a owl:Class ;
+ rdfs:subClassOf pvc:PVComponent ;
+ rdfs:label "Power Optimizer Product"@en ;
+ skos:definition
+ "Product-level specification for a module-level power optimizer."@en ;
+ skos:scopeNote "Corresponds to optimizer_type_object."@en ;
+ mds:hasDomain "builtenv"^^xsd:string ;
+ mds:hasSubDomain "pvcollada"^^xsd:string ;
+ mds:hasStudyStage "Characterization"^^xsd:string .
+
+
+###############################################################################
+# C I R C U I T I N S T A N C E C L A S S E S
+###############################################################################
+
+pvc:Circuit
+ a owl:Class ;
+ rdfs:subClassOf pvc:CircuitInstance ;
+ rdfs:label "Circuit"@en ;
+ skos:definition
+ """The complete electrical circuit description of a PV system, rooted at a single circuit_root element that is a transformer, AC combiner, or inverter."""@en ;
+ mds:hasDomain "builtenv"^^xsd:string ;
+ mds:hasSubDomain "pvcollada"^^xsd:string ;
+ mds:hasStudyStage "Simulation"^^xsd:string .
+
+pvc:InverterInstance
+ a owl:Class ;
+ rdfs:subClassOf pvc:CircuitInstance ;
+ rdfs:label "Inverter Instance"@en ;
+ skos:definition
+ """An instance of an inverter in the electrical circuit, referencing a product inverter specification and containing MPPT inputs."""@en ;
+ mds:hasDomain "builtenv"^^xsd:string ;
+ mds:hasSubDomain "pvcollada"^^xsd:string ;
+ mds:hasStudyStage "Simulation"^^xsd:string .
+
+pvc:TransformerInstance
+ a owl:Class ;
+ rdfs:subClassOf pvc:CircuitInstance ;
+ rdfs:label "Transformer Instance"@en ;
+ skos:definition
+ "An instance of a transformer in the electrical circuit."@en ;
+ mds:hasDomain "builtenv"^^xsd:string ;
+ mds:hasSubDomain "pvcollada"^^xsd:string ;
+ mds:hasStudyStage "Simulation"^^xsd:string .
+
+pvc:ACCombinerInstance
+ a owl:Class ;
+ rdfs:subClassOf pvc:CircuitInstance ;
+ rdfs:label "AC Combiner Instance"@en ;
+ skos:definition
+ "An instance of an AC combiner panel in the electrical circuit."@en ;
+ mds:hasDomain "builtenv"^^xsd:string ;
+ mds:hasSubDomain "pvcollada"^^xsd:string ;
+ mds:hasStudyStage "Simulation"^^xsd:string .
+
+pvc:DCCombinerInstance
+ a owl:Class ;
+ rdfs:subClassOf pvc:CircuitInstance ;
+ rdfs:label "DC Combiner Instance"@en ;
+ skos:definition
+ "An instance of a DC combiner box in the electrical circuit."@en ;
+ mds:hasDomain "builtenv"^^xsd:string ;
+ mds:hasSubDomain "pvcollada"^^xsd:string ;
+ mds:hasStudyStage "Simulation"^^xsd:string .
+
+pvc:MPPTInput
+ a owl:Class ;
+ rdfs:subClassOf pvc:CircuitInstance ;
+ rdfs:label "MPPT Input"@en ;
+ skos:definition
+ """A single MPPT channel instance within an inverter circuit instance, containing one or more strings or DC combiners."""@en ;
+ mds:hasDomain "builtenv"^^xsd:string ;
+ mds:hasSubDomain "pvcollada"^^xsd:string ;
+ mds:hasStudyStage "Simulation"^^xsd:string .
+
+pvc:String
+ a owl:Class ;
+ rdfs:subClassOf pvc:CircuitInstance ;
+ rdfs:label "PV String"@en ;
+ skos:definition
+ """A series-connected string of PV modules, containing either a module array or an optimizer array."""@en ;
+ mds:hasDomain "builtenv"^^xsd:string ;
+ mds:hasSubDomain "pvcollada"^^xsd:string ;
+ mds:hasStudyStage "Simulation"^^xsd:string .
+
+pvc:ModuleArray
+ a owl:Class ;
+ rdfs:subClassOf pvc:CircuitInstance ;
+ rdfs:label "Module Array"@en ;
+ skos:definition
+ """An ordered collection of modules within a string, each described by a ModuleLayout that maps a circuit position to a physical rack cell."""@en ;
+ mds:hasDomain "builtenv"^^xsd:string ;
+ mds:hasSubDomain "pvcollada"^^xsd:string ;
+ mds:hasStudyStage "Simulation"^^xsd:string .
+
+pvc:OptimizerArray
+ a owl:Class ;
+ rdfs:subClassOf pvc:CircuitInstance ;
+ rdfs:label "Optimizer Array"@en ;
+ skos:definition
+ "An ordered collection of power optimizer instances within a string."@en ;
+ mds:hasDomain "builtenv"^^xsd:string ;
+ mds:hasSubDomain "pvcollada"^^xsd:string ;
+ mds:hasStudyStage "Simulation"^^xsd:string .
+
+pvc:OptimizerInstance
+ a owl:Class ;
+ rdfs:subClassOf pvc:CircuitInstance ;
+ rdfs:label "Optimizer Instance"@en ;
+ skos:definition
+ """An instance of a power optimizer in the circuit, connected via cable_to_parent and optionally cable_to_neighbor."""@en ;
+ mds:hasDomain "builtenv"^^xsd:string ;
+ mds:hasSubDomain "pvcollada"^^xsd:string ;
+ mds:hasStudyStage "Simulation"^^xsd:string .
+
+pvc:ModuleLayout
+ a owl:Class ;
+ rdfs:subClassOf pvc:CircuitInstance ;
+ rdfs:label "Module Layout"@en ;
+ skos:definition
+ """Cross-domain bridge entity that maps a module's position in the electrical circuit (position_in_string) to its physical location on a rack (row, column) via a reference to an instance_rack_ref."""@en ;
+ skos:scopeNote
+ """This is the key join point between circuit topology and physical 3-D layout in PV-Collada."""@en ;
+ mds:hasDomain "builtenv"^^xsd:string ;
+ mds:hasSubDomain "pvcollada"^^xsd:string ;
+ mds:hasStudyStage "Simulation"^^xsd:string .
+
+pvc:CableTo
+ a owl:Class ;
+ rdfs:subClassOf pvc:CircuitInstance ;
+ rdfs:label "Cable To"@en ;
+ skos:definition
+ """A directed cable connection from a circuit instance to its electrical parent, carrying a reference to the cable product and the installed length."""@en ;
+ mds:hasDomain "builtenv"^^xsd:string ;
+ mds:hasSubDomain "pvcollada"^^xsd:string ;
+ mds:hasStudyStage "Simulation"^^xsd:string .
+
+
+###############################################################################
+# P H Y S I C A L A S S E T C L A S S E S
+###############################################################################
+
+pvc:Project
+ a owl:Class ;
+ rdfs:subClassOf pvc:PhysicalAsset ,
+ mds:PhotovoltaicSite ;
+ rdfs:label "PV Project"@en ;
+ skos:definition
+ """Top-level project metadata for a PV-Collada file, recording system capacity, string and module counts, geographic projection, and boundary."""@en ;
+ skos:scopeNote
+ """Declared as a subclass of mds:PhotovoltaicSite; the pvc:Project adds schema-level attributes (capacity, module/string counts, projection)."""@en ;
+ mds:hasDomain "builtenv"^^xsd:string ;
+ mds:hasSubDomain "pvcollada"^^xsd:string ;
+ mds:hasStudyStage "Simulation"^^xsd:string .
+
+pvc:Rack
+ a owl:Class ;
+ rdfs:subClassOf pvc:PhysicalAsset ,
+ mds:Racking ;
+ rdfs:label "PV Rack"@en ;
+ skos:definition
+ """A co-planar group of modules mounted in a fixed or tracker configuration, described by a COLLADA geometry rectangle representing the rack surface."""@en ;
+ skos:scopeNote
+ """Declared as a subclass of mds:Racking. Business rule (Schematron): if rack_type = fixed_tilt then azimuth and tilt are required and tracker fields are forbidden; if rack_type = tracker then tracker_azimuth is required and fixed-tilt fields are forbidden. See pvc:FixedTiltRack and pvc:TrackerRack subclasses."""@en ;
+ mds:hasDomain "builtenv"^^xsd:string ;
+ mds:hasSubDomain "pvcollada"^^xsd:string ;
+ mds:hasStudyStage "Simulation"^^xsd:string .
+
+# Schematron conditional requirements → OWL 2 subclass restrictions
+
+pvc:FixedTiltRack
+ a owl:Class ;
+ rdfs:subClassOf pvc:Rack ,
+ [ a owl:Restriction ;
+ owl:onProperty pvc:hasRackType ;
+ owl:hasValue pvc:FixedTilt ] ,
+ [ a owl:Restriction ;
+ owl:onProperty pvc:azimuth ;
+ owl:minCardinality "1"^^xsd:nonNegativeInteger ] ,
+ [ a owl:Restriction ;
+ owl:onProperty pvc:tilt ;
+ owl:minCardinality "1"^^xsd:nonNegativeInteger ] ;
+ rdfs:label "Fixed Tilt Rack"@en ;
+ skos:definition
+ """A rack mounted at a fixed tilt angle; requires azimuth and tilt, and must not carry tracker geometry fields."""@en ;
+ mds:hasDomain "builtenv"^^xsd:string ; mds:hasSubDomain "pvcollada"^^xsd:string .
+
+pvc:TrackerRack
+ a owl:Class ;
+ rdfs:subClassOf pvc:Rack ,
+ [ a owl:Restriction ;
+ owl:onProperty pvc:hasRackType ;
+ owl:hasValue pvc:TrackerRackType ] ,
+ [ a owl:Restriction ;
+ owl:onProperty pvc:trackerAzimuth ;
+ owl:minCardinality "1"^^xsd:nonNegativeInteger ] ;
+ rdfs:label "Tracker Rack"@en ;
+ skos:definition
+ """A rack mounted on a solar tracker; requires tracker_azimuth, and must not carry fixed-tilt geometry fields."""@en ;
+ mds:hasDomain "builtenv"^^xsd:string ; mds:hasSubDomain "pvcollada"^^xsd:string .
+
+owl:AllDisjointClasses
+ a owl:AllDisjointClasses ;
+ owl:members ( pvc:FixedTiltRack pvc:TrackerRack ) .
+
+pvc:Table
+ a owl:Class ;
+ rdfs:subClassOf pvc:PhysicalAsset ;
+ rdfs:label "PV Table"@en ;
+ skos:definition
+ """A group of mechanically linked racks in a single row, potentially including posts and gaps. When the table is a tracker, all constituent racks share the same rotation around the tracker axis."""@en ;
+ mds:hasDomain "builtenv"^^xsd:string ;
+ mds:hasSubDomain "pvcollada"^^xsd:string ;
+ mds:hasStudyStage "Simulation"^^xsd:string .
+
+pvc:Post
+ a owl:Class ;
+ rdfs:subClassOf pvc:PhysicalAsset ;
+ rdfs:label "Structural Post"@en ;
+ skos:definition
+ """A vertical structural member that supports a rack, tracker torque tube, or fence, driven into or anchored to the ground."""@en ;
+ mds:hasDomain "builtenv"^^xsd:string ;
+ mds:hasSubDomain "pvcollada"^^xsd:string ;
+ mds:hasStudyStage "Simulation"^^xsd:string .
+
+pvc:Gap
+ a owl:Class ;
+ rdfs:subClassOf pvc:PhysicalAsset ;
+ rdfs:label "Tracker Gap"@en ;
+ skos:definition
+ """A space between two racks on a single-axis tracker torque tube, occupied by a motor drive or a flexible joint."""@en ;
+ mds:hasDomain "builtenv"^^xsd:string ;
+ mds:hasSubDomain "pvcollada"^^xsd:string ;
+ mds:hasStudyStage "Simulation"^^xsd:string .
+
+pvc:Terrain
+ a owl:Class ;
+ rdfs:subClassOf pvc:PhysicalAsset ;
+ rdfs:label "Terrain"@en ;
+ skos:definition
+ "A triangulated 3-D surface model representing the site terrain."@en ;
+ mds:hasDomain "builtenv"^^xsd:string ;
+ mds:hasSubDomain "pvcollada"^^xsd:string ;
+ mds:hasStudyStage "Simulation"^^xsd:string .
+
+
+###############################################################################
+# O B J E C T P R O P E R T I E S
+###############################################################################
+
+pvc:hasRackType
+ a owl:ObjectProperty ;
+ rdfs:domain pvc:Rack ;
+ rdfs:range pvc:RackType ;
+ rdfs:label "has rack type"@en ;
+ skos:definition "Associates a rack with its mounting type (fixed_tilt or tracker)."@en .
+
+pvc:hasTableType
+ a owl:ObjectProperty ;
+ rdfs:domain pvc:Table ;
+ rdfs:range pvc:TableType ;
+ rdfs:label "has table type"@en ;
+ skos:definition "Associates a table with its mounting type (fixed or tracker)."@en .
+
+pvc:hasTrackerType
+ a owl:ObjectProperty ;
+ rdfs:domain pvc:Table ;
+ rdfs:range pvc:TrackerType ;
+ rdfs:label "has tracker type"@en ;
+ skos:definition "Associates a tracker table with its axis configuration."@en .
+
+pvc:hasTorqueTubeShape
+ a owl:ObjectProperty ;
+ rdfs:domain pvc:Table ;
+ rdfs:range pvc:TorqueTubeShape ;
+ rdfs:label "has torque tube shape"@en ;
+ skos:definition "Associates a single-axis tracker table with its torque tube cross-section shape."@en .
+
+pvc:hasDriveType
+ a owl:ObjectProperty ;
+ rdfs:domain pvc:Table ;
+ rdfs:range pvc:DriveType ;
+ rdfs:label "has drive type"@en ;
+ skos:definition "Associates a single-axis tracker table with its drive coupling type."@en .
+
+pvc:hasModuleOrientation
+ a owl:ObjectProperty ;
+ rdfs:domain pvc:Rack ;
+ rdfs:range pvc:ModuleOrientation ;
+ rdfs:label "has module orientation"@en ;
+ skos:definition "Associates a rack with the mounting orientation of its modules."@en .
+
+pvc:hasCellMaterial
+ a owl:ObjectProperty ;
+ rdfs:domain pvc:Module ;
+ rdfs:range pvc:CellMaterial ;
+ rdfs:label "has cell material"@en ;
+ skos:definition "Specifies the semiconductor absorber material of the cells in a module."@en .
+
+pvc:hasCellArchitecture
+ a owl:ObjectProperty ;
+ rdfs:domain pvc:Module ;
+ rdfs:range pvc:CellArchitecture ;
+ rdfs:label "has cell architecture"@en ;
+ skos:definition "Specifies the cell junction or contact architecture used in a module."@en .
+
+pvc:hasModuleType
+ a owl:ObjectProperty ;
+ rdfs:domain pvc:Module ;
+ rdfs:range pvc:ModuleType ;
+ rdfs:label "has module type"@en ;
+ skos:definition "Associates a module product with its form-factor type."@en .
+
+pvc:hasInverterType
+ a owl:ObjectProperty ;
+ rdfs:domain pvc:Inverter ;
+ rdfs:range pvc:InverterType ;
+ rdfs:label "has inverter type"@en ;
+ skos:definition "Associates an inverter product with its deployment topology."@en .
+
+pvc:hasConductorMaterial
+ a owl:ObjectProperty ;
+ rdfs:domain pvc:Cable ;
+ rdfs:range pvc:ConductorMaterial ;
+ rdfs:label "has conductor material"@en ;
+ skos:definition "Specifies the conductor material of a cable product."@en .
+
+pvc:hasPowerType
+ a owl:ObjectProperty ;
+ rdfs:domain pvc:Cable ;
+ rdfs:range pvc:PowerType ;
+ rdfs:label "has power type"@en ;
+ skos:definition "Associates a cable with its power type (AC or DC)."@en .
+
+pvc:hasEfficiencyStandardType
+ a owl:ObjectProperty ;
+ rdfs:domain pvc:Inverter ;
+ rdfs:range pvc:EfficiencyStandardType ;
+ rdfs:label "has efficiency standard type"@en ;
+ skos:definition "Specifies the rating standard (CEC or EU) used to compute the efficiency_standard_value."@en .
+
+pvc:hasPostType
+ a owl:ObjectProperty ;
+ rdfs:domain pvc:Post ;
+ rdfs:range pvc:PostType ;
+ rdfs:label "has post type"@en ;
+ skos:definition "Associates a post with its structural function (rack, tracker, fence)."@en .
+
+pvc:hasPostShape
+ a owl:ObjectProperty ;
+ rdfs:domain pvc:Post ;
+ rdfs:range pvc:PostShape ;
+ rdfs:label "has post shape"@en ;
+ skos:definition "Associates a post with its cross-section shape."@en .
+
+pvc:hasPostInclination
+ a owl:ObjectProperty ;
+ rdfs:domain pvc:Post ;
+ rdfs:range pvc:PostInclination ;
+ rdfs:label "has post inclination"@en ;
+ skos:definition "Associates a post with its installation inclination (vertical or perpendicular)."@en .
+
+pvc:hasGapType
+ a owl:ObjectProperty ;
+ rdfs:domain pvc:Gap ;
+ rdfs:range pvc:GapType ;
+ rdfs:label "has gap type"@en ;
+ skos:definition "Associates a gap with its function (motor or joint)."@en .
+
+pvc:referencesModule
+ a owl:ObjectProperty ;
+ rdfs:domain pvc:Rack ;
+ rdfs:range pvc:Module ;
+ rdfs:label "references module"@en ;
+ skos:definition
+ """Links a rack to the module product specification it holds, via the module_id IDREF in the PV-Collada schema."""@en .
+
+pvc:referencesRack
+ a owl:ObjectProperty ;
+ rdfs:domain pvc:ModuleLayout ;
+ rdfs:range pvc:Rack ;
+ rdfs:label "references rack"@en ;
+ skos:definition
+ """Cross-domain bridge property: links a circuit ModuleLayout to the physical rack instance (via instance_rack_ref) that holds the module."""@en ;
+ skos:scopeNote
+ "This is the critical join between circuit topology and physical layout."@en .
+
+pvc:referencesInverterProduct
+ a owl:ObjectProperty ;
+ rdfs:domain pvc:InverterInstance ;
+ rdfs:range pvc:Inverter ;
+ rdfs:label "references inverter product"@en ;
+ skos:definition "Links a circuit inverter instance to its product specification."@en .
+
+pvc:referencesTransformerProduct
+ a owl:ObjectProperty ;
+ rdfs:domain pvc:TransformerInstance ;
+ rdfs:range pvc:Transformer ;
+ rdfs:label "references transformer product"@en ;
+ skos:definition "Links a circuit transformer instance to its product specification."@en .
+
+pvc:referencesACCombinerProduct
+ a owl:ObjectProperty ;
+ rdfs:domain pvc:ACCombinerInstance ;
+ rdfs:range pvc:ACCombiner ;
+ rdfs:label "references AC combiner product"@en ;
+ skos:definition "Links a circuit AC combiner instance to its product specification."@en .
+
+pvc:referencesDCCombinerProduct
+ a owl:ObjectProperty ;
+ rdfs:domain pvc:DCCombinerInstance ;
+ rdfs:range pvc:DCCombiner ;
+ rdfs:label "references DC combiner product"@en ;
+ skos:definition "Links a circuit DC combiner instance to its product specification."@en .
+
+pvc:referencesOptimizerProduct
+ a owl:ObjectProperty ;
+ rdfs:domain pvc:OptimizerInstance ;
+ rdfs:range pvc:Optimizer ;
+ rdfs:label "references optimizer product"@en ;
+ skos:definition "Links a circuit optimizer instance to its product specification."@en .
+
+pvc:referencesCableProduct
+ a owl:ObjectProperty ;
+ rdfs:domain pvc:CableTo ;
+ rdfs:range pvc:Cable ;
+ rdfs:label "references cable product"@en ;
+ skos:definition "Links a CableTo connection to the cable product it uses."@en .
+
+pvc:hasMPPTUnit
+ a owl:ObjectProperty ;
+ rdfs:domain pvc:Inverter ;
+ rdfs:range pvc:MPPTUnit ;
+ rdfs:label "has MPPT unit"@en ;
+ skos:definition "Associates an inverter product with its MPPT channel specifications."@en .
+
+pvc:hasMPPTInput
+ a owl:ObjectProperty ;
+ rdfs:domain pvc:InverterInstance ;
+ rdfs:range pvc:MPPTInput ;
+ rdfs:label "has MPPT input"@en ;
+ skos:definition "Associates a circuit inverter instance with its MPPT channel instances."@en .
+
+pvc:hasString
+ a owl:ObjectProperty ;
+ rdfs:domain pvc:MPPTInput ;
+ rdfs:range pvc:String ;
+ rdfs:label "has string"@en ;
+ skos:definition "Associates an MPPT input with its connected PV strings."@en .
+
+pvc:hasDCCombinerInput
+ a owl:ObjectProperty ;
+ rdfs:domain pvc:MPPTInput ;
+ rdfs:range pvc:DCCombinerInstance ;
+ rdfs:label "has DC combiner input"@en ;
+ skos:definition "Associates an MPPT input with a DC combiner that aggregates strings."@en .
+
+pvc:hasModuleArray
+ a owl:ObjectProperty ;
+ rdfs:domain pvc:String ;
+ rdfs:range pvc:ModuleArray ;
+ rdfs:label "has module array"@en ;
+ skos:definition "Associates a string with its module array (direct-wire configuration)."@en .
+
+pvc:hasOptimizerArray
+ a owl:ObjectProperty ;
+ rdfs:domain pvc:String ;
+ rdfs:range pvc:OptimizerArray ;
+ rdfs:label "has optimizer array"@en ;
+ skos:definition "Associates a string with its optimizer array (optimized configuration)."@en .
+
+pvc:hasModuleLayout
+ a owl:ObjectProperty ;
+ rdfs:domain pvc:ModuleArray ;
+ rdfs:range pvc:ModuleLayout ;
+ rdfs:label "has module layout"@en ;
+ skos:definition
+ """Associates a module array with its constituent ModuleLayout entries, each describing the position of one module in the string and in the rack."""@en .
+
+pvc:hasCableToParent
+ a owl:ObjectProperty ;
+ rdfs:range pvc:CableTo ;
+ rdfs:label "has cable to parent"@en ;
+ skos:definition
+ """Associates a circuit instance with the cable that connects it to its electrical parent node."""@en .
+
+pvc:hasCableToNeighbor
+ a owl:ObjectProperty ;
+ rdfs:domain pvc:OptimizerInstance ;
+ rdfs:range pvc:CableTo ;
+ rdfs:label "has cable to neighbor"@en ;
+ skos:definition
+ """Associates an optimizer instance with the cable that daisy-chains it to an adjacent optimizer."""@en .
+
+
+###############################################################################
+# D A T A P R O P E R T I E S
+#
+# Convention: property name = lowerCamelCase from XSD element name.
+# Units recorded in skos:scopeNote and (where QUDT units are available) via
+# qudt:applicableUnit; the runtime value carries the raw numeric literal.
+###############################################################################
+
+# ── Shared ───────────────────────────────────────────────────────────────────
+
+pvc:manufacturer
+ a owl:DatatypeProperty ;
+ rdfs:label "manufacturer"@en ;
+ rdfs:range xsd:string ;
+ skos:definition "Name of the product manufacturer."@en ;
+ rdfs:seeAlso mds:Manufacturer .
+ # mds:Manufacturer is a class (reified entity); pvc:manufacturer is a
+ # datatype property carrying the manufacturer name string directly.
+
+pvc:productName
+ a owl:DatatypeProperty ;
+ rdfs:label "product name"@en ;
+ rdfs:range xsd:string ;
+ skos:definition "Model name of the product (e.g., 'Q.Tron Classic 440W')."@en .
+
+# ── Module data properties ────────────────────────────────────────────────────
+
+pvc:nomPower
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Module ;
+ rdfs:range xsd:float ;
+ rdfs:label "nominal power"@en ;
+ skos:definition "Module power at Standard Test Conditions (STC)."@en ;
+ skos:scopeNote "Unit: W"@en ;
+ qudt:applicableUnit unit:W ;
+ rdfs:seeAlso mds:NameplateMaximumPower .
+
+pvc:moduleLength
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Module ;
+ rdfs:range xsd:float ;
+ rdfs:label "module length"@en ;
+ skos:definition "Length of the module in the longest dimension."@en ;
+ skos:scopeNote "Unit: mm"@en ;
+ qudt:applicableUnit unit:MilliM .
+
+pvc:moduleWidth
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Module ;
+ rdfs:range xsd:float ;
+ rdfs:label "module width"@en ;
+ skos:definition "Width of the module orthogonal to its longest dimension."@en ;
+ skos:scopeNote "Unit: mm"@en ;
+ qudt:applicableUnit unit:MilliM .
+
+pvc:moduleDepth
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Module ;
+ rdfs:range xsd:float ;
+ rdfs:label "module depth"@en ;
+ skos:definition "Depth (thickness) of the module."@en ;
+ skos:scopeNote "Unit: mm"@en ;
+ qudt:applicableUnit unit:MilliM .
+
+pvc:numCells
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Module ;
+ rdfs:range xsd:positiveInteger ;
+ rdfs:label "number of cells"@en ;
+ skos:definition "Total number of PV cells in the module."@en ;
+ rdfs:seeAlso mds:CellNumber .
+
+pvc:numCellsLength
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Module ;
+ rdfs:range xsd:positiveInteger ;
+ rdfs:label "number of cells in length"@en ;
+ skos:definition "Number of cells arranged along the length dimension."@en .
+
+pvc:numCellsWidth
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Module ;
+ rdfs:range xsd:positiveInteger ;
+ rdfs:label "number of cells in width"@en ;
+ skos:definition "Number of cells arranged along the width dimension."@en .
+
+pvc:numCellsSeries
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Module ;
+ rdfs:range xsd:positiveInteger ;
+ rdfs:label "cells in series per string"@en ;
+ skos:definition "Number of series-connected cells in a single internal string."@en ;
+ rdfs:seeAlso mds:CellNumberPerString , mds:NumberOfCellsPerString .
+
+pvc:numStrings
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Module ;
+ rdfs:range xsd:positiveInteger ;
+ rdfs:label "number of internal strings"@en ;
+ skos:definition "Number of parallel internal cell strings within the module."@en ;
+ rdfs:seeAlso mds:ModuleParallelStringsNumber , mds:NumberStrings .
+
+pvc:bifacialFactor
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Module ;
+ rdfs:range xsd:float ;
+ rdfs:label "bifaciality factor"@en ;
+ skos:definition "Ratio of rear-side to front-side quantum efficiency for bifacial modules (dimensionless, 0–1)."@en .
+
+pvc:tCoefPower
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Module ;
+ rdfs:range xsd:float ;
+ rdfs:label "temperature coefficient of power"@en ;
+ skos:definition "Change in maximum power per degree Celsius."@en ;
+ skos:scopeNote "Unit: %/°C"@en ;
+ rdfs:seeAlso mds:ModuleTemperatureCoefficientPower .
+
+pvc:tCoefIsc
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Module ;
+ rdfs:range xsd:float ;
+ rdfs:label "temperature coefficient of short-circuit current"@en ;
+ skos:definition "Change in short-circuit current per degree Celsius."@en ;
+ skos:scopeNote "Unit: A/°C"@en ;
+ rdfs:seeAlso mds:ModuleTemperatureCoefficientCurrent .
+
+pvc:tCoefVoc
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Module ;
+ rdfs:range xsd:float ;
+ rdfs:label "temperature coefficient of open-circuit voltage"@en ;
+ skos:definition "Change in open-circuit voltage per degree Celsius."@en ;
+ skos:scopeNote "Unit: V/°C"@en ;
+ rdfs:seeAlso mds:ModuleTemperatureCoefficientVoltage .
+
+pvc:iSc
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Module ;
+ rdfs:range xsd:float ;
+ rdfs:label "short-circuit current at STC"@en ;
+ skos:definition "Module short-circuit current at Standard Test Conditions."@en ;
+ skos:scopeNote "Unit: A"@en ;
+ qudt:applicableUnit unit:A ;
+ rdfs:seeAlso mds:ShortCircuitCurrent , mds:NameplateShortCircuitCurrent .
+
+pvc:iMpp
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Module ;
+ rdfs:range xsd:float ;
+ rdfs:label "current at maximum power point at STC"@en ;
+ skos:definition "Module current at the maximum power point under STC."@en ;
+ skos:scopeNote "Unit: A"@en ;
+ qudt:applicableUnit unit:A ;
+ rdfs:seeAlso mds:CurrentAtMaximumPower , mds:NameplateCurrentAtMaximumPower .
+
+pvc:vOc
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Module ;
+ rdfs:range xsd:float ;
+ rdfs:label "open-circuit voltage at STC"@en ;
+ skos:definition "Module open-circuit voltage at Standard Test Conditions."@en ;
+ skos:scopeNote "Unit: V"@en ;
+ qudt:applicableUnit unit:V ;
+ rdfs:seeAlso mds:OpenCircuitVoltage , mds:NameplateOpenCircuitVoltage .
+
+pvc:vMpp
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Module ;
+ rdfs:range xsd:float ;
+ rdfs:label "voltage at maximum power point at STC"@en ;
+ skos:definition "Module voltage at the maximum power point under STC."@en ;
+ skos:scopeNote "Unit: V"@en ;
+ qudt:applicableUnit unit:V ;
+ rdfs:seeAlso mds:VoltageAtMaximumPower .
+
+# ── Inverter data properties ──────────────────────────────────────────────────
+
+pvc:nomPowerAC
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Inverter ;
+ rdfs:range xsd:float ;
+ rdfs:label "nominal AC power"@en ;
+ skos:definition "Inverter AC output power at rating conditions."@en ;
+ skos:scopeNote "Unit: W"@en ;
+ qudt:applicableUnit unit:W .
+
+pvc:nomPowerDC
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Inverter ;
+ rdfs:range xsd:float ;
+ rdfs:label "nominal DC power"@en ;
+ skos:definition "Inverter DC input power at rating conditions."@en ;
+ skos:scopeNote "Unit: W"@en ;
+ qudt:applicableUnit unit:W .
+
+pvc:capacityAC
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Inverter ;
+ rdfs:range xsd:float ;
+ rdfs:label "maximum AC capacity"@en ;
+ skos:definition "Maximum inverter AC output power."@en ;
+ skos:scopeNote "Unit: W"@en ;
+ qudt:applicableUnit unit:W .
+
+pvc:capacityDC
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Inverter ;
+ rdfs:range xsd:float ;
+ rdfs:label "maximum DC capacity"@en ;
+ skos:definition "Maximum inverter DC input power."@en ;
+ skos:scopeNote "Unit: W"@en ;
+ qudt:applicableUnit unit:W .
+
+pvc:vMppMin
+ a owl:DatatypeProperty ;
+ rdfs:range xsd:float ;
+ rdfs:label "minimum MPPT voltage"@en ;
+ skos:definition "Minimum DC voltage for MPPT tracking."@en ;
+ skos:scopeNote "Unit: V"@en ;
+ qudt:applicableUnit unit:V .
+
+pvc:vMppMax
+ a owl:DatatypeProperty ;
+ rdfs:range xsd:float ;
+ rdfs:label "maximum MPPT voltage"@en ;
+ skos:definition "Maximum DC voltage for MPPT tracking."@en ;
+ skos:scopeNote "Unit: V"@en ;
+ qudt:applicableUnit unit:V .
+
+pvc:vMppNom
+ a owl:DatatypeProperty ;
+ rdfs:range xsd:float ;
+ rdfs:label "nominal MPPT voltage"@en ;
+ skos:definition "Nominal DC voltage for MPPT tracking."@en ;
+ skos:scopeNote "Unit: V"@en ;
+ qudt:applicableUnit unit:V .
+
+pvc:iMaxDC
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Inverter ;
+ rdfs:range xsd:float ;
+ rdfs:label "maximum DC current"@en ;
+ skos:definition "Maximum DC input current to the inverter."@en ;
+ skos:scopeNote "Unit: A"@en ;
+ qudt:applicableUnit unit:A .
+
+pvc:mpptCount
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Inverter ;
+ rdfs:range xsd:positiveInteger ;
+ rdfs:label "MPPT count"@en ;
+ skos:definition "Number of MPPT channels on the inverter."@en .
+
+pvc:vOutAC
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Inverter ;
+ rdfs:range xsd:float ;
+ rdfs:label "nominal AC output voltage"@en ;
+ skos:definition "Nominal AC output voltage of the inverter."@en ;
+ skos:scopeNote "Unit: V"@en ;
+ qudt:applicableUnit unit:V .
+
+pvc:selfConsumption
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Inverter ;
+ rdfs:range xsd:float ;
+ rdfs:label "self consumption"@en ;
+ skos:definition "Power consumed by the inverter during normal operation."@en ;
+ skos:scopeNote "Unit: W"@en ;
+ qudt:applicableUnit unit:W .
+
+pvc:nightTare
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Inverter ;
+ rdfs:range xsd:float ;
+ rdfs:label "night tare power"@en ;
+ skos:definition "Standby power consumed by the inverter when not generating."@en ;
+ skos:scopeNote "Unit: W"@en ;
+ qudt:applicableUnit unit:W .
+
+pvc:efficiency
+ a owl:DatatypeProperty ;
+ rdfs:range xsd:float ;
+ rdfs:label "efficiency"@en ;
+ skos:definition "Maximum efficiency as AC output power / DC input power."@en ;
+ skos:scopeNote "Unit: %; range 0–100"@en .
+
+pvc:efficiencyStandardValue
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Inverter ;
+ rdfs:range xsd:float ;
+ rdfs:label "efficiency standard value"@en ;
+ skos:definition "Weighted efficiency computed per the standard specified by efficiencyStandardType."@en ;
+ skos:scopeNote "Unit: %; range 0–100"@en .
+
+# ── MPPT unit data properties ─────────────────────────────────────────────────
+
+pvc:inputCount
+ a owl:DatatypeProperty ;
+ rdfs:range xsd:positiveInteger ;
+ rdfs:label "input count"@en ;
+ skos:definition "Number of parallel inputs (strings) that can be connected."@en .
+
+# ── Transformer data properties ───────────────────────────────────────────────
+
+pvc:vIn
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Transformer ;
+ rdfs:range xsd:float ;
+ rdfs:label "nominal input voltage"@en ;
+ skos:definition "Nominal AC input voltage of the transformer."@en ;
+ skos:scopeNote "Unit: V"@en ;
+ qudt:applicableUnit unit:V .
+
+pvc:vOut
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Transformer ;
+ rdfs:range xsd:float ;
+ rdfs:label "nominal output voltage"@en ;
+ skos:definition "Nominal AC output voltage of the transformer."@en ;
+ skos:scopeNote "Unit: V"@en ;
+ qudt:applicableUnit unit:V .
+
+pvc:ironLoss
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Transformer ;
+ rdfs:range xsd:float ;
+ rdfs:label "iron core loss"@en ;
+ skos:definition "No-load loss in the transformer iron core, independent of output current."@en ;
+ skos:scopeNote "Unit: W"@en ;
+ qudt:applicableUnit unit:W .
+
+pvc:copperLoss
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Transformer ;
+ rdfs:range xsd:float ;
+ rdfs:label "winding resistance (copper loss)"@en ;
+ skos:definition "Equivalent series resistance used to compute winding (copper) losses."@en ;
+ skos:scopeNote "Unit: Ω"@en ;
+ qudt:applicableUnit unit:OHM .
+
+pvc:nightDisconnect
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Transformer ;
+ rdfs:range xsd:boolean ;
+ rdfs:label "night disconnect"@en ;
+ skos:definition "True if the transformer automatically disconnects from the grid at night."@en .
+
+# ── Cable data properties ─────────────────────────────────────────────────────
+
+pvc:crossSection
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Cable ;
+ rdfs:range xsd:float ;
+ rdfs:label "cross-section area"@en ;
+ skos:definition "Conductor cross-sectional area."@en ;
+ skos:scopeNote "Unit: mm²"@en .
+
+pvc:numConductors
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Cable ;
+ rdfs:range xsd:positiveInteger ;
+ rdfs:label "number of conductors"@en ;
+ skos:definition "Number of electrical conductors in the cable."@en .
+
+pvc:resistance
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Cable ;
+ rdfs:range xsd:float ;
+ rdfs:label "resistance per unit length"@en ;
+ skos:definition "DC electrical resistance per kilometre of cable."@en ;
+ skos:scopeNote "Unit: Ω/km"@en .
+
+pvc:impedance
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Cable ;
+ rdfs:range xsd:float ;
+ rdfs:label "impedance per unit length"@en ;
+ skos:definition "AC impedance per kilometre of cable."@en ;
+ skos:scopeNote "Unit: Ω/km"@en .
+
+# ── Rack data properties ──────────────────────────────────────────────────────
+
+pvc:rowSpacing
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Rack ;
+ rdfs:range xsd:float ;
+ rdfs:label "row spacing"@en ;
+ skos:definition "Spacing between modules in the row direction on a rack."@en .
+
+pvc:columnSpacing
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Rack ;
+ rdfs:range xsd:float ;
+ rdfs:label "column spacing"@en ;
+ skos:definition "Spacing between modules in the column direction on a rack."@en .
+
+pvc:moduleRows
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Rack ;
+ rdfs:range xsd:positiveInteger ;
+ rdfs:label "module rows"@en ;
+ skos:definition "Number of rows of modules on the rack."@en .
+
+pvc:moduleColumns
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Rack ;
+ rdfs:range xsd:positiveInteger ;
+ rdfs:label "module columns"@en ;
+ skos:definition "Number of columns of modules on the rack."@en .
+
+pvc:tilt
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Rack ;
+ rdfs:range xsd:float ;
+ rdfs:label "rack tilt"@en ;
+ skos:definition "Tilt angle from horizontal of a fixed rack."@en ;
+ skos:scopeNote "Unit: °; applies to FixedTiltRack only."@en .
+
+pvc:azimuth
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Rack ;
+ rdfs:range xsd:float ;
+ rdfs:label "rack azimuth"@en ;
+ skos:definition "Azimuth angle of a fixed rack (direction modules face)."@en ;
+ skos:scopeNote "Unit: °; applies to FixedTiltRack only."@en .
+
+pvc:slope
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Rack ;
+ rdfs:range xsd:float ;
+ rdfs:label "rack slope"@en ;
+ skos:definition "Slope of a fixed rack in the direction 90° counterclockwise from azimuth."@en ;
+ skos:scopeNote "Unit: °"@en .
+
+pvc:heightAboveGround
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Rack ;
+ rdfs:range xsd:float ;
+ rdfs:label "height above ground"@en ;
+ skos:definition "Height of the lower edge of a fixed rack above ground level."@en .
+
+pvc:trackerAzimuth
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Rack ;
+ rdfs:range xsd:float ;
+ rdfs:label "tracker azimuth"@en ;
+ skos:definition
+ """Azimuth of a tracker torque tube. Rotation is a right-hand rotation around this axis; e.g., positive rotation at azimuth 180° is westward."""@en ;
+ skos:scopeNote "Unit: °; applies to TrackerRack only."@en .
+
+pvc:trackerSlope
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Rack ;
+ rdfs:range xsd:float ;
+ rdfs:label "tracker slope"@en ;
+ skos:definition "Slope of a tracker torque tube in the direction of its azimuth."@en ;
+ skos:scopeNote "Unit: °"@en .
+
+pvc:trackerHeight
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Rack ;
+ rdfs:range xsd:float ;
+ rdfs:label "tracker height"@en ;
+ skos:definition "Height of the tracker torque tube centre above ground."@en .
+
+pvc:rackOffset
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Rack ;
+ rdfs:range xsd:float ;
+ rdfs:label "rack offset"@en ;
+ skos:definition "Distance from the rack surface to the tracker torque tube centre."@en .
+
+# ── Table data properties ─────────────────────────────────────────────────────
+
+pvc:trackerMaxRotation
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Table ;
+ rdfs:range xsd:string ;
+ rdfs:label "tracker maximum rotation"@en ;
+ skos:definition
+ """Pair of values (negative, positive) giving the nominal maximum rotation angles from horizontal for a single-axis tracker, e.g., '-45 45'."""@en ;
+ skos:scopeNote "Unit: °; encoded as two space-separated floats."@en .
+
+pvc:trackerTorqueTubeDiameter
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Table ;
+ rdfs:range xsd:float ;
+ rdfs:label "torque tube diameter"@en ;
+ skos:definition "Nominal diameter of the single-axis tracker torque tube."@en .
+
+pvc:trackerMaxGapAngle
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Table ;
+ rdfs:range xsd:float ;
+ rdfs:label "maximum gap angle"@en ;
+ skos:definition "Maximum angle formed in the torque axis at a gap between racks."@en ;
+ skos:scopeNote "Unit: °"@en .
+
+# ── Post data properties ──────────────────────────────────────────────────────
+
+pvc:postDepth
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Post ;
+ rdfs:range xsd:float ;
+ rdfs:label "post underground depth"@en ;
+ skos:definition "Nominal depth of the post driven underground."@en .
+
+pvc:postLength
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Post ;
+ rdfs:range xsd:float ;
+ rdfs:label "post total length"@en ;
+ skos:definition "Total length of the post including the underground portion."@en .
+
+pvc:postDiameter
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Post ;
+ rdfs:range xsd:float ;
+ rdfs:label "post diameter"@en ;
+ skos:definition "Diameter of the post cross-section."@en .
+
+# ── Gap data properties ───────────────────────────────────────────────────────
+
+pvc:rigid
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Gap ;
+ rdfs:range xsd:boolean ;
+ rdfs:label "rigid"@en ;
+ skos:definition "True if the gap is rigid; false if it allows torque tube flexion."@en .
+
+pvc:gapWidth
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Gap ;
+ rdfs:range xsd:float ;
+ rdfs:label "gap width"@en ;
+ skos:definition "Nominal width of the gap between the two adjacent racks."@en .
+
+pvc:jointAngle
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Gap ;
+ rdfs:range xsd:float ;
+ rdfs:label "joint angle"@en ;
+ skos:definition "Maximum flexion angle of a non-rigid joint gap."@en ;
+ skos:scopeNote "Unit: °"@en .
+
+# ── Terrain data properties ───────────────────────────────────────────────────
+
+pvc:vertexCount
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Terrain ;
+ rdfs:range xsd:positiveInteger ;
+ rdfs:label "vertex count"@en ;
+ skos:definition "Number of vertices in the triangulated terrain surface mesh."@en .
+
+pvc:triangleCount
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Terrain ;
+ rdfs:range xsd:positiveInteger ;
+ rdfs:label "triangle count"@en ;
+ skos:definition "Number of triangular faces in the terrain surface mesh."@en .
+
+# ── Project data properties ───────────────────────────────────────────────────
+
+pvc:projectName
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Project ;
+ rdfs:range xsd:string ;
+ rdfs:label "project name"@en ;
+ skos:definition "Name of the PV project."@en .
+
+pvc:drawing
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Project ;
+ rdfs:range xsd:string ;
+ rdfs:label "drawing reference"@en ;
+ skos:definition "Drawing or document reference associated with the project."@en .
+
+pvc:company
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Project ;
+ rdfs:range xsd:string ;
+ rdfs:label "company"@en ;
+ skos:definition "Name of the company or organisation responsible for the project."@en .
+
+pvc:country
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Project ;
+ rdfs:range xsd:string ;
+ rdfs:label "country"@en ;
+ skos:definition "ISO 3166 alpha-2 or alpha-3 country code for the project location."@en .
+
+pvc:timezone
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Project ;
+ rdfs:range xsd:string ;
+ rdfs:label "timezone"@en ;
+ skos:definition "IANA timezone string for the project location (e.g., 'America/Phoenix')."@en .
+
+pvc:timezoneOffset
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Project ;
+ rdfs:range xsd:float ;
+ rdfs:label "timezone offset"@en ;
+ skos:definition "UTC offset in hours; positive values are East of UTC."@en ;
+ skos:scopeNote "Unit: h"@en .
+
+pvc:localProjection
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Project ;
+ rdfs:range xsd:string ;
+ rdfs:label "local projection"@en ;
+ skos:definition
+ """EPSG code for the coordinate projection used to relate local (x,y,z) coordinates to geocoordinates (e.g., 'EPSG:3857')."""@en .
+
+pvc:moduleCount
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Project ;
+ rdfs:range xsd:positiveInteger ;
+ rdfs:label "module count"@en ;
+ skos:definition "Total number of PV modules in the system."@en .
+
+pvc:tableCount
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Project ;
+ rdfs:range xsd:positiveInteger ;
+ rdfs:label "table count"@en ;
+ skos:definition "Total number of tables in the physical layout."@en .
+
+pvc:stringCount
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Project ;
+ rdfs:range xsd:positiveInteger ;
+ rdfs:label "string count"@en ;
+ skos:definition "Total number of series-connected module strings."@en .
+
+pvc:systemCapacityDC
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Project ;
+ rdfs:range xsd:float ;
+ rdfs:label "system DC capacity"@en ;
+ skos:definition "Total DC nameplate capacity of the PV system at STC."@en ;
+ skos:scopeNote "Unit: W"@en ;
+ qudt:applicableUnit unit:W .
+
+pvc:systemCapacityAC
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Project ;
+ rdfs:range xsd:float ;
+ rdfs:label "system AC capacity"@en ;
+ skos:definition "Total AC capacity at the inverter rating condition."@en ;
+ skos:scopeNote "Unit: W"@en ;
+ qudt:applicableUnit unit:W .
+
+pvc:interconnectionLimit
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:Project ;
+ rdfs:range xsd:float ;
+ rdfs:label "interconnection limit"@en ;
+ skos:definition "AC power limit imposed by the grid interconnection agreement."@en ;
+ skos:scopeNote "Unit: W"@en ;
+ qudt:applicableUnit unit:W .
+
+# ── CableTo data properties ───────────────────────────────────────────────────
+
+pvc:cableLength
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:CableTo ;
+ rdfs:range xsd:decimal ;
+ rdfs:label "cable length"@en ;
+ skos:definition "Installed length of this cable run."@en ;
+ skos:scopeNote "Unit: m (assumed SI default; verify against project file)"@en .
+
+# ── ModuleLayout data properties ──────────────────────────────────────────────
+
+pvc:positionInString
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:ModuleLayout ;
+ rdfs:range xsd:integer ;
+ rdfs:label "position in string"@en ;
+ skos:definition "Sequential index of this module within its series string (1-based)."@en .
+
+pvc:rackRow
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:ModuleLayout ;
+ rdfs:range xsd:integer ;
+ rdfs:label "rack row"@en ;
+ skos:definition "Row index of the module slot on the physical rack."@en .
+
+pvc:rackColumn
+ a owl:DatatypeProperty ;
+ rdfs:domain pvc:ModuleLayout ;
+ rdfs:range xsd:integer ;
+ rdfs:label "rack column"@en ;
+ skos:definition "Column index of the module slot on the physical rack."@en .
+
+###############################################################################
+# E N D O F F I L E
+###############################################################################