{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://vho.bio/schema/record/v1",
  "title": "VHO effective record",
  "type": "object",
  "required": [
    "@context",
    "@id",
    "kind",
    "subject",
    "altLabels",
    "taxonomyChain",
    "morphs",
    "traits",
    "qualities",
    "capacities",
    "requiredRoles",
    "retractions",
    "regimes",
    "diet",
    "sizingConstraints",
    "measurements",
    "substrateRequirements",
    "careGuide",
    "coverage",
    "endorsements",
    "meta"
  ],
  "additionalProperties": false,
  "properties": {
    "@context": {
      "const": "https://vho.bio/context/record/v1"
    },
    "@id": {
      "type": "string",
      "format": "uri"
    },
    "kind": {
      "enum": [
        "species",
        "morph"
      ]
    },
    "subject": {
      "$ref": "#/$defs/iri"
    },
    "label": {
      "type": "string"
    },
    "altLabels": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "definition": {
      "type": "string"
    },
    "taxonomyChain": {
      "type": "array",
      "minItems": 1,
      "items": {
        "type": "object",
        "required": [
          "iri"
        ],
        "additionalProperties": false,
        "properties": {
          "iri": {
            "$ref": "#/$defs/iri"
          },
          "label": {
            "type": "string"
          },
          "ncbiTaxon": {
            "$ref": "#/$defs/iri"
          }
        }
      }
    },
    "morphs": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "iri",
          "record"
        ],
        "additionalProperties": false,
        "properties": {
          "iri": {
            "$ref": "#/$defs/iri"
          },
          "record": {
            "type": "string",
            "format": "uri"
          }
        }
      }
    },
    "traits": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/member"
      }
    },
    "qualities": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/member"
      },
      "allOf": [
        {
          "contains": {
            "type": "object",
            "properties": {
              "iri": {
                "enum": [
                  "https://vho.bio/ns/core#Gregarious",
                  "https://vho.bio/ns/core#Solitary"
                ]
              }
            },
            "required": [
              "iri"
            ]
          },
          "maxContains": 1
        }
      ]
    },
    "capacities": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/capacity"
      }
    },
    "requiredRoles": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "iri",
          "provenance"
        ],
        "additionalProperties": false,
        "properties": {
          "iri": {
            "$ref": "#/$defs/iri"
          },
          "label": {
            "type": "string"
          },
          "minCount": {
            "type": "integer",
            "minimum": 1
          },
          "basis": {
            "$ref": "#/$defs/iri"
          },
          "appliesWhen": {
            "type": "array",
            "items": {
              "$ref": "#/$defs/guard"
            }
          },
          "duringPeriod": {
            "$ref": "#/$defs/iri"
          },
          "comment": {
            "type": "string"
          },
          "provenance": {
            "$ref": "#/$defs/provenance"
          },
          "playerKind": {
            "type": "array",
            "items": {
              "$ref": "#/$defs/iri"
            }
          },
          "appliesWhenNot": {
            "type": "array",
            "items": {
              "$ref": "#/$defs/guard"
            }
          }
        }
      }
    },
    "retractions": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "predicate",
          "member",
          "provenance"
        ],
        "additionalProperties": false,
        "properties": {
          "predicate": {
            "$ref": "#/$defs/iri"
          },
          "member": {
            "$ref": "#/$defs/iri"
          },
          "provenance": {
            "$ref": "#/$defs/provenance"
          }
        }
      }
    },
    "regimes": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "axis",
          "period",
          "bands"
        ],
        "additionalProperties": false,
        "properties": {
          "axis": {
            "$ref": "#/$defs/iri"
          },
          "period": {
            "$ref": "#/$defs/iri"
          },
          "zone": {
            "$ref": "#/$defs/iri"
          },
          "bands": {
            "type": "array",
            "minItems": 1,
            "items": {
              "$ref": "#/$defs/band"
            }
          },
          "appliesWhen": {
            "type": "array",
            "items": {
              "$ref": "#/$defs/guard"
            }
          },
          "appliesWhenNot": {
            "type": "array",
            "items": {
              "$ref": "#/$defs/guard"
            }
          }
        }
      }
    },
    "diet": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "period",
          "foodstuff",
          "provenance"
        ],
        "additionalProperties": false,
        "properties": {
          "period": {
            "$ref": "#/$defs/iri"
          },
          "foodstuff": {
            "type": "array",
            "items": {
              "$ref": "#/$defs/iri"
            }
          },
          "frequency": {
            "$ref": "#/$defs/band"
          },
          "supplementaryFoodstuff": {
            "type": "array",
            "items": {
              "$ref": "#/$defs/iri"
            }
          },
          "supplementaryFrequency": {
            "$ref": "#/$defs/band"
          },
          "provenance": {
            "$ref": "#/$defs/provenance"
          }
        }
      }
    },
    "sizingConstraints": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "constrains",
          "provenance"
        ],
        "additionalProperties": false,
        "properties": {
          "constrains": {
            "$ref": "#/$defs/iri"
          },
          "comparator": {
            "$ref": "#/$defs/iri"
          },
          "basis": {
            "$ref": "#/$defs/iri"
          },
          "relativeTo": {
            "$ref": "#/$defs/iri"
          },
          "multiple": {
            "type": "number"
          },
          "absoluteFloor": {
            "type": "number"
          },
          "appliesWhen": {
            "type": "array",
            "items": {
              "$ref": "#/$defs/guard"
            }
          },
          "duringPeriod": {
            "$ref": "#/$defs/iri"
          },
          "comment": {
            "type": "string"
          },
          "provenance": {
            "$ref": "#/$defs/provenance"
          },
          "appliesWhenNot": {
            "type": "array",
            "items": {
              "$ref": "#/$defs/guard"
            }
          }
        }
      }
    },
    "measurements": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "property",
          "bands"
        ],
        "additionalProperties": false,
        "properties": {
          "property": {
            "$ref": "#/$defs/iri"
          },
          "measuredAs": {
            "$ref": "#/$defs/iri"
          },
          "bands": {
            "type": "array",
            "minItems": 1,
            "items": {
              "$ref": "#/$defs/band"
            }
          }
        }
      }
    },
    "substrateRequirements": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "property",
          "constrainsDerived",
          "value",
          "provenance"
        ],
        "additionalProperties": false,
        "properties": {
          "property": {
            "$ref": "#/$defs/iri"
          },
          "constrainsDerived": {
            "$ref": "#/$defs/iri"
          },
          "value": {
            "type": "number"
          },
          "provenance": {
            "$ref": "#/$defs/provenance"
          }
        }
      }
    },
    "cohabitationGroupRange": {
      "$ref": "#/$defs/band"
    },
    "conspecificCohabitationOnly": {
      "type": "object",
      "required": [
        "value",
        "provenance"
      ],
      "additionalProperties": false,
      "properties": {
        "value": {
          "type": "boolean"
        },
        "provenance": {
          "$ref": "#/$defs/provenance"
        }
      }
    },
    "venomSignificance": {
      "$ref": "#/$defs/member"
    },
    "enclosureClass": {
      "$ref": "#/$defs/member"
    },
    "ventilation": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "airExchangeLevel": {
          "$ref": "#/$defs/member"
        },
        "airflowPatterns": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/member"
          }
        }
      }
    },
    "careGuide": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "describes",
          "provenance"
        ],
        "additionalProperties": false,
        "properties": {
          "label": {
            "type": "string"
          },
          "order": {
            "type": "number"
          },
          "describes": {
            "type": "array",
            "items": {
              "$ref": "#/$defs/iri"
            }
          },
          "text": {
            "type": "string"
          },
          "provenance": {
            "$ref": "#/$defs/provenance"
          }
        }
      }
    },
    "advisedAgainst": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/advisedAgainst"
      }
    },
    "coverage": {
      "type": "object",
      "additionalProperties": {
        "enum": [
          "present",
          "sourced-none",
          "uncurated"
        ]
      }
    },
    "endorsements": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "iri",
          "agents"
        ],
        "additionalProperties": false,
        "properties": {
          "iri": {
            "$ref": "#/$defs/iri"
          },
          "agents": {
            "type": "array",
            "minItems": 1,
            "items": {
              "$ref": "#/$defs/iri"
            }
          },
          "record": {
            "type": "string",
            "format": "uri"
          },
          "date": {
            "type": "string"
          },
          "axes": {
            "type": "array",
            "items": {
              "$ref": "#/$defs/iri"
            }
          },
          "note": {
            "type": "string"
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        }
      }
    },
    "meta": {
      "type": "object",
      "required": [
        "ontologyVersion",
        "releaseDate",
        "compilerVersion",
        "contextVersion"
      ],
      "additionalProperties": false,
      "properties": {
        "ontologyVersion": {
          "type": "string"
        },
        "releaseDate": {
          "type": "string",
          "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
        },
        "compilerVersion": {
          "type": "string"
        },
        "contextVersion": {
          "const": "v1"
        }
      }
    }
  },
  "$defs": {
    "iri": {
      "type": "string",
      "format": "uri"
    },
    "provenance": {
      "type": "object",
      "required": [
        "assertedOn"
      ],
      "additionalProperties": false,
      "properties": {
        "assertedOn": {
          "oneOf": [
            {
              "$ref": "#/$defs/iri"
            },
            {
              "const": "individual"
            }
          ]
        },
        "sources": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "contributors": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/iri"
          }
        },
        "basis": {
          "$ref": "#/$defs/iri"
        }
      }
    },
    "band": {
      "type": "object",
      "required": [
        "provenance"
      ],
      "additionalProperties": false,
      "properties": {
        "min": {
          "type": "number"
        },
        "max": {
          "type": "number"
        },
        "value": {
          "oneOf": [
            {
              "type": "number"
            },
            {
              "type": "string"
            }
          ]
        },
        "unit": {
          "$ref": "#/$defs/iri"
        },
        "bandRole": {
          "$ref": "#/$defs/iri"
        },
        "comment": {
          "type": "string"
        },
        "provenance": {
          "$ref": "#/$defs/provenance"
        },
        "forSex": {
          "$ref": "#/$defs/iri"
        }
      }
    },
    "member": {
      "type": "object",
      "required": [
        "iri",
        "provenance"
      ],
      "additionalProperties": false,
      "properties": {
        "iri": {
          "$ref": "#/$defs/iri"
        },
        "label": {
          "type": "string"
        },
        "duringPeriod": {
          "$ref": "#/$defs/iri"
        },
        "comment": {
          "type": "string"
        },
        "provenance": {
          "$ref": "#/$defs/provenance"
        },
        "appliesWhen": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/guard"
          }
        },
        "appliesWhenNot": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/guard"
          }
        }
      }
    },
    "guard": {
      "oneOf": [
        {
          "type": "object",
          "required": [
            "iri"
          ],
          "additionalProperties": false,
          "properties": {
            "iri": {
              "$ref": "#/$defs/iri"
            }
          }
        },
        {
          "type": "object",
          "required": [
            "onProperty"
          ],
          "additionalProperties": false,
          "properties": {
            "onProperty": {
              "$ref": "#/$defs/iri"
            },
            "min": {
              "type": "number"
            },
            "max": {
              "type": "number"
            }
          }
        }
      ]
    },
    "advisedAgainst": {
      "type": "object",
      "required": [
        "onProperty",
        "iri",
        "provenance"
      ],
      "additionalProperties": false,
      "properties": {
        "onProperty": {
          "$ref": "#/$defs/iri"
        },
        "iri": {
          "$ref": "#/$defs/iri"
        },
        "label": {
          "type": "string"
        },
        "appliesWhen": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/guard"
          }
        },
        "appliesWhenNot": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/guard"
          }
        },
        "duringPeriod": {
          "$ref": "#/$defs/iri"
        },
        "comment": {
          "type": "string"
        },
        "provenance": {
          "$ref": "#/$defs/provenance"
        }
      }
    },
    "capacity": {
      "type": "object",
      "required": [
        "iri",
        "provenance"
      ],
      "additionalProperties": false,
      "properties": {
        "iri": {
          "$ref": "#/$defs/iri"
        },
        "label": {
          "type": "string"
        },
        "outcome": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/iri"
          }
        },
        "severity": {
          "$ref": "#/$defs/iri"
        },
        "appliesWhen": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/guard"
          }
        },
        "appliesWhenNot": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/guard"
          }
        },
        "duringPeriod": {
          "$ref": "#/$defs/iri"
        },
        "comment": {
          "type": "string"
        },
        "provenance": {
          "$ref": "#/$defs/provenance"
        }
      }
    }
  }
}
