{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "title": "CDIF Discovery metadata profile",
  "description": "CDIF Discovery profile for dataset metadata. Composes cdifCore with discovery-oriented properties: measurement technique, variables, spatial and temporal coverage, quality measurements.",
  "properties": {
    "@context": {
      "type": "object",
      "description": "Additional JSON-LD namespace prefixes for discovery properties.",
      "properties": {
        "geosparql": {
          "const": "http://www.opengis.net/ont/geosparql#"
        },
        "dqv": {
          "const": "http://www.w3.org/ns/dqv#"
        },
        "cdi": {
          "const": "http://ddialliance.org/Specification/DDI-CDI/1.0/RDF/"
        }
      }
    },
    "@id": {
      "type": "string",
      "description": "The URI for the resource should be the @id value for the root of the JSON instance document tree. Must be an IRI (e.g. https://doi.org/..., urn:..., or a relative URI like #localid). Note that this identifier can be interpreted to identify the resource that is the subject of this metadata record, or the JSON-LD object that is the digital object containing the metadata information."
    },
    "@type": {
      "description": "a schema.org Class that specifies the expected information content for the metadata record. The array must include at least one schema.org type value. Default is schema:Dataset.",
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "schema:CreativeWork",
          "schema:SoftwareApplication",
          "schema:SoftwareSourceCode",
          "schema:Product",
          "schema:WebAPI",
          "schema:Dataset",
          "schema:DigitalDocument",
          "schema:Collection",
          "schema:ImageObject",
          "schema:DataCatalog",
          "schema:DefinedTermSet",
          "schema:MediaObject"
        ]
      },
      "default": "schema:Dataset",
      "minItems": 1,
      "contains": {
        "const": "schema:Dataset"
      }
    },
    "schema:name": {
      "type": "string",
      "description": "A descriptive name of a dataset (e.g., 'Snow depth in Northern Hemisphere'). The name should uniquely identify the described resource for human use, in the scope of the metadata catalog containing this metadata record."
    },
    "schema:description": {
      "type": "string",
      "description": "A short summary describing a dataset. This text will be indexed by search applications, so the more information here, the better."
    },
    "schema:identifier": {
      "description": "The primary identifier for the dataset; other identifiers should be listed in the sameAs field. Schema.org has three ways of encoding identifiers-- a text description, a URL, or by using the schema:PropertyValue field. The Science on Schema.org guidance strongly recommends using the PropertyValue approach. see https://github.com/ESIPFed/science-on-schema.org   .... Dataset.md#identifier.  Ideally, for any given data provided they would provide identifiers either all as strings or all as identifier_type.",
      "anyOf": [
        {
          "$ref": "#/$defs/Identifier"
        },
        {
          "type": "string"
        }
      ]
    },
    "schema:additionalType": {
      "description": "identifiers for datatypes from other vocabularies (not schema.org) that apply to this metadata.",
      "type": "array",
      "minItems": 0,
      "items": {
        "$ref": "#/$defs/cdifConceptOrTermOrString"
      }
    },
    "schema:sameAs": {
      "description": "Other identifiers for the dataset, as IRI references, literal strings, or structured identifiers using schema:PropertyValue.",
      "type": "array",
      "minItems": 1,
      "items": {
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "object",
            "required": [
              "@id"
            ],
            "additionalProperties": false,
            "properties": {
              "@id": {
                "type": "string",
                "description": "IRI for an equivalent resource or alternate identifier"
              }
            }
          },
          {
            "$ref": "#/$defs/Identifier"
          }
        ]
      }
    },
    "schema:version": {
      "type": [
        "string",
        "number"
      ],
      "description": "The version number or identifier for this dataset (text or numeric). The values should sort from oldest to newest using an alphanumeric sort on version strings"
    },
    "schema:inLanguage": {
      "type": "string",
      "description": "the language of the dataset content"
    },
    "schema:dateModified": {
      "type": "string",
      "description": "ISO8601 formatted date (and optional time if relevant) when Dataset was last updated"
    },
    "schema:datePublished": {
      "type": "string",
      "description": "ISO8601 formatted date (and optional time if relevant) when Dataset was made public."
    },
    "schema:conditionsOfAccess": {
      "description": "text statement of conditions for use and access; if an online resource documents the restrictions or a URI is used to identify the conditions, recommend using schema:CreativeWork to provide a label (name) and an identifier (URI or URL). ",
      "type": "array",
      "minItems": 0,
      "items": {
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "object",
            "required": [
              "@id"
            ],
            "additionalProperties": false,
            "properties": {
              "@id": {
                "type": "string",
                "description": "a reference to a resource defining conditions of Access"
              }
            }
          },
          {
            "$ref": "#/$defs/Reference"
          }
        ]
      }
    },
    "schema:license": {
      "description": "legal statement of conditions for use and access; recommend using schema:CreativeWork to provide a label (name) for the license, and an identifier. Sources of license identifiers: https://opensource.org/licenses/, https://creativecommons.org/about/cclicenses/, https://spdx.org/licenses/, http://cor.esipfed.org/ont/earthcube/swl. If only a string is provided, it should be an identifier for the license, ideally a resolvable URI",
      "type": "array",
      "minItems": 0,
      "items": {
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "object",
            "required": [
              "@id"
            ],
            "additionalProperties": false,
            "properties": {
              "@id": {
                "type": "string",
                "description": "a reference to a license defintion"
              }
            }
          },
          {
            "$ref": "#/$defs/Reference"
          }
        ]
      }
    },
    "schema:url": {
      "type": "string",
      "format": "uri",
      "description": "Web Location of a page describing the dataset (landing page), typically providing links or instructions to get the actual resource content; analogous to dcat:accessURL. If a direct link is available to get the data, put in distribution/contentUrl"
    },
    "schema:distribution": {
      "description": "specifies how to download the data in a specific format or access via a web API. This property describes where to get the data and in what format by using the schema:DataDownload type. If user must access data through a landing page, provide link to landing page in the 'url' property for the dataset",
      "type": "array",
      "items": {
        "anyOf": [
          {
            "description": "schema to document file-based access to a resoruce via URL, based on schema.org/DataDownload",
            "type": "object",
            "properties": {
              "@id": {
                "type": "string"
              },
              "@type": {
                "type": "array",
                "description": "implement as array because extensions might need to add additional types",
                "items": {
                  "type": "string"
                },
                "contains": {
                  "const": "schema:DataDownload"
                },
                "minItems": 1
              },
              "schema:name": {
                "type": "string"
              },
              "schema:description": {
                "type": "string",
                "description": "Description of this distribution, e.g. what format, access constraints, etc."
              },
              "schema:contentUrl": {
                "type": "string",
                "format": "uri"
              },
              "schema:encodingFormat": {
                "type": "array",
                "description": "MIME type with extension; should indicate the serialization scheme in sufficient detail that machine can know how to parse.",
                "items": {
                  "type": "string"
                }
              },
              "schema:additionalType": {
                "type": "array",
                "description": "Domain-specific type classification for this distribution: what KIND of thing the file is, beyond its MIME type. schema:encodingFormat says how to parse the bytes; this says what they are. A plain string is accepted, but a schema:DefinedTerm carrying schema:inDefinedTermSet is preferred where the value comes from a controlled vocabulary, so the vocabulary travels with the data rather than being asserted only in a profile.",
                "items": {
                  "$ref": "#/$defs/cdifConceptOrTermOrString"
                }
              },
              "schema:contentSize": {
                "type": "string",
                "description": "File size of this distribution, e.g. '2.5 MB' or a byte count. Per schema.org/contentSize."
              },
              "spdx:checksum": {
                "type": "object",
                "description": "A string value calculated from the content of the resource representation, used to test if content has been modified. The checksum is a property of a particular distribution/DataDownload.",
                "properties": {
                  "@type": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "contains": {
                      "const": "spdx:Checksum"
                    },
                    "minItems": 1
                  },
                  "spdx:algorithm": {
                    "type": "string"
                  },
                  "spdx:checksumValue": {
                    "type": "string"
                  }
                },
                "required": [
                  "@type",
                  "spdx:algorithm",
                  "spdx:checksumValue"
                ]
              },
              "dcterms:conformsTo": {
                "description": "An identifier for a standard or specification that the distribution conforms to. Recommended to enable machine-actionable data access.",
                "type": "array",
                "minItems": 1,
                "items": {
                  "type": "object",
                  "required": [
                    "@id"
                  ],
                  "additionalProperties": false,
                  "properties": {
                    "@id": {
                      "type": "string",
                      "description": "uri for specification that this distribution conforms to"
                    }
                  }
                }
              },
              "schema:provider": {
                "type": "array",
                "description": "Party who maintains this particular distribution option for the dataset. Use this property if there are multiple distributions from different providers",
                "items": {
                  "anyOf": [
                    {
                      "type": "object",
                      "additionalProperties": false,
                      "properties": {
                        "@id": {
                          "type": "string",
                          "description": "a identifier for an agent defined in this metadata, or externally; must be dereferenceable"
                        }
                      },
                      "required": [
                        "@id"
                      ]
                    },
                    {
                      "$ref": "#/$defs/Person"
                    },
                    {
                      "$ref": "#/$defs/Organization"
                    }
                  ]
                }
              }
            },
            "required": [
              "@type"
            ],
            "allOf": [
              {
                "if": {
                  "not": {
                    "type": "object",
                    "required": [
                      "@type"
                    ],
                    "properties": {
                      "@type": {
                        "type": "array",
                        "contains": {
                          "const": "schema:Collection"
                        }
                      }
                    }
                  }
                },
                "then": {
                  "required": [
                    "schema:contentUrl"
                  ]
                },
                "else": {
                  "required": [
                    "schema:hasPart"
                  ]
                }
              }
            ]
          },
          {
            "title": "Direct data access to a resource via web servcie",
            "description": "use schema.org Action to document url or url template and parameters to request data through a web accessible location. At this point, schema is set up for one action-- an HTTP Get that requests data. The url template parameters (in curly brackets '{}') specify query paramters to filter the source data, request particular output formats or other aspects of data.",
            "type": "object",
            "properties": {
              "@type": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "contains": {
                  "const": "schema:WebAPI"
                },
                "minItems": 1
              },
              "schema:serviceType": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "$ref": "#/$defs/DefinedTerm"
                  }
                ],
                "description": "specify the kind of service. Ideally this should be a resolvable identifier. Currently there is no widely adopted registry for serviceType identifiers, in large part because services might be defined at different levels of granularity, and classifications might focus on function, data formats, thematic content, security, or other aspects of the service definition. For interoperability, there must be an external arrangement between data providers and consumers on the strings that will be used to specify service types."
              },
              "schema:termsOfService": {
                "description": "Description of access privileges required to use the API, e.g. registration, licensing, payments. Note that access constraints applying to all distributions of the resource should be specified in the access constraints for the resource description as a whole.",
                "oneOf": [
                  {
                    "type": "string",
                    "default": "not specified"
                  },
                  {
                    "$ref": "#/$defs/Reference"
                  }
                ]
              },
              "schema:documentation": {
                "description": "a document that provides a machine-actionable description of a service instance. Examples include OpenAPI documents, OGC Capabilities documents. Software designed to utilise a particular service type will typically include functionality to parse such a description document and engage with the service endpoint. If such a document is available for the service instance providing the resource distribution, it should be included in the distribution metadata.",
                "oneOf": [
                  {
                    "type": "string"
                  },
                  {
                    "$ref": "#/$defs/Reference"
                  }
                ]
              },
              "schema:potentialAction": {
                "type": "array",
                "description": "actions that can be invoked via the API",
                "items": {
                  "title": "Action ",
                  "type": "object",
                  "description": "this element defines an action (operation) that can be invoked via messages using the protocol defined. In most cases this will be an http request via TCP/IP, but in desktop or LAN environments, other protocols might be used. The target property defines the endpoint and syntax for invoking the action. Result specifies the encoding format for the (possible) response(s) when the action is invoked. Object specifies the information model for the resource that is the object of the action. This approach is an adoptation of the Action Blog Post from schema.org (see https://schema.org/docs/actions.html, and https://github.com/schemaorg/suggestions-questions-brainstorming/issues/62) ",
                  "properties": {
                    "@type": {
                      "description": "The type of action. Must be schema:Action or one of its subtypes.",
                      "default": "schema:Action",
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "contains": {
                        "enum": [
                          "schema:Action",
                          "schema:AssessAction",
                          "schema:ConsumeAction",
                          "schema:ControlAction",
                          "schema:CreateAction",
                          "schema:DeleteAction",
                          "schema:FindAction",
                          "schema:InteractAction",
                          "schema:MoveAction",
                          "schema:PlayAction",
                          "schema:SearchAction",
                          "schema:TransferAction",
                          "schema:UpdateAction"
                        ]
                      },
                      "minItems": 1
                    },
                    "schema:name": {
                      "type": "string",
                      "description": "text label for the action"
                    },
                    "schema:target": {
                      "type": "object",
                      "description": "specifies the request target location and request syntax. Documentation of the URL end point and syntax to invoke the service. This schema doesn't handle post requests.",
                      "properties": {
                        "@type": {
                          "default": "schema:EntryPoint",
                          "type": "array",
                          "items": {
                            "type": "string"
                          },
                          "contains": {
                            "const": "schema:EntryPoint"
                          },
                          "minItems": 1
                        },
                        "schema:description": {
                          "type": "string"
                        },
                        "schema:urlTemplate": {
                          "type": "string",
                          "description": "a templated URL; parameters are enclosed in curly braces ({..}); parameters are not required. If included, parameters MUST be documented in the query-input element. Template should be consitent with URI Template (https://datatracker.ietf.org/doc/html/rfc6570) examples: - http://portal.chordsrt.com/api/v1/data.{encoding}; single parameter - http://portal.chordsrt.com/api/v1/data.{encoding}?instruments={instruments}&start={start}&end={end} ; multiple parameters - {endpoint}{encoding}; endpoint URL path is a parameter,should only appear in potential actions for API specification descriptions, which are generic-not specific to a particular endpoint."
                        },
                        "schema:httpMethod": {
                          "title": "HTTP Method",
                          "description": "only applicable if protocol is http or a protocol that tunnels on http",
                          "type": "array",
                          "items": {
                            "type": "string",
                            "default": "GET",
                            "enum": [
                              "GET",
                              "PUT",
                              "POST",
                              "PATCH",
                              "DELETE",
                              "COPY",
                              "HEAD",
                              "OPTIONS",
                              "PROPFIND"
                            ]
                          }
                        },
                        "schema:contentType": {
                          "type": "array",
                          "description": "The supported content type(s) for an EntryPoint response. a MIME type (https://www.iana.org/assignments/media-types/media-types.xhtml) that specifies the content type for messages in resonses from the service endpoint. This is a schema.org property, and is redundant with encodingFormat in the result property for the Action.",
                          "items": {
                            "type": "string"
                          }
                        }
                      },
                      "required": [
                        "schema:urlTemplate"
                      ]
                    },
                    "schema:result": {
                      "title": "Action result",
                      "description": "specifies the serialization scheme (encoding format, information model) for the expected representation of the data - documentation of the serialization format for the API response. See the actionResult building block.",
                      "type": "object",
                      "properties": {
                        "@type": {
                          "type": "array",
                          "description": "Type of result object. Typically schema:DataDownload, but may include additional types.",
                          "items": {
                            "type": "string"
                          },
                          "contains": {
                            "const": "schema:DataDownload"
                          },
                          "minItems": 1
                        },
                        "schema:name": {
                          "type": "string",
                          "description": "text label for the result/response format."
                        },
                        "schema:description": {
                          "type": "string",
                          "description": "description of the result/response representation."
                        },
                        "schema:encodingFormat": {
                          "type": "array",
                          "description": "MIME type(s) of the response serialization.",
                          "items": {
                            "type": "string"
                          }
                        },
                        "dcterms:conformsTo": {
                          "type": "array",
                          "description": "identifier(s) for a standard or specification the response conforms to.",
                          "items": {
                            "type": "object",
                            "required": [
                              "@id"
                            ],
                            "additionalProperties": false,
                            "properties": {
                              "@id": {
                                "type": "string"
                              }
                            }
                          }
                        }
                      }
                    },
                    "schema:object": {
                      "type": "object",
                      "description": "The entity upon which the action is carried out, whose state is kept intact or changed. This is an open ended class for general description of Actions. When schema:Action (or a subclass) is used to describe operations for a WebAPI distribution, the object is implicitly the resource that is the subject of the containing metadata record, so this property would be superfluous.",
                      "properties": {
                        "@type": {
                          "default": "schema:Thing",
                          "type": "array",
                          "items": {
                            "type": "string"
                          },
                          "minItems": 1
                        },
                        "schema:description": {
                          "type": "string"
                        }
                      }
                    },
                    "schema:query-input": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "description": "Query input parameter for a web API action, typed as schema:PropertyValueSpecification.",
                        "properties": {
                          "@id": {
                            "type": "string"
                          },
                          "@type": {
                            "default": "schema:PropertyValueSpecification",
                            "type": "array",
                            "items": {
                              "type": "string"
                            },
                            "contains": {
                              "const": "schema:PropertyValueSpecification"
                            },
                            "minItems": 1
                          },
                          "schema:valueName": {
                            "type": "string"
                          },
                          "schema:description": {
                            "type": "string"
                          },
                          "schema:valueRequired": {
                            "type": "boolean",
                            "default": true
                          },
                          "schema:valuePattern": {
                            "type": "string"
                          }
                        },
                        "required": [
                          "schema:valueName",
                          "schema:description"
                        ]
                      },
                      "description": "set of explanations of the parameters in the URL template for the target."
                    }
                  },
                  "required": [
                    "schema:name",
                    "schema:target"
                  ]
                }
              }
            },
            "required": [
              "schema:serviceType",
              "schema:potentialAction",
              "schema:termsOfService"
            ]
          }
        ]
      }
    },
    "schema:relatedLink": {
      "type": "array",
      "description": "Links to related resources. schema:linkRelationship says how the target relates to this resource. Defined by schemaorgProperties/linkRole since 2026-09-23; it was inline here, which is why schemaorgProperties/instrument could not reuse it and defined the same property as a labeled link instead.",
      "items": {
        "description": "A typed link, implemented as a schema.org LinkRole: schema:linkRelationship names how the target relates to the subject, and schema:target carries the EntryPoint actually being linked to.\nThis is the right shape when the relationship itself is the point -- \"this is the canonical version of\", \"this is the download endpoint for\". Where the value is simply a work at a URL, such as a license or a terms-of-service document, use schemaorgProperties/labeledLink instead: a licence is a work, not a role, and wrapping it in a Role forces every consumer through an indirection to reach the thing itself.\nDefined here as a block rather than inline in a profile (where it lived until 2026-09-23) so that more than one consumer can reuse it. While it was inline in cdifCore, schemaorgProperties/instrument could not reach it and defined schema:relatedLink as a labeled link instead -- the same property carrying two different shapes depending on which node held it.",
        "type": "object",
        "properties": {
          "@type": {
            "default": "schema:LinkRole",
            "type": "array",
            "items": {
              "type": "string"
            },
            "contains": {
              "const": "schema:LinkRole"
            },
            "minItems": 1
          },
          "schema:linkRelationship": {
            "$ref": "#/$defs/cdifConceptOrTermOrString",
            "description": "How the target relates to the subject, as a controlled-vocabulary value or a plain string label. Required: a typed link whose relationship is unstated carries no more information than a bare URL, which is what schemaorgProperties/labeledLink is for.",
            "default": "missing"
          },
          "schema:target": {
            "type": "object",
            "description": "The entry point being linked to. Deliberately not sealed: real targets also carry schema:httpMethod, schema:urlTemplate, schema:contentType and domain-specific properties, and JSON-LD is open-world.",
            "properties": {
              "@type": {
                "default": "schema:EntryPoint",
                "type": "array",
                "items": {
                  "type": "string"
                },
                "contains": {
                  "const": "schema:EntryPoint"
                },
                "minItems": 1
              },
              "schema:name": {
                "type": "string"
              },
              "schema:url": {
                "type": "string",
                "format": "uri"
              },
              "schema:encodingFormat": {
                "type": "string",
                "description": "registered MIME types are expected"
              }
            }
          }
        },
        "required": [
          "@type",
          "schema:linkRelationship"
        ]
      }
    },
    "schema:publishingPrinciples": {
      "description": "FDOF digitalObjectMutability, RDA digitalObjectPolicy, FDOF PersistencyPolicy. Policies related to maintenance, update, expected time to live. If an online resource documents the policies or a URI is used to identify the conditions, recommend using schema:CreativeWork to provide a label (name) and an identifier (URI or URL).",
      "type": "array",
      "minItems": 0,
      "items": {
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "object",
            "required": [
              "@id"
            ],
            "additionalProperties": false,
            "properties": {
              "@id": {
                "type": "string",
                "description": "a reference to a publishing principles statement"
              }
            }
          },
          {
            "$ref": "#/$defs/Reference"
          }
        ]
      }
    },
    "schema:keywords": {
      "description": "Keywords are an array of strings, an array of schema:DefinedTerms, or some combination of these. If you have information about a controlled vocabulary from which keywords come from, use schema:DefinedTerm to descibe that keyword. This allowed variability makes parsing metadata hard; recommend using DefinedTerm for all keywords if any of them are from a known vocabulary, otherwise an array of strings.",
      "type": "array",
      "items": {
        "$ref": "#/$defs/cdifConceptOrTermOrString"
      }
    },
    "schema:creator": {
      "description": "author or orginator of intellectual content of dataset. Uset the JSON-LD @list construct to preserve author order. Use contributor with the Role property to specify other roles related to creation or stewardship of the resource.",
      "type": "object",
      "properties": {
        "@list": {
          "type": "array",
          "items": {
            "anyOf": [
              {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "@id": {
                    "type": "string",
                    "description": "a identifier for an agent defined in this metadata, or externally; must be dereferenceable"
                  }
                },
                "required": [
                  "@id"
                ]
              },
              {
                "$ref": "#/$defs/Person"
              },
              {
                "$ref": "#/$defs/Organization"
              }
            ]
          }
        }
      }
    },
    "schema:contributor": {
      "description": "other parties who played a role in production of dataset",
      "type": "array",
      "items": {
        "anyOf": [
          {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "@id": {
                "type": "string",
                "description": "a identifier for an agent defined in this metadata, or externally; must be dereferenceable"
              }
            },
            "required": [
              "@id"
            ]
          },
          {
            "$ref": "#/$defs/Person"
          },
          {
            "$ref": "#/$defs/Organization"
          },
          {
            "description": "For more granularity on how a person contributed to a Dataset, use schema:Role. The schema.org documentation does not state that the Role type is an expected data type of author, creator and contributor, but that is addressed in this blog post (http://blog.schema.org/2014/06/introducing-role.html). see https://github.com/ESIPFed/science-on-schema.org/blob/develop/guides/Dataset.md#roles-of-people",
            "type": "object",
            "properties": {
              "@type": {
                "default": "schema:Role",
                "type": "array",
                "items": {
                  "type": "string"
                },
                "contains": {
                  "const": "schema:Role"
                },
                "minItems": 1
              },
              "schema:roleName": {
                "$ref": "#/$defs/cdifConceptOrTermOrString"
              },
              "schema:contributor": {
                "anyOf": [
                  {
                    "type": "object",
                    "additionalProperties": false,
                    "properties": {
                      "@id": {
                        "type": "string",
                        "description": "IRI reference to a Person or Organization defined elsewhere"
                      }
                    },
                    "required": [
                      "@id"
                    ]
                  },
                  {
                    "$ref": "#/$defs/Person"
                  },
                  {
                    "$ref": "#/$defs/Organization"
                  }
                ]
              }
            },
            "required": [
              "@type",
              "schema:roleName",
              "schema:contributor"
            ]
          }
        ]
      }
    },
    "schema:publisher": {
      "description": "Party who made the dataset publicly available",
      "anyOf": [
        {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "@id": {
              "type": "string",
              "description": "a identifier for an agent defined in this metadata, or externally; must be dereferenceable"
            }
          },
          "required": [
            "@id"
          ]
        },
        {
          "$ref": "#/$defs/Person"
        },
        {
          "$ref": "#/$defs/Organization"
        }
      ]
    },
    "schema:provider": {
      "description": "Party who maintains the distribution options for the dataset. If there are multiple distributions from different providers, use the provider property on distribution/DataDownload",
      "type": "array",
      "items": {
        "anyOf": [
          {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "@id": {
                "type": "string",
                "description": "a identifier for an agent defined in this metadata, or externally; must be dereferenceable"
              }
            },
            "required": [
              "@id"
            ]
          },
          {
            "$ref": "#/$defs/Person"
          },
          {
            "$ref": "#/$defs/Organization"
          }
        ]
      }
    },
    "schema:funding": {
      "type": "array",
      "items": {
        "description": "Funding acknowledgement properties, profile of schema.org/MonetaryGrant",
        "type": "object",
        "properties": {
          "@id": {
            "type": "string",
            "description": "URI identifier for this funding record"
          },
          "@type": {
            "default": "schema:MonetaryGrant",
            "type": "array",
            "items": {
              "type": "string"
            },
            "contains": {
              "const": "schema:MonetaryGrant"
            },
            "minItems": 1
          },
          "schema:identifier": {
            "$ref": "#/$defs/Identifier",
            "description": "identifier for a particular grant"
          },
          "schema:description": {
            "type": "string",
            "description": "description of the funding or grant"
          },
          "schema:name": {
            "type": "string",
            "description": "title of the grant"
          },
          "schema:funder": {
            "anyOf": [
              {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "@id": {
                    "type": "string",
                    "description": "a identifier for an agent defined in this metadata, or externally; must be dereferenceable"
                  }
                },
                "required": [
                  "@id"
                ]
              },
              {
                "$ref": "#/$defs/Person"
              },
              {
                "$ref": "#/$defs/Organization"
              }
            ]
          }
        },
        "anyOf": [
          {
            "required": [
              "schema:funder"
            ]
          },
          {
            "required": [
              "schema:identifier"
            ]
          },
          {
            "required": [
              "schema:name"
            ]
          }
        ]
      }
    },
    "prov:wasGeneratedBy": {
      "description": "Brief information about instruments, software or experimental protocols used",
      "type": "array",
      "items": {
        "title": "very simple links or names of software or instruments used to generate a resource.",
        "type": "object",
        "required": [
          "@type"
        ],
        "properties": {
          "@type": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "minItems": 1,
            "contains": {
              "const": "prov:Activity"
            }
          },
          "prov:used": {
            "type": "array",
            "description": "Entities the activity used. Per PROV-O each value denotes a prov:Entity. An item may be (1) a string URI or free-text reference, (2) an {@id} reference, (3) an inline entity object carrying an @type that includes prov:Entity plus a schema.org type for the kind of thing used, e.g. [\"prov:Entity\",\"schema:Thing\"] (instrument), [\"prov:Entity\",\"schema:CreativeWork\"] (method/protocol), or [\"prov:Entity\",\"schema:SoftwareApplication\"] (software), or (4) a role-keyed wrapper naming what was used through one of the recognized \"used\" relations (schema:instrument, bios:computationalTool, prov:reagent). Base leaves the wrapped value loose; profiles/extensions (e.g. cdifProvActivity, adaProduct) pin its shape (Instrument, ComputationalTool, Reagent, ...).",
            "items": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "object",
                  "required": [
                    "@id"
                  ],
                  "additionalProperties": false,
                  "properties": {
                    "@id": {
                      "type": "string",
                      "description": "a resolvable reference to a representation of the software or instrument used"
                    }
                  }
                },
                {
                  "type": "object",
                  "description": "an inline prov:Entity used by the activity (see prov:used description)",
                  "properties": {
                    "@type": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "minItems": 1,
                      "contains": {
                        "const": "prov:Entity"
                      }
                    }
                  },
                  "required": [
                    "@type"
                  ]
                },
                {
                  "type": "object",
                  "description": "a role-keyed wrapper naming an instrument used by the activity; the extension layer pins the value to an Instrument description.",
                  "required": [
                    "schema:instrument"
                  ]
                },
                {
                  "type": "object",
                  "description": "a role-keyed wrapper naming a computational tool (software) used; the extension layer pins the value to a ComputationalTool description.",
                  "required": [
                    "bios:computationalTool"
                  ]
                },
                {
                  "type": "object",
                  "description": "a role-keyed wrapper naming a reagent / material used; the extension layer pins the value to a Reagent description.",
                  "required": [
                    "prov:reagent"
                  ]
                }
              ]
            }
          }
        }
      }
    },
    "prov:wasDerivedFrom": {
      "description": "Brief information about sources of data used in aggregate datasets",
      "type": "array",
      "items": {
        "title": "very simple links or names of data sources used to generate the described resource.",
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "object",
            "required": [
              "@id"
            ],
            "additionalProperties": false,
            "properties": {
              "@id": {
                "type": "string",
                "description": "a resolvable reference to a representation of the software or instrument used"
              }
            }
          },
          {
            "$ref": "#/$defs/Reference"
          }
        ]
      }
    },
    "schema:subjectOf": {
      "type": "object",
      "description": "see https://github.com/Cross-Domain-Interoperability-Framework/Discovery/issues/13 for discussion on how to make assertion about the sample registration and metadata distinct from statements about the physical object",
      "properties": {
        "@type": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "contains": {
            "const": "schema:Dataset"
          },
          "minItems": 1
        },
        "schema:additionalType": {
          "type": "array",
          "description": "additional type assertions for the catalog record node. dcat:CatalogRecord is required.",
          "items": {
            "$ref": "#/$defs/cdifConceptOrTermOrString"
          },
          "contains": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "@id"
            ],
            "properties": {
              "@id": {
                "const": "dcat:CatalogRecord"
              }
            }
          },
          "minItems": 1
        },
        "@id": {
          "type": "string",
          "description": "identifier for the metadata record"
        },
        "schema:about": {
          "type": "object",
          "required": [
            "@id"
          ],
          "additionalProperties": false,
          "properties": {
            "@id": {
              "type": "string",
              "description": "this must be the @id value of the node containing the resource description metadata"
            }
          }
        },
        "dcterms:conformsTo": {
          "allOf": [
            {
              "contains": {
                "type": "object",
                "required": [
                  "@id"
                ],
                "additionalProperties": false,
                "properties": {
                  "@id": {
                    "const": "https://w3id.org/cdif/core/1.1"
                  }
                }
              }
            },
            {
              "contains": {
                "type": "object",
                "required": [
                  "@id"
                ],
                "additionalProperties": false,
                "properties": {
                  "@id": {
                    "const": "https://w3id.org/cdif/discovery/1.1"
                  }
                }
              }
            }
          ]
        },
        "schema:maintainer": {
          "description": "Identification of the agent that maintains the metadata, with contact information. Should include person name and affiliation, or position name and affiliation, or just organization name. e-mail address is preferred contact information.",
          "anyOf": [
            {
              "$ref": "#/$defs/Person"
            },
            {
              "$ref": "#/$defs/Organization"
            }
          ]
        },
        "schema:sdDatePublished": {
          "description": "date of most recent update to the metadata content",
          "type": "string",
          "format": "date"
        },
        "schema:includedInDataCatalog": {
          "type": "object",
          "description": "identify the source for the origin the metadata record.",
          "properties": {
            "@id": {
              "type": "string",
              "description": "identifier for the graph node."
            },
            "@type": {
              "default": "schema:DataCatalog",
              "type": "array",
              "items": {
                "type": "string"
              },
              "contains": {
                "const": "schema:DataCatalog"
              },
              "minItems": 1
            },
            "schema:name": {
              "type": "string"
            },
            "schema:url": {
              "type": "string",
              "format": "uri",
              "description": "locator to access a landing page for the collection or catalog"
            },
            "schema:identifier": {
              "$ref": "#/$defs/Identifier",
              "description": "identifier for the collection or catalog; use identifier_type to provide information on identifier scheme and context for identifier"
            }
          }
        }
      },
      "required": [
        "schema:about",
        "dcterms:conformsTo",
        "schema:additionalType",
        "@type",
        "@id"
      ]
    },
    "schema:measurementTechnique": {
      "description": "The technique, technology, or methodology used for measurement or determination of the dataset values.",
      "type": "array",
      "items": {
        "$ref": "#/$defs/cdifConceptOrTermOrString"
      }
    },
    "schema:variableMeasured": {
      "description": "What does the dataset measure? (e.g., temperature, pressure)",
      "type": "array",
      "items": {
        "description": "Schema.org PropertyValue-based variableMeasured. Defines properties for a measured variable in a dataset, typed as schema:PropertyValue.",
        "type": "object",
        "properties": {
          "@type": {
            "description": "Must include schema:PropertyValue - a measured VALUE - or schema:PropertyValueSpecification - a SPECIFICATION of one, stating the permitted range, default or unit rather than an observed result. Protocol and method descriptions declare the latter, and pinning the array to PropertyValue alone left them no valid spelling. Additional type URIs may be included.",
            "type": "array",
            "items": {
              "type": "string"
            },
            "contains": {
              "anyOf": [
                {
                  "const": "schema:PropertyValue"
                },
                {
                  "const": "schema:PropertyValueSpecification"
                }
              ]
            },
            "minItems": 1
          },
          "@id": {
            "type": "string"
          },
          "schema:name": {
            "type": "string",
            "description": "string label associated with the variable in the dataset serialization"
          },
          "schema:description": {
            "type": "string",
            "default": "missing"
          },
          "schema:alternateName": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "human intelligible name for variable that conveys semantics"
            }
          },
          "schema:measurementTechnique": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "object",
                "required": [
                  "@id"
                ],
                "additionalProperties": false,
                "properties": {
                  "@id": {
                    "type": "string",
                    "description": "reference to a skos concept"
                  }
                }
              },
              {
                "$ref": "#/$defs/DefinedTerm"
              }
            ],
            "description": "Text description or URI specifying how values for the variable were obtained."
          },
          "schema:propertyID": {
            "type": "array",
            "items": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "object",
                  "required": [
                    "@id"
                  ],
                  "additionalProperties": false,
                  "properties": {
                    "@id": {
                      "type": "string"
                    }
                  }
                },
                {
                  "$ref": "#/$defs/DefinedTerm"
                }
              ]
            },
            "description": "identifier or name for the property concept"
          },
          "schema:unitText": {
            "type": "string",
            "description": "unit of measurement as text"
          },
          "schema:unitCode": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "object",
                "required": [
                  "@id"
                ],
                "additionalProperties": false,
                "properties": {
                  "@id": {
                    "type": "string"
                  }
                }
              },
              {
                "$ref": "#/$defs/DefinedTerm"
              }
            ],
            "description": "URI or code identifying the unit of measure"
          },
          "schema:minValue": {
            "type": "number",
            "description": "minimum numeric value in the dataset"
          },
          "schema:maxValue": {
            "type": "number",
            "description": "maximum numeric value in the dataset"
          },
          "schema:url": {
            "anyOf": [
              {
                "type": "string",
                "format": "uri",
                "description": "link to a web page useful for interpreting the variable"
              },
              {
                "$ref": "#/$defs/Reference"
              }
            ]
          }
        },
        "required": [
          "@type",
          "schema:name"
        ]
      }
    },
    "schema:spatialCoverage": {
      "description": "Geographic extent of resource content.",
      "type": "array",
      "items": {
        "description": "Spatial Extent description for CDIF discovery profile.  Note required prefix declaration for geoSparql ( http://www.opengis.net/ont/geosparql#) and OGC simple features (sf: http://www.opengis.net/ont/sf#)",
        "type": "object",
        "properties": {
          "@type": {
            "default": "schema:Place",
            "type": "array",
            "items": {
              "type": "string"
            },
            "contains": {
              "const": "schema:Place"
            },
            "minItems": 1
          },
          "schema:additionalType": {
            "description": "Domain-specific type classifications for this place (e.g. facility type,laboratory classification, feature type).",
            "type": "array",
            "items": {
              "$ref": "#/$defs/cdifConceptOrTermOrString"
            }
          },
          "schema:name": {
            "description": "A place name for the location, either as a string or a DefinedTerm from a gazetteer.",
            "anyOf": [
              {
                "type": "string"
              },
              {
                "$ref": "#/$defs/DefinedTerm"
              }
            ]
          },
          "schema:identifier": {
            "description": "Formal identifier for this place (e.g. ROR identifier for a facility).",
            "anyOf": [
              {
                "type": "string"
              },
              {
                "$ref": "#/$defs/Identifier"
              }
            ]
          },
          "schema:alternateName": {
            "description": "Alternate or abbreviated name(s) for this place.",
            "type": "array",
            "items": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "$ref": "#/$defs/DefinedTerm"
                }
              ]
            }
          },
          "schema:geo": {
            "description": "Either a bounding box or a point location.",
            "anyOf": [
              {
                "type": "object",
                "description": "A point location. Point locations are recommended for data that is associated with specific sample locations, particularly if these are widely spaced such that an enclosing bounding box would be a misleading representation of the spatial location. Be aware that some client applications might only index or display bounding box extents or a single point location.",
                "properties": {
                  "@type": {
                    "default": "schema:GeoCoordinates",
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "contains": {
                      "const": "schema:GeoCoordinates"
                    },
                    "minItems": 1
                  },
                  "schema:latitude": {
                    "type": "number",
                    "minimum": -90,
                    "maximum": 90
                  },
                  "schema:longitude": {
                    "type": "number",
                    "minimum": -180,
                    "maximum": 180
                  }
                },
                "required": [
                  "@type",
                  "schema:latitude",
                  "schema:longitude"
                ]
              },
              {
                "type": "object",
                "description": "A schema:GeoShape bounding box. The geometry is described with a set of latitude/longitude pairs (in that order).The documentation for schema:GeoShape states 'Either whitespace or commas can be used to separate latitude and longitude; whitespace should be used when writing a list of several such points.'",
                "properties": {
                  "@type": {
                    "default": "schema:GeoShape",
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "contains": {
                      "const": "schema:GeoShape"
                    },
                    "minItems": 1
                  },
                  "schema:box": {
                    "type": "string",
                    "description": "A GeoShape box defines an area on the surface of the earth defined by point locations of the southwest corner and northeast corner of the rectangle in latitude-longitude coordinates. A space should be used to separate the latitude and longitude values. The two corner coordinate points are separated by a space. 'East longitude' means positive longitude values are east of the prime (Greenwich) meridian."
                  }
                },
                "required": [
                  "@type",
                  "schema:box"
                ]
              },
              {
                "type": "object",
                "description": "A schema:GeoShape curvilinear trace, for resource related to a linear trace like a ship track or airplane flight line",
                "properties": {
                  "@type": {
                    "default": "schema:GeoShape",
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "contains": {
                      "const": "schema:GeoShape"
                    },
                    "minItems": 1
                  },
                  "schema:line": {
                    "type": "string",
                    "description": "A GeoShape box defines a curvilinear geometry as a string of latitude-longitude coordinates. A space should be used to separate the latitude and longitude values. The coordinate point pairs are also separated by a space. 'East longitude' means positive longitude values are east of the prime (Greenwich) meridian. e.g. '39.33 120.77 40.44 123.96 41.00 121.34' "
                  }
                },
                "required": [
                  "@type",
                  "schema:line"
                ]
              }
            ]
          },
          "geosparql:hasGeometry": {
            "type": "object",
            "description": "Optional geographic extent using wkt geometry, see Ocean InfoHub (https://book.oceaninfohub.org/thematics/spatial/README.html#simple-geosparql-wkt). Other geometry schemes might be specified in a specific domain profile, e.g. for atmospheric, subsurface data, or local coordinate systems. NOTE that the location specified here should be the same as the schema.org point or contained within the specified bounding box.",
            "properties": {
              "@type": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "minItems": 1,
                "description": "MUST be sf: (<http://www.opengis.net/ont/sf#>) SimpleFeature geometry type. See https://opengeospatial.github.io/ogc-geosparql/geosparql11/sf_geometries.ttl"
              },
              "geosparql:asWKT": {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "contains": {
                      "const": "geosparql:wktLiteral"
                    },
                    "minItems": 1
                  },
                  "@value": {
                    "type": "string",
                    "description": "a WKT geometry description string, e.g. 'POINT(-76 -18)'"
                  }
                }
              },
              "geosparql:crs": {
                "type": "object",
                "required": [
                  "@id"
                ],
                "additionalProperties": false,
                "properties": {
                  "@id": {
                    "type": "string",
                    "description": "identifier string for coordinate reference system, e.g., 'CRS84'"
                  }
                }
              }
            },
            "required": [
              "geosparql:asWKT"
            ]
          }
        },
        "anyOf": [
          {
            "required": [
              "schema:name"
            ]
          },
          {
            "required": [
              "schema:identifier"
            ]
          },
          {
            "required": [
              "schema:geo"
            ]
          },
          {
            "required": [
              "geosparql:hasGeometry"
            ]
          }
        ]
      }
    },
    "schema:temporalCoverage": {
      "description": "Temporal extent of resource content.",
      "type": "array",
      "items": {
        "description": "The time interval during which data was collected or observations were made; or a time period that an activity or collection is linked to intellectually or thematically (for example, 1997 to 1998; the 18th century) (see https://documentation.ardc.edu.au/display/DOC/Temporal+coverage). For documentation of Earth Science, Paleobiology or Paleontology datasets, we are interested in the second case-- the time period that data are linked to thematically. NOTE-- context must include \"time\": \"http://www.w3.org/2006/time#\"}",
        "anyOf": [
          {
            "type": "object",
            "description": "a w3c time proper interval with bounds that are named time ordinal eras with identifier, e.g. geologic age. This is a SOSO schema.org extension",
            "properties": {
              "@type": {
                "default": "time:ProperInterval",
                "type": "array",
                "items": {
                  "type": "string"
                },
                "contains": {
                  "const": "time:ProperInterval"
                },
                "minItems": 1
              },
              "schema:description": {
                "type": "string",
                "description": "free text description of the temporal interval"
              },
              "time:intervalStartedBy": {
                "type": "string",
                "format": "uri",
                "description": "identifier for a named time ordinal era that is older bound of time interval, e.g. 'isc:LowerDevonian' "
              },
              "time:intervalFinishedBy": {
                "type": "string",
                "format": "uri",
                "description": "identifier for a named time ordinal era that is younger bound of time interval, e.g. 'isc:LowerDevonian' "
              }
            },
            "anyOf": [
              {
                "required": [
                  "time:intervalStartedBy"
                ]
              },
              {
                "required": [
                  "time:intervalFinishedBy"
                ]
              }
            ]
          },
          {
            "type": "object",
            "description": "a w3c time proper interval with bounds that numeric ages.",
            "properties": {
              "@context": {
                "type": "object",
                "properties": {
                  "time": {
                    "type": "string",
                    "const": "http://www.w3.org/2006/time#"
                  },
                  "schema": {
                    "type": "string",
                    "const": "http://schema.org/"
                  }
                },
                "required": [
                  "time",
                  "schema"
                ],
                "additionalProperties": true,
                "description": "Must exactly match the specified @context object."
              },
              "@type": {
                "default": "time:ProperInterval",
                "type": "array",
                "items": {
                  "type": "string"
                },
                "contains": {
                  "const": "time:ProperInterval"
                },
                "minItems": 1
              },
              "schema:description": {
                "type": "string",
                "description": "free text description of the temporal interval"
              },
              "time:hasBeginning": {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "contains": {
                      "const": "time:Instant"
                    },
                    "minItems": 1
                  },
                  "time:inTimePosition": {
                    "type": "object",
                    "properties": {
                      "@type": {
                        "default": "time:TimePosition",
                        "type": "array",
                        "items": {
                          "type": "string"
                        },
                        "contains": {
                          "const": "time:TimePosition"
                        },
                        "minItems": 1
                      },
                      "time:hasTRS": {
                        "type": "string",
                        "description": "identifier for a temporal reference system; default is million years before prsent as a decimal number",
                        "default": "http://www.opengis.net/def/crs/OGC/0/ChronometricGeologicTime"
                      },
                      "time:numericPosition": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "@type",
                      "time:hasTRS",
                      "time:numericPosition"
                    ]
                  }
                }
              },
              "time:hasEnd": {
                "type": "object",
                "properties": {
                  "@type": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "contains": {
                      "const": "time:Instant"
                    },
                    "minItems": 1
                  },
                  "time:inTimePosition": {
                    "type": "object",
                    "properties": {
                      "@type": {
                        "default": "time:TimePosition",
                        "type": "array",
                        "items": {
                          "type": "string"
                        },
                        "contains": {
                          "const": "time:TimePosition"
                        },
                        "minItems": 1
                      },
                      "time:hasTRS": {
                        "type": "string",
                        "description": "identifier for a temporal reference system; default is million years before prsent as a decimal number",
                        "default": "http://www.opengis.net/def/crs/OGC/0/ChronometricGeologicTime"
                      },
                      "time:numericPosition": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "@type",
                      "time:hasTRS",
                      "time:numericPosition"
                    ]
                  }
                }
              }
            },
            "anyOf": [
              {
                "required": [
                  "time:hasBeginning"
                ]
              },
              {
                "required": [
                  "time:hasEnd"
                ]
              }
            ]
          },
          {
            "type": "string",
            "description": "Simple ISO8601 encoding of calendar date, dateTime, or time interval with calendar date bounds"
          }
        ]
      }
    },
    "dqv:hasQualityMeasurement": {
      "description": "Quality measurements reported to assess the resource.",
      "type": "array",
      "items": {
        "title": "definitions for simple quality measure property",
        "type": "object",
        "properties": {
          "@type": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "contains": {
              "const": "dqv:QualityMeasurement"
            },
            "minItems": 1
          },
          "dqv:isMeasurementOf": {
            "description": "specify the quality measure that is reported, by name, with an ID ref, or as a Defined Term",
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "object",
                "required": [
                  "@id"
                ],
                "additionalProperties": false,
                "properties": {
                  "@id": {
                    "type": "string",
                    "description": "a resolvable reference to a representation of a quality measure"
                  }
                }
              },
              {
                "$ref": "#/$defs/DefinedTerm"
              }
            ]
          },
          "dqv:value": {
            "description": "the reported result of the quality measure, as a string, a number, or a defined term from a vocabulary",
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "number"
              },
              {
                "$ref": "#/$defs/DefinedTerm"
              }
            ]
          }
        },
        "required": [
          "dqv:isMeasurementOf",
          "dqv:value"
        ]
      }
    }
  },
  "allOf": [
    {
      "required": [
        "@id",
        "@type",
        "@context",
        "schema:name",
        "schema:identifier",
        "schema:dateModified",
        "schema:subjectOf"
      ]
    },
    {
      "anyOf": [
        {
          "required": [
            "schema:license"
          ]
        },
        {
          "required": [
            "schema:conditionsOfAccess"
          ]
        }
      ]
    },
    {
      "anyOf": [
        {
          "required": [
            "schema:url"
          ]
        },
        {
          "required": [
            "schema:distribution"
          ]
        }
      ]
    },
    {
      "description": "a bundle distribution with no schema:contentUrl obliges the dataset to publish a landing page in schema:url, so that the record still states a way to reach the data",
      "if": {
        "required": [
          "schema:distribution"
        ],
        "properties": {
          "schema:distribution": {
            "type": "array",
            "contains": {
              "type": "object",
              "required": [
                "@type"
              ],
              "properties": {
                "@type": {
                  "type": "array",
                  "contains": {
                    "const": "schema:Collection"
                  }
                }
              },
              "not": {
                "required": [
                  "schema:contentUrl"
                ]
              }
            }
          }
        }
      },
      "then": {
        "required": [
          "schema:url"
        ]
      }
    }
  ],
  "$defs": {
    "cdifConceptOrTermOrString": {
      "title": "CDIF Concept-or-Term-or-String",
      "description": "Shared shape for a CDIF property that carries either a controlled-vocabulary value or a bare string label. Wraps cdifConceptOrTerm (SKOS-concept @id-ref, schema:DefinedTerm, or inline cdif:Concept) with a plain-string alternative used for legacy or single-word labels not yet bound to a vocabulary.",
      "anyOf": [
        {
          "type": "string"
        },
        {
          "description": "A SKOS concept identified by URI, a schema:DefinedTerm, or an inline cdif:Concept. Shared shape used wherever a CDIF property carries either a controlled-vocabulary reference or an inline concept definition.",
          "anyOf": [
            {
              "type": "object",
              "required": [
                "@id"
              ],
              "additionalProperties": false,
              "properties": {
                "@id": {
                  "type": "string",
                  "description": "reference to a skos concept for the data type"
                }
              }
            },
            {
              "$ref": "#/$defs/DefinedTerm"
            },
            {
              "$ref": "#/$defs/Concept"
            }
          ]
        }
      ]
    },
    "DefinedTerm": {
      "description": "schema.org Defined Term schema.\n\n**Union-type policy:** In CDIF profile UML models an attribute typed as\nschema:DefinedTerm is represented by a single attribute of that class type.\nThe JSON Schema implementation permits the property value to be EITHER a\nplain string (interpreted as schema:name or schema:termCode in the default\nvocabulary) OR a full schema:DefinedTerm object (with explicit @type, name,\nidentifier, termCode, inDefinedTermSet). Consumers should accept either form.\n\nNote that this differs from the cdif Concept policy: a Concept (skos:Concept)\nin CDIF profiles MUST be a controlled-vocabulary entry (object form or\n@id-reference) — plain strings are not permitted for Concept-typed values\nbecause vocabulary identity cannot be recovered from an unscoped label.\n",
      "type": "object",
      "properties": {
        "@type": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "contains": {
            "const": "schema:DefinedTerm"
          },
          "minItems": 1
        },
        "schema:name": {
          "type": "string",
          "description": "text label for the term that is useful to human user"
        },
        "schema:identifier": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/$defs/Identifier"
            }
          ]
        },
        "schema:inDefinedTermSet": {
          "description": "The controlled vocabulary responsible for this keyword, as EITHER a plain URI string identifying the vocabulary, OR an object reference ({\"@id\": \"<uri>\"}) to a vocabulary defined elsewhere in the document. Both forms are already in use across CDIF profiles and downstream ADA building blocks; permitting only the string form made the object form - the natural JSON-LD spelling of a reference - invalid, while this class's own union-type policy above explicitly anticipates both.",
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "object",
              "required": [
                "@id"
              ],
              "additionalProperties": false,
              "properties": {
                "@id": {
                  "type": "string"
                }
              }
            }
          ]
        },
        "schema:termCode": {
          "type": "string",
          "description": "A representative code for this keyword in the controlled vocabulary. Analogous to skos:Notation"
        }
      },
      "allOf": [
        {
          "required": [
            "@type"
          ]
        },
        {
          "anyOf": [
            {
              "required": [
                "schema:name"
              ]
            },
            {
              "required": [
                "schema:identifier"
              ]
            },
            {
              "required": [
                "schema:termCode"
              ]
            }
          ]
        }
      ]
    },
    "Identifier": {
      "description": "Properties for a schema.org identifier (schema:PropertyValue pattern).\n**Union-type policy:** In CDIF profile UML models an attribute typed as\nschema:Identifier / schema:PropertyValue is represented by a single attribute\nof that class type. The JSON Schema implementation permits the property value\nto be EITHER a plain string (interpreted as the bare identifier value) OR a\nfull schema:PropertyValue object (with explicit @type, propertyID, value).\nConsumers should accept either form.\n",
      "type": "object",
      "properties": {
        "@type": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "contains": {
            "const": "schema:PropertyValue"
          },
          "minItems": 1
        },
        "schema:propertyID": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "@id"
              ],
              "properties": {
                "@id": {
                  "type": "string"
                }
              }
            }
          ],
          "description": "In this context for the schema:PropertyValue, this field is an identifier for the identifier schema, e.g. DOI, ARK.  Get values from https://registry.identifiers.org/registry/ for interoperability. URI-shape values MUST be serialized as JSON-LD IRI references ({\"@id\":\"...\"}) so they participate in RDF entailment; free-label strings remain valid as strings."
        },
        "schema:value": {
          "type": "string",
          "description": "the identifier string. E.g. 10.5066/F7VX0DMQ"
        },
        "schema:url": {
          "type": "string",
          "format": "uri",
          "description": "web-resolveable string for the identifier; host name part is location of a resolver that will return some representation for the given identifier value. E.g. https://doi.org/10.5066/F7VX0DMQ "
        }
      },
      "allOf": [
        {
          "required": [
            "@type"
          ]
        },
        {
          "anyOf": [
            {
              "required": [
                "schema:value"
              ]
            },
            {
              "required": [
                "schema:url"
              ]
            }
          ]
        }
      ]
    },
    "Reference": {
      "description": "Schema for a labeled link, a profile of schema.org/CreativeWork: a resolvable URL with an optional name and description. Optionally carries the DCAT relation surface (dcat:hadRole, dcterms:relation) for a link that expresses a typed relationship rather than a plain reference.\nThose two properties were a separate block, cdifDataType/cdifReference, which was an allOf of this schema plus exactly those two optional properties and nothing else -- its dcat:Relationship co-type mandate had already been removed because it made every labeled link unsatisfiable and broke every schema:license example that followed schema.org's own advice. Since both are optional, folding them in here changes no document's validity while removing a block and five levels of $defs/Reference indirection. cdifReference was retired 2026-09-23.",
      "type": "object",
      "properties": {
        "@type": {
          "description": "Either construct, or both. A labeled link is a schema:CreativeWork at a URL; a dcat:Relationship is DCAT's association class for a typed relation to another resource. A node may declare both -- CDIF's own relation examples do -- but NEITHER IS REQUIRED TO ACCOMPANY THE OTHER.\nThat is the whole point of the anyOf. Until 2026-09-08 this block's Relation half required contains: dcat:Relationship while the labeled-link half required contains: schema:CreativeWork, and under allOf both applied to every instance, so an ordinary labeled link was unsatisfiable. Of profile-core's licenses the 29 plain strings and 1 @id-reference passed while the 10 that followed schema.org's own recommendation -- \"use schema:CreativeWork to provide a label (name) for the license\" -- failed. 412782113 fixed that by deleting the dcat:Relationship mandate outright, which left the JSON Schema with no notion of dcat:Relationship at all while rules.shacl went on targeting it as a class. A pure DCAT relation then met a SHACL requirement with no schema counterpart. This anyOf restores the type to the schema WITHOUT restoring the conjunction.",
          "default": "schema:CreativeWork",
          "type": "array",
          "items": {
            "type": "string"
          },
          "minItems": 1,
          "anyOf": [
            {
              "contains": {
                "const": "schema:CreativeWork"
              }
            },
            {
              "contains": {
                "const": "dcat:Relationship"
              }
            }
          ]
        },
        "schema:name": {
          "type": "string"
        },
        "schema:description": {
          "type": "string"
        },
        "schema:url": {
          "type": "string",
          "format": "uri"
        },
        "dcat:hadRole": {
          "description": "Role of the related resource. Present only on a link that expresses a relationship; a plain labeled link such as a license omits it.\nDCAT's declared range is dcat:Role (dcat.ttl: rdfs:range dcat:Role, and dcat:Role rdfs:subClassOf skos:Concept), so the DCAT-native form is a node typed dcat:Role. That form was NOT accepted here before 2026-10-01: this property was cdifConceptOrTermOrString alone, which matches a bare string, a sealed @id reference, a schema:DefinedTerm or a skos:Concept -- none of which a dcat:Role-typed node satisfies, because JSON Schema does no subclass reasoning.\ndcat:Role is added as a branch rather than replacing the others, so the DCAT-native form becomes valid without invalidating anything already written. Note this leaves CDIF LOOSER than DCAT, deliberately: DCAT's range is dcat:Role alone, and CDIF also accepts a plain skos:Concept, a DefinedTerm, an @id reference and a string. That is the same both-forms stance taken on dcterms:relation, and it is a choice rather than an oversight -- do not read the extra branches as something not yet tightened.",
          "anyOf": [
            {
              "description": "A dcat:Role -- DCAT's declared range for dcat:hadRole. Defined inline rather than as its own building block because nothing else in the register needs it yet; dcat:hadRole's domain is owl:unionOf [prov:Attribution, dcat:Relationship], so promote it to a block if a qualified attribution ever needs the same shape.\ndcat:Role rdfs:subClassOf skos:Concept, so the skos:prefLabel / skos:inScheme furniture of a concept is permitted alongside; it is not required here because DCAT states no cardinality constraints on the class -- dcat.ttl declares no rdfs:subClassOf and no owl:Restriction on dcat:Relationship, and the \"mandatory\" wording in the DCAT-3 document is prose in the spec tables rather than an axiom in the vocabulary.",
              "type": "object",
              "properties": {
                "@id": {
                  "type": "string",
                  "description": "IRI of the role concept, ideally from a controlled vocabulary."
                },
                "@type": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  },
                  "contains": {
                    "const": "dcat:Role"
                  },
                  "minItems": 1
                }
              },
              "required": [
                "@type"
              ]
            },
            {
              "$ref": "#/$defs/cdifConceptOrTermOrString"
            }
          ]
        },
        "dcterms:relation": {
          "description": "The related resource -- the DCAT canonical pointer to what is being related to, which is distinct from schema:url, the presentation URL of the link itself.\nAn @id reference is the RECOMMENDED form and a string is permitted, which is DCMI's own position: \"Recommended practice is to identify the related resource by means of a URI. If this is not possible or feasible, a string conforming to a formal identification system may be provided.\" DCMI declares no rdfs:range for this property, and of the 13 DCMI properties carrying an \"intended to be used with non-literal values\" restriction, this is deliberately not one. dcat.ttl does not re-declare or constrain it at all -- the only triple mentioning it in the whole DCAT vocabulary is `dcat:distribution rdfs:subPropertyOf dcterms:relation`.\nSo objectReference-only would be stricter than both DCAT and DCMI and would reject a form the specification sanctions. The anyOf matches how schema:additionalType is handled here: both forms valid, the object form used in examples and required only where a `contains` pins a specific value.\nIt was string-only until 2026-10-01, which rejected the @id form outright. Reported from outside by a PSDI validator taking a things-not-strings approach (profile-core#16): their DCAT catalogue mirrors the DCAT-3 spec examples and wrote {\"@id\": ...}, which failed both layers -- while CDIF's own documented URI serialization policy (agents.md) says URI values SHOULD be {\"@id\": ...}. The register required the one form its own policy argues against.",
          "anyOf": [
            {
              "title": "Object Reference",
              "description": "A reference to a node defined elsewhere, by its @id.",
              "type": "object",
              "properties": {
                "@id": {
                  "type": "string",
                  "description": "resolvable @id of the referenced node"
                }
              },
              "required": [
                "@id"
              ],
              "additionalProperties": false
            },
            {
              "type": "string",
              "format": "uri"
            }
          ]
        }
      },
      "required": [
        "@type"
      ],
      "allOf": [
        {
          "if": {
            "required": [
              "@type"
            ],
            "properties": {
              "@type": {
                "contains": {
                  "const": "schema:CreativeWork"
                }
              }
            }
          },
          "then": {
            "required": [
              "schema:url"
            ]
          }
        }
      ]
    },
    "Person": {
      "description": "schema for cdif profile of schema.org/Person",
      "type": "object",
      "properties": {
        "@id": {
          "type": "string"
        },
        "@type": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "contains": {
            "const": "schema:Person"
          },
          "minItems": 1
        },
        "schema:name": {
          "type": "string",
          "description": "string label for person that is meaningful for human users, should format consistently. Recommend 'Family Name, Given name' format."
        },
        "schema:description": {
          "type": "string"
        },
        "schema:identifier": {
          "description": "identifier for person, recommend ORCID",
          "anyOf": [
            {
              "$ref": "#/$defs/Identifier"
            },
            {
              "type": "string"
            }
          ]
        },
        "schema:alternateName": {
          "type": "string",
          "description": "other labels by which the person might be known"
        },
        "schema:affiliation": {
          "$ref": "#/$defs/Organization",
          "description": "if affiliation is present, value must be a schema:Organization."
        },
        "schema:contactPoint": {
          "type": "object",
          "description": "restrict to email only. Schema.org allows telephone and postal contacts as well",
          "properties": {
            "@type": {
              "default": "schema:ContactPoint",
              "type": "array",
              "items": {
                "type": "string"
              },
              "contains": {
                "const": "schema:ContactPoint"
              },
              "minItems": 1
            },
            "schema:email": {
              "type": "string"
            }
          },
          "required": [
            "@type",
            "schema:email"
          ]
        },
        "schema:sameAs": {
          "type": "array",
          "description": "other identifiers for the person",
          "items": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "object",
                "required": [
                  "@id"
                ],
                "additionalProperties": false,
                "properties": {
                  "@id": {
                    "type": "string"
                  }
                }
              }
            ]
          }
        }
      },
      "allOf": [
        {
          "required": [
            "@type"
          ]
        },
        {
          "anyOf": [
            {
              "required": [
                "schema:name"
              ]
            },
            {
              "required": [
                "schema:identifier"
              ]
            }
          ]
        }
      ]
    },
    "Organization": {
      "type": "object",
      "properties": {
        "@id": {
          "type": "string"
        },
        "@type": {
          "default": "schema:Organization",
          "type": "array",
          "items": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "schema:Organization",
                  "schema:FundingAgency",
                  "schema:Consortium",
                  "schema:Corporation",
                  "schema:EducationalOrganization",
                  "schema:FundingScheme",
                  "schema:GovernmentOrganization",
                  "schema:NGO",
                  "schema:Project",
                  "schema:ResearchOrganization"
                ]
              }
            ]
          },
          "contains": {
            "const": "schema:Organization"
          },
          "minItems": 1
        },
        "schema:additionalType": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/cdifConceptOrTermOrString"
          }
        },
        "schema:name": {
          "type": "string",
          "description": "string label for organization that is meaningful for human users"
        },
        "schema:alternateName": {
          "type": "string",
          "description": "other labels by which the organization might be known"
        },
        "schema:description": {
          "type": "string"
        },
        "schema:identifier": {
          "description": "identifier for organization",
          "anyOf": [
            {
              "$ref": "#/$defs/Identifier"
            },
            {
              "type": "string"
            }
          ]
        },
        "schema:sameAs": {
          "type": "array",
          "description": "other identifiers for the organization",
          "items": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "object",
                "required": [
                  "@id"
                ],
                "additionalProperties": false,
                "properties": {
                  "@id": {
                    "type": "string"
                  }
                }
              }
            ]
          }
        }
      },
      "allOf": [
        {
          "required": [
            "@type"
          ]
        },
        {
          "anyOf": [
            {
              "required": [
                "schema:name"
              ]
            },
            {
              "required": [
                "schema:identifier"
              ]
            }
          ]
        }
      ]
    },
    "Concept": {
      "type": "object",
      "properties": {
        "@context": {
          "description": "JSON-LD context declaring the skos namespace prefix. May be a single object or an array of strings and objects.",
          "anyOf": [
            {
              "type": "object",
              "properties": {
                "skos": {
                  "const": "http://www.w3.org/2004/02/skos/core#"
                }
              },
              "required": [
                "skos"
              ]
            },
            {
              "type": "array",
              "items": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "object"
                  }
                ]
              },
              "contains": {
                "type": "object",
                "properties": {
                  "skos": {
                    "const": "http://www.w3.org/2004/02/skos/core#"
                  }
                },
                "required": [
                  "skos"
                ]
              }
            }
          ]
        },
        "@id": {
          "type": "string",
          "description": "URI identifier for this concept."
        },
        "@type": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "contains": {
            "const": "skos:Concept"
          },
          "minItems": 1
        },
        "skos:prefLabel": {
          "description": "Preferred lexical label for this concept. A single string, a single language-tagged value, or an array of language-tagged values. Each language should appear at most once.",
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/$defs/LanguageTaggedValue"
            },
            {
              "type": "array",
              "items": {
                "$ref": "#/$defs/LanguageTaggedValue"
              }
            }
          ]
        },
        "skos:notation": {
          "description": "Classification code for this concept within a scheme (a single notation string, consistent with CdifCodelistConcept).",
          "type": "string"
        },
        "skos:definition": {
          "description": "Formal explanation of the meaning of this concept.",
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/$defs/LanguageTaggedValue"
            },
            {
              "type": "array",
              "items": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "$ref": "#/$defs/LanguageTaggedValue"
                  }
                ]
              }
            }
          ]
        },
        "skos:scopeNote": {
          "description": "Note clarifying meaning and/or intended use.",
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/$defs/LanguageTaggedValue"
            },
            {
              "type": "array",
              "items": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "$ref": "#/$defs/LanguageTaggedValue"
                  }
                ]
              }
            }
          ]
        },
        "skos:note": {
          "description": "General note about this concept.",
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/$defs/LanguageTaggedValue"
            },
            {
              "type": "array",
              "items": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "$ref": "#/$defs/LanguageTaggedValue"
                  }
                ]
              }
            }
          ]
        },
        "skos:historyNote": {
          "description": "Note about past state or use.",
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/$defs/LanguageTaggedValue"
            },
            {
              "type": "array",
              "items": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "$ref": "#/$defs/LanguageTaggedValue"
                  }
                ]
              }
            }
          ]
        },
        "skos:changeNote": {
          "description": "Note documenting a change.",
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/$defs/LanguageTaggedValue"
            },
            {
              "type": "array",
              "items": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "$ref": "#/$defs/LanguageTaggedValue"
                  }
                ]
              }
            }
          ]
        },
        "skos:editorialNote": {
          "description": "Note for editors and maintainers.",
          "anyOf": [
            {
              "type": "string"
            },
            {
              "$ref": "#/$defs/LanguageTaggedValue"
            },
            {
              "type": "array",
              "items": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "$ref": "#/$defs/LanguageTaggedValue"
                  }
                ]
              }
            }
          ]
        },
        "skos:inScheme": {
          "description": "Concept scheme(s) this concept belongs to.",
          "anyOf": [
            {
              "type": "object",
              "additionalProperties": false,
              "properties": {
                "@id": {
                  "type": "string"
                }
              },
              "required": [
                "@id"
              ]
            },
            {
              "type": "array",
              "items": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "@id": {
                    "type": "string"
                  }
                },
                "required": [
                  "@id"
                ]
              }
            }
          ]
        },
        "skos:topConceptOf": {
          "description": "Concept scheme(s) for which this is a top concept.",
          "anyOf": [
            {
              "type": "object",
              "additionalProperties": false,
              "properties": {
                "@id": {
                  "type": "string"
                }
              },
              "required": [
                "@id"
              ]
            },
            {
              "type": "array",
              "items": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "@id": {
                    "type": "string"
                  }
                },
                "required": [
                  "@id"
                ]
              }
            }
          ]
        },
        "skos:broader": {
          "description": "Broader (parent) concepts in the hierarchy. Items are inline concept objects or @id references.",
          "type": "array",
          "items": {
            "anyOf": [
              {
                "type": "object",
                "additionalProperties": false,
                "description": "A reference to a SKOS Concept by URI.",
                "properties": {
                  "@id": {
                    "type": "string",
                    "description": "URI of the referenced concept."
                  }
                },
                "required": [
                  "@id"
                ]
              },
              {
                "$ref": "#/$defs/Concept"
              }
            ]
          }
        },
        "skos:narrower": {
          "description": "Narrower (child) concepts in the hierarchy. Items are inline concept objects or @id references.",
          "type": "array",
          "items": {
            "anyOf": [
              {
                "type": "object",
                "additionalProperties": false,
                "description": "A reference to a SKOS Concept by URI.",
                "properties": {
                  "@id": {
                    "type": "string",
                    "description": "URI of the referenced concept."
                  }
                },
                "required": [
                  "@id"
                ]
              },
              {
                "$ref": "#/$defs/Concept"
              }
            ]
          }
        }
      },
      "required": [
        "@type",
        "skos:prefLabel",
        "skos:definition",
        "skos:inScheme"
      ]
    },
    "LanguageTaggedValue": {
      "type": "object",
      "description": "An RDF literal value with a language tag, serialized as a JSON-LD value object.",
      "properties": {
        "@value": {
          "type": "string",
          "description": "The text content."
        },
        "@language": {
          "type": "string",
          "description": "BCP 47 language tag (e.g. en, fr, de)."
        }
      },
      "required": [
        "@value",
        "@language"
      ]
    }
  }
}
