{
    "title": "Schema for JSON-LD",
    "$schema": "http://json-schema.org/draft-04/schema#",

    "definitions":{
        "context": {
            "additionalProperties": true,
            "properties": {
                "@context": {
                    "description": "Used to define the short-hand names that are used throughout a JSON-LD document.",
                    "type": ["object", "string", "array", "null"]
                }
            }
        },
        "graph": {
            "additionalProperties": true,
            "properties": {
                "@graph": {
                    "description": "Used to express a graph.",
                    "type": ["array", "object"],
                    "additionalItems": {
                        "anyOf": [{ "$ref": "#/definitions/common" }]
                    }
                }
            }
        },
        "common":{
            "additionalProperties": {
                "anyOf": [{ "$ref": "#/definitions/common" }]
            },
            "properties": {
                "@id": {
                    "description": "Used to uniquely identify things that are being described in the document with IRIs or blank node identifiers.",
                    "type": "string",
                    "format": "uri"
                },
                "@value": {
                    "description": "Used to specify the data that is associated with a particular property in the graph.",
                    "type": ["string", "boolean", "number", "null"]
                },
                "@language": {
                    "description": "Used to specify the language for a particular string value or the default language of a JSON-LD document.",
                    "type": ["string", "null"]
                },
                "@type": {
                    "description": "Used to set the data type of a node or typed value.",
                    "type": ["string", "null", "array"]
                },
                "@container": {
                    "description": "Used to set the default container type for a term.",
                    "type": ["string", "null"],
                    "enum": ["@list", "@index", "@set"]
                },
                "@list": {
                    "description": "Used to express an ordered set of data."
                },
                "@set": {
                    "description": "Used to express an unordered set of data and to ensure that values are always represented as arrays."
                },
                "@reverse": {
                    "description": "Used to express reverse properties.",
                    "type": ["string", "object", "null"],
                    "additionalProperties": {
                        "anyOf": [{ "$ref": "#/definitions/common" }]
                    }
                },
                "@base": {
                    "description": "Used to set the base IRI against which relative IRIs are resolved",
                    "type": ["string", "null"],
                    "format": "uri"
                },
                "@vocab": {
                    "description": "Used to expand properties and values in @type with a common prefix IRI",
                    "type": ["string", "null"],
                    "format": "uri"
                }
            }
        }
    },

    "allOf": [
        { "$ref": "#/definitions/context" },
        { "$ref": "#/definitions/graph" },
        { "$ref": "#/definitions/common" }
    ],

    "type": ["object", "array"],
    "additionalProperties": true
}
