Unofficial Draft
Copyright © 2020 the document editors/authors. Text is available under the Creative Commons Attribution 4.0 International Public License; additional terms may apply.
Provenance is information about entities, activities, and people involved in producing a piece of data or thing, which can be used to form assessments about the data or thing's quality, reliability or trustworthiness. PROV-DM is the conceptual data model that forms a basis for the W3C provenance (PROV) family of specifications. This document specifies PROV-JSONLD, a serialization of PROV in JSON, which exploits JSON-LD to define a semantic mapping, so that it can also be processed as Linked Data. Overall, PROV-JSONLD is designed to be suitable for interchanging provenance in Web and Linked Data applications, to offer a natural encoding of provenance for its targeted audience, and to allow for fast processing.
This document is a draft of a potential specification. It has no official standing of any kind and does not represent the support or consensus of any standards organization.
As well as sections marked as non-normative, all authoring guidelines, diagrams, examples, and notes in this specification are non-normative. Everything else in this specification is normative.
The key words MAY, MUST, RECOMMENDED, REQUIRED, and SHOULD in this document are to be interpreted as described in BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here.
This is required for specifications that contain normative material.
Since their release in 2013, the PROV Recommendations [PROV-OVERVIEW] by the World Wide Web Consortium (W3C) have started being adopted by flagship deployments such as the Global Change Information System, the Gazette in the UK, and other Linked Data sets. PROV, which is used as the data model to describe the provenance of data, is made available in several different representations: PROV-N [PROV-N], PROV-XML [PROV-XML], or in an RDF serialization using the PROV Ontology [PROV-O]. The latter, arguably, is most suitable for Linked Data [LINKED-DATA], given that it can readily be consumed by existing Semantic Web tools and comes with the semantic grounding provided by PROV-O [PROV-O].
Surprisingly, the PROV-JSON [PROV-JSON] serialization has gained traction, despite simply being a member submission, and not having gone through the various stages of a standardization activity. The primary reason for this, we conjecture, is that many web applications are built to be light-weight, working mainly with simple data formats such as JSON [RFC8259].
The very existence of all these serializations is a testament to the approach to standardization taken by the Provenance Working Group, by which a conceptual data model for PROV was defined, the PROV data model [PROV-DM], alongside its mapping to different technologies, to suit users and developers. However, the family of PROV specifications lacks a serialization that is capable of addressing simultaneously all of the following requirements.
Surprisingly, none of the existing PROV serializations supports all these requirements simultaneously. While PROV-JSON is the only serialization to support lightweight web applications, it does not have any semantic markup, its internal structure does not exhibit the natural structure of the PROV data structures, and its grouping of expressions per categories (e.g. all entities, all activities, ...) is not conducive to incremental processing. The RDF serialization compatible with PROV-O has been architected to be natural to the Semantic Web community: all influence relations have been given the same directionality with respect to their time ordering, but the decomposition of data structures (essentially n-ary relations) into individual triples, which can occur anywhere in the serialization, is not conducive to efficient parsing. It is reasonable to say that the world has moved on from XML, while the PROV-N notation was aimed at humans rather than efficient processing.
JSON-LD [JSON-LD] allows a semantic structure to be overlaid over a JSON structure [RFC8259], thereby enabling the conversion of JSON serializations into linked data. This was exploited in an early version of this work [IPAW-POSTER], which applied the JSON-LD approach to a JSON serialization of PROV. The solution did not lead to a natural encoding of the PROV data structure, because a property occurring in different types of JSON objects had to be named differently, so that it could be mapped to the appropriate RDF property; we see here that what is natural in JSON is not necessarily natural in RDF, and vice-versa. The ability to define contextual mappings was introduced in JSON-LD 1.1 [JSON-LD11] and is a key enabler of this work, allowing for the same natural PROV property names to be used in different contexts while still maintaining their correct mappings to the appropriate RDF properties.
Thus, this specification proposes PROV-JSONLD, a serialization of PROV that is compatible with [PROV-DM] and that addresses all of our 4 key requirements. It is first and foremost a JSON structure so it supports lightweight Web applications. It is structured in such a way that each PROV expression is encoded as a self-contained JSON object, and therefore, is natural to JavaScript programmers. Exploiting JSON-LD 1.1, we defined contextual semantic mappings, allowing PROV-JSONLD to be seen as linked data. And finally, PROV-JSONLD allows for efficient processing, since each JSON object can be readily mapped to a data structure, without requiring unbounded lookaheads, or search within the data structure.
In the rest of this specification, we provide an illustration of PROV-JSONLD, we then define its structure by means of a JSON Schema [JSON-SCHEMA], we define its semantic mappings using JSON-LD 1.1, and we outline the interoperability testing we put in place to check its compatibility with the PROV data model.
The following namespaces prefixes are used throughout this document.
prefix | namespace IRI | definition |
prov | http://www.w3.org/ns/prov# | The PROV namespace [PROV-DM] |
provext | https://openprovenance.org/ns/provext# | Extension namespace for PROV used in this specification |
xsd | http://www.w3.org/2000/10/XMLSchema# | XML Schema Namespace [XMLSCHEMA11-2]] |
rdf | http://www.w3.org/1999/02/22-rdf-syntax-ns# | The RDF namespace [RDF-CONCEPTS] |
(others) | (various) | All other namespace prefixes are used in examples only. In particular, IRIs starting with "http://example.com" represent some application-dependent IRI [RFC3987] |
This section is non-normative.
We assume the reader to be familiar with PROV, JSON, and JSON-LD.
To illustrate the PROV-JSONLD serialization, we consider a subset of the example of [PROV-PRIMER], depicted below. It can be paraphrased as follows: agent Derek was responsible for composing an article based on an existing dataset.
The PROV-JSONLD representation of this example can be seen in Example 1. At the top-level, a PROV-JSONLD document is a JSON object with two properties @context and @graph, as per JSON-LD. A context contains mappings of prefixes to namespaces, and also an explicit reference to https://openprovenance.org/prov-jsonld/context.json — the JSON-LD 1.1 context defining the semantic mapping for PROV-JSONLD. (This context is fully described in section 5.) The @graph property has an array of PROV expressions as value. Each PROV expression is itself a JSON object with at least a @type property (for instance, prov:Entity, prov:Agent or prov:Derivation). Each of these PROV expressions provides a description for a resource, some of which are identified by the @id property (for instance, ex:article1 or ex:derek). Some of the resources are anonymous and therefore do not have a property @id, for instance, the prov:Derivation between the dataset and the article.
PROV expressions can be enriched with a variety of properties. Some of which are "reserved" such as activity and agent in a prov:Association. Others may be defined in a different namespace such as foaf:givenName, for which we expect the prefix foaf to be declared in the @context property. Finally, further PROV attributes are allowed, for instance prov:type with an array of further types, to better describe the resource.
The property @type is mandatory and is associated with a single value, expected to be one of the predefined PROV expressions. From an efficiency viewpoint, this property is critical in determining which internal data structure a PROV expression should map to, and therefore, facilitates efficient processing. On the contrary, prov:type is optional and can contain as many types as required; their order is not significant.
{
"@context" : [ {
"xsd" : "http://www.w3.org/2001/XMLSchema#",
"dcterms" : "http://purl.org/dc/terms/",
"ex" : "http://example/",
"prov" : "http://www.w3.org/ns/prov#",
"foaf" : "http://xmlns.com/foaf/0.1/"
}, "https://openprovenance.org/prov-jsonld/context.json" ],
"@graph" : [ {
"@type" : "prov:Entity",
"@id" : "ex:dataSet1"
}, {
"@type" : "prov:Entity",
"@id" : "ex:article1",
"dcterms:title" : [ {
"@value" : "Crime rises in cities",
"@language" : "EN"
} ]
}, {
"@type" : "prov:Derivation",
"generatedEntity" : "ex:article1",
"usedEntity" : "ex:dataSet1"
}, {
"@type" : "prov:Agent",
"@id" : "ex:derek",
"foaf:mbox" : [ {
"@value" : ""
} ],
"prov:type" : [ "prov:Person" ],
"foaf:givenName" : [ {
"@value" : "Derek"
} ]
}, {
"@type" : "prov:Association",
"activity" : "ex:compose",
"agent" : "ex:derek"
}, {
"@type" : "prov:Activity",
"@id" : "ex:compose"
}, {
"@type" : "prov:Usage",
"activity" : "ex:compose",
"entity" : "ex:dataSet1"
}, {
"@type" : "prov:Generation",
"entity" : "ex:article1",
"activity" : "ex:compose"
} ]
}
In this section, we provide an overview of the JSON schema [JSON-SCHEMA] for PROV-JSONLD; its full details can be found in Appendix A.
Some primitive types occur in PROV serializations, namely DateTime and QualifiedName. We define their schemas as follows.
{
"DateTime": {
"$id": "#/definitions/DateTime",
"type": "string",
"format": "date-time"
},
}
{
"QualifiedName": {
"$id": "#/definitions/QualifiedName",
"type": "string",
"title": "The QualifiedName Schema",
"default": "",
"pattern": "^[A-Za-z0-9_]+:(.*)$"
},
}
Typed values (typed_value) are JSON objects with properties @value and @type. String values are JSON objects with properties @value and @language.
{
"typed_value": {
"type": "object",
"required": [ "@value", "@type" ],
"properties": {
"@value": {
"type": "string"
},
"@type": {
"type": "string"
}
},
"additionalProperties": false
}
}
{
"lang_string": {
"type": "object",
"required": [ "@value" ],
"properties": {
"@value": {
"type": "string"
},
"@language": {
"type": "string"
}
},
"additionalProperties": false
}
}
We also define general types for property values, which can be arrays of values ArrayOfValues or arrays of labels ArrayOfLabelValues.
{
"ArrayOfValues": {
"$id": "#/definitions/ArrayOfValues",
"type": "array",
"items": {
"anyOf": [
{ "$ref": "#/definitions/QualifiedName" },
{ "$ref": "#/definitions/typed_value" },
{ "$ref": "#/definitions/lang_string" }
]
}
},
"ArrayOfLabelValues": {
"$id": "#/definitions/ArrayOfLabelValues",
"type": "array",
"items": { "$ref": "#/definitions/lang_string" }
},
"Context": {
"$id": "#/definitions/Context",
"type": "array",
"title": "The @context Schema",
"items": {
"oneOf": [
{
"type": "string",
"format": "uri"
},
{
"type": "object",
"title": "The Items Schema",
"additionalProperties": false
}
}
With these preliminary definitions in place, we can now present the specification of the core data structures of PROV-JSONLD.
An entity MUST contain an identifier (property @id) and a property @type with value prov:Entity. It MAY contain further type information (property prov:type), a location (property prov:location), a label (property prov:label), or other properties with an explicit prefix. (The presence of a colon ":" in the patternProperties element forces all other properties to have the structure of a prefix, a colon, and a local name.)
Schema for prov:Entity{
"prov:Entity": {
"type": "object",
"required": [ "@type", "@id" ],
"properties": {
"@type": { "pattern": "prov:Entity" },
"@id": { "$ref": "#/definitions/QualifiedName" },
"prov:type": { "$ref": "#/definitions/ArrayOfValues"},
"prov:location": { "$ref": "#/definitions/ArrayOfValues" },
"prov:label": { "$ref": "#/definitions/ArrayOfLabelValues"}
},
"patternProperties": {
"^[A-Za-z0-9_]+:(.*)$": { "$ref": "#/definitions/ArrayOfValues" }
},
"additionalProperties": false
}
}
An activity MUST contain an identifier (property @id) and a property @type with value prov:Activity. It MAY contain a start time (property startTime), an end time (property endTime), further type information (property prov:type), a location (property prov:location), a label (property prov:label), or other properties with an explicit prefix.
Schema for prov:Activity{
"prov:Activity": {
"type": "object",
"required": [ "@type", "@id" ],
"properties": {
"@type": { "pattern": "prov:Activity" },
"@id": { "$ref": "#/definitions/QualifiedName" },
"startTime": { "$ref": "#/definitions/DateTime" },
"endTime": { "$ref": "#/definitions/DateTime" },
"prov:type": { "$ref": "#/definitions/ArrayOfValues"},
"prov:location": { "$ref": "#/definitions/ArrayOfValues" },
"prov:label": { "$ref": "#/definitions/ArrayOfLabelValues"}
},
"patternProperties": {
"^[A-Za-z0-9_]+:(.*)$": { "$ref": "#/definitions/ArrayOfValues" }
},
"additionalProperties": false
}
}
An agent MUST contain an identifier (property @id) and a property @type with value prov:Agent. It MAY contain further type information (property prov:type), a location (property prov:location), a label (property prov:label), or other properties with an explicit prefix.
Schema for prov:Agent{
"prov:Agent": {
"type": "object",
"required": [ "@type", "@id" ],
"properties": {
"@type": { "pattern": "prov:Agent" },
"@id": { "$ref": "#/definitions/QualifiedName" },
"prov:type": { "$ref": "#/definitions/ArrayOfValues"},
"prov:location": { "$ref": "#/definitions/ArrayOfValues" },
"prov:label": { "$ref": "#/definitions/ArrayOfLabelValues"}
},
"patternProperties": {
"^[A-Za-z0-9_]+:(.*)$": { "$ref": "#/definitions/ArrayOfValues" }
},
"additionalProperties": false
}
}
A derivation MUST contain a property @type with value prov:Derivation. It SHOULD contain a generated entity (property generatedEntity) and used entity (property usedEntity). It MAY contain an identifier (property @id), an activity (property activity), a generation (property generation), a usage (property usage), further type information (property prov:type), a label (property prov:label), or other properties with an explicit prefix.
Schema for prov:Derivation{
"prov:Derivation": {
"type": "object",
"required": [
"@type"
],
"properties": {
"@type": { "pattern": "prov:Derivation" },
"@id": { "$ref": "#/definitions/QualifiedName" },
"activity": { "$ref": "#/definitions/QualifiedName" },
"generation": { "$ref": "#/definitions/QualifiedName" },
"usage": { "$ref": "#/definitions/QualifiedName" },
"generatedEntity": { "$ref": "#/definitions/QualifiedName" },
"usedEntity": { "$ref": "#/definitions/QualifiedName" },
"prov:type": { "$ref": "#/definitions/ArrayOfValues"},
"prov:label": { "$ref": "#/definitions/ArrayOfLabelValues"}
},
"patternProperties": {
"^[A-Za-z0-9_]+:(.*)$": { "$ref": "#/definitions/ArrayOfValues" }
},
"additionalProperties": false
}
}
An attribution MUST contain a property @type with value prov:Attribution. It SHOULD contain the entity that is the subject of the attribution (property entity) and the associated agent (property agent). It MAY contain an identifier (property @id), further type information (property prov:type), a label (property prov:label), or other properties witn an explicit prefix.
Schema for prov:Attribution{
"prov:Attribution": {
"type": "object",
"required": [
"@type"
],
"properties": {
"@type": { "pattern": "prov:Attribution" },
"@id": { "$ref": "#/definitions/QualifiedName" },
"entity": { "$ref": "#/definitions/QualifiedName" },
"agent" : { "$ref": "#/definitions/QualifiedName"},
"prov:type": { "$ref": "#/definitions/ArrayOfValues"},
"prov:label": { "$ref": "#/definitions/ArrayOfLabelValues"}
},
"patternProperties": {
"^[A-Za-z0-9_]+:(.*)$": { "$ref": "#/definitions/ArrayOfValues" }
},
"additionalProperties": false
}
}
An association MUST contain a property @type with value prov:Association. It SHOULD contain an activity (property activity) and its associated agent (property agent). It MAY contain an identifier (property @id), a plan (property plan), a location (property location), a role (property role), further type information (property prov:type), a label (property prov:label), or other properties with an explicit prefix.
Schema for prov:Association{
"prov:Association": {
"type": "object",
"required": [
"@type"
],
"properties": {
"@type": { "pattern": "prov:Association" },
"@id": { "$ref": "#/definitions/QualifiedName" },
"activity": { "$ref": "#/definitions/QualifiedName" },
"agent" : { "$ref": "#/definitions/QualifiedName"},
"plan" : { "$ref": "#/definitions/QualifiedName"},
"prov:type": { "$ref": "#/definitions/ArrayOfValues"},
"prov:role": { "$ref": "#/definitions/ArrayOfValues" },
"prov:location": { "$ref": "#/definitions/ArrayOfValues" },
"prov:label": { "$ref": "#/definitions/ArrayOfLabelValues"}
},
"patternProperties": {
"^[A-Za-z0-9_]+:(.*)$": { "$ref": "#/definitions/ArrayOfValues" }
},
"additionalProperties": false
}
}
A delegation MUST contain a property @type with value prov:Delegation. It SHOULD contain a delegate agent (property delegate) and a responsible agent (property responsible). It MAY contain an identifier (property @id), an activity (property activity), further type information (property prov:type), a label (property prov:label), or other properties with an explicit prefix.
Schema for prov:Delegation{
"prov:Delegation": {
"type": "object",
"required": [
"@type"
],
"properties": {
"@type": { "pattern": "prov:Delegation" },
"@id": { "$ref": "#/definitions/QualifiedName" },
"delegate": { "$ref": "#/definitions/QualifiedName" },
"responsible": { "$ref": "#/definitions/QualifiedName" },
"activity": { "$ref": "#/definitions/QualifiedName" },
"prov:type": { "$ref": "#/definitions/ArrayOfValues"},
"prov:label": { "$ref": "#/definitions/ArrayOfLabelValues"}
},
"patternProperties": {
"^[A-Za-z0-9_]+:(.*)$": { "$ref": "#/definitions/ArrayOfValues" }
},
"additionalProperties": false
}
}
A usage MUST contain a property @type with value prov:Usage. It SHOULD contain an activity (property activity) and an entity (property entity). It MAY contain an identifier (property @id), a time (property time), a location (property location), a role (property role), further type information (property prov:type), a label (property prov:label), or other properties with an explicit prefix.
Schema for prov:Usage{
"prov:Usage": {
"type": "object",
"required": [ "@type" ],
"properties": {
"@type": { "pattern": "prov:Usage" },
"@id": { "$ref": "#/definitions/QualifiedName" },
"entity": { "$ref": "#/definitions/QualifiedName"},
"activity": { "$ref": "#/definitions/QualifiedName" },
"time": { "$ref": "#/definitions/DateTime" },
"prov:type": { "$ref": "#/definitions/ArrayOfValues"},
"prov:role": { "$ref": "#/definitions/ArrayOfValues" },
"prov:location": { "$ref": "#/definitions/ArrayOfValues" },
"prov:label": { "$ref": "#/definitions/ArrayOfLabelValues"}
},
"patternProperties": {
"^[A-Za-z0-9_]+:(.*)$": { "$ref": "#/definitions/ArrayOfValues" }
},
"additionalProperties": false
}
}
A generation MUST contain a property @type with value prov:Generation. It SHOULD contain an entity (property entity) and an activity (property activity). It MAY contain an identifier (property @id), a time (property time), a location (property location), a role (property role), further type information (property prov:type), a label (property prov:label), or other properties with an explicit prefix.
Schema for prov:Generation{
"prov:Generation": {
"type": "object",
"required": [ "@type" ],
"properties": {
"@type": { "pattern": "prov:Generation" },
"@id": { "$ref": "#/definitions/QualifiedName" },
"entity": { "$ref": "#/definitions/QualifiedName"},
"activity": { "$ref": "#/definitions/QualifiedName" },
"time": { "$ref": "#/definitions/DateTime" },
"prov:type": { "$ref": "#/definitions/ArrayOfValues"},
"prov:role": { "$ref": "#/definitions/ArrayOfValues" },
"prov:location": { "$ref": "#/definitions/ArrayOfValues" },
"prov:label": { "$ref": "#/definitions/ArrayOfLabelValues"}
},
"patternProperties": {
"^[A-Za-z0-9_]+:(.*)$": { "$ref": "#/definitions/ArrayOfValues" }
},
"additionalProperties": false
}
}
An invalidation MUST contain a property @type with value prov:Invalidation. It SHOULD contain an entity (property entity) and an activity (property activity). It MAY contain an identifier (property @id), a time (property time), a location (property location), a role (property role), further type information (property prov:type), a label (property prov:label), or other properties with an explicit prefix.
Schema for prov:Invalidation{
"prov:Invalidation": {
"type": "object",
"required": [ "@type" ],
"properties": {
"@type": { "pattern": "prov:Invalidation" },
"@id": { "$ref": "#/definitions/QualifiedName" },
"entity": { "$ref": "#/definitions/QualifiedName"},
"activity": { "$ref": "#/definitions/QualifiedName" },
"time": { "$ref": "#/definitions/DateTime" },
"prov:type": { "$ref": "#/definitions/ArrayOfValues"},
"prov:role": { "$ref": "#/definitions/ArrayOfValues" },
"prov:location": { "$ref": "#/definitions/ArrayOfValues" },
"prov:label": { "$ref": "#/definitions/ArrayOfLabelValues"}
},
"patternProperties": {
"^[A-Za-z0-9_]+:(.*)$": { "$ref": "#/definitions/ArrayOfValues" }
},
"additionalProperties": false
}
}
A start MUST contain a property @type with value prov:Start. It SHOULD contain an activity that was started (property activity); it MAY contain a starter activity (property starter) and a triggering entity (property trigger). It MAY also contain an identifier (property @id), a time (property time), a location (property location), a role (property role), further type information (property prov:type), a label (property prov:label), or other properties with an explicit prefix.
Schema for prov:Start{
"prov:Start": {
"type": "object",
"required": [
"@type"
],
"properties": {
"@type": { "pattern": "prov:Start" },
"@id": { "$ref": "#/definitions/QualifiedName" },
"activity": { "$ref": "#/definitions/QualifiedName" },
"starter": { "$ref": "#/definitions/QualifiedName"},
"trigger": { "$ref": "#/definitions/QualifiedName" },
"time": { "$ref": "#/definitions/DateTime" },
"prov:type": { "$ref": "#/definitions/ArrayOfValues"},
"prov:role": { "$ref": "#/definitions/ArrayOfValues" },
"prov:location": { "$ref": "#/definitions/ArrayOfValues" },
"prov:label": { "$ref": "#/definitions/ArrayOfLabelValues"}
},
"patternProperties": {
"^[A-Za-z0-9_]+:(.*)$": { "$ref": "#/definitions/ArrayOfValues" }
},
"additionalProperties": false
}
}
An end MUST contain a property @type with value prov:End. It SHOULD contain an activity that was ended (property activity); it MAY contain an ender activity (property ender) and a triggering entity (property trigger). It MAY also contain an identifier (property @id), a time (property time), a location (property location), a role (property role), further type information (property prov:type), a label (property prov:label), or other properties with an explicit prefix.
Schema for prov:End{
"prov:End": {
"type": "object",
"required": [
"@type"
],
"properties": {
"@type": { "pattern": "prov:End" },
"@id": { "$ref": "#/definitions/QualifiedName" },
"activity": { "$ref": "#/definitions/QualifiedName" },
"ender" : { "$ref": "#/definitions/QualifiedName"},
"trigger": { "$ref": "#/definitions/QualifiedName" },
"time": { "$ref": "#/definitions/DateTime" },
"prov:type": { "$ref": "#/definitions/ArrayOfValues"},
"prov:role": { "$ref": "#/definitions/ArrayOfValues" },
"prov:location": { "$ref": "#/definitions/ArrayOfValues" },
"prov:label": { "$ref": "#/definitions/ArrayOfLabelValues"}
},
"patternProperties": {
"^[A-Za-z0-9_]+:(.*)$": { "$ref": "#/definitions/ArrayOfValues" }
},
"additionalProperties": false
}
}
A communication MUST contain a property @type with value prov:Communication. It SHOULD contain an informed activity (property informed) and an informant activity (property informant). It MAY contain an identifier (property @id), further type information (property prov:type), a label (property prov:label), or other properties with an explicit prefix.
Schema for prov:Communication{
"prov:Communication": {
"type": "object",
"required": [
"@type"
],
"properties": {
"@type": { "pattern": "prov:Communication" },
"@id": { "$ref": "#/definitions/QualifiedName" },
"informant": { "$ref": "#/definitions/QualifiedName" },
"informed": { "$ref": "#/definitions/QualifiedName" },
"prov:type": { "$ref": "#/definitions/ArrayOfValues"},
"prov:label": { "$ref": "#/definitions/ArrayOfLabelValues"}
},
"patternProperties": {
"^[A-Za-z0-9_]+:(.*)$": { "$ref": "#/definitions/ArrayOfValues" }
},
"additionalProperties": false
}
}
An influence MUST contain a property @type with value prov:Influence. It SHOULD contain an influencee (property influencee) and an influencer (property influencer). It MAY contain an identifier (property @id), further type information (property prov:type), a label (property prov:label), or other properties with an explicit prefix.
Schema for prov:Influence{
"prov:Influence": {
"type": "object",
"required": [
"@type"
],
"properties": {
"@type": { "pattern": "prov:Influence" },
"@id": { "$ref": "#/definitions/QualifiedName" },
"influencer": { "$ref": "#/definitions/QualifiedName" },
"influencee": { "$ref": "#/definitions/QualifiedName" },
"prov:type": { "$ref": "#/definitions/ArrayOfValues"},
"prov:label": { "$ref": "#/definitions/ArrayOfLabelValues"}
},
"patternProperties": {
"^[A-Za-z0-9_]+:(.*)$": { "$ref": "#/definitions/ArrayOfValues" }
},
"additionalProperties": false
}
}
A specialization MUST contain a property @type with value prov:Specialization. It SHOULD contain a specific entity (property specificEntity) and a general entity (property generalEntity). It MAY contain an identifier (property @id), further type information (property prov:type), a label (property prov:label), or other properties with an explicit prefix.
Schema for prov:Specialization{
"prov:Specialization": {
"type": "object",
"required": [
"@type"
],
"properties": {
"@type": { "pattern": "prov:Specialization" },
"@id": { "$ref": "#/definitions/QualifiedName" },
"generalEntity": { "$ref": "#/definitions/QualifiedName" },
"specificEntity": { "$ref": "#/definitions/QualifiedName" },
"prov:type": { "$ref": "#/definitions/ArrayOfValues"},
"prov:label": { "$ref": "#/definitions/ArrayOfLabelValues"}
},
"patternProperties": {
"^[A-Za-z0-9_]+:(.*)$": { "$ref": "#/definitions/ArrayOfValues" }
},
"additionalProperties": false
}
}
An alternate MUST contain a property @type with value prov:Alternate. It SHOULD contain a first alternate (property alternate1) and a second alternate (property alternate2). It MAY contain an identifier (property @id), further type information (property prov:type), a label (property prov:label), or other properties with an explicit prefix.
Schema for prov:Alternate{
"prov:Alternate": {
"type": "object",
"required": [
"@type"
],
"properties": {
"@type": { "pattern": "prov:Alternate" },
"@id": { "$ref": "#/definitions/QualifiedName" },
"alternate1": { "$ref": "#/definitions/QualifiedName" },
"alternate2": { "$ref": "#/definitions/QualifiedName" },
"prov:type": { "$ref": "#/definitions/ArrayOfValues"},
"prov:label": { "$ref": "#/definitions/ArrayOfLabelValues"}
},
"patternProperties": {
"^[A-Za-z0-9_]+:(.*)$": { "$ref": "#/definitions/ArrayOfValues" }
},
"additionalProperties": false
}
}
A membership MUST contain a property @type with value prov:Membership. It SHOULD contain a collection (property collection) and a single entity or an array of them (property entity). It MAY contain an identifier (property @id), further type information (property prov:type), a label (property prov:label), or other properties with an explicit prefix.
Schema for prov:Membership{
"prov:Membership": {
"type": "object",
"required": [
"@type"
],
"properties": {
"@type": { "pattern": "prov:Membership" },
"@id": { "$ref": "#/definitions/QualifiedName" },
"entity": { "$ref": "#/definitions/QualifiedName+" },
"collection": { "$ref": "#/definitions/QualifiedName" },
"prov:type": { "$ref": "#/definitions/ArrayOfValues"},
"prov:label": { "$ref": "#/definitions/ArrayOfLabelValues"}
},
"patternProperties": {
"^[A-Za-z0-9_]+:(.*)$": { "$ref": "#/definitions/ArrayOfValues" }
},
"additionalProperties": false
}
}
{
"QualifiedName+": {
"$id": "#/definitions/QualifiedName+",
"oneOf": [
{ "type": "array",
"items": { "$ref": "#/definitions/QualifiedName" }} ,
{ "$ref": "#/definitions/QualifiedName" }
]
},
}
A bundle and a document MUST contain a property @type with value prov:Bundle and prov:Document respectively, a context @context, and set of PROV expressions @graph. The names of the properties @context and @graph are specified by JSON-LD [JSON-LD11]. In addition, a bundle must contain an identifier (property @id).
Schemas for prov:Bundle and prov:Document{
"prov:Bundle": {
"type": "object",
"required": [
"@type", "@id", "@graph", "@context"
],
"properties": {
"@type": { "pattern": "prov:Bundle" },
"@id": { "$ref": "#/definitions/QualifiedName" },
"@context": { "$ref": "#/definitions/Context" },
"@graph": {
"type": "array",
"items": { "$ref": "#/definitions/prov:Statement" }
}
},
"additionalProperties": false
}
}
{
"prov:Document": {
"type": "object",
"required": [
"@context", "@graph"
],
"properties": {
"@type": { "pattern": "prov:Document" },
"@context": { "$ref": "#/definitions/Context" },
"@graph": {
"type": "array",
"items": { "$ref": "#/definitions/prov:StatementOrBundle" }
}
},
"additionalProperties": false
}
}
Bundles contain statements (definition prov:Statement), whereas documents contain statements or bundles (definition prov:StatementOrBundle).
{
"prov:Statement": {
"oneOf": [
{ "$ref": "#/definitions/prov:Entity" },
{ "$ref": "#/definitions/prov:Activity" },
{ "$ref": "#/definitions/prov:Agent" },
{ "$ref": "#/definitions/prov:Usage" },
{ "$ref": "#/definitions/prov:Generation" },
{ "$ref": "#/definitions/prov:Attribution" },
{ "$ref": "#/definitions/prov:Association" },
{ "$ref": "#/definitions/prov:Delegation" },
{ "$ref": "#/definitions/prov:Invalidation" },
{ "$ref": "#/definitions/prov:Start" },
{ "$ref": "#/definitions/prov:End" },
{ "$ref": "#/definitions/prov:Derivation" },
{ "$ref": "#/definitions/prov:Alternate" },
{ "$ref": "#/definitions/prov:Specialization" },
{ "$ref": "#/definitions/prov:Membership" },
{ "$ref": "#/definitions/prov:Influence" },
{ "$ref": "#/definitions/prov:Communication" }
]
}
}
{
"prov:StatementOrBundle": {
"oneOf": [
{ "$ref": "#/definitions/prov:Statement" },
{ "$ref": "#/definitions/prov:Bundle" }
]
}
}
Finally, contexts are defined as follows. They take the shape of an array, containing either mappings of prefixes to URIs or URIs to further JSON-LD contexts.
{
"Context": {
"$id": "#/definitions/Context",
"type": "array",
"title": "The @context Schema",
"items": {
"oneOf": [
{
"type": "string",
"format": "uri"
},
{
"type": "object",
"title": "The Items Schema",
"additionalProperties": { "type": "string"}
}
]
}
}
In this section, we provide a description of the JSON-LD context to map the PROV-JSON structures to linked data. Full details of the context can be found in Appendix B.
The Ontology PROV-O [PROV-O] defines the Qualification Pattern, which restates a binary property between two resources (referred to as an unqualified influence relation) by using an intermediate class that represents the influence between two resources. This new instance, in turn, can be annotated with additional descriptions of the influence that one resource had upon another. The following figure, borrowed from [PROV-O], summarises the PROV relations, and how they are encoded in RDF using the Qualification Pattern. Note that the figure does not include the Qualification Pattern for Influence; in addition, PROV-O does not define the Qualification Pattern for specialization, alternate and membership.
The following JSON properties have a default meaning, unless they are redefined in a specific context of a PROV-JSONLD document: entity, activity and agent respectively map to PROV-O object properties prov:entity, prov:activity and prov:agent.
The following JSON properties have the same meaning in all contexts of a PROV-JSONLD document: prov:role, prov:type, prov:label and prov:location respectively map to the RDF properties prov:hadRole, rdf:type, rdfs:label, and prov:atLocation.
{
"entity": {
"@id": "prov:entity",
"@type": "@id"
},
"activity": {
"@id": "prov:activity",
"@type": "@id"
},
"agent": {
"@id": "prov:agent",
"@type": "@id"
},
"prov:role": {
"@id": "prov:hadRole",
"@type": "@id"
},
"prov:type": {
"@id": "rdf:type",
"@type": "@id"
},
"prov:label": {
"@id": "rdfs:label"
},
"prov:location": {
"@id": "prov:atLocation",
"@type": "@id"
},
}
There is no contextual definition that is specific to entities.
The JSON properties startTime and endTime map to the RDF data properties prov:startedAtTime and prov:endedAtType, respectively, and have a range of type xsd:dateTime.
Context for prov:Activity{
"prov:Activity": {
"@id": "prov:Activity",
"@context" : {
"startTime": {
"@id": "prov:startedAtTime",
"@type": "xsd:dateTime"
},
"endTime": {
"@id": "prov:endedAtTime",
"@type": "xsd:dateTime"
}
}
}
}
There is no contextual definition that is specific to agents .
The mapping below supports the Qualification Pattern of Figure 2, g. Each of the JSON properties generatedEntity, usedEntity, activity, generation, and usage maps to an object property: namely, prov:qualifiedDerivation, prov:entity, prov:hadActivity, prov:hadGeneration, and prov:hadUsage, respectively.
Context for prov:Derivation{
"prov:Derivation": {
"@id": "prov:Derivation",
"@context": {
"generatedEntity": {
"@reverse": "prov:qualifiedDerivation",
"@type": "@id"
},
"usedEntity": {
"@id": "prov:entity",
"@type": "@id"
},
"generation": {
"@id": "prov:hadGeneration",
"@type": "@id"
},
"activity": {
"@id": "prov:hadActivity",
"@type": "@id"
},
"usage": {
"@id": "prov:hadUsage",
"@type": "@id"
}
}
}
}
The mapping below supports the Qualification Pattern of Figure 2, i. The JSON property entity maps to the object property prov:qualifiedAttribution.
Context for prov:Attribution{
"prov:Attribution": {
"@id": "prov:Attribution",
"@context": {
"entity": {
"@reverse" : "prov:qualifiedAttribution",
"@type" : "@id"
}
}
}
}
The mapping below supports the Qualification Pattern of Figure 2, j. The JSON properties activity and plan map to the object properties prov:qualifiedAssociation and prov:hadPlan, respectively.
Context for prov:Association{
"prov:Association": {
"@id": "prov:Association",
"@context": {
"activity": {
"@reverse" : "prov:qualifiedAssociation",
"@type" : "@id"
},
"plan": {
"@id": "prov:hadPlan",
"@type": "@id"
}
}
}
}
The mapping below supports the Qualification Pattern of Figure 2, h. The JSON properties responsible, delegate and activity map to the object properties prov:agent, prov:qualifiedDelegation and prov:hadActivity, respectively.
Context for prov:Delegation{
"prov:Delegation": {
"@id": "prov:Delegation",
"@context": {
"responsible": {
"@id": "prov:agent",
"@type" : "@id"
},
"delegate": {
"@reverse": "prov:qualifiedDelegation",
"@type": "@id"
},
"activity": {
"@id" : "prov:hadActivity",
"@type" : "@id"
}
}
}
}
The mapping below supports the Qualification Pattern of Figure 2, a. The JSON properties activity and time map to the object property prov:qualifiedUsage and the data property prov:atTime, respectively. The range of the latter is xsd:dateTime.
Context for prov:Usage{
"prov:Usage": {
"@id": "prov:Usage",
"@context": {
"activity": {
"@reverse" : "prov:qualifiedUsage",
"@type" : "@id"
},
"time": {
"@id": "prov:atTime",
"@type": "xsd:dateTime"
}
}
}
}
The mapping below supports the Qualification Pattern of Figure 2, b. The JSON properties entity and time map to the object property prov:qualifiedGeneration and the data property prov:atTime, respectively. The range of the latter is xsd:dateTime.
Context for prov:Generation{
"prov:Generation": {
"@id": "prov:Generation",
"@context": {
"entity": {
"@reverse" : "prov:qualifiedGeneration",
"@type" : "@id"
},
"time": {
"@id": "prov:atTime",
"@type": "xsd:dateTime"
}
}
}
}
The mapping below supports the Qualification Pattern of Figure 2, c. The JSON properties entity and time map to the object property prov:qualifiedInvalidation and the data property prov:atTime, respectively. The range of the latter is xsd:dateTime.
Context for prov:Invalidation{
"prov:Invalidation": {
"@id": "prov:Invalidation",
"@context": {
"entity": {
"@reverse" : "prov:qualifiedInvalidation",
"@type" : "@id"
},
"time": {
"@id": "prov:atTime",
"@type": "xsd:dateTime"
}
}
}
}
The mapping below supports the Qualification Pattern of Figure 2, e. The JSON properties activity, trigger, starter, and time map to the object properties prov:qualifiedStart, prov:entity, prov:hadActivity, and the data property prov:atTime, respectively. The range of the latter is xsd:dateTime.
Context for prov:Start{
"prov:Start": {
"@id": "prov:Start",
"@context": {
"activity": {
"@reverse": "prov:qualifiedStart",
"@type": "@id"
},
"trigger": {
"@id": "prov:entity",
"@type": "@id"
},
"starter": {
"@id": "prov:hadActivity",
"@type": "@id"
},
"time": {
"@id": "prov:atTime",
"@type": "xsd:dateTime"
}
}
}
}
The mapping below supports the Qualification Pattern of Figure 2, f. The JSON properties activity, trigger, ender, and time map to the object properties prov:qualifiedEnd, prov:entity, prov:hadActivity, and the data property prov:atTime, respectively. The range of the latter is xsd:dateTime.
Context for prov:End{
"prov:End": {
"@id": "prov:End",
"@context": {
"activity": {
"@reverse": "prov:qualifiedEnd",
"@type": "@id"
},
"trigger": {
"@id": "prov:entity",
"@type": "@id"
},
"ender": {
"@id": "prov:hadActivity",
"@type": "@id"
},
"time": {
"@id": "prov:atTime",
"@type": "xsd:dateTime"
}
}
}
}
The mapping below supports the Qualification Pattern of Figure 2, d. The JSON properties informed and informant map to the object properties prov:qualifiedCommunication and prov:activity, respectively.
Context for prov:Communication{
"prov:Communication": {
"@id": "prov:Communication",
"@context": {
"informed": {
"@reverse" : "prov:qualifiedCommunication",
"@type" : "@id"
},
"informant": {
"@id": "prov:activity",
"@type": "@id"
}
}
}
}
The JSON properties influencee and influencer map to the object properties prov:qualifiedInfluence and prov:influencer, respectively.
Context for prov:Influence{
"prov:Influence": {
"@id": "prov:Influence",
"@context": {
"influencee": {
"@reverse" : "prov:qualifiedInfluence",
"@type" : "@id"
},
"influencer": {
"@id": "prov:influencer",
"@type": "@id"
}
}
}
}
While [PROV-O] does not define a Qualification Pattern for Specialization, for uniformity and usability reasons, we adopt a similar mapping as other PROV relations, via a Qualification Pattern. However, the mapping is to new classes and properties in the PROV extension namespace (denoted by the prefix provext). See Section 6 for interoperability considerations.
The JSON properties specificEntity and generalEntity map to the object properties provext:qualifiedSpecialization and prov:entity, respectively.
Context for prov:Specialization{
"prov:Specialization": {
"@id": "provext:Specialization",
"@context": {
"specificEntity": {
"@reverse" : "provext:qualifiedSpecialization",
"@type" : "@id"
},
"generalEntity": {
"@id": "prov:entity",
"@type": "@id"
}
}
}
}
While [PROV-O] does not define a Qualification Pattern for Alternate, for uniformity and usability reasons, we adopt a similar mapping as other PROV relations, via a Qualification Pattern. However, the mapping is to new classes and properties in the PROV extension namespace (denoted by the prefix provext). See Section 6 for interoperability considerations.
The JSON properties alternate1 and alternate2 map to the object properties provext:qualifiedAlternate and prov:entity, respectively.
Context for prov:Alternate{
"prov:Alternate": {
"@id": "provext:Alternate",
"@context": {
"alternate1": {
"@reverse" : "provext:qualifiedAlternate",
"@type" : "@id"
},
"alternate2": {
"@id": "prov:entity",
"@type": "@id"
}
}
}
}
While [PROV-O] does not define a Qualification Pattern for Membership, for uniformity and usability reasons, we adopt a similar mapping as other PROV relations, via a Qualification Pattern. However, the mapping is to new classes and properties in the PROV extension namespace (denoted by the prefix provext). See Section 6 for interoperability considerations.
The JSON properties collection and entity map to the object properties provext:qualifiedMembership and prov:entity, respectively.
Context for prov:Membership{
"prov:Membership": {
"@id": "provext:Membership",
"@context": {
"collection": {
"@reverse" : "provext:qualifiedMembership",
"@type" : "@id"
},
"entity": {
"@id": "prov:entity",
"@type": "@id"
}
}
}
}
{
"@graph" : [
{
"@type" : "prov:Agent",
"@id" : "ex:derek",
"foaf:mbox" : [ {
"@value" : ""
} ],
"prov:type" : [ "prov:Person" ],
"foaf:givenName" : [ {
"@value" : "Derek"
} ]
},
{
"@type" : "prov:Derivation",
"generatedEntity" : "ex:dataSet2",
"usedEntity" : "ex:dataSet1",
"prov:type" : [ "prov:Revision" ]
}
]
}
{
"definitions": {
"DateTime": {
"$id": "#/definitions/DateTime",
"type": "string",
"format": "date-time"
},
"QualifiedName": {
"$id": "#/definitions/QualifiedName",
"type": "string",
"title": "The QualifiedName Schema",
"default": "",
"pattern": "^[A-Za-z0-9_]+:(.*)$"
},
"QualifiedName+": {
"$id": "#/definitions/QualifiedName+",
"oneOf": [
{ "type": "array",
"items": { "$ref": "#/definitions/QualifiedName" }} ,
{ "$ref": "#/definitions/QualifiedName" }
]
},
"non_prov_properties": {
"patternProperties": {
"^[A-Za-z0-9_]+:(.*)$": {}
},
"additionalProperties": false
},
"typed_value": {
"type": "object",
"required": [ "@value", "@type" ],
"properties": {
"@value": {
"type": "string"
},
"@type": {
"type": "string"
}
},
"additionalProperties": false
},
"lang_string": {
"type": "object",
"required": [ "@value" ],
"properties": {
"@value": {
"type": "string"
},
"@language": {
"type": "string"
}
},
"additionalProperties": false
},
"ArrayOfValues": {
"$id": "#/definitions/ArrayOfValues",
"type": "array",
"items": {
"anyOf": [
{ "$ref": "#/definitions/QualifiedName" },
{ "$ref": "#/definitions/typed_value" },
{ "$ref": "#/definitions/lang_string" }
]
}
},
"ArrayOfLabelValues": {
"$id": "#/definitions/ArrayOfLabelValues",
"type": "array",
"items": { "$ref": "#/definitions/lang_string" }
},
"Context": {
"$id": "#/definitions/Context",
"type": "array",
"title": "The @context Schema",
"items": {
"oneOf": [
{
"type": "string",
"format": "uri"
},
{
"type": "object",
"title": "The Items Schema",
"additionalProperties": { "type": "string"}
}
]
}
},
"prov:StatementOrBundle": {
"oneOf": [
{ "$ref": "#/definitions/prov:Statement" },
{ "$ref": "#/definitions/prov:Bundle" }
]
},
"prov:Statement": {
"oneOf": [
{ "$ref": "#/definitions/prov:Entity" },
{ "$ref": "#/definitions/prov:Activity" },
{ "$ref": "#/definitions/prov:Agent" },
{ "$ref": "#/definitions/prov:Usage" },
{ "$ref": "#/definitions/prov:Generation" },
{ "$ref": "#/definitions/prov:Attribution" },
{ "$ref": "#/definitions/prov:Association" },
{ "$ref": "#/definitions/prov:Delegation" },
{ "$ref": "#/definitions/prov:Invalidation" },
{ "$ref": "#/definitions/prov:Start" },
{ "$ref": "#/definitions/prov:End" },
{ "$ref": "#/definitions/prov:Derivation" },
{ "$ref": "#/definitions/prov:Alternate" },
{ "$ref": "#/definitions/prov:Specialization" },
{ "$ref": "#/definitions/prov:Membership" },
{ "$ref": "#/definitions/prov:Influence" },
{ "$ref": "#/definitions/prov:Communication" }
]
},
"prov:Entity": {
"type": "object",
"required": [ "@type", "@id" ],
"properties": {
"@type": { "pattern": "prov:Entity" },
"@id": { "$ref": "#/definitions/QualifiedName" },
"prov:type": { "$ref": "#/definitions/ArrayOfValues"},
"prov:location": { "$ref": "#/definitions/ArrayOfValues" },
"prov:label": { "$ref": "#/definitions/ArrayOfLabelValues"}
},
"patternProperties": {
"^[A-Za-z0-9_]+:(.*)$": { "$ref": "#/definitions/ArrayOfValues" }
},
"additionalProperties": false
},
"prov:Agent": {
"type": "object",
"required": [ "@type", "@id" ],
"properties": {
"@type": { "pattern": "prov:Agent" },
"@id": { "$ref": "#/definitions/QualifiedName" },
"prov:type": { "$ref": "#/definitions/ArrayOfValues"},
"prov:location": { "$ref": "#/definitions/ArrayOfValues" },
"prov:label": { "$ref": "#/definitions/ArrayOfLabelValues"}
},
"patternProperties": {
"^[A-Za-z0-9_]+:(.*)$": { "$ref": "#/definitions/ArrayOfValues" }
},
"additionalProperties": false
},
"prov:Activity": {
"type": "object",
"required": [ "@type", "@id" ],
"properties": {
"@type": { "pattern": "prov:Activity" },
"@id": { "$ref": "#/definitions/QualifiedName" },
"startTime": { "$ref": "#/definitions/DateTime" },
"endTime": { "$ref": "#/definitions/DateTime" },
"prov:type": { "$ref": "#/definitions/ArrayOfValues"},
"prov:location": { "$ref": "#/definitions/ArrayOfValues" },
"prov:label": { "$ref": "#/definitions/ArrayOfLabelValues"}
},
"patternProperties": {
"^[A-Za-z0-9_]+:(.*)$": { "$ref": "#/definitions/ArrayOfValues" }
},
"additionalProperties": false
},
"prov:Usage": {
"type": "object",
"required": [ "@type" ],
"properties": {
"@type": { "pattern": "prov:Usage" },
"@id": { "$ref": "#/definitions/QualifiedName" },
"entity": { "$ref": "#/definitions/QualifiedName"},
"activity": { "$ref": "#/definitions/QualifiedName" },
"time": { "$ref": "#/definitions/DateTime" },
"prov:type": { "$ref": "#/definitions/ArrayOfValues"},
"prov:role": { "$ref": "#/definitions/ArrayOfValues" },
"prov:location": { "$ref": "#/definitions/ArrayOfValues" },
"prov:label": { "$ref": "#/definitions/ArrayOfLabelValues"}
},
"patternProperties": {
"^[A-Za-z0-9_]+:(.*)$": { "$ref": "#/definitions/ArrayOfValues" }
},
"additionalProperties": false
},
"prov:Generation": {
"type": "object",
"required": [ "@type" ],
"properties": {
"@type": { "pattern": "prov:Generation" },
"@id": { "$ref": "#/definitions/QualifiedName" },
"entity": { "$ref": "#/definitions/QualifiedName"},
"activity": { "$ref": "#/definitions/QualifiedName" },
"time": { "$ref": "#/definitions/DateTime" },
"prov:type": { "$ref": "#/definitions/ArrayOfValues"},
"prov:role": { "$ref": "#/definitions/ArrayOfValues" },
"prov:location": { "$ref": "#/definitions/ArrayOfValues" },
"prov:label": { "$ref": "#/definitions/ArrayOfLabelValues"}
},
"patternProperties": {
"^[A-Za-z0-9_]+:(.*)$": { "$ref": "#/definitions/ArrayOfValues" }
},
"additionalProperties": false
},
"prov:Invalidation": {
"type": "object",
"required": [ "@type" ],
"properties": {
"@type": { "pattern": "prov:Invalidation" },
"@id": { "$ref": "#/definitions/QualifiedName" },
"entity": { "$ref": "#/definitions/QualifiedName"},
"activity": { "$ref": "#/definitions/QualifiedName" },
"time": { "$ref": "#/definitions/DateTime" },
"prov:type": { "$ref": "#/definitions/ArrayOfValues"},
"prov:role": { "$ref": "#/definitions/ArrayOfValues" },
"prov:location": { "$ref": "#/definitions/ArrayOfValues" },
"prov:label": { "$ref": "#/definitions/ArrayOfLabelValues"}
},
"patternProperties": {
"^[A-Za-z0-9_]+:(.*)$": { "$ref": "#/definitions/ArrayOfValues" }
},
"additionalProperties": false
},
"prov:Start": {
"type": "object",
"required": [
"@type"
],
"properties": {
"@type": { "pattern": "prov:Start" },
"@id": { "$ref": "#/definitions/QualifiedName" },
"activity": { "$ref": "#/definitions/QualifiedName" },
"starter": { "$ref": "#/definitions/QualifiedName"},
"trigger": { "$ref": "#/definitions/QualifiedName" },
"time": { "$ref": "#/definitions/DateTime" },
"prov:type": { "$ref": "#/definitions/ArrayOfValues"},
"prov:role": { "$ref": "#/definitions/ArrayOfValues" },
"prov:location": { "$ref": "#/definitions/ArrayOfValues" },
"prov:label": { "$ref": "#/definitions/ArrayOfLabelValues"}
},
"patternProperties": {
"^[A-Za-z0-9_]+:(.*)$": { "$ref": "#/definitions/ArrayOfValues" }
},
"additionalProperties": false
},
"prov:End": {
"type": "object",
"required": [
"@type"
],
"properties": {
"@type": { "pattern": "prov:End" },
"@id": { "$ref": "#/definitions/QualifiedName" },
"activity": { "$ref": "#/definitions/QualifiedName" },
"ender" : { "$ref": "#/definitions/QualifiedName"},
"trigger": { "$ref": "#/definitions/QualifiedName" },
"time": { "$ref": "#/definitions/DateTime" },
"prov:type": { "$ref": "#/definitions/ArrayOfValues"},
"prov:role": { "$ref": "#/definitions/ArrayOfValues" },
"prov:location": { "$ref": "#/definitions/ArrayOfValues" },
"prov:label": { "$ref": "#/definitions/ArrayOfLabelValues"}
},
"patternProperties": {
"^[A-Za-z0-9_]+:(.*)$": { "$ref": "#/definitions/ArrayOfValues" }
},
"additionalProperties": false
},
"prov:Attribution": {
"type": "object",
"required": [
"@type"
],
"properties": {
"@type": { "pattern": "prov:Attribution" },
"@id": { "$ref": "#/definitions/QualifiedName" },
"entity": { "$ref": "#/definitions/QualifiedName" },
"agent" : { "$ref": "#/definitions/QualifiedName"},
"prov:type": { "$ref": "#/definitions/ArrayOfValues"},
"prov:label": { "$ref": "#/definitions/ArrayOfLabelValues"}
},
"patternProperties": {
"^[A-Za-z0-9_]+:(.*)$": { "$ref": "#/definitions/ArrayOfValues" }
},
"additionalProperties": false
},
"prov:Association": {
"type": "object",
"required": [
"@type"
],
"properties": {
"@type": { "pattern": "prov:Association" },
"@id": { "$ref": "#/definitions/QualifiedName" },
"activity": { "$ref": "#/definitions/QualifiedName" },
"agent" : { "$ref": "#/definitions/QualifiedName"},
"plan" : { "$ref": "#/definitions/QualifiedName"},
"prov:type": { "$ref": "#/definitions/ArrayOfValues"},
"prov:role": { "$ref": "#/definitions/ArrayOfValues" },
"prov:location": { "$ref": "#/definitions/ArrayOfValues" },
"prov:label": { "$ref": "#/definitions/ArrayOfLabelValues"}
},
"patternProperties": {
"^[A-Za-z0-9_]+:(.*)$": { "$ref": "#/definitions/ArrayOfValues" }
},
"additionalProperties": false
},
"prov:Delegation": {
"type": "object",
"required": [
"@type"
],
"properties": {
"@type": { "pattern": "prov:Delegation" },
"@id": { "$ref": "#/definitions/QualifiedName" },
"delegate": { "$ref": "#/definitions/QualifiedName" },
"responsible": { "$ref": "#/definitions/QualifiedName" },
"activity": { "$ref": "#/definitions/QualifiedName" },
"prov:type": { "$ref": "#/definitions/ArrayOfValues"},
"prov:label": { "$ref": "#/definitions/ArrayOfLabelValues"}
},
"patternProperties": {
"^[A-Za-z0-9_]+:(.*)$": { "$ref": "#/definitions/ArrayOfValues" }
},
"additionalProperties": false
},
"prov:Derivation": {
"type": "object",
"required": [
"@type"
],
"properties": {
"@type": { "pattern": "prov:Derivation" },
"@id": { "$ref": "#/definitions/QualifiedName" },
"activity": { "$ref": "#/definitions/QualifiedName" },
"generation": { "$ref": "#/definitions/QualifiedName" },
"usage": { "$ref": "#/definitions/QualifiedName" },
"generatedEntity": { "$ref": "#/definitions/QualifiedName" },
"usedEntity": { "$ref": "#/definitions/QualifiedName" },
"prov:type": { "$ref": "#/definitions/ArrayOfValues"},
"prov:label": { "$ref": "#/definitions/ArrayOfLabelValues"}
},
"patternProperties": {
"^[A-Za-z0-9_]+:(.*)$": { "$ref": "#/definitions/ArrayOfValues" }
},
"additionalProperties": false
},
"prov:Alternate": {
"type": "object",
"required": [
"@type"
],
"properties": {
"@type": { "pattern": "prov:Alternate" },
"@id": { "$ref": "#/definitions/QualifiedName" },
"alternate1": { "$ref": "#/definitions/QualifiedName" },
"alternate2": { "$ref": "#/definitions/QualifiedName" },
"prov:type": { "$ref": "#/definitions/ArrayOfValues"},
"prov:label": { "$ref": "#/definitions/ArrayOfLabelValues"}
},
"patternProperties": {
"^[A-Za-z0-9_]+:(.*)$": { "$ref": "#/definitions/ArrayOfValues" }
},
"additionalProperties": false
},
"prov:Specialization": {
"type": "object",
"required": [
"@type"
],
"properties": {
"@type": { "pattern": "prov:Specialization" },
"@id": { "$ref": "#/definitions/QualifiedName" },
"generalEntity": { "$ref": "#/definitions/QualifiedName" },
"specificEntity": { "$ref": "#/definitions/QualifiedName" },
"prov:type": { "$ref": "#/definitions/ArrayOfValues"},
"prov:label": { "$ref": "#/definitions/ArrayOfLabelValues"}
},
"patternProperties": {
"^[A-Za-z0-9_]+:(.*)$": { "$ref": "#/definitions/ArrayOfValues" }
},
"additionalProperties": false
},
"prov:Membership": {
"type": "object",
"required": [
"@type"
],
"properties": {
"@type": { "pattern": "prov:Membership" },
"@id": { "$ref": "#/definitions/QualifiedName" },
"entity": { "$ref": "#/definitions/QualifiedName+" },
"collection": { "$ref": "#/definitions/QualifiedName" },
"prov:type": { "$ref": "#/definitions/ArrayOfValues"},
"prov:label": { "$ref": "#/definitions/ArrayOfLabelValues"}
},
"patternProperties": {
"^[A-Za-z0-9_]+:(.*)$": { "$ref": "#/definitions/ArrayOfValues" }
},
"additionalProperties": false
},
"prov:QualifiedAlternate": {
"type": "object",
"required": [
"@type"
],
"properties": {
"@type": { "pattern": "prov:QualifiedAlternate" },
"@id": { "$ref": "#/definitions/QualifiedName" },
"alternate1": { "$ref": "#/definitions/QualifiedName" },
"alternate2": { "$ref": "#/definitions/QualifiedName" },
"prov:type": { "$ref": "#/definitions/ArrayOfValues"},
"prov:label": { "$ref": "#/definitions/ArrayOfLabelValues"}
},
"patternProperties": {
"^[A-Za-z0-9_]+:(.*)$": { "$ref": "#/definitions/ArrayOfValues" }
},
"additionalProperties": false
},
"prov:QualifiedSpecialization": {
"type": "object",
"required": [
"@type"
],
"properties": {
"@type": { "pattern": "prov:QualifiedSpecialization" },
"@id": { "$ref": "#/definitions/QualifiedName" },
"generalEntity": { "$ref": "#/definitions/QualifiedName" },
"specificEntity": { "$ref": "#/definitions/QualifiedName" },
"prov:type": { "$ref": "#/definitions/ArrayOfValues"},
"prov:label": { "$ref": "#/definitions/ArrayOfLabelValues"}
},
"patternProperties": {
"^[A-Za-z0-9_]+:(.*)$": { "$ref": "#/definitions/ArrayOfValues" }
},
"additionalProperties": false
},
"prov:QualifiedMembership": {
"type": "object",
"required": [
"@type"
],
"properties": {
"@type": { "pattern": "prov:QualifiedMembership" },
"@id": { "$ref": "#/definitions/QualifiedName" },
"collection": { "$ref": "#/definitions/QualifiedName" },
"entity": { "$ref": "#/definitions/QualifiedName+" },
"prov:type": { "$ref": "#/definitions/ArrayOfValues"},
"prov:label": { "$ref": "#/definitions/ArrayOfLabelValues"}
},
"patternProperties": {
"^[A-Za-z0-9_]+:(.*)$": { "$ref": "#/definitions/ArrayOfValues" }
},
"additionalProperties": false
},
"prov:Influence": {
"type": "object",
"required": [
"@type"
],
"properties": {
"@type": { "pattern": "prov:Influence" },
"@id": { "$ref": "#/definitions/QualifiedName" },
"influencer": { "$ref": "#/definitions/QualifiedName" },
"influencee": { "$ref": "#/definitions/QualifiedName" },
"prov:type": { "$ref": "#/definitions/ArrayOfValues"},
"prov:label": { "$ref": "#/definitions/ArrayOfLabelValues"}
},
"patternProperties": {
"^[A-Za-z0-9_]+:(.*)$": { "$ref": "#/definitions/ArrayOfValues" }
},
"additionalProperties": false
},
"prov:Communication": {
"type": "object",
"required": [
"@type"
],
"properties": {
"@type": { "pattern": "prov:Communication" },
"@id": { "$ref": "#/definitions/QualifiedName" },
"informant": { "$ref": "#/definitions/QualifiedName" },
"informed": { "$ref": "#/definitions/QualifiedName" },
"prov:type": { "$ref": "#/definitions/ArrayOfValues"},
"prov:label": { "$ref": "#/definitions/ArrayOfLabelValues"}
},
"patternProperties": {
"^[A-Za-z0-9_]+:(.*)$": { "$ref": "#/definitions/ArrayOfValues" }
},
"additionalProperties": false
},
"prov:Bundle": {
"type": "object",
"required": [
"@type", "@id", "@graph", "@context"
],
"properties": {
"@type": { "pattern": "prov:Bundle" },
"@id": { "$ref": "#/definitions/QualifiedName" },
"@context": { "$ref": "#/definitions/Context" },
"@graph": {
"type": "array",
"items": { "$ref": "#/definitions/prov:Statement" }
}
},
"additionalProperties": false
},
"prov:Document": {
"type": "object",
"required": [
"@context", "@graph"
],
"properties": {
"@type": { "pattern": "prov:Document" },
"@context": { "$ref": "#/definitions/Context" },
"@graph": {
"type": "array",
"items": { "$ref": "#/definitions/prov:StatementOrBundle" }
}
},
"additionalProperties": false
}
},
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "https://openprovenance.org/prov-jsonld.json",
"$ref": "#/definitions/prov:Document"
}
{
"@context": {
"@version": 1.1,
"prov": "http://www.w3.org/ns/prov#",
"provext": "https://openprovenance.org/ns/provext#",
"xsd": "http://www.w3.org/2001/XMLSchema#",
"rdfs": "http://www.w3.org/2000/01/rdf-schema#",
"rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
"entity": {
"@id": "prov:entity",
"@type": "@id"
},
"activity": {
"@id": "prov:activity",
"@type": "@id"
},
"agent": {
"@id": "prov:agent",
"@type": "@id"
},
"prov:role": {
"@id": "prov:hadRole",
"@type": "@id"
},
"prov:type": {
"@id": "rdf:type",
"@type": "@id"
},
"prov:label": {
"@id": "rdfs:label"
},
"prov:location": {
"@id": "prov:atLocation",
"@type": "@id"
},
"prov:Activity": {
"@id": "prov:Activity",
"@context" : {
"startTime": {
"@id": "prov:startedAtTime",
"@type": "xsd:dateTime"
},
"endTime": {
"@id": "prov:endedAtTime",
"@type": "xsd:dateTime"
}
}
},
"prov:Delegation": {
"@id": "prov:Delegation",
"@context": {
"responsible": {
"@id": "prov:agent",
"@type" : "@id"
},
"delegate": {
"@reverse": "prov:qualifiedDelegation",
"@type": "@id"
},
"activity": {
"@id" : "prov:hadActivity",
"@type" : "@id"
}
}
},
"prov:Usage": {
"@id": "prov:Usage",
"@context": {
"activity": {
"@reverse" : "prov:qualifiedUsage",
"@type" : "@id"
},
"time": {
"@id": "prov:atTime",
"@type": "xsd:dateTime"
}
}
},
"prov:Generation": {
"@id": "prov:Generation",
"@context": {
"entity": {
"@reverse" : "prov:qualifiedGeneration",
"@type" : "@id"
},
"time": {
"@id": "prov:atTime",
"@type": "xsd:dateTime"
}
}
},
"prov:Invalidation": {
"@id": "prov:Invalidation",
"@context": {
"entity": {
"@reverse" : "prov:qualifiedInvalidation",
"@type" : "@id"
},
"time": {
"@id": "prov:atTime",
"@type": "xsd:dateTime"
}
}
},
"prov:Attribution": {
"@id": "prov:Attribution",
"@context": {
"entity": {
"@reverse" : "prov:qualifiedAttribution",
"@type" : "@id"
}
}
},
"prov:Association": {
"@id": "prov:Association",
"@context": {
"activity": {
"@reverse" : "prov:qualifiedAssociation",
"@type" : "@id"
},
"plan": {
"@id": "prov:hadPlan",
"@type": "@id"
}
}
},
"prov:Communication": {
"@id": "prov:Communication",
"@context": {
"informed": {
"@reverse" : "prov:qualifiedCommunication",
"@type" : "@id"
},
"informant": {
"@id": "prov:activity",
"@type": "@id"
}
}
},
"prov:Influence": {
"@id": "prov:Influence",
"@context": {
"influencee": {
"@reverse" : "prov:qualifiedInfluence",
"@type" : "@id"
},
"influencer": {
"@id": "prov:influencer",
"@type": "@id"
}
}
},
"prov:Derivation": {
"@id": "prov:Derivation",
"@context": {
"generatedEntity": {
"@reverse": "prov:qualifiedDerivation",
"@type": "@id"
},
"usedEntity": {
"@id": "prov:entity",
"@type": "@id"
},
"generation": {
"@id": "prov:hadGeneration",
"@type": "@id"
},
"activity": {
"@id": "prov:hadActivity",
"@type": "@id"
},
"usage": {
"@id": "prov:hadUsage",
"@type": "@id"
}
}
},
"prov:Start": {
"@id": "prov:Start",
"@context": {
"activity": {
"@reverse": "prov:qualifiedStart",
"@type": "@id"
},
"trigger": {
"@id": "prov:entity",
"@type": "@id"
},
"starter": {
"@id": "prov:hadActivity",
"@type": "@id"
},
"time": {
"@id": "prov:atTime",
"@type": "xsd:dateTime"
}
}
},
"prov:End": {
"@id": "prov:End",
"@context": {
"activity": {
"@reverse": "prov:qualifiedEnd",
"@type": "@id"
},
"trigger": {
"@id": "prov:entity",
"@type": "@id"
},
"ender": {
"@id": "prov:hadActivity",
"@type": "@id"
},
"time": {
"@id": "prov:atTime",
"@type": "xsd:dateTime"
}
}
},
"prov:Specialization": {
"@id": "provext:Specialization",
"@context": {
"specificEntity": {
"@reverse" : "provext:qualifiedSpecialization",
"@type" : "@id"
},
"generalEntity": {
"@id": "prov:entity",
"@type": "@id"
}
}
},
"prov:Membership": {
"@id": "provext:Membership",
"@context": {
"collection": {
"@reverse" : "provext:qualifiedMembership",
"@type" : "@id"
},
"entity": {
"@id": "prov:entity",
"@type": "@id"
}
}
},
"prov:Alternate": {
"@id": "provext:Alternate",
"@context": {
"alternate1": {
"@reverse" : "provext:qualifiedAlternate",
"@type" : "@id"
},
"alternate2": {
"@id": "prov:entity",
"@type": "@id"
}
}
}
}
}