{
  "$id": "https://specif.de/v1.1/schema#",
  "$schema": "https://json-schema.org/draft/2019-09/schema",
  "definitions": {
    "SpecifId": {
      "description": "A globally unique identifier.",
      "type": "string",
      "pattern": "^[_a-zA-Z]{1}[_a-zA-Z0-9.-]*$"
    },
    "SpecifAlternativeId": {
      "description": "A list of pointers to resources resp. statements which have been merged to this one.",
      "type": "object",
      "properties": {
        "id": {
          "description": "A string with a valid identifier of a model-element",
          "$ref": "#/definitions/SpecifId"
        },
        "revision": {
          "description": "If missing, the latest revision is implied.",
          "$ref": "#/definitions/SpecifRevision"
        },
        "project": {
          "description": "A string with a valid project identifier in case the identifier is not globally unique.",
          "$ref": "#/definitions/SpecifId"
        }
      },
      "additionalProperties": false,
      "required": ["id"]
    },
    "SpecifAlternativeIds": {
      "description": "The list of consolidated items to be used in case a consolidated item shall be updated.",
      "type": "array",
      "uniqueItems": true,
      "items": {
        "$ref": "#/definitions/SpecifAlternativeId"
      }
    },
    "SpecifRevision": {
      "description": "A globally unique revision tag with one or multiple blocks with alphanumeric characters separated by a special character [.:,;/-]. Sequential as well as branching/merging notations are possible.",
      "type": "string",
      "pattern": "^(?:[0-9a-zA-Z]+[.:,;/-])*[0-9a-zA-Z]+$"
    },
    "SpecifReplaces": {
      "description": "For change and configuration management; the first revision has 0 entries, a simple modification has 1 entry and the result of a merge has 2 entries.",
      "type": "array",
      "maxItems": 2,
      "uniqueItems": true,
      "items": {
        "$ref": "#/definitions/SpecifRevision"
      }
    },
    "SpecifKey": {
      "description": "A key for a particular revision of an identifiable item, e.g. of a resource. A key consists of a globally unique identifier and a revision. No or an undefined revision means the latest revision of the identified item.",
      "type": "object",
      "properties": {
        "id": {
          "$ref": "#/definitions/SpecifId"
        },
        "revision": {
          "description": "If missing, the latest revision is implied.",
          "$ref": "#/definitions/SpecifRevision"
        }
      },
      "additionalProperties": false,
      "required": ["id"]
    },
    "SpecifKeys": {
      "description": "A list of keys referencing items such as propertyClasses, resourceClasses or statementClasses; any list must have >0 entries including those of any parent element.",
      "type": "array",
      "uniqueItems": true,
      "items": {
        "$ref": "#/definitions/SpecifKey"
      }
    },
    "SpecifRights": {
      "type": "object",
      "properties": {
        "title": {
          "type": "string"
        },
        "url": {
          "type": "string",
          "format": "uri"
        }
      },
      "required": ["title", "url"]
    },
    "SpecifOrg": {
      "type": "object",
      "properties": {
        "organizationName": {
          "type": "string"
        }
      },
      "required": ["organizationName"]
    },
    "SpecifCreatedBy": {
      "description": "The creator of the SpecIF data-set (file). If specified, at least an e-mail address must be given.",
      "type": "object",
      "properties": {
        "familyName": {
          "type": "string"
        },
        "givenName": {
          "type": "string"
        },
        "org": {
          "$ref": "#/definitions/SpecifOrg"
        },
        "email": {
          "type": "string",
          "format": "email"
        }
      },
      "required": ["email"]
    },
    "SpecifText": {
      "description": "A good class name indicates it's role. The use of a vocabulary-term is recommended, which in turn can be translated to any natural or domain language.",
      "type": "string"
    },
    "SpecifTextFormat": {
      "type": "string",
      "enum": ["plain", "xhtml"]
    },
    "SpecifMultiLanguageText": {
      "description": "A list of items with text and language properties. If the information is be provided in multiple languages, the language must be specified for proper selection; it is however not required by the schema to avoid a lot of overhead in most cases with a single language.",
      "type": "array",
      "uniqueItems": true,
      "items": {
        "type": "object",
        "properties": {
          "text": {
            "description": "A string containing some text.",
            "type": "string"
          },
          "format": {
            "description": "By default, the format is assumed 'plain'.",
            "$ref": "#/definitions/SpecifTextFormat"
          },
          "language": {
            "description": "An IETF language tag such as 'en', 'en-US, 'fr' or 'de'.",
            "type": "string"
          }
        },
        "additionalProperties": false,
        "required": ["text"]
      }
    },
    "SpecifValue": {
      "oneOf": [
        {
          "description": "For properties with a dataType other than 'xs:string'.",
          "type": "string"
        },
        {
          "description": "For properties with dataType 'xs:string'.",
          "$ref": "#/definitions/SpecifMultiLanguageText"
        }
      ]
    },
    "SpecifValues": {
      "description": "If 'multiple' of the propertyClass is undefined or false, the array must contain one item. If the value is unknown, omit the whole property. By default, the class' value applies.",
      "type": "array",
      "minItems": 1,
      "uniqueItems": true,
      "items": {
        "$ref": "#/definitions/SpecifValue"
      }
    },
    "SpecifEnumeratedValue": {
      "type": "object",
      "properties": {
        "id": {
          "$ref": "#/definitions/SpecifId"
        },
        "value": {
          "$ref": "#/definitions/SpecifValue"
        }
      },
      "required": ["id", "value"]
    },
    "SpecifEnumeratedValues": {
      "type": "array",
      "title": "Enumerated Values",
      "description": "Enumerated values for the given dataType. If 'multiple' is true 0..n options may be selected, otherwise exactly one must be selected.",
      "uniqueItems": true,
      "items": {
        "$ref": "#/definitions/SpecifEnumeratedValue"
      }
    },
    "SpecifDateTime": {
      "description": "An ISO-8601 dateTime string. For reduced accuracy, any number of values may be dropped, but only from right to left.",
      "type": "string",
      "format": "date-time"
    },
    "SpecifIcon": {
      "description": "A symbol for display as a prefix to titles; applicable to all instances of the class. Is usually a XML-encoded UTF-8 symbol, can be an URL or dataURL.",
      "type": "string"
    },
    "SpecifInstantiation": {
      "description": "Indicates whether an instance of the class is created automatically, manually or both. All is allowed, if the property is omitted. The class is abstract and cannot be instantiated, if the property list is present, but empty.",
      "type": "array",
      "uniqueItems": true,
      "items": {
        "type": "string",
        "enum": ["auto", "user"]
      }
    },
    "SpecifDataType": {
      "oneOf": [
        {
          "type": "object",
          "properties": {
            "type": {
              "description": "The corresponding definition in https://www.w3.org/TR/xmlschema-2/ applies.",
              "type": "string",
              "title": "Data-type 'Boolean'",
              "enum": ["xs:boolean"]
            },
            "id": {
              "$ref": "#/definitions/SpecifId"
            },
            "title": {
              "$ref": "#/definitions/SpecifText"
            },
            "description": {
              "$ref": "#/definitions/SpecifMultiLanguageText"
            },
            "revision": {
              "$ref": "#/definitions/SpecifRevision"
            },
            "replaces": {
              "$ref": "#/definitions/SpecifReplaces"
            },
            "changedAt": {
              "$ref": "#/definitions/SpecifDateTime"
            },
            "changedBy": {
              "type": "string"
            }
          },
          "additionalProperties": false,
          "required": ["id", "title", "type", "changedAt"]
        },
        {
          "type": "object",
          "properties": {
            "type": {
              "description": "The corresponding definition in https://www.w3.org/TR/xmlschema-2/ applies.",
              "type": "string",
              "title": "Data-type 'dateTime', 'duration' or 'URI'",
              "enum": ["xs:dateTime", "xs:duration", "xs:anyURI"]
            },
            "id": {
              "$ref": "#/definitions/SpecifId"
            },
            "title": {
              "$ref": "#/definitions/SpecifText"
            },
            "description": {
              "$ref": "#/definitions/SpecifMultiLanguageText"
            },
            "enumeration": {
              "description": "An optional list of values to choose from for a specific instance; multiple values are allowed, if 'multiple' is set to 'true'.",
              "$ref": "#/definitions/SpecifEnumeratedValues"
            },
            "multiple": {
              "description": "Indicates whether multiple values are allowed; by default the value is 'false'.",
              "type": "boolean"
            },
            "revision": {
              "$ref": "#/definitions/SpecifRevision"
            },
            "replaces": {
              "$ref": "#/definitions/SpecifReplaces"
            },
            "changedAt": {
              "$ref": "#/definitions/SpecifDateTime"
            },
            "changedBy": {
              "type": "string"
            }
          },
          "additionalProperties": false,
          "required": ["id", "title", "type", "changedAt"]
        },
        {
          "type": "object",
          "properties": {
            "type": {
              "description": "The corresponding definition in https://www.w3.org/TR/xmlschema-2/ applies.",
              "type": "string",
              "title": "Data-type 'Integer'",
              "enum": ["xs:integer"]
            },
            "id": {
              "$ref": "#/definitions/SpecifId"
            },
            "title": {
              "$ref": "#/definitions/SpecifText"
            },
            "description": {
              "$ref": "#/definitions/SpecifMultiLanguageText"
            },
            "minInclusive": {
              "type": "number",
              "title": "Minimum Value of a Number",
              "description": "Optional use by dataTypes 'xs:integer' and 'xs:double'."
            },
            "maxInclusive": {
              "type": "number",
              "title": "Maximum Value of a Number",
              "description": "Optional use by dataTypes 'xs:integer' and 'xs:double'."
            },
            "enumeration": {
              "description": "An optional list of values to choose from for a specific instance; multiple values are allowed, if 'multiple' is set to 'true'.",
              "$ref": "#/definitions/SpecifEnumeratedValues"
            },
            "multiple": {
              "description": "Indicates whether multiple values are allowed; by default the value is 'false'.",
              "type": "boolean"
            },
            "revision": {
              "$ref": "#/definitions/SpecifRevision"
            },
            "replaces": {
              "$ref": "#/definitions/SpecifReplaces"
            },
            "changedAt": {
              "$ref": "#/definitions/SpecifDateTime"
            },
            "changedBy": {
              "type": "string"
            }
          },
          "additionalProperties": false,
          "required": ["id", "title", "type", "changedAt"]
        },
        {
          "type": "object",
          "properties": {
            "type": {
              "description": "The corresponding definition in https://www.w3.org/TR/xmlschema-2/ applies.",
              "type": "string",
              "title": "Data-type 'Double'",
              "enum": ["xs:double"]
            },
            "id": {
              "$ref": "#/definitions/SpecifId"
            },
            "title": {
              "$ref": "#/definitions/SpecifText"
            },
            "description": {
              "$ref": "#/definitions/SpecifMultiLanguageText"
            },
            "fractionDigits": {
              "description": "Optional use by dataType 'xs:double', indicates the number of decimals.",
              "type": "integer",
              "title": "Number of fraction digits of a Decimal Number",
              "minimum": 1
            },
            "minInclusive": {
              "description": "Optional use by dataTypes 'xs:integer' and 'xs:double'.",
              "type": "number",
              "title": "Minimum Value of a Number"
            },
            "maxInclusive": {
              "description": "Optional use by dataTypes 'xs:integer' and 'xs:double'.",
              "type": "number",
              "title": "Maximum Value of a Number"
            },
            "enumeration": {
              "description": "An optional list of values to choose from for a specific instance; multiple values are allowed, if 'multiple' is set to 'true'.",
              "$ref": "#/definitions/SpecifEnumeratedValues"
            },
            "multiple": {
              "description": "Indicates whether multiple values are allowed; by default the value is 'false'.",
              "type": "boolean"
            },
            "revision": {
              "$ref": "#/definitions/SpecifRevision"
            },
            "replaces": {
              "$ref": "#/definitions/SpecifReplaces"
            },
            "changedAt": {
              "$ref": "#/definitions/SpecifDateTime"
            },
            "changedBy": {
              "type": "string"
            }
          },
          "additionalProperties": false,
          "required": ["id", "title", "type", "changedAt"]
        },
        {
          "type": "object",
          "properties": {
            "type": {
              "description": "The corresponding definition in https://www.w3.org/TR/xmlschema-2/ applies.",
              "type": "string",
              "title": "Data-type 'String' with plain or formatted text. The property's text object MAY specify the format and language.",
              "enum": ["xs:string"]
            },
            "id": {
              "$ref": "#/definitions/SpecifId"
            },
            "title": {
              "$ref": "#/definitions/SpecifText"
            },
            "description": {
              "$ref": "#/definitions/SpecifMultiLanguageText"
            },
            "maxLength": {
              "description": "Optional use by dataType 'xs:string'.",
              "type": "integer",
              "title": "Maximum String Length",
              "minimum": 0
            },
            "enumeration": {
              "description": "An optional list of values to choose from for a specific instance; multiple values are allowed, if 'multiple' is set to 'true'.",
              "$ref": "#/definitions/SpecifEnumeratedValues"
            },
            "multiple": {
              "description": "Indicates whether multiple values are allowed; by default the value is 'false'.",
              "type": "boolean"
            },
            "revision": {
              "$ref": "#/definitions/SpecifRevision"
            },
            "replaces": {
              "$ref": "#/definitions/SpecifReplaces"
            },
            "changedAt": {
              "$ref": "#/definitions/SpecifDateTime"
            },
            "changedBy": {
              "type": "string"
            }
          },
          "additionalProperties": false,
          "required": ["id", "title", "type", "changedAt"]
        }
      ]
    },
    "SpecifPropertyClass": {
      "type": "object",
      "properties": {
        "id": {
          "$ref": "#/definitions/SpecifId"
        },
        "title": {
          "$ref": "#/definitions/SpecifText"
        },
        "description": {
          "$ref": "#/definitions/SpecifMultiLanguageText"
        },
        "dataType": {
          "description": "Must be a member of dataTypes.",
          "$ref": "#/definitions/SpecifKey"
        },
        "multiple": {
          "description": "Optional use by all propertyClasses. Indicates whether multiple values can be given. If omitted, the 'multiple' property of the dataType applies; by default the value is 'false'.",
          "type": "boolean"
        },
        "values": {
          "description": "An optional list of default values in case the instantiated resource's or statement's property is missing.",
          "$ref": "#/definitions/SpecifValues"
        },
        "format": {
          "description": "The default format of a property's text value. Is superseded by a text value's format attribute.",
          "$ref": "#/definitions/SpecifTextFormat"
        },
        "unit": {
          "description": "The unit of a property's numeric value; preferably an SI unit symbol such as 'm^3/kg' (Système international (d'unités)) or a currency symbol.",
          "type": "string"
        },
        "revision": {
          "$ref": "#/definitions/SpecifRevision"
        },
        "replaces": {
          "$ref": "#/definitions/SpecifReplaces"
        },
        "changedAt": {
          "$ref": "#/definitions/SpecifDateTime"
        },
        "changedBy": {
          "type": "string"
        }
      },
      "additionalProperties": false,
      "required": ["id", "title", "dataType", "changedAt"]
    },
    "SpecifResourceClass": {
      "type": "object",
      "properties": {
        "id": {
          "$ref": "#/definitions/SpecifId"
        },
        "title": {
          "$ref": "#/definitions/SpecifText"
        },
        "description": {
          "$ref": "#/definitions/SpecifMultiLanguageText"
        },
        "extends": {
          "description": "Must be a member of resourceClasses.",
          "$ref": "#/definitions/SpecifKey"
        },
        "icon": {
          "$ref": "#/definitions/SpecifIcon"
        },
        "isHeading": {
          "type": "boolean"
        },
        "instantiation": {
          "$ref": "#/definitions/SpecifInstantiation"
        },
        "propertyClasses": {
          "description": "A list of keys referencing propertyClasses; a base resourceClass must have at least one propertyClass, whereas an extending class may have none.",
          "$ref": "#/definitions/SpecifKeys"
        },
        "revision": {
          "$ref": "#/definitions/SpecifRevision"
        },
        "replaces": {
          "$ref": "#/definitions/SpecifReplaces"
        },
        "changedAt": {
          "$ref": "#/definitions/SpecifDateTime"
        },
        "changedBy": {
          "type": "string"
        }
      },
      "additionalProperties": false,
      "required": ["id", "title", "propertyClasses", "changedAt"]
    },
    "SpecifStatementClass": {
      "type": "object",
      "properties": {
        "id": {
          "$ref": "#/definitions/SpecifId"
        },
        "title": {
          "$ref": "#/definitions/SpecifText"
        },
        "description": {
          "$ref": "#/definitions/SpecifMultiLanguageText"
        },
        "extends": {
          "description": "Must be a member of statementClasses.",
          "$ref": "#/definitions/SpecifKey"
        },
        "icon": {
          "$ref": "#/definitions/SpecifIcon"
        },
        "instantiation": {
          "$ref": "#/definitions/SpecifInstantiation"
        },
        "isUndirected": {
          "description": "Indicates that an instance's subject and object are equivalent and can be exchanged without change in meaning.",
          "type": "boolean"
        },
        "propertyClasses": {
          "description": "A list of keys referencing propertyClasses; a statementClass may exist without propertyClasses.",
          "$ref": "#/definitions/SpecifKeys"
        },
        "subjectClasses": {
          "description": "A list of keys referencing eligible resource and statement classes for a statement's subject; if missing, all resource or statement classes are eligible.",
          "$ref": "#/definitions/SpecifKeys"
        },
        "objectClasses": {
          "description": "A list of keys referencing eligible resource and statement classes for a statement's object; if missing, all resource or statement classes are eligible.",
          "$ref": "#/definitions/SpecifKeys"
        },
        "revision": {
          "$ref": "#/definitions/SpecifRevision"
        },
        "replaces": {
          "$ref": "#/definitions/SpecifReplaces"
        },
        "changedAt": {
          "$ref": "#/definitions/SpecifDateTime"
        },
        "changedBy": {
          "type": "string"
        }
      },
      "additionalProperties": false,
      "required": ["id", "title", "changedAt"]
    },
    "SpecifProperty": {
      "type": "object",
      "properties": {
        "class": {
          "description": "Must be a member of 'propertyClasses'. In addition, it must be listed in the propertyClasses of the respective resource's or statement's (or any of it's parent's) class.",
          "$ref": "#/definitions/SpecifKey"
        },
        "values": {
          "$ref": "#/definitions/SpecifValues"
        }
      },
      "required": ["class", "values"]
    },
    "SpecifProperties": {
      "description": "A list of properties of a resource or statement; the number of properties including any parent's properties must be >0.",
      "type": "array",
      "uniqueItems": true,
      "items": {
        "$ref": "#/definitions/SpecifProperty"
      }
    },
    "SpecifResource": {
      "type": "object",
      "properties": {
        "id": {
          "$ref": "#/definitions/SpecifId"
        },
        "alternativeIds": {
          "$ref": "#/definitions/SpecifAlternativeIds"
        },
        "class": {
          "$ref": "#/definitions/SpecifKey",
          "description": "Must be a member of resourceClasses."
        },
        "language": {
          "description": "An IETF language tag such as 'en', 'en-US, 'fr' or 'de' showing the used language of the resource. Is superseded by a property's language value.",
          "type": "string"
        },
        "properties": {
          "$ref": "#/definitions/SpecifProperties"
        },
        "revision": {
          "$ref": "#/definitions/SpecifRevision"
        },
        "replaces": {
          "$ref": "#/definitions/SpecifReplaces"
        },
        "changedAt": {
          "$ref": "#/definitions/SpecifDateTime"
        },
        "changedBy": {
          "type": "string"
        }
      },
      "required": ["id", "class", "properties", "changedAt"]
    },
    "SpecifStatement": {
      "type": "object",
      "properties": {
        "id": {
          "$ref": "#/definitions/SpecifId"
        },
        "alternativeIds": {
          "$ref": "#/definitions/SpecifAlternativeIds"
        },
        "class": {
          "$ref": "#/definitions/SpecifKey",
          "description": "Must be a member of statementClasses."
        },
        "language": {
          "description": "An IETF language tag such as 'en', 'en-US, 'fr' or 'de' showing the used language of the statement. Is superseded by a property's language value.",
          "type": "string"
        },
        "subject": {
          "description": "Must be a member of resources or statements.",
          "$ref": "#/definitions/SpecifKey"
        },
        "object": {
          "description": "Must be a member of resources or statements.",
          "$ref": "#/definitions/SpecifKey"
        },
        "properties": {
          "description": "If there is no title property, the statementClass' title applies.",
          "$ref": "#/definitions/SpecifProperties"
        },
        "revision": {
          "$ref": "#/definitions/SpecifRevision"
        },
        "replaces": {
          "$ref": "#/definitions/SpecifReplaces"
        },
        "changedAt": {
          "$ref": "#/definitions/SpecifDateTime"
        },
        "changedBy": {
          "type": "string"
        }
      },
      "required": ["id", "class", "subject", "object", "changedAt"]
    },
    "SpecifNode": {
      "type": "object",
      "properties": {
        "id": {
          "$ref": "#/definitions/SpecifId"
        },
        "title": {
          "description": "The node's label; if missing, the value of the referenced resource's title property is applied.",
          "$ref": "#/definitions/SpecifMultiLanguageText"
        },
        "description": {
          "$ref": "#/definitions/SpecifMultiLanguageText"
        },
        "resource": {
          "description": "The pointer to the resource to be displayed at this position.",
          "$ref": "#/definitions/SpecifKey"
        },
        "nodes": {
          "description": "The next hierarchy level.",
          "$ref": "#/definitions/SpecifNodes"
        },
        "revision": {
          "$ref": "#/definitions/SpecifRevision"
        },
        "replaces": {
          "$ref": "#/definitions/SpecifReplaces"
        },
        "changedAt": {
          "$ref": "#/definitions/SpecifDateTime"
        },
        "changedBy": {
          "type": "string"
        }
      },
      "required": ["id", "resource", "changedAt"]
    },
    "SpecifNodes": {
      "description": "A list of pointers to resources; may be nested forming a tree, i.e. a hierarchy of pointers.",
      "type": "array",
      "uniqueItems": true,
      "items": {
        "$ref": "#/definitions/SpecifNode"
      }
    },
    "SpecifFile": {
      "type": "object",
      "properties": {
        "id": {
          "$ref": "#/definitions/SpecifId"
        },
        "title": {
          "description": "The file's name.",
          "type": "string"
        },
        "description": {
          "$ref": "#/definitions/SpecifMultiLanguageText"
        },
        "url": {
          "description": "An absolute or relative URL to the file; will be of format 'uri-reference' in future. If missing, the title applies.",
          "type": "string"
        },
        "type": {
          "description": "The file's media type (formerly MIME-type) according to https://www.iana.org/assignments/media-types/media-types.xhtml.",
          "type": "string"
        },
        "revision": {
          "$ref": "#/definitions/SpecifRevision"
        },
        "replaces": {
          "$ref": "#/definitions/SpecifReplaces"
        },
        "changedAt": {
          "$ref": "#/definitions/SpecifDateTime"
        },
        "changedBy": {
          "type": "string"
        }
      },
      "required": ["id", "title", "type", "changedAt"]
    }
  },
  "description": "The Specification Integration Facility (SpecIF) integrates partial system models from different methods and tools in a semantic net. Collaborators shall browse, search and audit engineering results in a common context. Also, the exchange of model information between organizations and tools is facilitated. SpecIF represents the visible, i.e. the diagrams and the text, as well as the semantics of system specifications.",
  "properties": {
    "$schema": {
      "description": "An absolute URL pointing to this SpecIF schema. Supports both specif.de and schemastore.org.",
      "type": "string",
      "format": "uri",
      "pattern": "^https?:\\/\\/(specif\\.de\\/v1\\.1\\/schema|json\\.schemastore\\.org\\/specif-1\\.1)\\.json$"
    },
    "id": {
      "$ref": "#/definitions/SpecifId"
    },
    "revision": {
      "$ref": "#/definitions/SpecifRevision"
    },
    "title": {
      "description": "The project's name; if missing, the first hierarchy node's title applies.",
      "$ref": "#/definitions/SpecifMultiLanguageText"
    },
    "description": {
      "description": "The project's description; if missing, the first hierarchy node's description applies.",
      "$ref": "#/definitions/SpecifMultiLanguageText"
    },
    "isExtension": {
      "description": "Indicates that the project is not schema-compliant on its own; by default the value is 'false'. Of course, it is expected that once extended the project is schema-compliant.",
      "type": "boolean"
    },
    "generator": {
      "type": "string"
    },
    "generatorVersion": {
      "type": "string"
    },
    "rights": {
      "$ref": "#/definitions/SpecifRights"
    },
    "createdAt": {
      "$ref": "#/definitions/SpecifDateTime"
    },
    "createdBy": {
      "$ref": "#/definitions/SpecifCreatedBy"
    },
    "language": {
      "description": "An IETF language tag such as 'en', 'en-US, 'fr' or 'de' showing the used language of the project. Is superseded by a resource's, statement's or property's language value. By default, 'en' is assumed.",
      "type": "string"
    },
    "dataTypes": {
      "description": "The base data types for use by property class definitions.",
      "type": "array",
      "uniqueItems": true,
      "items": {
        "$ref": "#/definitions/SpecifDataType"
      }
    },
    "propertyClasses": {
      "description": "Class definition of a property for resources or statements. Is a sub-element of the respective resourceClass or statementClass. If no revision or change information is specified, the respective values of the parent element apply.",
      "type": "array",
      "uniqueItems": true,
      "items": {
        "$ref": "#/definitions/SpecifPropertyClass"
      }
    },
    "resourceClasses": {
      "description": "The class definitions for resources.",
      "type": "array",
      "uniqueItems": true,
      "items": {
        "$ref": "#/definitions/SpecifResourceClass"
      }
    },
    "statementClasses": {
      "description": "The class definitions for statements in subject-predicate-object statements, where subject and object are resources.",
      "type": "array",
      "uniqueItems": true,
      "items": {
        "$ref": "#/definitions/SpecifStatementClass"
      }
    },
    "resources": {
      "description": "The resources such as diagrams, model elements or requirements.",
      "type": "array",
      "uniqueItems": true,
      "items": {
        "$ref": "#/definitions/SpecifResource"
      }
    },
    "statements": {
      "description": "Subject-predicate-Object statements, where subject and object are resources. In other terms, statements are directed relations between two resources building a semantic net.",
      "type": "array",
      "uniqueItems": true,
      "items": {
        "$ref": "#/definitions/SpecifStatement"
      }
    },
    "hierarchies": {
      "description": "A list of hierarchies with pointers to resources; may be nested to build a tree, i.e. a hierarchy of pointers.",
      "$ref": "#/definitions/SpecifNodes"
    },
    "files": {
      "description": "A list of files being referenced by a resource's or statement's property of dataType XHTML using an <object> tag. A file should have a media type as defined by IANA (see below).",
      "type": "array",
      "uniqueItems": true,
      "items": {
        "$ref": "#/definitions/SpecifFile"
      }
    }
  },
  "required": [
    "$schema",
    "id",
    "dataTypes",
    "propertyClasses",
    "resourceClasses",
    "statementClasses",
    "resources",
    "statements",
    "hierarchies"
  ],
  "title": "JSON-Schema for SpecIF v1.1",
  "type": "object"
}
