@prefix core: <https://dataset-dl.liris.cnrs.fr/rdf-owl-urban-data-ontologies/Ontologies/CityGML/3.0/core#> .
@prefix grp: <https://dataset-dl.liris.cnrs.fr/rdf-owl-urban-data-ontologies/Ontologies/CityGML/3.0/cityobjectgroup#> .
@prefix iso19150-2: <http://def.isotc211.org/iso19150/-2/2012/base#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix skos: <http://www.w3.org/2004/02/skos/core#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

<https://dataset-dl.liris.cnrs.fr/rdf-owl-urban-data-ontologies/Ontologies/CityGML/3.0/cityobjectgroup> a owl:Ontology ;
    rdfs:label "CityObjectGroup"@en ;
    owl:imports <http://def.isotc211.org/iso19150/-2/2012/base>,
        <https://dataset-dl.liris.cnrs.fr/rdf-owl-urban-data-ontologies/Ontologies/CityGML/3.0/core.ttl> ;
    skos:definition "The CityObjectGroup module supports grouping of city objects. Arbitrary city objects may be aggregated in groups according to user-defined criteria. A group may be further classified by application-specific attributes."@en .

grp:CityObjectGroup.adeOfCityObjectGroup a owl:ObjectProperty ;
    rdfs:label "adeOfCityObjectGroup"@en ;
    rdfs:domain grp:CityObjectGroup ;
    rdfs:range grp:ADEOfCityObjectGroup ;
    skos:definition "Augments the CityObjectGroup with properties defined in an ADE."@en .

grp:CityObjectGroup.function a owl:ObjectProperty ;
    rdfs:label "function"@en ;
    rdfs:domain grp:CityObjectGroup ;
    rdfs:range owl:Class ;
    skos:definition "Specifies the intended purposes of the CityObjectGroup."@en .

grp:CityObjectGroup.groupMember a owl:ObjectProperty ;
    rdfs:label "groupMember"@en ;
    rdfs:domain grp:CityObjectGroup ;
    rdfs:range grp:Role ;
    skos:definition "Relates to the city objects that are part of the CityObjectGroup."@en .

grp:CityObjectGroup.usage a owl:ObjectProperty ;
    rdfs:label "usage"@en ;
    rdfs:domain grp:CityObjectGroup ;
    rdfs:range owl:Class ;
    skos:definition "Specifies the actual usages of the CityObjectGroup."@en .

grp:ADEOfCityObjectGroup a owl:Class ;
    rdfs:label "ADEOfCityObjectGroup"@en ;
    iso19150-2:isAbstract true ;
    skos:definition "ADEOfCityObjectGroup acts as a hook to define properties within an ADE that are to be added to a CityObjectGroup."@en .

grp:CityObjectGroup.class a owl:ObjectProperty ;
    rdfs:label "class"@en ;
    rdfs:domain grp:CityObjectGroup ;
    rdfs:range owl:Class ;
    skos:definition "Indicates the specific type of the CityObjectGroup."@en .

grp:CityObjectGroup.parent a owl:ObjectProperty ;
    rdfs:label "parent"@en ;
    rdfs:domain grp:CityObjectGroup ;
    rdfs:range core:AbstractCityObject ;
    skos:definition "Relates to a city object to which the CityObjectGroup belongs."@en .

grp:Role.groupMember a owl:ObjectProperty ;
    rdfs:label "groupMember"@en ;
    rdfs:domain grp:Role ;
    rdfs:range core:AbstractCityObject ;
    skos:definition "Relates to the city objects that are part of the CityObjectGroup."@en .

grp:Role.role a owl:DatatypeProperty ;
    rdfs:label "role"@en ;
    rdfs:domain grp:Role ;
    rdfs:range xsd:string ;
    skos:definition "Describes the role the city object plays within the CityObjectGroup."@en .

grp:Role a owl:Class ;
    rdfs:label "Role"@en ;
    rdfs:subClassOf [ a owl:Restriction ;
            owl:onClass core:AbstractCityObject ;
            owl:onProperty grp:Role.groupMember ;
            owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ],
        [ a owl:Restriction ;
            owl:allValuesFrom xsd:string ;
            owl:onProperty grp:Role.role ],
        [ a owl:Restriction ;
            owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ;
            owl:onDataRange xsd:string ;
            owl:onProperty grp:Role.role ],
        [ a owl:Restriction ;
            owl:allValuesFrom core:AbstractCityObject ;
            owl:onProperty grp:Role.groupMember ] ;
    skos:definition "Role qualifies the function of a city object within the CityObjectGroup."@en .

grp:CityObjectGroup a owl:Class ;
    rdfs:label "CityObjectGroup"@en ;
    rdfs:subClassOf [ a owl:Restriction ;
            owl:allValuesFrom core:AbstractCityObject ;
            owl:onProperty grp:CityObjectGroup.parent ],
        [ a owl:Restriction ;
            owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ;
            owl:onClass owl:Class ;
            owl:onProperty grp:CityObjectGroup.class ],
        [ a owl:Restriction ;
            owl:allValuesFrom owl:Class ;
            owl:onProperty grp:CityObjectGroup.class ],
        [ a owl:Restriction ;
            owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ;
            owl:onClass core:AbstractCityObject ;
            owl:onProperty grp:CityObjectGroup.parent ],
        [ a owl:Restriction ;
            owl:allValuesFrom owl:Class ;
            owl:onProperty grp:CityObjectGroup.function ],
        [ a owl:Restriction ;
            owl:allValuesFrom grp:ADEOfCityObjectGroup ;
            owl:onProperty grp:CityObjectGroup.adeOfCityObjectGroup ],
        [ a owl:Restriction ;
            owl:allValuesFrom owl:Class ;
            owl:onProperty grp:CityObjectGroup.usage ],
        [ a owl:Restriction ;
            owl:allValuesFrom grp:Role ;
            owl:onProperty grp:CityObjectGroup.groupMember ],
        core:AbstractLogicalSpace ;
    skos:definition "A CityObjectGroup represents an application-specific aggregation of city objects according to some user-defined criteria. Examples for groups are the buildings in a specific region, the result of a query, or objects put together for visualization purposes. Each member of a group may be qualified by a role name, reflecting the role each city object plays in the context of the group."@en .

