BASE <https://w3id.org/linkml/>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
PREFIX pav: <http://purl.org/pav/>
PREFIX oslc: <http://open-services.net/ns/core#>
PREFIX bibo: <http://purl.org/ontology/bibo/>
PREFIX sh: <https://w3id.org/shacl/>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX dcterms: <http://purl.org/dc/terms/>
PREFIX oboInOwl: <http://www.geneontology.org/formats/oboInOwl#>


<String> xsd:string

<Integer> xsd:integer

<Boolean> xsd:boolean

<Float> xsd:float

<Double> xsd:double

<Decimal> xsd:decimal

<Time> xsd:dateTime

<Date> xsd:date

<Datetime> xsd:dateTime

<Uriorcurie> IRI

<Uri> IRI

<Ncname> xsd:string

<Objectidentifier> IRI

<Nodeidentifier> NONLITERAL

<AltDescription> CLOSED {
    (  $<AltDescription_tes> (  <source> @<String> ;
          <description> @<String>
       ) ;
       rdf:type [ <AltDescription> ]
    )
}

<Annotatable> {
    (  $<Annotatable_tes> <annotations> @<Annotation> * ;
       rdf:type [ <Annotatable> ] ?
    )
}

<Annotation> CLOSED {
    (  $<Annotation_tes> (  &<Extension_tes> ;
          rdf:type [ <Extension> ] ? ;
          &<Annotatable_tes> ;
          rdf:type [ <Annotatable> ] ? ;
          <annotations> @<Annotation> *
       ) ;
       rdf:type [ <Annotation> ] ?
    )
}

<AnonymousClassExpression> CLOSED {
    (  $<AnonymousClassExpression_tes> (  &<AnonymousExpression_tes> ;
          rdf:type [ <AnonymousExpression> ] ? ;
          &<ClassExpression_tes> ;
          rdf:type [ <ClassExpression> ] ? ;
          <any_of> @<AnonymousClassExpression> * ;
          <exactly_one_of> @<AnonymousClassExpression> * ;
          <none_of> @<AnonymousClassExpression> * ;
          <all_of> @<AnonymousClassExpression> * ;
          <slot_conditions> @<SlotDefinition> *
       ) ;
       rdf:type [ <AnonymousClassExpression> ] ?
    )
}

<AnonymousExpression>  (
    @<AnonymousClassExpression> OR @<AnonymousSlotExpression>
)

<AnonymousExpression_struct> {
    (  $<AnonymousExpression_tes> (  &<Expression_tes> ;
          rdf:type [ <Expression> ] ? ;
          &<Extensible_tes> ;
          rdf:type [ <Extensible> ] ? ;
          &<Annotatable_tes> ;
          rdf:type [ <Annotatable> ] ? ;
          &<CommonMetadata_tes> ;
          rdf:type [ <CommonMetadata> ] ? ;
          <extensions> @<Extension> * ;
          <annotations> @<Annotation> * ;
          skos:definition @<String> ? ;
          <alt_descriptions> @<AltDescription> * ;
          dcterms:title @<String> ? ;
          <deprecated> @<String> ? ;
          <todos> @<String> * ;
          skos:editorialNote @<String> * ;
          skos:note @<String> * ;
          <examples> @<Example> * ;
          oboInOwl:inSubset @<SubsetDefinition> * ;
          skos:inScheme @<Uri> ? ;
          <imported_from> @<String> ? ;
          rdfs:seeAlso @<Uriorcurie> * ;
          <deprecated_element_has_exact_replacement> @<Uriorcurie> ? ;
          <deprecated_element_has_possible_replacement> @<Uriorcurie> ?
       ) ;
       rdf:type [ <AnonymousExpression> ] ?
    )
}

<AnonymousSlotExpression> CLOSED {
    (  $<AnonymousSlotExpression_tes> (  &<AnonymousExpression_tes> ;
          rdf:type [ <AnonymousExpression> ] ? ;
          &<SlotExpression_tes> ;
          rdf:type [ <SlotExpression> ] ? ;
          <range> @<Element> ? ;
          <range_expression> @<AnonymousClassExpression> ? ;
          <required> @<Boolean> ? ;
          <recommended> @<Boolean> ? ;
          <minimum_value> @<Integer> ? ;
          <maximum_value> @<Integer> ? ;
          <pattern> @<String> ? ;
          <equals_string> @<String> ? ;
          <equals_string_in> @<String> * ;
          <equals_number> @<Integer> ? ;
          <equals_expression> @<String> ? ;
          <minimum_cardinality> @<Integer> ? ;
          <maximum_cardinality> @<Integer> ? ;
          <has_member> @<AnonymousSlotExpression> ? ;
          <all_members> @<SlotDefinition> * ;
          <none_of> @<AnonymousSlotExpression> * ;
          <exactly_one_of> @<AnonymousSlotExpression> * ;
          <any_of> @<AnonymousSlotExpression> * ;
          <all_of> @<AnonymousSlotExpression> *
       ) ;
       rdf:type [ <AnonymousSlotExpression> ] ?
    )
}

<AnonymousTypeExpression> CLOSED {
    (  $<AnonymousTypeExpression_tes> (  &<TypeExpression_tes> ;
          rdf:type [ <TypeExpression> ] ? ;
          <pattern> @<String> ? ;
          <equals_string> @<String> ? ;
          <equals_string_in> @<String> * ;
          <equals_number> @<Integer> ? ;
          <none_of> @<AnonymousTypeExpression> * ;
          <exactly_one_of> @<AnonymousTypeExpression> * ;
          <any_of> @<AnonymousTypeExpression> * ;
          <all_of> @<AnonymousTypeExpression> *
       ) ;
       rdf:type [ <AnonymousTypeExpression> ] ?
    )
}

<ClassDefinition> CLOSED {
    (  $<ClassDefinition_tes> (  &<Definition_tes> ;
          rdf:type [ <Definition> ] ? ;
          &<ClassExpression_tes> ;
          rdf:type [ <ClassExpression> ] ? ;
          <slots> @<SlotDefinition> * ;
          <slot_usage> @<SlotDefinition> * ;
          <attributes> @<SlotDefinition> * ;
          <class_uri> @<Uriorcurie> ? ;
          rdfs:subClassOf @<Uriorcurie> ? ;
          <union_of> @<ClassDefinition> * ;
          <defining_slots> @<SlotDefinition> * ;
          <tree_root> @<Boolean> ? ;
          <unique_keys> @<UniqueKey> * ;
          sh:rule @<ClassRule> * ;
          <classification_rules> @<AnonymousClassExpression> * ;
          <mixins> @<ClassDefinition> * ;
          <apply_to> @<ClassDefinition> * ;
          <any_of> @<AnonymousClassExpression> * ;
          <exactly_one_of> @<AnonymousClassExpression> * ;
          <none_of> @<AnonymousClassExpression> * ;
          <all_of> @<AnonymousClassExpression> * ;
          <slot_conditions> @<SlotDefinition> *
       ) ;
       rdf:type [ <ClassDefinition> ]
    )
}

<ClassExpression> {
    (  $<ClassExpression_tes> (  <any_of> @<AnonymousClassExpression> * ;
          <exactly_one_of> @<AnonymousClassExpression> * ;
          <none_of> @<AnonymousClassExpression> * ;
          <all_of> @<AnonymousClassExpression> * ;
          <slot_conditions> @<SlotDefinition> *
       ) ;
       rdf:type [ <ClassExpression> ] ?
    )
}

<ClassLevelRule>  (
    {
       (  $<ClassLevelRule_tes> rdf:type . * ;
          rdf:type [ <ClassLevelRule> ] ?
       )
    } OR @<ClassRule>
)

<ClassRule> CLOSED {
    (  $<ClassRule_tes> (  &<ClassLevelRule_tes> ;
          rdf:type [ <ClassLevelRule> ] ? ;
          &<Extensible_tes> ;
          rdf:type [ <Extensible> ] ? ;
          &<Annotatable_tes> ;
          rdf:type [ <Annotatable> ] ? ;
          &<CommonMetadata_tes> ;
          rdf:type [ <CommonMetadata> ] ? ;
          sh:condition @<AnonymousClassExpression> ? ;
          <postconditions> @<AnonymousClassExpression> ? ;
          <elseconditions> @<AnonymousClassExpression> ? ;
          <bidirectional> @<Boolean> ? ;
          <open_world> @<Boolean> ? ;
          sh:order @<Integer> ? ;
          sh:deactivated @<Boolean> ? ;
          <extensions> @<Extension> * ;
          <annotations> @<Annotation> * ;
          skos:definition @<String> ? ;
          <alt_descriptions> @<AltDescription> * ;
          dcterms:title @<String> ? ;
          <deprecated> @<String> ? ;
          <todos> @<String> * ;
          skos:editorialNote @<String> * ;
          skos:note @<String> * ;
          <examples> @<Example> * ;
          oboInOwl:inSubset @<SubsetDefinition> * ;
          skos:inScheme @<Uri> ? ;
          <imported_from> @<String> ? ;
          rdfs:seeAlso @<Uriorcurie> * ;
          <deprecated_element_has_exact_replacement> @<Uriorcurie> ? ;
          <deprecated_element_has_possible_replacement> @<Uriorcurie> ?
       ) ;
       rdf:type [ <ClassRule> ] ?
    )
}

<CommonMetadata> {
    (  $<CommonMetadata_tes> (  skos:definition @<String> ? ;
          <alt_descriptions> @<AltDescription> * ;
          dcterms:title @<String> ? ;
          <deprecated> @<String> ? ;
          <todos> @<String> * ;
          skos:editorialNote @<String> * ;
          skos:note @<String> * ;
          <examples> @<Example> * ;
          oboInOwl:inSubset @<SubsetDefinition> * ;
          skos:inScheme @<Uri> ? ;
          <imported_from> @<String> ? ;
          rdfs:seeAlso @<Uriorcurie> * ;
          <deprecated_element_has_exact_replacement> @<Uriorcurie> ? ;
          <deprecated_element_has_possible_replacement> @<Uriorcurie> ?
       ) ;
       rdf:type [ <CommonMetadata> ] ?
    )
}

<Definition>  (
    @<ClassDefinition> OR @<SlotDefinition>
)

<Definition_struct> {
    (  $<Definition_tes> (  &<Element_tes> ;
          rdf:type [ <Element> ] ? ;
          <abstract> @<Boolean> ? ;
          <mixin> @<Boolean> ? ;
          <mixins> @<Definition> * ;
          <apply_to> @<Definition> * ;
          <values_from> @<Uriorcurie> * ;
          pav:createdBy @<Uriorcurie> ? ;
          pav:createdOn @<Datetime> ? ;
          pav:lastUpdatedOn @<Datetime> ? ;
          oslc:modifiedBy @<Uriorcurie> ? ;
          bibo:status @<Uriorcurie> ? ;
          <string_serialization> @<String> ?
       ) ;
       rdf:type [ <Definition> ]
    )
}

<Element>  (
    @<Definition> OR @<EnumDefinition> OR @<SchemaDefinition> OR @<SubsetDefinition> OR @<TypeDefinition>
)

<Element_struct> {
    (  $<Element_tes> (  &<Extensible_tes> ;
          rdf:type [ <Extensible> ] ? ;
          &<Annotatable_tes> ;
          rdf:type [ <Annotatable> ] ? ;
          &<CommonMetadata_tes> ;
          rdf:type [ <CommonMetadata> ] ? ;
          <id_prefixes> @<Ncname> * ;
          <definition_uri> @<Uriorcurie> ? ;
          skos:altLabel @<String> * ;
          <local_names> @<LocalName> * ;
          dcterms:conformsTo @<String> ? ;
          skos:mappingRelation @<Uriorcurie> * ;
          skos:exactMatch @<Uriorcurie> * ;
          skos:closeMatch @<Uriorcurie> * ;
          skos:relatedMatch @<Uriorcurie> * ;
          skos:narrowMatch @<Uriorcurie> * ;
          skos:broadMatch @<Uriorcurie> * ;
          <extensions> @<Extension> * ;
          <annotations> @<Annotation> * ;
          skos:definition @<String> ? ;
          <alt_descriptions> @<AltDescription> * ;
          dcterms:title @<String> ? ;
          <deprecated> @<String> ? ;
          <todos> @<String> * ;
          skos:editorialNote @<String> * ;
          skos:note @<String> * ;
          <examples> @<Example> * ;
          oboInOwl:inSubset @<SubsetDefinition> * ;
          skos:inScheme @<Uri> ? ;
          <imported_from> @<String> ? ;
          rdfs:seeAlso @<Uriorcurie> * ;
          <deprecated_element_has_exact_replacement> @<Uriorcurie> ? ;
          <deprecated_element_has_possible_replacement> @<Uriorcurie> ?
       ) ;
       rdf:type [ <Element> ]
    )
}

<EnumDefinition> CLOSED {
    (  $<EnumDefinition_tes> (  &<Element_tes> ;
          rdf:type [ <Element> ] ? ;
          <code_set> @<Uriorcurie> ? ;
          <code_set_tag> @<String> ? ;
          <code_set_version> @<String> ? ;
          <pv_formula> @<PvFormulaOptions> ? ;
          <permissible_values> @<PermissibleValue> *
       ) ;
       rdf:type [ <EnumDefinition> ]
    )
}

<Example> CLOSED {
    (  $<Example_tes> (  skos:example @<String> ? ;
          <description> @<String> ?
       ) ;
       rdf:type [ <Example> ] ?
    )
}

<Expression>  (
    @<SlotExpression> OR @<TypeExpression>
)

<Expression_struct> {
    (  $<Expression_tes> rdf:type . * ;
       rdf:type [ <Expression> ] ?
    )
}

<Extensible> {
    (  $<Extensible_tes> <extensions> @<Extension> * ;
       rdf:type [ <Extensible> ] ?
    )
}

<Extension>  (
    CLOSED {
       (  $<Extension_tes> (  <tag> @<Uriorcurie> ;
             <value> @<String> ;
             <extensions> @<Extension> *
          ) ;
          rdf:type [ <Extension> ] ?
       )
    } OR @<Annotation>
)

<LocalName> CLOSED {
    (  $<LocalName_tes> (  <local_name_source> @<Ncname> ;
          skos:altLabel @<String>
       ) ;
       rdf:type [ <LocalName> ]
    )
}

<PermissibleValue> CLOSED {
    (  $<PermissibleValue_tes> (  &<Extensible_tes> ;
          rdf:type [ <Extensible> ] ? ;
          &<Annotatable_tes> ;
          rdf:type [ <Annotatable> ] ? ;
          &<CommonMetadata_tes> ;
          rdf:type [ <CommonMetadata> ] ? ;
          skos:definition @<String> ? ;
          <meaning> @<Uriorcurie> ? ;
          <mixins> @<PermissibleValue> * ;
          <extensions> @<Extension> * ;
          <annotations> @<Annotation> * ;
          <alt_descriptions> @<AltDescription> * ;
          dcterms:title @<String> ? ;
          <deprecated> @<String> ? ;
          <todos> @<String> * ;
          skos:editorialNote @<String> * ;
          skos:note @<String> * ;
          <examples> @<Example> * ;
          oboInOwl:inSubset @<SubsetDefinition> * ;
          skos:inScheme @<Uri> ? ;
          <imported_from> @<String> ? ;
          rdfs:seeAlso @<Uriorcurie> * ;
          <deprecated_element_has_exact_replacement> @<Uriorcurie> ? ;
          <deprecated_element_has_possible_replacement> @<Uriorcurie> ?
       ) ;
       rdf:type [ <PermissibleValue> ]
    )
}

<Prefix> CLOSED {
    (  $<Prefix_tes> (  <prefix_prefix> @<Ncname> ;
          <prefix_reference> @<Uri>
       ) ;
       rdf:type [ <Prefix> ]
    )
}

<SchemaDefinition> CLOSED {
    (  $<SchemaDefinition_tes> (  &<Element_tes> ;
          rdf:type [ <Element> ] ? ;
          <id> @<Uri> ;
          pav:version @<String> ? ;
          <imports> @<Uriorcurie> * ;
          dcterms:license @<String> ? ;
          <prefixes> @<Prefix> * ;
          <emit_prefixes> @<Ncname> * ;
          <default_curi_maps> @<String> * ;
          <default_prefix> @<String> ? ;
          <default_range> @<TypeDefinition> ? ;
          <subsets> @<SubsetDefinition> * ;
          <types> @<TypeDefinition> * ;
          <enums> @<EnumDefinition> * ;
          <slots> @<SlotDefinition> * ;
          <classes> @<ClassDefinition> * ;
          <metamodel_version> @<String> ? ;
          <source_file> @<String> ? ;
          <source_file_date> @<Datetime> ? ;
          <source_file_size> @<Integer> ? ;
          <generation_date> @<Datetime> ?
       ) ;
       rdf:type [ <SchemaDefinition> ]
    )
}

<SlotDefinition> CLOSED {
    (  $<SlotDefinition_tes> (  &<Definition_tes> ;
          rdf:type [ <Definition> ] ? ;
          &<SlotExpression_tes> ;
          rdf:type [ <SlotExpression> ] ? ;
          skos:altLabel @<String> ? ;
          <domain> @<ClassDefinition> ? ;
          <slot_uri> @<Uriorcurie> ? ;
          <multivalued> @<Boolean> ? ;
          <inherited> @<Boolean> ? ;
          <readonly> @<String> ? ;
          <ifabsent> @<String> ? ;
          <inlined> @<Boolean> ? ;
          <inlined_as_list> @<Boolean> ? ;
          <key> @<Boolean> ? ;
          <identifier> @<Boolean> ? ;
          <designates_type> @<Boolean> ? ;
          skos:prefLabel @<String> ? ;
          <owner> @<Definition> ? ;
          <domain_of> @<ClassDefinition> * ;
          rdfs:subPropertyOf @<SlotDefinition> ? ;
          <symmetric> @<Boolean> ? ;
          owl:inverseOf @<SlotDefinition> ? ;
          <is_class_field> @<Boolean> ? ;
          <role> @<String> ? ;
          <is_usage_slot> @<Boolean> ? ;
          <usage_slot_name> @<String> ? ;
          <mixins> @<SlotDefinition> * ;
          <apply_to> @<SlotDefinition> * ;
          <range> @<Element> ? ;
          <range_expression> @<AnonymousClassExpression> ? ;
          <required> @<Boolean> ? ;
          <recommended> @<Boolean> ? ;
          <minimum_value> @<Integer> ? ;
          <maximum_value> @<Integer> ? ;
          <pattern> @<String> ? ;
          <equals_string> @<String> ? ;
          <equals_string_in> @<String> * ;
          <equals_number> @<Integer> ? ;
          <equals_expression> @<String> ? ;
          <minimum_cardinality> @<Integer> ? ;
          <maximum_cardinality> @<Integer> ? ;
          <has_member> @<AnonymousSlotExpression> ? ;
          <all_members> @<SlotDefinition> * ;
          <none_of> @<AnonymousSlotExpression> * ;
          <exactly_one_of> @<AnonymousSlotExpression> * ;
          <any_of> @<AnonymousSlotExpression> * ;
          <all_of> @<AnonymousSlotExpression> *
       ) ;
       rdf:type [ <SlotDefinition> ]
    )
}

<SlotExpression> {
    (  $<SlotExpression_tes> (  &<Expression_tes> ;
          rdf:type [ <Expression> ] ? ;
          <range> @<Element> ? ;
          <range_expression> @<AnonymousClassExpression> ? ;
          <required> @<Boolean> ? ;
          <recommended> @<Boolean> ? ;
          <minimum_value> @<Integer> ? ;
          <maximum_value> @<Integer> ? ;
          <pattern> @<String> ? ;
          <equals_string> @<String> ? ;
          <equals_string_in> @<String> * ;
          <equals_number> @<Integer> ? ;
          <equals_expression> @<String> ? ;
          <minimum_cardinality> @<Integer> ? ;
          <maximum_cardinality> @<Integer> ? ;
          <has_member> @<AnonymousSlotExpression> ? ;
          <all_members> @<SlotDefinition> * ;
          <none_of> @<AnonymousSlotExpression> * ;
          <exactly_one_of> @<AnonymousSlotExpression> * ;
          <any_of> @<AnonymousSlotExpression> * ;
          <all_of> @<AnonymousSlotExpression> *
       ) ;
       rdf:type [ <SlotExpression> ] ?
    )
}

<SubsetDefinition> CLOSED {
    (  $<SubsetDefinition_tes> (  &<Element_tes> ;
          rdf:type [ <Element> ] ?
       ) ;
       rdf:type [ <SubsetDefinition> ]
    )
}

<TypeDefinition> CLOSED {
    (  $<TypeDefinition_tes> (  &<Element_tes> ;
          rdf:type [ <Element> ] ? ;
          &<TypeExpression_tes> ;
          rdf:type [ <TypeExpression> ] ? ;
          <typeof> @<TypeDefinition> ? ;
          <base> @<String> ? ;
          <uri> @<Uriorcurie> ? ;
          <repr> @<String> ? ;
          <pattern> @<String> ? ;
          <equals_string> @<String> ? ;
          <equals_string_in> @<String> * ;
          <equals_number> @<Integer> ? ;
          <none_of> @<AnonymousTypeExpression> * ;
          <exactly_one_of> @<AnonymousTypeExpression> * ;
          <any_of> @<AnonymousTypeExpression> * ;
          <all_of> @<AnonymousTypeExpression> *
       ) ;
       rdf:type [ <TypeDefinition> ]
    )
}

<TypeExpression> {
    (  $<TypeExpression_tes> (  &<Expression_tes> ;
          rdf:type [ <Expression> ] ? ;
          <pattern> @<String> ? ;
          <equals_string> @<String> ? ;
          <equals_string_in> @<String> * ;
          <equals_number> @<Integer> ? ;
          <none_of> @<AnonymousTypeExpression> * ;
          <exactly_one_of> @<AnonymousTypeExpression> * ;
          <any_of> @<AnonymousTypeExpression> * ;
          <all_of> @<AnonymousTypeExpression> *
       ) ;
       rdf:type [ <TypeExpression> ] ?
    )
}

<UniqueKey> CLOSED {
    (  $<UniqueKey_tes> (  &<Extensible_tes> ;
          rdf:type [ <Extensible> ] ? ;
          &<Annotatable_tes> ;
          rdf:type [ <Annotatable> ] ? ;
          &<CommonMetadata_tes> ;
          rdf:type [ <CommonMetadata> ] ? ;
          <unique_key_slots> @<SlotDefinition> + ;
          <extensions> @<Extension> * ;
          <annotations> @<Annotation> * ;
          skos:definition @<String> ? ;
          <alt_descriptions> @<AltDescription> * ;
          dcterms:title @<String> ? ;
          <deprecated> @<String> ? ;
          <todos> @<String> * ;
          skos:editorialNote @<String> * ;
          skos:note @<String> * ;
          <examples> @<Example> * ;
          oboInOwl:inSubset @<SubsetDefinition> * ;
          skos:inScheme @<Uri> ? ;
          <imported_from> @<String> ? ;
          rdfs:seeAlso @<Uriorcurie> * ;
          <deprecated_element_has_exact_replacement> @<Uriorcurie> ? ;
          <deprecated_element_has_possible_replacement> @<Uriorcurie> ?
       ) ;
       rdf:type [ <UniqueKey> ] ?
    )
}



