Part 9: Larger schemas

personinfo.yaml:

id: https://w3id.org/linkml/examples/personinfo
name: personinfo
description: |-
  Information about people, based on [schema.org](http://schema.org)
license: https://creativecommons.org/publicdomain/zero/1.0/
default_curi_maps:
  - semweb_context
imports:
  - linkml:types
prefixes:
  personinfo: https://w3id.org/linkml/examples/personinfo/
  linkml: https://w3id.org/linkml/
  schema: http://schema.org/
  rdfs: http://www.w3.org/2000/01/rdf-schema#
  prov: http://www.w3.org/ns/prov#
  GSSO: http://purl.obolibrary.org/obo/GSSO_
  famrel: https://example.org/FamilialRelations#
default_prefix: personinfo
default_range: string

emit_prefixes:
  - rdf
  - rdfs
  - xsd
  - skos

classes:

  NamedThing:
    description: >-
      A generic grouping for any identifiable entity
    slots:
      - id
      - name
      - description
      - image
    close_mappings:
     - schema:Thing

  Person:
    is_a: NamedThing
    description: >-
      A person (alive, dead, undead, or fictional).
    class_uri: schema:Person
    mixins:
      - HasAliases
    slots:
      - primary_email
      - birth_date
      - age_in_years
      - gender
      - current_address
      - has_employment_history
      - has_familial_relationships
      - has_medical_history
    slot_usage:
      primary_email:
        pattern: "^\\S+@[\\S+\\.]+\\S+"
    in_subset:
      - basic_subset
  
  HasAliases:
    description: >-
      A mixin applied to any class that can have aliases/alternateNames
    mixin: true
    attributes:
      aliases:
        multivalued: true
        exact_mappings:
          - schema:alternateName


  Organization:
    description: >-
      An organization such as a company or university
    is_a: NamedThing
    class_uri: schema:Organization
    mixins:
      - HasAliases
    slots:
      - mission_statement
      - founding_date
      - founding_location

  Place:
    mixins:
      - HasAliases
    slots:
      - id
      - name
      
  Address:
    class_uri: schema:PostalAddress
    slots:
      - street
      - city
      - postal_code

  Event:
    slots:
      - started_at_time
      - ended_at_time
      - duration
      - is_current
    close_mappings:
      - schema:Event

  Concept:
    is_a: NamedThing

  DiagnosisConcept:
    is_a: Concept

  ProcedureConcept:
    is_a: Concept
      

  Relationship:
    slots:
      - started_at_time
      - ended_at_time
      - related_to
      - type

  FamilialRelationship:
    is_a: Relationship
    slot_usage:
      type:
        range: FamilialRelationshipType
        required: true
      related to:
        range: Person
        required: true

  EmploymentEvent:
    is_a: Event
    slots:
      - employed_at

  MedicalEvent:
    is_a: Event
    slots:
      - in_location
      - diagnosis
      - procedure

  WithLocation:
    mixin: true
    slots:
      - in_location

  # TODO: annotate that this is a container/root class
  Container:
    slots:
      - persons
      - organizations

slots:
  id:
    identifier: true
    slot_uri: schema:identifier
  name:
    slot_uri: schema:name
  description:
    slot_uri: schema:description
  image:
    slot_uri: schema:image
  gender:
    slot_uri: schema:gender
    range: GenderType
  primary_email:
    slot_uri: schema:email
  birth_date:
    slot_uri: schema:birthDate
  employed_at:
    range: Organization
  is_current:
    range: boolean
  has_employment_history:
    range: EmploymentEvent
    multivalued: true
    inlined_as_list: true
  has_medical_history:
    range: MedicalEvent
    multivalued: true
    inlined_as_list: true
  has_familial_relationships:
    range: FamilialRelationship
    multivalued: true
    inlined_as_list: true
  in_location:
    range: Place
  current_address:
    description: >-
      The address at which a person currently lives
    range: Address
  age_in_years:
    range: integer
    minimum_value: 0
    maximum_value: 999
  related_to:
  type:
  street:
  city:
  mission_statement:
  founding_date:
  founding_location:
    range: Place
  postal_code:
    range: string
  started_at_time:
    slot_uri: prov:startedAtTime
    range: date
  duration:
    range: float
  diagnosis:
    range: DiagnosisConcept
    inlined: true
  procedure:
    range: ProcedureConcept
    inlined: true

  ended_at_time:
    slot_uri: prov:endedAtTime
    range: date

  persons:
    range: Person
    inlined: true
    inlined_as_list: true
    multivalued: true
  organizations:
    range: Organization
    inlined_as_list: true
    inlined: true
    multivalued: true
    
enums:
  FamilialRelationshipType:
    permissible_values:
      SIBLING_OF:
        meaning: famrel:01
      PARENT_OF:
        meaning: famrel:02
      CHILD_OF:
        meaning: famrel:01
  GenderType:
    permissible_values:
      nonbinary man:
        meaning: GSSO:009254
      nonbinary woman:
        meaning: GSSO:009253
      transgender woman:
        meaning: GSSO:000384
      transgender man:
        meaning: GSSO:000372
      cisgender man:
        meaning: GSSO:000371
      cisgender woman:
        meaning: GSSO:000385
  DiagnosisType:

subsets:
  basic_subset:
    description: A subset of the schema that handles basic information

Get a summary:

gen-yaml -v personinfo.yaml

Will output something like:

Classes: 16
        Referenced by: 9 classes, 15 slots, 0 types, 0 enums 
        Root: 8
        Leaf: 10
        Standalone: 15
        Declared mixin: 2
        Undeclared mixin: 0
        Abstract: 0

Slots: 35
        Referenced by: 16 classes, 3 slots, 0 types, 0 enums 
        Root: 32
        Leaf: 32
        Standalone: 40
        Declared mixin: 0
        Undeclared mixin: 0
        Abstract: 0
        Domain unspecified: 32
        Ranges:
                Type:
                        boolean: 1
                        date: 2
                        float: 1
                        integer: 1
                        string: 15
                Class:
                        Address: 1
                        DiagnosisConcept: 1
                        EmploymentEvent: 1
                        FamilialRelationship: 1
                        MedicalEvent: 1
                        Organization: 2
                        Person: 3
                        Place: 2
                        ProcedureConcept: 1
                Unknown:
                        FamilialRelationshipType: 1
                        GenderType: 1