@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix : <http://purl.org/ppeo/PPEO.owl#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix xml: <http://www.w3.org/XML/1998/namespace> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix dc: <http://purl.org/dc/elements/1.1/> .

<http://purl.org/ppeo/PPEO.owl>
    dc:creator "Bruno Vasques Costa"^^xsd:string, "Cyril Pommier"^^xsd:string, "Daniel Faria"^^xsd:string, "Evangelia Papoutsoglou"^^xsd:string, "Guillaume Cornut"^^xsd:string, "Hanna Cwiek-Kupczynska"^^xsd:string, "Ines Chaves"^^xsd:string, "Manuel Ruiz"^^xsd:string, "Marie Angélique Laporte"^^xsd:string, "Pascal Neveu"^^xsd:string, "Pierre Larmande"^^xsd:string ;
    a owl:Ontology .

:GPS_location
    a owl:Class ;
    rdfs:label "GPS location"@en ;
    rdfs:subClassOf :location ;
    owl:equivalentClass [
        a owl:Class ;
        owl:intersectionOf ([
                a owl:Restriction ;
                owl:onDataRange xsd:float ;
                owl:onProperty :hasLatitude ;
                owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger
            ]
            [
                a owl:Restriction ;
                owl:onDataRange xsd:float ;
                owl:onProperty :hasLongitude ;
                owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger
            ]
        )
    ] .

:altitude
    :hasType "altitude"^^xsd:string ;
    a :spatial_coordinate, owl:NamedIndividual ;
    rdfs:comment "The global spatial coordinate altitude (in meters)"@en .

:biological_material
    :hasBrAPISynonym "germplasm"@en ;
    a owl:Class ;
    rdfs:comment "An organism that was the subject of the study and/or was observed in an observation unit."@en ;
    rdfs:label "biological material"@en ;
    rdfs:subClassOf [
        a owl:Restriction ;
        owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ;
        owl:onClass :GPS_location ;
        owl:onProperty :hasLocation
    ], [
        a owl:Restriction ;
        owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ;
        owl:onClass :material_source ;
        owl:onProperty :hasMaterialSource
    ], [
        a owl:Restriction ;
        owl:onDataRange [
            a rdfs:Datatype ;
            owl:unionOf (xsd:anyURI
                xsd:string
            )
        ] ;
        owl:onProperty :hasMaterialIdentifier ;
        owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger
    ], [
        a owl:Restriction ;
        owl:onDataRange [
            a rdfs:Datatype ;
            owl:unionOf (xsd:anyURI
                xsd:string
            )
        ] ;
        owl:onProperty :hasTaxonIdentifier ;
        owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger
    ], [
        a owl:Restriction ;
        owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ;
        owl:onDataRange xsd:string ;
        owl:onProperty :hasGenus
    ], [
        a owl:Restriction ;
        owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ;
        owl:onDataRange xsd:string ;
        owl:onProperty :hasSpecies
    ] .

:column
    :hasType "column"^^xsd:string ;
    a :spatial_coordinate, owl:NamedIndividual ;
    rdfs:comment "The local spatial coordinate identifying the column"@en .

:country
    a owl:Class ;
    rdfs:comment "A country in the world that either presently exists (i.e. is recognized in status by most entities) or existed at the time of the study."@en ;
    rdfs:label "country"@en ;
    rdfs:subClassOf [
        a owl:Restriction ;
        owl:onProperty :hasName ;
        owl:someValuesFrom xsd:string
    ] .

:data_file
    a owl:Class ;
    rdfs:comment "A description of and link to a file or data stream holding some or all of the data described by the MIAPPE submission."@en ;
    rdfs:label "data file"@en ;
    rdfs:subClassOf [
        a owl:Restriction ;
        owl:onDataRange xsd:string ;
        owl:onProperty :hasDescription ;
        owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger
    ], [
        a owl:Restriction ;
        owl:onDataRange [
            a rdfs:Datatype ;
            owl:unionOf (xsd:anyURI
                xsd:string
            )
        ] ;
        owl:onProperty :hasDigitalLocation ;
        owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger
    ], [
        a owl:Restriction ;
        owl:onDataRange xsd:string ;
        owl:onProperty :hasVersion ;
        owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger
    ] .

:derivesFrom
    a owl:ObjectProperty ;
    rdfs:domain :sample ;
    rdfs:label "derives from"@en ;
    rdfs:range :observation_unit .

:environment
    a owl:Class ;
    rdfs:comment "The set of environmental parameters or experimental conditions that were kept constant during the study and did not change betweeen observation units or assays."@en ;
    rdfs:label "environment"@en ;
    rdfs:subClassOf [
        a owl:Restriction ;
        owl:onProperty :hasEnvironmentParameter ;
        owl:someValuesFrom :environment_parameter
    ] .

:environment_parameter
    a owl:Class ;
    rdfs:comment "A parameter of the environment which is represented by a name and a value."@en ;
    rdfs:label "environment parameter"@en ;
    rdfs:subClassOf [
        a owl:Restriction ;
        owl:onDataRange xsd:string ;
        owl:onProperty :hasName ;
        owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger
    ], [
        a owl:Restriction ;
        owl:onDataRange [
            a rdfs:Datatype ;
            owl:unionOf (xsd:float
                xsd:int
                xsd:string
            )
        ] ;
        owl:onProperty :hasValue ;
        owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger
    ] .

:event
    :hasRelatedSynonym "time factor"@en ;
    a owl:Class ;
    rdfs:comment "A discrete change to the state of one or more observation units that happened at a given point in time, be it deliberate or inadvertent."@en ;
    rdfs:label "event"@en ;
    rdfs:subClassOf [
        a owl:Restriction ;
        owl:onProperty :hasDateTime ;
        owl:someValuesFrom xsd:dateTime
    ], [
        a owl:Restriction ;
        owl:onDataRange xsd:string ;
        owl:onProperty :hasType ;
        owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger
    ], [
        a owl:Restriction ;
        owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ;
        owl:onDataRange xsd:string ;
        owl:onProperty :hasDescription
    ], [
        a owl:Restriction ;
        owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ;
        owl:onDataRange [
            a rdfs:Datatype ;
            owl:unionOf (xsd:anyURI
                xsd:string
            )
        ] ;
        owl:onProperty :hasExternalIdentifier
    ] .

:experimental_design
    a owl:Class ;
    rdfs:label "experimental design"@en ;
    rdfs:subClassOf [
        a owl:Restriction ;
        owl:onDataRange xsd:string ;
        owl:onProperty :hasDescription ;
        owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger
    ], [
        a owl:Restriction ;
        owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ;
        owl:onDataRange [
            a rdfs:Datatype ;
            owl:unionOf (xsd:anyURI
                xsd:string
            )
        ] ;
        owl:onProperty :hasType
    ] .

:factor
    a owl:Class ;
    rdfs:comment "A condition that varies between observation units, by taking different values or modalities, assessing the effect of which is the goal of the study. A factor may be biotic (pest, disease interaction) or abiotic (treatment, cultural practice) in nature. It must have at least two values or modalities."@en ;
    rdfs:label "factor"@en ;
    rdfs:subClassOf [
        a owl:Restriction ;
        owl:minQualifiedCardinality "2"^^xsd:nonNegativeInteger ;
        owl:onClass :factor_value ;
        owl:onProperty :hasModality
    ], [
        a owl:Restriction ;
        owl:onDataRange xsd:string ;
        owl:onProperty :hasType ;
        owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger
    ], [
        a owl:Restriction ;
        owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ;
        owl:onDataRange xsd:string ;
        owl:onProperty :hasDescription
    ] .

:factor_value
    a owl:Class ;
    rdfs:comment "A value or modality of a factor."@en ;
    rdfs:label "factor value"@en ;
    rdfs:subClassOf [
        a owl:Restriction ;
        owl:onClass :factor ;
        owl:onProperty :isModalityOf ;
        owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger
    ], [
        a owl:Restriction ;
        owl:onDataRange [
            a rdfs:Datatype ;
            owl:unionOf (xsd:float
                xsd:int
                xsd:string
            )
        ] ;
        owl:onProperty :hasValue ;
        owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger
    ] .

:growth_facility
    a owl:Class ;
    rdfs:comment "A facility in which plants can be grown, such as a field or greenhouse."@en ;
    rdfs:label "growth facility"@en ;
    rdfs:subClassOf [
        a owl:Restriction ;
        owl:onDataRange xsd:string ;
        owl:onProperty :hasDescription ;
        owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger
    ], [
        a owl:Restriction ;
        owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ;
        owl:onDataRange [
            a rdfs:Datatype ;
            owl:unionOf (xsd:anyURI
                xsd:string
            )
        ] ;
        owl:onProperty :hasType
    ] .

:hasAbbreviation
    a owl:DatatypeProperty ;
    rdfs:label "has abbreviation"@en ;
    rdfs:range xsd:string .

:hasAddress
    a owl:DatatypeProperty, owl:FunctionalProperty ;
    rdfs:domain :location ;
    rdfs:label "has address"@en ;
    rdfs:range xsd:string .

:hasAffiliation
    a owl:ObjectProperty ;
    rdfs:domain :person ;
    rdfs:label "has affiliation"@en ;
    rdfs:range :institution .

:hasAltitude
    a owl:DatatypeProperty, owl:FunctionalProperty ;
    rdfs:comment "The altitude of a location in metres"@en ;
    rdfs:domain :location ;
    rdfs:label "has altitude"@en ;
    rdfs:range xsd:float .

:hasAssociatedPublication
    a owl:DatatypeProperty ;
    rdfs:domain [
        a owl:Class ;
        owl:unionOf (:investigation
            :method
        )
    ] ;
    rdfs:label "has associated publication"@en ;
    rdfs:range [
        a rdfs:Datatype ;
        owl:unionOf (xsd:anyURI
            xsd:string
        )
    ] .

:hasBiologicalMaterial
    a owl:ObjectProperty ;
    rdfs:domain [
        a owl:Class ;
        owl:unionOf (:observation_unit
            :study
        )
    ] ;
    rdfs:label "has biological material"@en ;
    rdfs:range :biological_material .

:hasBrAPISynonym
    a owl:AnnotationProperty ;
    rdfs:label "has BrAPI synonym"@en .

:hasCollectionDate
    a owl:DatatypeProperty ;
    rdfs:domain :sample ;
    rdfs:label "has collection date"@en ;
    rdfs:range xsd:dateTime ;
    rdfs:subPropertyOf :hasDateTime .

:hasContactInstitution
    a owl:ObjectProperty ;
    rdfs:domain :study ;
    rdfs:label "has contact institution"@en ;
    rdfs:range :institution .

:hasCountry
    a owl:FunctionalProperty, owl:ObjectProperty ;
    rdfs:domain :location ;
    rdfs:label "has country"@en ;
    rdfs:range :country .

:hasCountryCode
    a owl:DatatypeProperty ;
    rdfs:comment "An ISO 3166-1 country code with either 2 or 3 letters (alpha-2 or alpha-3)."@en ;
    rdfs:domain :country ;
    rdfs:label "has country code"@en ;
    rdfs:range xsd:string ;
    rdfs:subPropertyOf :hasExternalIdentifier .

:hasCountryOfOrigin
    a owl:ObjectProperty ;
    rdfs:domain :biological_material ;
    rdfs:label "has country of origin"@en ;
    rdfs:range :country ;
    owl:propertyChainAxiom (:hasMaterialSource
        :hasLocation
        :hasCountry
    ) .

:hasCulturalPractices
    a owl:DatatypeProperty ;
    rdfs:domain :study ;
    rdfs:label "has cultural practices"@en ;
    rdfs:range xsd:string .

:hasDOI
    a owl:DatatypeProperty, owl:FunctionalProperty ;
    rdfs:comment "An external identifier that is specifically a DOI, given either as just the DOI code (string) or as an URI. The entity <=> DOI relation should be bijective."@en ;
    rdfs:label "has DOI"@en ;
    rdfs:range [
        a rdfs:Datatype ;
        owl:unionOf (xsd:anyURI
            xsd:string
        )
    ] ;
    rdfs:subPropertyOf :hasExternalIdentifier .

:hasDataFile
    a owl:ObjectProperty ;
    rdfs:domain :study ;
    rdfs:label "has data file"@en ;
    rdfs:range :data_file .

:hasDatabaseId
    a owl:DatatypeProperty ;
    rdfs:comment "An external identifier that is specifically a database identifier."@en ;
    rdfs:label "has database identifier"@en ;
    rdfs:range [
        a rdfs:Datatype ;
        owl:unionOf (xsd:anyURI
            xsd:string
        )
    ] ;
    rdfs:subPropertyOf :hasExternalIdentifier .

:hasDateTime
    a owl:DatatypeProperty ;
    rdfs:label "has date-time"@en ;
    rdfs:range xsd:dateTime .

:hasDescription
    a owl:DatatypeProperty ;
    rdfs:label "has description"@en ;
    rdfs:range xsd:string .

:hasDigitalLocation
    a owl:DatatypeProperty ;
    rdfs:comment "The location of the file in the form of a URI or,  if the file is contained within a local MIAPPE submission (e.g. ISA-Tab), a path or file name."@en ;
    rdfs:domain :data_file ;
    rdfs:label "has digital location"@en ;
    rdfs:range [
        a rdfs:Datatype ;
        owl:unionOf (xsd:anyURI
            xsd:string
        )
    ] .

:hasEmailContact
    a owl:DatatypeProperty ;
    rdfs:comment "The e-mail address of a person"@en ;
    rdfs:domain :person ;
    rdfs:label "has e-mail contact"@en ;
    rdfs:range xsd:string .

:hasEndDateTime
    a owl:DatatypeProperty, owl:FunctionalProperty ;
    rdfs:label "has end date-time"@en ;
    rdfs:range xsd:dateTime ;
    rdfs:subPropertyOf :hasDateTime .

:hasEntryNumber
    a owl:DatatypeProperty, owl:FunctionalProperty ;
    rdfs:comment "Used in BrAPI Phenotypes call"@en ;
    rdfs:label "has entry number"@en ;
    rdfs:range xsd:int .

:hasEntryType
    a owl:DatatypeProperty, owl:FunctionalProperty ;
    rdfs:comment "Used in BrAPI Phenotypes call"@en ;
    rdfs:label "has entry type"@en ;
    rdfs:range xsd:string .

:hasEnvironment
    a owl:ObjectProperty ;
    rdfs:domain :study ;
    rdfs:label "has environment"@en ;
    rdfs:range :environment .

:hasEnvironmentParameter
    a owl:ObjectProperty ;
    rdfs:domain :environment ;
    rdfs:label "has environment parameter"@en ;
    rdfs:range :environment_parameter .

:hasEvent
    a owl:ObjectProperty ;
    rdfs:domain [
        a owl:Class ;
        owl:unionOf (:observation_unit
            :study
        )
    ] ;
    rdfs:label "has event"@en ;
    rdfs:range :event .

:hasExactSynonym
    a owl:AnnotationProperty ;
    rdfs:label "has exact synonym"@en .

:hasExperimentalDesign
    a owl:ObjectProperty ;
    rdfs:domain :study ;
    rdfs:label "has experimental design"@en ;
    rdfs:range :experimental_design .

:hasExperimentalDesignMap
    a owl:DatatypeProperty ;
    rdfs:comment "A map of the experimental design of the study, in gis or excel"@en ;
    rdfs:domain :study ;
    rdfs:label "has experimental design map"@en ;
    rdfs:range [
        a rdfs:Datatype ;
        owl:unionOf (xsd:anyURI
            xsd:string
        )
    ] .

:hasExternalIdentifier
    a owl:DatatypeProperty ;
    rdfs:comment "An identifier from another public resource, such as an ontology or database, either in the form of an accession number, or in the form of a URI. An external identifier should be globally unique."@en ;
    rdfs:label "has external identifier"@en ;
    rdfs:range [
        a rdfs:Datatype ;
        owl:unionOf (xsd:anyURI
            xsd:string
        )
    ] ;
    rdfs:subPropertyOf :hasIdentifier .

:hasFactor
    a owl:ObjectProperty ;
    rdfs:domain :study ;
    rdfs:label "has factor"@en ;
    rdfs:range :factor .

:hasFactorValue
    a owl:ObjectProperty ;
    rdfs:domain :observation_unit ;
    rdfs:label "has factor value"@en ;
    rdfs:range :factor_value .

:hasGenus
    a owl:DatatypeProperty, owl:FunctionalProperty ;
    rdfs:domain :biological_material ;
    rdfs:label "has genus"@en ;
    rdfs:range xsd:string .

:hasGermplasmAccessionNumber
    a owl:DatatypeProperty ;
    rdfs:comment "A unique identifier for a germplasm."@en ;
    rdfs:domain [
        a owl:Class ;
        owl:unionOf (:biological_material
            :material_source
        )
    ] ;
    rdfs:label "has germplasm accession number"@en ;
    rdfs:range [
        a rdfs:Datatype ;
        owl:unionOf (xsd:anyURI
            xsd:string
        )
    ] ;
    rdfs:subPropertyOf :hasExternalIdentifier, :hasMaterialIdentifier .

:hasGrowthFacility
    a owl:ObjectProperty ;
    rdfs:domain :study ;
    rdfs:label "has growth facility"@en ;
    rdfs:range :growth_facility .

:hasISASynonym
    a owl:AnnotationProperty ;
    rdfs:label "has ISA synonym"@en .

:hasIdentifier
    a owl:DatatypeProperty ;
    rdfs:label "has identifier"@en ;
    rdfs:range [
        a rdfs:Datatype ;
        owl:unionOf (xsd:anyURI
            xsd:string
        )
    ] .

:hasInfraspecificName
    a owl:DatatypeProperty ;
    rdfs:comment "Name of any subtaxa level, including variety, crossing name, etc. It can be used to store any additional taxonomic identifier. Either free text description or key-value pair list format (the key is the name of the rank and the value is the value of  the rank). Ranks can be among the following terms: subspecies, cultivar, variety, subvariety, convariety, group, subgroup, hybrid, line, form, subform. For MCPD compliance, the following abbreviations are allowed: ‘subsp.’ (subspecies); ‘convar.’ (convariety); ‘var.’ (variety); ‘f.’ (form); ‘Group’ (cultivar group)."@en ;
    rdfs:domain :biological_material ;
    rdfs:label "has infraspecific name"@en ;
    rdfs:range xsd:string .

:hasInstituteCode
    a owl:DatatypeProperty, owl:FunctionalProperty ;
    rdfs:comment "A code or acronym of an institution."@en ;
    rdfs:domain :institution ;
    rdfs:label "has institute code"@en ;
    rdfs:range xsd:string ;
    rdfs:subPropertyOf :hasExternalIdentifier .

:hasInternalIdentifier
    a owl:DatatypeProperty ;
    rdfs:comment "An identifier used internally, either only in the MIAPPE submission itself, or also on a non-public database whence the information was retrieved. An internal identifier need only be unique among entities of the same type within a MIAPPE submission."@en ;
    rdfs:label "has internal identifier"@en ;
    rdfs:range [
        a rdfs:Datatype ;
        owl:unionOf (xsd:anyURI
            xsd:string
        )
    ] ;
    rdfs:subPropertyOf :hasIdentifier .

:hasLatitude
    a owl:DatatypeProperty, owl:FunctionalProperty ;
    rdfs:comment "The latitude of a location in degrees, in the decimal system"@en ;
    rdfs:domain :location ;
    rdfs:label "has latitude"@en ;
    rdfs:range xsd:float .

:hasLicense
    a owl:DatatypeProperty, owl:FunctionalProperty ;
    rdfs:domain :investigation ;
    rdfs:label "has license"@en ;
    rdfs:range xsd:string .

:hasLocation
    a owl:ObjectProperty ;
    rdfs:label "has location"@en ;
    rdfs:range :location .

:hasLongitude
    a owl:DatatypeProperty, owl:FunctionalProperty ;
    rdfs:comment "The longitude of a location in degrees, in the decimal system"@en ;
    rdfs:domain :location ;
    rdfs:label "has longitude"@en ;
    rdfs:range xsd:float .

:hasMIAPPESynonym
    a owl:AnnotationProperty ;
    rdfs:label "has MIAPPE synonym"@en .

:hasMIAPPEVersion
    a owl:DatatypeProperty ;
    rdfs:domain :investigation ;
    rdfs:label "has MIAPPE version"@en ;
    rdfs:range xsd:string .

:hasMaterialIdentifier
    a owl:DatatypeProperty ;
    rdfs:comment "An identifier used specifically for biological materials (and their sources) which can be internal or external. For material sources, it usually follows one of two forms: a key-value pair comprising the name/identifer of the repository from which the material was sourced plus the accession number of the repository for that material, or, where an accession number has not been assigned, but the material has been derived from the crossing of known accessions, \"mother_accession X father_accession\" (father_accession can be \"UNKNOWN\")."@en ;
    rdfs:domain [
        a owl:Class ;
        owl:unionOf (:biological_material
            :material_source
        )
    ] ;
    rdfs:label "has material identifier"@en ;
    rdfs:range [
        a rdfs:Datatype ;
        owl:unionOf (xsd:anyURI
            xsd:string
        )
    ] ;
    rdfs:subPropertyOf :hasIdentifier .

:hasMaterialSource
    a owl:ObjectProperty ;
    rdfs:domain :biological_material ;
    rdfs:label "has material source"@en ;
    rdfs:range :material_source .

:hasMethod
    a owl:ObjectProperty ;
    rdfs:domain :observed_variable ;
    rdfs:label "has method"@en ;
    rdfs:range :method .

:hasModality
    a owl:ObjectProperty ;
    rdfs:domain :factor ;
    rdfs:label "has modality"@en ;
    rdfs:range :factor_value ;
    owl:inverseOf :isModalityOf .

:hasName
    :hasExactSynonym "has title"@en ;
    a owl:DatatypeProperty ;
    rdfs:label "has name"@en ;
    rdfs:range xsd:string .

:hasObservation
    a owl:ObjectProperty ;
    rdfs:domain :data_file ;
    rdfs:label "has observation"@en ;
    rdfs:range :observation .

:hasObservationLevel
    a owl:ObjectProperty ;
    rdfs:domain :observation_unit ;
    rdfs:label "has observation level"@en ;
    rdfs:range :observation_level .

:hasObservationLevelHierarchy
    a owl:ObjectProperty ;
    rdfs:domain :study ;
    rdfs:label "has observation level hierarchy"@en ;
    rdfs:range :observation_level_hierarchy .

:hasObservationUnitDescription
    a owl:DatatypeProperty ;
    rdfs:domain :study ;
    rdfs:label "has observation unit description"@en ;
    rdfs:range xsd:string .

:hasObservedSubject
    a owl:ObjectProperty ;
    rdfs:domain :observation ;
    rdfs:label "has observed subject"@en ;
    rdfs:range [
        a owl:Class ;
        owl:unionOf (:observation_unit
            :sample
        )
    ] ;
    owl:inverseOf :isSubjectOfObservation .

:hasOntologyRecommendation
    a owl:AnnotationProperty ;
    rdfs:label "has ontology recommendation"@en .

:hasPart
    a owl:ObjectProperty, owl:TransitiveProperty ;
    rdfs:label "has part"@en ;
    owl:inverseOf :partOf .

:hasParticipatingInstitution
    a owl:ObjectProperty ;
    rdfs:domain [
        a owl:Class ;
        owl:unionOf (:investigation
            :study
        )
    ] ;
    rdfs:label "has participating institution"@en ;
    rdfs:range :institution ;
    owl:propertyChainAxiom (:hasPersonWithRole
        :isRoleOf
        :hasAffiliation
    ) .

:hasPersonWithRole
    a owl:ObjectProperty ;
    rdfs:domain [
        a owl:Class ;
        owl:unionOf (:investigation
            :study
        )
    ] ;
    rdfs:label "has person with role"@en ;
    rdfs:range :role ;
    owl:inverseOf :isRoleOfPersonIn .

:hasPlantAnatomicalEntity
    a owl:DatatypeProperty ;
    rdfs:domain :sample ;
    rdfs:label "has plant anatomical entity"@en ;
    rdfs:range [
        a rdfs:Datatype ;
        owl:unionOf (xsd:anyURI
            xsd:string
        )
    ] .

:hasPlantStructureDevelopmentStage
    a owl:DatatypeProperty ;
    rdfs:domain :sample ;
    rdfs:label "has plant structure development stage"@en ;
    rdfs:range [
        a rdfs:Datatype ;
        owl:unionOf (xsd:anyURI
            xsd:string
        )
    ] .

:hasPreprocessing
    a owl:DatatypeProperty ;
    rdfs:domain :biological_material ;
    rdfs:label "has preprocessing"@en ;
    rdfs:range [
        a rdfs:Datatype ;
        owl:unionOf (xsd:anyURI
            xsd:string
        )
    ] .

:hasPublicReleaseDate
    a owl:DatatypeProperty, owl:FunctionalProperty ;
    rdfs:domain :investigation ;
    rdfs:label "has public release date"@en ;
    rdfs:range xsd:dateTime ;
    rdfs:subPropertyOf :hasDateTime .

:hasRelatedSynonym
    a owl:AnnotationProperty ;
    rdfs:label "has related synonym"@en .

:hasRole
    a owl:ObjectProperty ;
    rdfs:domain :person ;
    rdfs:label "has role"@en ;
    rdfs:range :role ;
    owl:inverseOf :isRoleOf .

:hasScale
    a owl:ObjectProperty ;
    rdfs:domain :observed_variable ;
    rdfs:label "has scale"@en ;
    rdfs:range :scale .

:hasSeason
    a owl:DatatypeProperty, owl:FunctionalProperty ;
    rdfs:domain :observation ;
    rdfs:label "has season"@en ;
    rdfs:range xsd:string .

:hasSpatialDistribution
    a owl:ObjectProperty ;
    rdfs:domain :observation_unit ;
    rdfs:label "has spatial distribution"@en ;
    rdfs:range :spatial_distribution .

:hasSpatialDistributionType
    a owl:ObjectProperty ;
    rdfs:domain :spatial_distribution ;
    rdfs:label "has spatial distribution type"@en ;
    rdfs:range :spatial_distribution_type .

:hasSpecies
    :hasExactSynonym "has specific epithet"@en ;
    a owl:DatatypeProperty, owl:FunctionalProperty ;
    rdfs:domain :biological_material ;
    rdfs:label "has species"@en ;
    rdfs:range xsd:string .

:hasSpeciesAuthority
    a owl:DatatypeProperty, owl:FunctionalProperty ;
    rdfs:domain :biological_material ;
    rdfs:label "has species authority"@en ;
    rdfs:range xsd:string .

:hasStartDateTime
    a owl:DatatypeProperty, owl:FunctionalProperty ;
    rdfs:label "has start date-time"@en ;
    rdfs:range xsd:dateTime ;
    rdfs:subPropertyOf :hasDateTime .

:hasSublevel
    a owl:IrreflexiveProperty, owl:ObjectProperty ;
    rdfs:domain :observation_level ;
    rdfs:label "has sublevel"@en ;
    rdfs:range :observation_level ;
    owl:inverseOf :hasSuperlevel .

:hasSubmissionDate
    a owl:DatatypeProperty, owl:FunctionalProperty ;
    rdfs:domain :investigation ;
    rdfs:label "has submission date"@en ;
    rdfs:range xsd:dateTime ;
    rdfs:subPropertyOf :hasDateTime .

:hasSubtaxon
    a owl:DatatypeProperty ;
    rdfs:domain :biological_material ;
    rdfs:label "has subtaxon"@en ;
    rdfs:range xsd:string .

:hasSubtaxonAuthority
    a owl:DatatypeProperty ;
    rdfs:domain :biological_material ;
    rdfs:label "has subtaxon authority"@en ;
    rdfs:range xsd:string .

:hasSuperlevel
    a owl:IrreflexiveProperty, owl:ObjectProperty ;
    rdfs:domain :observation_level ;
    rdfs:label "has superlevel"@en ;
    rdfs:range :observation_level .

:hasTaxonIdentifier
    a owl:DatatypeProperty ;
    rdfs:comment "An external identifier for a taxon that is either an NCBI Taxon identifier or an equivalent."@en ;
    rdfs:domain :biological_material ;
    rdfs:label "has taxon identifier"@en ;
    rdfs:range [
        a rdfs:Datatype ;
        owl:unionOf (xsd:anyURI
            xsd:string
        )
    ] ;
    rdfs:subPropertyOf :hasExternalIdentifier .

:hasTimeScale
    a owl:DatatypeProperty ;
    rdfs:domain :observed_variable ;
    rdfs:label "has time scale"@en ;
    rdfs:range xsd:string .

:hasTrait
    a owl:ObjectProperty ;
    rdfs:domain :observed_variable ;
    rdfs:label "has trait"@en ;
    rdfs:range :trait .

:hasType
    a owl:DatatypeProperty ;
    rdfs:label "has type"@en ;
    rdfs:range [
        a rdfs:Datatype ;
        owl:unionOf (xsd:anyURI
            xsd:string
        )
    ] .

:hasUncertainty
    a owl:DatatypeProperty, owl:FunctionalProperty ;
    rdfs:domain :location ;
    rdfs:label "has uncertainty"@en ;
    rdfs:range xsd:float .

:hasValue
    a owl:DatatypeProperty ;
    rdfs:label "has value"@en .

:hasVariable
    a owl:ObjectProperty ;
    rdfs:domain :observation ;
    rdfs:label "has variable"@en ;
    rdfs:range :observed_variable .

:hasVersion
    a owl:DatatypeProperty, owl:FunctionalProperty ;
    rdfs:domain :data_file ;
    rdfs:label "has version"@en ;
    rdfs:range xsd:string .

:institution
    a owl:Class ;
    rdfs:comment "An institution (academic or industrial) involved in the investigation or study."@en ;
    rdfs:label "institution"@en ;
    rdfs:subClassOf [
        a owl:Restriction ;
        owl:onProperty :hasLocation ;
        owl:someValuesFrom :named_location
    ], [
        a owl:Restriction ;
        owl:onDataRange xsd:string ;
        owl:onProperty :hasName ;
        owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger
    ] .

:investigation
    :hasBrAPISynonym "trial"@en ;
    a owl:Class ;
    rdfs:comment "A research programme with defined aims, which can vary in scale from a single experiment, to a grant-funded programme or various components comprising a peer-reviewed publication."@en ;
    rdfs:label "investigation"@en ;
    rdfs:subClassOf [
        a owl:Restriction ;
        owl:onProperty :hasPart ;
        owl:someValuesFrom :study
    ], [
        a owl:Restriction ;
        owl:onProperty :hasPersonWithRole ;
        owl:someValuesFrom :role
    ], [
        a owl:Restriction ;
        owl:onDataRange xsd:string ;
        owl:onProperty :hasMIAPPEVersion ;
        owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger
    ], [
        a owl:Restriction ;
        owl:onDataRange xsd:string ;
        owl:onProperty :hasName ;
        owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger
    ], [
        a owl:Restriction ;
        owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ;
        owl:onDataRange xsd:string ;
        owl:onProperty :hasDescription
    ], [
        a owl:Restriction ;
        owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ;
        owl:onDataRange [
            a rdfs:Datatype ;
            owl:unionOf (xsd:anyURI
                xsd:string
            )
        ] ;
        owl:onProperty :hasIdentifier
    ] .

:isActive
    a owl:DatatypeProperty, owl:FunctionalProperty ;
    rdfs:label "is active"@en ;
    rdfs:range xsd:boolean .

:isModalityOf
    a owl:ObjectProperty ;
    rdfs:domain :factor_value ;
    rdfs:label "is modality of"@en ;
    rdfs:range :factor .

:isRoleOf
    a owl:ObjectProperty ;
    rdfs:domain :role ;
    rdfs:label "is role of"@en ;
    rdfs:range :person .

:isRoleOfPersonIn
    a owl:ObjectProperty ;
    rdfs:domain :role ;
    rdfs:label "is role of person in"@en ;
    rdfs:range [
        a owl:Class ;
        owl:unionOf (:investigation
            :study
        )
    ] .

:isSubjectOfObservation
    a owl:ObjectProperty ;
    rdfs:domain [
        a owl:Class ;
        owl:unionOf (:observation_unit
            :sample
        )
    ] ;
    rdfs:label "is subject of observation"@en ;
    rdfs:range :observation .

:latitude
    :hasType "latitude"^^xsd:string ;
    a :spatial_coordinate, owl:NamedIndividual ;
    rdfs:comment "The global spatial coordinate latitude (in degrees in the decimal system)"@en .

:location
    a owl:Class ;
    rdfs:comment "A physical location, typically on planet Earth, identified by GPS coordinates and/or name and address."@en ;
    rdfs:label "location"@en .

:longitude
    :hasType "longitude"^^xsd:string ;
    a :spatial_coordinate, owl:NamedIndividual ;
    rdfs:comment "The global spatial coordinate latitude (in degrees in the decimal system)"@en .

:material_source
    a owl:Class ;
    rdfs:comment "An organism from which the organism(s) used in the study were derived. It should be identified with a unique external identifier (such as germplasm accession number) and possibly a DOI."@en ;
    rdfs:label "material source"@en ;
    rdfs:subClassOf [
        a owl:Restriction ;
        owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ;
        owl:onClass :GPS_location ;
        owl:onProperty :hasLocation
    ], [
        a owl:Restriction ;
        owl:onDataRange [
            a rdfs:Datatype ;
            owl:unionOf (xsd:anyURI
                xsd:string
            )
        ] ;
        owl:onProperty :hasMaterialIdentifier ;
        owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger
    ], [
        a owl:Restriction ;
        owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ;
        owl:onDataRange [
            a rdfs:Datatype ;
            owl:unionOf (xsd:anyURI
                xsd:string
            )
        ] ;
        owl:onProperty :hasDOI
    ], [
        a owl:Restriction ;
        owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ;
        owl:onDataRange xsd:string ;
        owl:onProperty :hasDescription
    ] .

:method
    a owl:Class ;
    rdfs:label "method"@en ;
    rdfs:subClassOf [
        a owl:Restriction ;
        owl:onDataRange xsd:string ;
        owl:onProperty :hasName ;
        owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger
    ], [
        a owl:Restriction ;
        owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ;
        owl:onDataRange xsd:string ;
        owl:onProperty :hasAssociatedPublication
    ], [
        a owl:Restriction ;
        owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ;
        owl:onDataRange xsd:string ;
        owl:onProperty :hasDescription
    ], [
        a owl:Restriction ;
        owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ;
        owl:onDataRange [
            a rdfs:Datatype ;
            owl:unionOf (xsd:anyURI
                xsd:string
            )
        ] ;
        owl:onProperty :hasExternalIdentifier
    ] .

:named_location
    a owl:Class ;
    rdfs:label "named location"@en ;
    rdfs:subClassOf :location ;
    owl:equivalentClass [
        a owl:Class ;
        owl:intersectionOf ([
                a owl:Restriction ;
                owl:onClass :country ;
                owl:onProperty :hasCountry ;
                owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger
            ]
            [
                a owl:Restriction ;
                owl:onDataRange xsd:string ;
                owl:onProperty :hasAddress ;
                owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger
            ]
            [
                a owl:Restriction ;
                owl:onDataRange xsd:string ;
                owl:onProperty :hasName ;
                owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger
            ]
        )
    ] .

:observation
    a owl:Class ;
    rdfs:label "observation"@en ;
    rdfs:subClassOf [
        a owl:Restriction ;
        owl:onClass [
            a owl:Class ;
            owl:unionOf (:observation_unit
                :sample
            )
        ] ;
        owl:onProperty :hasObservedSubject ;
        owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger
    ], [
        a owl:Restriction ;
        owl:onClass :observed_variable ;
        owl:onProperty :hasVariable ;
        owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger
    ], [
        a owl:Restriction ;
        owl:allValuesFrom [
            a rdfs:Datatype ;
            owl:unionOf (xsd:float
                xsd:int
                xsd:string
            )
        ] ;
        owl:onProperty :hasValue
    ] .

:observation_level
    a owl:Class ;
    rdfs:label "observation level"@en ;
    rdfs:subClassOf :spatial_distribution_type, [
        a owl:Restriction ;
        owl:minQualifiedCardinality "1"^^xsd:nonNegativeInteger ;
        owl:onClass :observation_level_hierarchy ;
        owl:onProperty :partOf
    ] .

:observation_level_hierarchy
    a owl:Class ;
    rdfs:label "observation level hierarchy"@en ;
    rdfs:subClassOf [
        a owl:Restriction ;
        owl:onProperty :hasPart ;
        owl:someValuesFrom :observation_level
    ] .

:observation_unit
    :hasExactSynonym "experiment unit"@en ;
    a owl:Class ;
    rdfs:label "observation unit"@en ;
    rdfs:subClassOf [
        a owl:Restriction ;
        owl:onProperty :hasBiologicalMaterial ;
        owl:someValuesFrom :biological_material
    ], [
        a owl:Restriction ;
        owl:onProperty :partOf ;
        owl:someValuesFrom :study
    ], [
        a owl:Restriction ;
        owl:onClass :observation_level ;
        owl:onProperty :hasObservationLevel ;
        owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger
    ], [
        a owl:Restriction ;
        owl:onDataRange [
            a rdfs:Datatype ;
            owl:unionOf (xsd:anyURI
                xsd:string
            )
        ] ;
        owl:onProperty :hasInternalIdentifier ;
        owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger
    ] .

:observed_variable
    :hasBrAPISynonym "observation variable"@en ;
    :hasISASynonym "assay"@en ;
    a owl:Class ;
    rdfs:label "observed variable"@en ;
    rdfs:subClassOf [
        a owl:Restriction ;
        owl:onProperty :partOf ;
        owl:someValuesFrom :study
    ], [
        a owl:Restriction ;
        owl:onClass :method ;
        owl:onProperty :hasMethod ;
        owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger
    ], [
        a owl:Restriction ;
        owl:onClass :scale ;
        owl:onProperty :hasScale ;
        owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger
    ], [
        a owl:Restriction ;
        owl:onClass :trait ;
        owl:onProperty :hasTrait ;
        owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger
    ], [
        a owl:Restriction ;
        owl:onDataRange [
            a rdfs:Datatype ;
            owl:unionOf (xsd:anyURI
                xsd:string
            )
        ] ;
        owl:onProperty :hasInternalIdentifier ;
        owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger
    ], [
        a owl:Restriction ;
        owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ;
        owl:onDataRange [
            a rdfs:Datatype ;
            owl:unionOf (xsd:anyURI
                xsd:string
            )
        ] ;
        owl:onProperty :hasExternalIdentifier
    ], [
        a owl:Restriction ;
        owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ;
        owl:onDataRange xsd:string ;
        owl:onProperty :hasName
    ] .

:partOf
    a owl:ObjectProperty, owl:TransitiveProperty ;
    rdfs:label "part of"@en .

:person
    a owl:Class ;
    rdfs:label "person"@en ;
    rdfs:subClassOf [
        a owl:Restriction ;
        owl:onProperty :hasAffiliation ;
        owl:someValuesFrom :institution
    ], [
        a owl:Restriction ;
        owl:onProperty :hasRole ;
        owl:someValuesFrom :role
    ], [
        a owl:Restriction ;
        owl:onDataRange xsd:string ;
        owl:onProperty :hasName ;
        owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger
    ], [
        a owl:Restriction ;
        owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ;
        owl:onDataRange xsd:string ;
        owl:onProperty :hasEmailContact
    ], [
        a owl:Restriction ;
        owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ;
        owl:onDataRange xsd:string ;
        owl:onProperty :hasIdentifier
    ] .

:role
    a owl:Class ;
    rdfs:label "role"@en ;
    rdfs:subClassOf [
        a owl:Restriction ;
        owl:onProperty :isRoleOf ;
        owl:someValuesFrom :person
    ], [
        a owl:Restriction ;
        owl:onProperty :isRoleOfPersonIn ;
        owl:someValuesFrom [
            a owl:Class ;
            owl:unionOf (:investigation
                :study
            )
        ]
    ], [
        a owl:Restriction ;
        owl:onDataRange xsd:string ;
        owl:onProperty :hasName ;
        owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger
    ] .

:row
    :hasType "row"^^xsd:string ;
    a :spatial_coordinate, owl:NamedIndividual ;
    rdfs:comment "The local spatial coordinate identifying the row"@en .

:sample
    a owl:Class ;
    rdfs:label "sample"@en ;
    rdfs:subClassOf [
        a owl:Restriction ;
        owl:onClass :observation_unit ;
        owl:onProperty :derivesFrom ;
        owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger
    ], [
        a owl:Restriction ;
        owl:allValuesFrom [
            a rdfs:Datatype ;
            owl:unionOf (xsd:anyURI
                xsd:string
            )
        ] ;
        owl:onProperty :hasExternalIdentifier
    ], [
        a owl:Restriction ;
        owl:onDataRange xsd:dateTime ;
        owl:onProperty :hasCollectionDate ;
        owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger
    ], [
        a owl:Restriction ;
        owl:onDataRange [
            a rdfs:Datatype ;
            owl:unionOf (xsd:anyURI
                xsd:string
            )
        ] ;
        owl:onProperty :hasInternalIdentifier ;
        owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger
    ], [
        a owl:Restriction ;
        owl:onDataRange [
            a rdfs:Datatype ;
            owl:unionOf (xsd:anyURI
                xsd:string
            )
        ] ;
        owl:onProperty :hasPlantAnatomicalEntity ;
        owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger
    ], [
        a owl:Restriction ;
        owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ;
        owl:onDataRange xsd:string ;
        owl:onProperty :hasDescription
    ], [
        a owl:Restriction ;
        owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ;
        owl:onDataRange [
            a rdfs:Datatype ;
            owl:unionOf (xsd:anyURI
                xsd:string
            )
        ] ;
        owl:onProperty :hasPlantStructureDevelopmentStage
    ] .

:scale
    a owl:Class ;
    rdfs:label "scale"@en ;
    rdfs:subClassOf [
        a owl:Restriction ;
        owl:onDataRange xsd:string ;
        owl:onProperty :hasName ;
        owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger
    ], [
        a owl:Restriction ;
        owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ;
        owl:onDataRange [
            a rdfs:Datatype ;
            owl:unionOf (xsd:anyURI
                xsd:string
            )
        ] ;
        owl:onProperty :hasExternalIdentifier
    ] .

:spatial_coordinate
    a owl:Class ;
    rdfs:label "spatial coordinate"@en ;
    rdfs:subClassOf :spatial_distribution_type ;
    owl:equivalentClass [
        a owl:Class ;
        owl:oneOf (:altitude
            :column
            :latitude
            :longitude
            :row
            :x
            :x_m
            :y
            :y_m
            :z
            :z_m
        )
    ] .

:spatial_distribution
    a owl:Class ;
    rdfs:label "spatial distribution"@en ;
    rdfs:subClassOf [
        a owl:Restriction ;
        owl:onClass :spatial_distribution_type ;
        owl:onProperty :hasSpatialDistributionType ;
        owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger
    ], [
        a owl:Restriction ;
        owl:onDataRange [
            a rdfs:Datatype ;
            owl:unionOf (xsd:float
                xsd:int
                xsd:string
            )
        ] ;
        owl:onProperty :hasValue ;
        owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger
    ] .

:spatial_distribution_type
    a owl:Class ;
    rdfs:label "spatial distribution type"@en ;
    rdfs:subClassOf [
        a owl:Restriction ;
        owl:onDataRange [
            a rdfs:Datatype ;
            owl:unionOf (xsd:anyURI
                xsd:string
            )
        ] ;
        owl:onProperty :hasType ;
        owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger
    ] .

:study
    :hasExactSynonym "experiment"@en ;
    a owl:Class ;
    rdfs:comment """A study (or experiment) comprises a series of assays (or measurements) of one or more types, undertaken to answer a particular biological question.
It is recommended that a Study have a description."""@en ;
    rdfs:label "study"@en ;
    rdfs:subClassOf [
        a owl:Restriction ;
        owl:onProperty :hasBiologicalMaterial ;
        owl:someValuesFrom :biological_material
    ], [
        a owl:Restriction ;
        owl:onProperty :hasPart ;
        owl:someValuesFrom :observation_unit
    ], [
        a owl:Restriction ;
        owl:onProperty :hasPart ;
        owl:someValuesFrom :observed_variable
    ], [
        a owl:Restriction ;
        owl:onProperty :partOf ;
        owl:someValuesFrom :investigation
    ], [
        a owl:Restriction ;
        owl:onClass :institution ;
        owl:onProperty :hasContactInstitution ;
        owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger
    ], [
        a owl:Restriction ;
        owl:onClass :growth_facility ;
        owl:onProperty :hasGrowthFacility ;
        owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger
    ], [
        a owl:Restriction ;
        owl:onClass :named_location ;
        owl:onProperty :hasLocation ;
        owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger
    ], [
        a owl:Restriction ;
        owl:onClass :experimental_design ;
        owl:onProperty :hasExperimentalDesign ;
        owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger
    ], [
        a owl:Restriction ;
        owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ;
        owl:onClass :environment ;
        owl:onProperty :hasEnvironment
    ], [
        a owl:Restriction ;
        owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ;
        owl:onClass :observation_level_hierarchy ;
        owl:onProperty :hasObservationLevelHierarchy
    ], [
        a owl:Restriction ;
        owl:onDataRange xsd:string ;
        owl:onProperty :hasName ;
        owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger
    ], [
        a owl:Restriction ;
        owl:onDataRange xsd:string ;
        owl:onProperty :hasObservationUnitDescription ;
        owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger
    ], [
        a owl:Restriction ;
        owl:onDataRange xsd:dateTime ;
        owl:onProperty :hasStartDateTime ;
        owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger
    ], [
        a owl:Restriction ;
        owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ;
        owl:onDataRange xsd:string ;
        owl:onProperty :hasCulturalPractices
    ], [
        a owl:Restriction ;
        owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ;
        owl:onDataRange xsd:string ;
        owl:onProperty :hasDescription
    ], [
        a owl:Restriction ;
        owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ;
        owl:onDataRange xsd:dateTime ;
        owl:onProperty :hasEndDateTime
    ], [
        a owl:Restriction ;
        owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ;
        owl:onDataRange [
            a rdfs:Datatype ;
            owl:unionOf (xsd:anyURI
                xsd:string
            )
        ] ;
        owl:onProperty :hasIdentifier
    ] .

:trait
    a owl:Class ;
    rdfs:comment "Name of the (plant or environmental) trait under observation" ;
    rdfs:label "trait"@en ;
    rdfs:subClassOf [
        a owl:Restriction ;
        owl:onDataRange xsd:string ;
        owl:onProperty :hasName ;
        owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger
    ], [
        a owl:Restriction ;
        owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ;
        owl:onDataRange [
            a rdfs:Datatype ;
            owl:unionOf (xsd:anyURI
                xsd:string
            )
        ] ;
        owl:onProperty :hasExternalIdentifier
    ] .

:x
    :hasType "x"^^xsd:string ;
    a :spatial_coordinate, owl:NamedIndividual ;
    rdfs:comment "The local spatial coordinate x (numeric, discrete)"@en .

:x_m
    :hasType "x (m)"^^xsd:string ;
    a :spatial_coordinate, owl:NamedIndividual ;
    rdfs:comment "The local spatial coordinate x (in meters)"@en .

:y
    :hasType "y"^^xsd:string ;
    a :spatial_coordinate, owl:NamedIndividual ;
    rdfs:comment "The local spatial coordinate y (numeric, discrete)"@en .

:y_m
    :hasType "y (m)"^^xsd:string ;
    a :spatial_coordinate, owl:NamedIndividual ;
    rdfs:comment "The local spatial coordinate y (in meters)"@en .

:z
    :hasType "z"^^xsd:string ;
    a :spatial_coordinate, owl:NamedIndividual ;
    rdfs:comment "The local spatial coordinate z (numeric, discrete)"@en .

:z_m
    :hasType "z (m)"^^xsd:string ;
    a :spatial_coordinate, owl:NamedIndividual ;
    rdfs:comment "The local spatial coordinate z (in meters)"@en .

[]
    :hasOntologyRecommendation "http://www.cropontology.org/rdf/CO_715:0000006"^^xsd:anyURI ;
    a owl:Axiom ;
    owl:annotatedProperty rdfs:subClassOf ;
    owl:annotatedSource :event ;
    owl:annotatedTarget [
        a owl:Restriction ;
        owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ;
        owl:onDataRange [
            a rdfs:Datatype ;
            owl:unionOf (xsd:anyURI
                xsd:string
            )
        ] ;
        owl:onProperty :hasExternalIdentifier
    ] .

[]
    :hasOntologyRecommendation "http://www.cropontology.org/rdf/CO_715:0000005"^^xsd:anyURI ;
    a owl:Axiom ;
    owl:annotatedProperty rdfs:subClassOf ;
    owl:annotatedSource :growth_facility ;
    owl:annotatedTarget [
        a owl:Restriction ;
        owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ;
        owl:onDataRange [
            a rdfs:Datatype ;
            owl:unionOf (xsd:anyURI
                xsd:string
            )
        ] ;
        owl:onProperty :hasType
    ] .

[]
    :hasMIAPPESynonym "investigation title"@en ;
    a owl:Axiom ;
    owl:annotatedProperty rdfs:subClassOf ;
    owl:annotatedSource :investigation ;
    owl:annotatedTarget [
        a owl:Restriction ;
        owl:onDataRange xsd:string ;
        owl:onProperty :hasName ;
        owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger
    ] .

[]
    :hasMIAPPESynonym "investigation unique ID"@en ;
    a owl:Axiom ;
    owl:annotatedProperty rdfs:subClassOf ;
    owl:annotatedSource :investigation ;
    owl:annotatedTarget [
        a owl:Restriction ;
        owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ;
        owl:onDataRange [
            a rdfs:Datatype ;
            owl:unionOf (xsd:anyURI
                xsd:string
            )
        ] ;
        owl:onProperty :hasIdentifier
    ] .

[]
    :hasOntologyRecommendation "http://www.cropontology.org/ (Method)"^^xsd:string ;
    a owl:Axiom ;
    owl:annotatedProperty rdfs:subClassOf ;
    owl:annotatedSource :method ;
    owl:annotatedTarget [
        a owl:Restriction ;
        owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ;
        owl:onDataRange [
            a rdfs:Datatype ;
            owl:unionOf (xsd:anyURI
                xsd:string
            )
        ] ;
        owl:onProperty :hasExternalIdentifier
    ] .

[]
    :hasOntologyRecommendation "http://www.cropontology.org/rdf/Variable"^^xsd:anyURI ;
    a owl:Axiom ;
    owl:annotatedProperty rdfs:subClassOf ;
    owl:annotatedSource :observed_variable ;
    owl:annotatedTarget [
        a owl:Restriction ;
        owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ;
        owl:onDataRange [
            a rdfs:Datatype ;
            owl:unionOf (xsd:anyURI
                xsd:string
            )
        ] ;
        owl:onProperty :hasExternalIdentifier
    ] .

[]
    :hasOntologyRecommendation "http://purl.obolibrary.org/obo/PO_0025131"^^xsd:anyURI ;
    a owl:Axiom ;
    owl:annotatedProperty rdfs:subClassOf ;
    owl:annotatedSource :sample ;
    owl:annotatedTarget [
        a owl:Restriction ;
        owl:onDataRange [
            a rdfs:Datatype ;
            owl:unionOf (xsd:anyURI
                xsd:string
            )
        ] ;
        owl:onProperty :hasPlantAnatomicalEntity ;
        owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger
    ] .

[]
    :hasOntologyRecommendation "http://purl.obolibrary.org/obo/PO_0009012"^^xsd:anyURI ;
    a owl:Axiom ;
    owl:annotatedProperty rdfs:subClassOf ;
    owl:annotatedSource :sample ;
    owl:annotatedTarget [
        a owl:Restriction ;
        owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ;
        owl:onDataRange [
            a rdfs:Datatype ;
            owl:unionOf (xsd:anyURI
                xsd:string
            )
        ] ;
        owl:onProperty :hasPlantStructureDevelopmentStage
    ] .

[]
    :hasOntologyRecommendation "http://www.cropontology.org/ (Scale)"^^xsd:string ;
    a owl:Axiom ;
    owl:annotatedProperty rdfs:subClassOf ;
    owl:annotatedSource :scale ;
    owl:annotatedTarget [
        a owl:Restriction ;
        owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ;
        owl:onDataRange [
            a rdfs:Datatype ;
            owl:unionOf (xsd:anyURI
                xsd:string
            )
        ] ;
        owl:onProperty :hasExternalIdentifier
    ] .

[]
    :hasOntologyRecommendation "http://www.cropontology.org/rdf/CO_715:0000003"^^xsd:anyURI ;
    a owl:Axiom ;
    owl:annotatedProperty rdfs:subClassOf ;
    owl:annotatedSource :experimental_design ;
    owl:annotatedTarget [
        a owl:Restriction ;
        owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ;
        owl:onDataRange [
            a rdfs:Datatype ;
            owl:unionOf (xsd:anyURI
                xsd:string
            )
        ] ;
        owl:onProperty :hasType
    ] .

[]
    :hasMIAPPESynonym "study title"@en ;
    a owl:Axiom ;
    owl:annotatedProperty rdfs:subClassOf ;
    owl:annotatedSource :study ;
    owl:annotatedTarget [
        a owl:Restriction ;
        owl:onDataRange xsd:string ;
        owl:onProperty :hasName ;
        owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger
    ] .

[]
    :hasMIAPPESynonym "study unique ID"@en ;
    a owl:Axiom ;
    owl:annotatedProperty rdfs:subClassOf ;
    owl:annotatedSource :study ;
    owl:annotatedTarget [
        a owl:Restriction ;
        owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ;
        owl:onDataRange [
            a rdfs:Datatype ;
            owl:unionOf (xsd:anyURI
                xsd:string
            )
        ] ;
        owl:onProperty :hasIdentifier
    ] .

[]
    :hasOntologyRecommendation "http://purl.obolibrary.org/obo/to.owl"^^xsd:anyURI, "http://www.cropontology.org/ (traits)"^^xsd:string ;
    a owl:Axiom ;
    owl:annotatedProperty rdfs:subClassOf ;
    owl:annotatedSource :trait ;
    owl:annotatedTarget [
        a owl:Restriction ;
        owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ;
        owl:onDataRange [
            a rdfs:Datatype ;
            owl:unionOf (xsd:anyURI
                xsd:string
            )
        ] ;
        owl:onProperty :hasExternalIdentifier
    ] .

[]
    :hasMIAPPESynonym "organism"@en ;
    a owl:Axiom ;
    owl:annotatedProperty rdfs:subClassOf ;
    owl:annotatedSource :biological_material ;
    owl:annotatedTarget [
        a owl:Restriction ;
        owl:onDataRange [
            a rdfs:Datatype ;
            owl:unionOf (xsd:anyURI
                xsd:string
            )
        ] ;
        owl:onProperty :hasTaxonIdentifier ;
        owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger
    ] .

