@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix dc: <http://purl.org/dc/elements/1.1/> .
@prefix scv: <http://purl.org/NET/scovo#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix measurement: <http://www.telegraphis.net/ontology/measurement/measurement#> .

<http://www.telegraphis.net/ontology/measurement/measurement#> a owl:Ontology;
    dc:title "Measurement Ontology";
    dc:description """The Measurement Ontology is an ontology in which measurements may be rendered."""@en;
    dc:creator <http://www.pipian.com/people/pipian/card#me>.

dc:description a owl:AnnotationProperty.
dc:creator a owl:AnnotationProperty.
dc:title a owl:AnnotationProperty.

measurement:Measurement a owl:Class;
    rdfs:label "Measurement"@en;
    rdfs:description "A measurement is a statistic that measures a quantity that may or may not have units."@en;
    rdfs:subClassOf scv:Item,
      [ a owl:Restriction;
        owl:onProperty measurement:quantityMeasured;
        owl:cardinality "1"^^xsd:nonNegativeInteger ].
      [ a owl:Restriction;
        owl:onProperty measurement:units;
        owl:maxCardinality "1"^^xsd:nonNegativeInteger ].

measurement:Quantity a owl:Class;
    rdfs:label "Quantity"@en;
    rdfs:description "A quantity is a quantifiable quality of an object."@en;
    rdfs:subClassOf scv:Dimension;
    owl:disjointWith measurement:Unit, measurement:UnitClass.

measurement:Unit a owl:Class;
    rdfs:label "Unit"@en;
    rdfs:description "A unit is a particular quantity against which another quantity may be compared.  Hence, a unit is dimensionful and provides a ratio by which a quantity may be measured."@en;
    rdfs:subClassOf scv:Dimension;
    owl:disjointWith measurement:Quantity, measurement:UnitClass.

measurement:UnitClass a owl:Restriction, owl:Class;
    rdfs:label "Unit Class"@en;
    rdfs:description "A unit class is a subset of units, with no particular restriction on its contents (i.e. it may be a set of units measuring orthogonal quantities, making a UnitSystem, or a set of units measuring the same quantity)."@en;
    rdfs:subClassOf owl:Class;
    owl:onProperty rdfs:subClassOf;
    owl:hasValue measurement:Unit;
    owl:disjointWith measurement:Quantity, measurement:Unit.

measurement:UnitSystem a owl:Class;
    rdfs:label "Unit System"@en;
    rdfs:description "A unit system is a class of units for which no two elements in the class measure the same dimension (i.e. all dimensions are orthogonal to each other, or measure dimensions derived from a set of orthogonal dimensions with units derived from the units that measure those orthogonal dimensions specified in the system."@en;
    rdfs:subClassOf measurement:UnitClass.

measurement:equivalentUnitClass a owl:FunctionalProperty, owl:ObjectProperty;
    rdfs:label "equivalent unit class"@en;
    rdfs:description "An equivalent unit class of a quantity is the unit class corresponding to units that measure the quantity."@en;
    rdfs:domain measurement:Quantity;
    rdfs:range measurement:UnitClass;
    owl:inverseOf measurement:quantityMeasured.

measurement:equivalentQuantity a owl:InverseFunctionalProperty, owl:ObjectProperty;
    rdfs:label "equivalent quantity"@en;
    rdfs:description "An equivalent quantity of a unit class is the quantity measured by all units in the unit class."@en;
    rdfs:domain measurement:UnitClass;
    rdfs:range measurement:Quantity;
    owl:inverseOf measurement:unitClass.

measurement:quantityMeasured a owl:FunctionalProperty, owl:ObjectProperty;
    rdfs:label "measured quantity"@en;
    rdfs:description "The quantity measured for a measurement."@en;
    rdfs:subPropertyOf scv:dimension;
    rdfs:domain measurement:Measurement;
    rdfs:range measurement:Quantity.

measurement:unit a owl:FunctionalProperty, owl:ObjectProperty;
    rdfs:label "unit"@en;
    rdfs:description "The unit a measurement is made in."@en;
    rdfs:subPropertyOf scv:dimension;
    rdfs:domain measurement:Measurement;
    rdfs:range measurement:Unit.

# Now, some sample quantities.

measurement:Area a measurement:Quantity;
    rdfs:label "Area"@en;
    measurement:equivalentUnitClass measurement:AreaUnit.

measurement:AreaUnit a measurement:UnitClass;
    rdfs:label "Area Unit"@en;
    rdfs:subClassOf measurement:Unit;
    measurement:equivalentQuantity measurement:Area.

measurement:Km2 a measurement:AreaUnit;
    rdfs:label "square kilometers"@en.

measurement:AreaMeasurement a owl:Class;
    rdfs:label "Area Measurement"@en;
    rdfs:subClassOf measurement:Measurement;
    rdfs:subClassOf [ a owl:Restriction;
        owl:onProperty measurement:measuredQuantity;
	owl:hasValue measurement:Area ],
      [ a owl:Restriction;
        owl:onProperty measurement:unit;
        owl:hasValue [ a measurement:AreaUnit ] ].

measurement:area a owl:ObjectProperty;
    rdfs:label "area"@en;
    rdfs:range measurement:AreaMeasurement.

