{
    "id": "http://provenance.ecs.soton.ac.uk/prov-json/schema#",
    "$schema": "http://json-schema.org/draft-04/schema#",
    "description": "Schema for a PROV-JSON document",
    "type": "object",
    "additionalProperties": false,
    "properties": {
        "prefix": {
            "type": "object",
            "patternProperties": {
                "^[a-zA-Z0-9_\\-]+$": {
                    "type": "string",
                    "format": "uri"
                }
            }
        },
        "entity": {
            "type": "object",
            "additionalProperties": {
                "$ref": "#/definitions/entity"
            }
        },
        "activity": {
            "type": "object",
            "additionalProperties": {
                "$ref": "#/definitions/activity"
            }
        },
        "agent": {
            "type": "object",
            "additionalProperties": {
                "$ref": "#/definitions/agent"
            }
        },
        "wasGeneratedBy": {
            "type": "object",
            "additionalProperties": {
                "$ref": "#/definitions/generation"
            }
        },
        "used": {
            "type": "object",
            "additionalProperties": {
                "$ref": "#/definitions/usage"
            }
        },
        "wasInformedBy": {
            "type": "object",
            "additionalProperties": {
                "$ref": "#/definitions/communication"
            }
        },
        "wasStartedBy": {
            "type": "object",
            "additionalProperties": {
                "$ref": "#/definitions/start"
            }
        },
        "wasEndedby": {
            "type": "object",
            "additionalProperties": {
                "$ref": "#/definitions/end"
            }
        },
        "wasInvalidatedBy": {
            "type": "object",
            "additionalProperties": {
                "$ref": "#/definitions/invalidation"
            }
        },
        "wasDerivedFrom": {
            "type": "object",
            "additionalProperties": {
                "$ref": "#/definitions/derivation"
            }
        },
        "wasAttributedTo": {
            "type": "object",
            "additionalProperties": {
                "$ref": "#/definitions/attribution"
            }
        },
        "wasAssociatedWith": {
            "type": "object",
            "additionalProperties": {
                "$ref": "#/definitions/association"
            }
        },
        "actedOnBehalfOf": {
            "type": "object",
            "additionalProperties": {
                "$ref": "#/definitions/delegation"
            }
        },
        "wasInfluencedBy": {
            "type": "object",
            "additionalProperties": {
                "$ref": "#/definitions/influence"
            }
        },
        "specializationOf": {
            "type": "object",
            "additionalProperties": {
                "$ref": "#/definitions/specialization"
            }
        },
        "alternateOf": {
            "type": "object",
            "additionalProperties": {
                "$ref": "#/definitions/alternate"
            }
        },
        "hadMember": {
            "type": "object",
            "additionalProperties": {
                "$ref": "#/definitions/membership"
            }
        },
        "bundle": {
            "type": "object",
            "additionalProperties": {
                "$ref": "#/definitions/bundle"
            }
        }
    },
    "definitions": {
        "typedLiteral": {
            "title": "PROV-JSON Typed Literal",
            "type": "object",
            "properties": {
                "$": {
                    "type": "string"
                },
                "type": {
                    "type": "string",
                    "format": "uri"
                },
                "lang": {
                    "type": "string"
                }
            },
            "required": [
                "$"
            ],
            "additionalProperties": false
        },
        "stringLiteral": {
            "type": "string"
        },
        "numberLiteral": {
            "type": "number"
        },
        "booleanLiteral": {
            "type": "boolean"
        },
        "literalArray": {
            "type": "array",
            "minItems": 1,
            "items": {
                "anyOf": [
                    {
                        "$ref": "#/definitions/stringLiteral"
                    },
                    {
                        "$ref": "#/definitions/numberLiteral"
                    },
                    {
                        "$ref": "#/definitions/booleanLiteral"
                    },
                    {
                        "$ref": "#/definitions/typedLiteral"
                    }
                ]
            }
        },
        "attributeValues": {
            "anyOf": [
                {
                    "$ref": "#/definitions/stringLiteral"
                },
                {
                    "$ref": "#/definitions/numberLiteral"
                },
                {
                    "$ref": "#/definitions/booleanLiteral"
                },
                {
                    "$ref": "#/definitions/typedLiteral"
                },
                {
                    "$ref": "#/definitions/literalArray"
                }
            ]
        },
        "entity": {
            "type": "object",
            "title": "entity",
            "additionalProperties": {
                "$ref": "#/definitions/attributeValues"
            }
        },
        "agent": {
            "$ref": "#/definitions/entity"
        },
        "activity": {
            "type": "object",
            "title": "activity",
            "prov:startTime": {
                "type": "string",
                "format": "date-time"
            },
            "prov:endTime": {
                "type": "string",
                "format": "date-time"
            },
            "additionalProperties": {
                "$ref": "#/definitions/attributeValues"
            }
        },
        "generation": {
            "type": "object",
            "title": "generation/usage",
            "properties": {
                "prov:entity": {
                    "type": "string",
                    "format": "uri"
                },
                "prov:activity": {
                    "type": "string",
                    "format": "uri"
                },
                "prov:time": {
                    "type": "string",
                    "format": "date-time"
                }
            },
            "required": [
                "prov:entity"
            ],
            "additionalProperties": {
                "$ref": "#/definitions/attributeValues"
            }
        },
        "usage": {
            "$ref": "#/definitions/generation"
        },
        "communication": {
            "type": "object",
            "title": "communication",
            "properties": {
                "prov:informant": {
                    "type": "string",
                    "format": "uri"
                },
                "prov:informed": {
                    "type": "string",
                    "format": "uri"
                }
            },
            "required": [
                "prov:informant",
                "prov:informed"
            ],
            "additionalProperties": {
                "$ref": "#/definitions/attributeValues"
            }
        },
        "start": {
            "type": "object",
            "title": "start/end",
            "properties": {
                "prov:activity": {
                    "type": "string",
                    "format": "uri"
                },
                "prov:time": {
                    "type": "string",
                    "format": "date-time"
                },
                "prov:trigger": {
                    "type": "string",
                    "format": "uri"
                }
            },
            "required": [
                "prov:activity"
            ],
            "additionalProperties": {
                "$ref": "#/definitions/attributeValues"
            }
        },
        "end": {
            "$ref": "#/definitions/start"
        },
        "invalidation": {
            "type": "object",
            "title": "invalidation",
            "properties": {
                "prov:entity": {
                    "type": "string",
                    "format": "uri"
                },
                "prov:time": {
                    "type": "string",
                    "format": "date-time"
                },
                "prov:activity": {
                    "type": "string",
                    "format": "uri"
                }
            },
            "required": [
                "prov:entity"
            ],
            "additionalProperties": {
                "$ref": "#/definitions/attributeValues"
            }
        },
        "derivation": {
            "type": "object",
            "title": "derivation",
            "properties": {
                "prov:generatedEntity": {
                    "type": "string",
                    "format": "uri"
                },
                "prov:usedEntity": {
                    "type": "string",
                    "format": "uri"
                },
                "prov:activity": {
                    "type": "string",
                    "format": "uri"
                },
                "prov:generation": {
                    "type": "string",
                    "format": "uri"
                },
                "prov:usage": {
                    "type": "string",
                    "format": "uri"
                }
            },
            "required": [
                "prov:generatedEntity",
                "prov:usedEntity"
            ],
            "additionalProperties": {
                "$ref": "#/definitions/attributeValues"
            }
        },
        "attribution": {
            "type": "object",
            "title": "attribution",
            "properties": {
                "prov:entity": {
                    "type": "string",
                    "format": "uri"
                },
                "prov:agent": {
                    "type": "string",
                    "format": "uri"
                }
            },
            "required": [
                "prov:entity",
                "prov:agent"
            ],
            "additionalProperties": {
                "$ref": "#/definitions/attributeValues"
            }
        },
        "association": {
            "type": "object",
            "title": "association",
            "properties": {
                "prov:activity": {
                    "type": "string",
                    "format": "uri"
                },
                "prov:agent": {
                    "type": "string",
                    "format": "uri"
                },
                "prov:plan": {
                    "type": "string",
                    "format": "uri"
                }
            },
            "required": [
                "prov:activity"
            ],
            "additionalProperties": {
                "$ref": "#/definitions/attributeValues"
            }
        },
        "delegation": {
            "type": "object",
            "title": "delegation",
            "properties": {
                "prov:delegate": {
                    "type": "string",
                    "format": "uri"
                },
                "prov:responsible": {
                    "type": "string",
                    "format": "uri"
                },
                "prov:activity": {
                    "type": "string",
                    "format": "uri"
                }
            },
            "required": [
                "prov:delegate",
                "prov:responsible"
            ],
            "additionalProperties": {
                "$ref": "#/definitions/attributeValues"
            }
        },
        "influence": {
            "type": "object",
            "title": "",
            "properties": {
                "prov:influencer": {
                    "type": "string",
                    "format": "uri"
                },
                "prov:influencee": {
                    "type": "string",
                    "format": "uri"
                }
            },
            "required": [
                "prov:influencer",
                "prov:influencee"
            ],
            "additionalProperties": {
                "$ref": "#/definitions/attributeValues"
            }
        },
        "specialization": {
            "type": "object",
            "title": "specialization",
            "properties": {
                "prov:generalEntity": {
                    "type": "string",
                    "format": "uri"
                },
                "prov:specificEntity": {
                    "type": "string",
                    "format": "uri"
                }
            },
            "required": [
                "prov:generalEntity",
                "prov:specificEntity"
            ],
            "additionalProperties": {
                "$ref": "#/definitions/attributeValues"
            }
        },
        "alternate": {
            "type": "object",
            "title": "alternate",
            "properties": {
                "prov:alternate1": {
                    "type": "string",
                    "format": "uri"
                },
                "prov:alternate2": {
                    "type": "string",
                    "format": "uri"
                }
            },
            "required": [
                "prov:alternate1",
                "prov:alternate2"
            ],
            "additionalProperties": {
                "$ref": "#/definitions/attributeValues"
            }
        },
        "membership": {
            "type": "object",
            "title": "membership",
            "properties": {
                "prov:collection": {
                    "type": "string",
                    "format": "uri"
                },
                "prov:entity": {
                    "type": "string",
                    "format": "uri"
                }
            },
            "required": [
                "prov:collection",
                "prov:entity"
            ],
            "additionalProperties": {
                "$ref": "#/definitions/attributeValues"
            }
        },
        "bundle": {
            "type": "object",
            "title": "bundle",
            "properties": {
                "prefix": {
                    "type": "object",
                    "patternProperties": {
                        "^[a-zA-Z0-9_\\-]+$": {
                            "type": "string",
                            "format": "uri"
                        }
                    }
                },
                "entity": {
                    "type": "object",
                    "additionalProperties": {
                        "$ref": "#/definitions/entity"
                    }
                },
                "activity": {
                    "type": "object",
                    "additionalProperties": {
                        "$ref": "#/definitions/activity"
                    }
                },
                "agent": {
                    "type": "object",
                    "additionalProperties": {
                        "$ref": "#/definitions/agent"
                    }
                },
                "wasGeneratedBy": {
                    "type": "object",
                    "additionalProperties": {
                        "$ref": "#/definitions/generation"
                    }
                },
                "used": {
                    "type": "object",
                    "additionalProperties": {
                        "$ref": "#/definitions/usage"
                    }
                },
                "wasInformedBy": {
                    "type": "object",
                    "additionalProperties": {
                        "$ref": "#/definitions/communication"
                    }
                },
                "wasStartedBy": {
                    "type": "object",
                    "additionalProperties": {
                        "$ref": "#/definitions/start"
                    }
                },
                "wasEndedby": {
                    "type": "object",
                    "additionalProperties": {
                        "$ref": "#/definitions/end"
                    }
                },
                "wasInvalidatedBy": {
                    "type": "object",
                    "additionalProperties": {
                        "$ref": "#/definitions/invalidation"
                    }
                },
                "wasDerivedFrom": {
                    "type": "object",
                    "additionalProperties": {
                        "$ref": "#/definitions/derivation"
                    }
                },
                "wasAttributedTo": {
                    "type": "object",
                    "additionalProperties": {
                        "$ref": "#/definitions/attribution"
                    }
                },
                "wasAssociatedWith": {
                    "type": "object",
                    "additionalProperties": {
                        "$ref": "#/definitions/association"
                    }
                },
                "actedOnBehalfOf": {
                    "type": "object",
                    "additionalProperties": {
                        "$ref": "#/definitions/delegation"
                    }
                },
                "wasInfluencedBy": {
                    "type": "object",
                    "additionalProperties": {
                        "$ref": "#/definitions/influence"
                    }
                },
                "specializationOf": {
                    "type": "object",
                    "additionalProperties": {
                        "$ref": "#/definitions/specialization"
                    }
                },
                "alternateOf": {
                    "type": "object",
                    "additionalProperties": {
                        "$ref": "#/definitions/alternate"
                    }
                },
                "hadMember": {
                    "type": "object",
                    "additionalProperties": {
                        "$ref": "#/definitions/membership"
                    }
                }
            }
        }
    }
}