diff --git a/.gitignore b/.gitignore
index bf818f778..80cdf2886 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,3 +5,4 @@
.idea/vc-data-model.iml
.idea/vcs.xml
.idea/workspace.xml
+.vscode
diff --git a/vocab/credentials/v2/README.md b/vocab/credentials/v2/README.md
new file mode 100644
index 000000000..66df198e2
--- /dev/null
+++ b/vocab/credentials/v2/README.md
@@ -0,0 +1,3 @@
+# Updating vocabulary
+
+Vocabulary definitions are managed in `vocab.csv`. Add or change entries within this file. Regenerate `vocabulary.ttl`, `vocabulary.jsonld`, and `vocabulary.html` by running `mk_vocab.rb`.
diff --git a/vocab/credentials/v2/mk_vocab.rb b/vocab/credentials/v2/mk_vocab.rb
new file mode 100755
index 000000000..b4c1d851a
--- /dev/null
+++ b/vocab/credentials/v2/mk_vocab.rb
@@ -0,0 +1,351 @@
+#! /usr/bin/env ruby
+# Parse vocabulary definition in CSV to generate Context+Vocabulary in JSON-LD or Turtle
+
+require 'getoptlong'
+require 'csv'
+require 'json'
+require 'erubis'
+
+class Vocab
+ JSON_STATE = JSON::State.new(
+ :indent => " ",
+ :space => " ",
+ :space_before => "",
+ :object_nl => "\n",
+ :array_nl => "\n"
+ )
+
+ TITLE = "Verifiable Credentials Vocabulary v2.0".freeze
+ DESCRIPTION = %(This document describes the RDFS vocabulary description used for Verifiable Credentials [[VC-DATA-MODEL]].).freeze
+ attr_accessor :prefixes, :terms, :properties, :classes, :contexts, :instances, :datatypes,
+ :imports, :date, :commit, :seeAlso
+
+ def initialize
+ path = File.expand_path("../vocab.csv", __FILE__)
+ csv = CSV.new(File.open(path))
+ @prefixes, @terms, @properties, @classes, @datatypes, @instances = {}, {}, {}, {}, {}, {}
+ @contexts, @imports, @seeAlso = [], [], []
+ #git_info = %x{git log -1 #{path}}.split("\n")
+ #@commit = "https://github.com/w3c/vc-vocab/commit/" + (git_info[0] || 'uncommitted').split.last
+ date_line = nil #git_info.detect {|l| l.start_with?("Date:")}
+ @date = Date.parse((date_line || Date.today.to_s).split(":",2).last).strftime("%Y-%m-%d")
+
+ columns = []
+ csv.shift.each_with_index {|c, i| columns[i] = c.to_sym if c}
+
+ csv.sort_by(&:to_s).each do |line|
+ entry = {}
+ # Create entry as object indexed by symbolized column name
+ line.each_with_index {|v, i| entry[columns[i]] = v ? v.gsub("\r", "\n").gsub("\\", "\\\\") : nil}
+
+ case entry[:type]
+ when '@context' then (@contexts ||= []) << entry[:subClassOf]
+ when 'prefix' then @prefixes[entry[:id]] = entry
+ when 'term' then @terms[entry[:id]] = entry
+ when 'rdf:Property' then @properties[entry[:id]] = entry
+ when 'rdfs:Class' then @classes[entry[:id]] = entry
+ when 'rdfs:Datatype' then @datatypes[entry[:id]] = entry
+ when 'owl:imports' then @imports << entry[:subClassOf]
+ when 'rdfs:seeAlso' then @seeAlso << entry[:subClassOf]
+ else @instances[entry[:id]] = entry
+ end
+ end
+
+ end
+
+ def namespaced(term)
+ term.include?(":") ? term : "cred:#{term}"
+ end
+
+ # The full JSON-LD file without the RDFS parts
+ def to_context
+ ctx = JSON.parse(to_jsonld)
+ ctx.delete('@graph')
+ ctx.to_json(JSON_STATE)
+ end
+
+ def to_jsonld
+ rdfs_context = {}
+ context = ::JSON.parse %({
+ "dc": "http://purl.org/dc/terms/",
+ "owl": "http://www.w3.org/2002/07/owl#",
+ "rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
+ "rdfs": "http://www.w3.org/2000/01/rdf-schema#",
+ "dc:title": {"@container": "@language"},
+ "dc:description": {"@container": "@language"},
+ "dc:date": {"@type": "xsd:date"},
+ "rdfs:comment": {"@container": "@language"},
+ "rdfs:domain": {"@type": "@id"},
+ "rdfs:label": {"@container": "@language"},
+ "rdfs:range": {"@type": "@id"},
+ "rdfs:seeAlso": {"@type": "@id"},
+ "rdfs:subClassOf": {"@type": "@id"},
+ "rdfs:subPropertyOf": {"@type": "@id"},
+ "owl:equivalentClass": {"@type": "@vocab"},
+ "owl:equivalentProperty": {"@type": "@vocab"},
+ "owl:oneOf": {"@container": "@list", "@type": "@vocab"},
+ "owl:imports": {"@type": "@id"},
+ "owl:versionInfo": {"@type": "@id"},
+ "owl:inverseOf": {"@type": "@vocab"},
+ "owl:unionOf": {"@type": "@vocab", "@container": "@list"},
+ "rdfs_classes": {"@reverse": "rdfs:isDefinedBy", "@type": "@id"},
+ "rdfs_properties": {"@reverse": "rdfs:isDefinedBy", "@type": "@id"},
+ "rdfs_datatypes": {"@reverse": "rdfs:isDefinedBy", "@type": "@id"},
+ "rdfs_instances": {"@reverse": "rdfs:isDefinedBy", "@type": "@id"}
+ })
+ rdfs_classes, rdfs_properties, rdfs_datatypes, rdfs_instances = [], [], [], []
+
+ prefixes.each do |id, entry|
+ context[id] = entry[:subClassOf]
+ end
+
+ terms.each do |id, entry|
+ next if entry[:@type] == '@null'
+ context[id] = if [:@container, :@type].any? {|k| entry[k]}
+ {'@id' => entry[:subClassOf]}.
+ merge(entry[:@container] ? {'@container' => entry[:@container]} : {}).
+ merge(entry[:@type] ? {'@type' => entry[:@type]} : {})
+ else
+ entry[:subClassOf]
+ end
+ end
+
+ classes.each do |id, entry|
+ term = entry[:term] || id
+ # context[term] = namespaced(id) unless entry[:@type] == '@null'
+
+ # Class definition
+ node = {
+ '@id' => namespaced(id),
+ '@type' => 'rdfs:Class',
+ 'rdfs:label' => {"en" => entry[:label].to_s},
+ 'rdfs:comment' => {"en" => entry[:comment].to_s},
+ }
+ node['rdfs:subClassOf'] = namespaced(entry[:subClassOf]) if entry[:subClassOf]
+ rdfs_classes << node
+ end
+
+ properties.each do |id, entry|
+ defn = {"@id" => namespaced(id)}
+ case entry[:range]
+ when "xsd:string" then defn['@language'] = nil
+ when /xsd:/ then defn['@type'] = entry[:range].split(',').first
+ when nil,
+ 'rdfs:Literal' then ;
+ else defn['@type'] = '@id'
+ end
+
+ defn['@container'] = entry[:@container] if entry[:@container]
+ defn['@type'] = entry[:@type] if entry[:@type]
+
+ term = entry[:term] || id
+ # context[term] = defn unless entry[:@type] == '@null'
+
+ # Property definition
+ node = {
+ '@id' => namespaced(id),
+ '@type' => 'rdf:Property',
+ 'rdfs:label' => {"en" => entry[:label].to_s},
+ 'rdfs:comment' => {"en" => entry[:comment].to_s},
+ }
+ node['rdfs:subPropertyOf'] = namespaced(entry[:subClassOf]) if entry[:subClassOf]
+
+ domains = entry[:domain].to_s.split(',')
+ case domains.length
+ when 0 then ;
+ when 1 then node['rdfs:domain'] = namespaced(domains.first)
+ else node['rdfs:domain'] = {'owl:unionOf' => domains.map {|d| namespaced(d)}}
+ end
+
+ ranges = entry[:range].to_s.split(',')
+ case ranges.length
+ when 0 then ;
+ when 1 then node['rdfs:range'] = namespaced(ranges.first)
+ else node['rdfs:range'] = {'owl:unionOf' => ranges.map {|r| namespaced(r)}}
+ end
+
+ rdfs_properties << node
+ end
+
+ datatypes.each do |id, entry|
+ # context[id] = namespaced(id) unless entry[:@type] == '@null'
+
+ # Datatype definition
+ node = {
+ '@id' => namespaced(id),
+ '@type' => 'rdfs:Datatype',
+ 'rdfs:label' => {"en" => entry[:label].to_s},
+ 'rdfs:comment' => {"en" => entry[:comment].to_s},
+ }
+ node['rdfs:subClassOf'] = namespaced(entry[:subClassOf]) if entry[:subClassOf]
+ rdfs_datatypes << node
+ end
+
+ instances.each do |id, entry|
+ # context[id] = namespaced(id) unless entry[:@type] == '@null'
+ # Instance definition
+ rdfs_instances << {
+ '@id' => namespaced(id),
+ '@type' => entry[:type],
+ 'rdfs:label' => {"en" => entry[:label].to_s},
+ 'rdfs:comment' => {"en" => entry[:comment].to_s},
+ }
+ end
+
+ # Use separate rdfs context so as not to polute the context.
+ ontology = {
+ "@context" => rdfs_context,
+ "@id" => prefixes["cred"][:subClassOf],
+ "@type" => "owl:Ontology",
+ "dc:title" => {"en" => TITLE},
+ "dc:description" => {"en" => DESCRIPTION},
+ "dc:date" => date,
+ "owl:imports" => imports,
+ #"owl:versionInfo" => commit,
+ "rdfs:seeAlso" => seeAlso,
+ "rdfs_classes" => rdfs_classes,
+ "rdfs_properties" => rdfs_properties,
+ "rdfs_datatypes" => rdfs_datatypes,
+ "rdfs_instances" => rdfs_instances
+ }.delete_if {|k,v| Array(v).empty?}
+
+ # Imported contexts
+ context = contexts + [context]unless contexts.empty?
+
+ {
+ "@context" => context,
+ "@graph" => ontology
+ }.to_json(JSON_STATE)
+ end
+
+ def to_html
+ json = JSON.parse(to_jsonld)
+ eruby = Erubis::Eruby.new(File.read("template.html"))
+ eruby.result(ont: json['@graph'], context: json['@context'].is_a?(Array) ? json['@context'].last : json['@context'])
+ end
+
+ def to_ttl
+ output = []
+
+ prefixes = {
+ "dc" => {subClassOf: "http://purl.org/dc/terms/"},
+ "owl" => {subClassOf: "http://www.w3.org/2002/07/owl#"},
+ "rdf" => {subClassOf: "http://www.w3.org/1999/02/22-rdf-syntax-ns#"},
+ "rdfs" => {subClassOf: "http://www.w3.org/2000/01/rdf-schema#"},
+ }.merge(@prefixes).dup
+ prefixes.each {|id, entry| output << "@prefix #{id}: <#{entry[:subClassOf]}> ."}
+
+ output << "\n# CSVM Ontology definition"
+ output << "cred: a owl:Ontology;"
+ output << %( dc:title "#{TITLE}"@en;)
+ output << %( dc:description """#{DESCRIPTION}"""@en;)
+ output << %( dc:date "#{date}"^^xsd:date;)
+ #output << %( dc:imports #{imports.map {|i| '<' + i + '>'}.join(", ")};)
+ #output << %( owl:versionInfo <#{commit}>;)
+ output << %( rdfs:seeAlso #{seeAlso.map {|i| '<' + i + '>'}.join(", ")};)
+ output << "."
+
+ output << "\n# Class definitions" unless @classes.empty?
+ @classes.each do |id, entry|
+ output << "cred:#{id} a rdfs:Class;"
+ output << %( rdfs:label "#{entry[:label]}"@en;)
+ output << %( rdfs:comment """#{entry[:comment]}"""@en;)
+ output << %( rdfs:subClassOf #{namespaced(entry[:subClassOf])};) if entry[:subClassOf]
+ output << %( rdfs:isDefinedBy cred: .)
+ end
+
+ output << "\n# Property definitions" unless @properties.empty?
+ @properties.each do |id, entry|
+ output << "cred:#{id} a rdf:Property;"
+ output << %( rdfs:label "#{entry[:label]}"@en;)
+ output << %( rdfs:comment """#{entry[:comment]}"""@en;)
+ output << %( rdfs:subPropertyOf #{namespaced(entry[:subClassOf])};) if entry[:subClassOf]
+ domains = entry[:domain].to_s.split(',')
+ case domains.length
+ when 0 then ;
+ when 1 then output << %( rdfs:domain #{namespaced(entry[:domain])};)
+ else
+ output << %( rdfs:domain [ owl:unionOf (#{domains.map {|d| namespaced(d)}.join(' ')})];)
+ end
+
+ ranges = entry[:range].to_s.split(',')
+ case ranges.length
+ when 0 then ;
+ when 1 then output << %( rdfs:range #{namespaced(entry[:range])};)
+ else
+ output << %( rdfs:range [ owl:unionOf (#{ranges.map {|d| namespaced(d)}.join(' ')})];)
+ end
+ output << %( rdfs:isDefinedBy cred: .)
+ end
+
+ output << "\n# Datatype definitions" unless @datatypes.empty?
+ @datatypes.each do |id, entry|
+ output << "cred:#{id} a rdfs:Datatype;"
+ output << %( rdfs:label "#{entry[:label]}"@en;)
+ output << %( rdfs:comment """#{entry[:comment]}"""@en;)
+ output << %( rdfs:subClassOf #{namespaced(entry[:subClassOf])};) if entry[:subClassOf]
+ output << %( rdfs:isDefinedBy cred: .)
+ end
+
+ output << "\n# Instance definitions" unless @instances.empty?
+ @instances.each do |id, entry|
+ output << "cred:#{id} a #{namespaced(entry[:type])};"
+ output << %( rdfs:label "#{entry[:label]}"@en;)
+ output << %( rdfs:comment """#{entry[:comment]}"""@en;)
+ output << %( rdfs:isDefinedBy cred: .)
+ end
+
+ output.join("\n")
+ end
+end
+
+options = {
+ output: $stdout
+}
+
+OPT_ARGS = [
+ ["--format", "-f", GetoptLong::REQUIRED_ARGUMENT,"Output format, default #{options[:format].inspect}"],
+ ["--output", "-o", GetoptLong::REQUIRED_ARGUMENT,"Output to the specified file path"],
+ ["--quiet", GetoptLong::NO_ARGUMENT, "Supress most output other than progress indicators"],
+ ["--help", "-?", GetoptLong::NO_ARGUMENT, "This message"]
+]
+def usage
+ STDERR.puts %{Usage: #{$0} [options] URL ...}
+ width = OPT_ARGS.map do |o|
+ l = o.first.length
+ l += o[1].length + 2 if o[1].is_a?(String)
+ l
+ end.max
+ OPT_ARGS.each do |o|
+ s = " %-*s " % [width, (o[1].is_a?(String) ? "#{o[0,2].join(', ')}" : o[0])]
+ s += o.last
+ STDERR.puts s
+ end
+ exit(1)
+end
+
+opts = GetoptLong.new(*OPT_ARGS.map {|o| o[0..-2]})
+
+opts.each do |opt, arg|
+ case opt
+ when '--format' then options[:format] = arg.to_sym
+ when '--output' then options[:output] = File.open(arg, "w")
+ when '--quiet' then options[:quiet] = true
+ when '--help' then usage
+ end
+end
+
+vocab = Vocab.new
+case options[:format]
+when :context then options[:output].puts(vocab.to_context)
+when :jsonld then options[:output].puts(vocab.to_jsonld)
+when :ttl then options[:output].puts(vocab.to_ttl)
+when :html then options[:output].puts(vocab.to_html)
+else
+ [:jsonld, :ttl, :html].each do |format|
+ fn = {jsonld: "vocabulary.jsonld", ttl: "vocabulary.ttl", html: "vocabulary.html"}[format]
+ File.open(fn, "w") do |output|
+ output.puts(vocab.send("to_#{format}".to_sym))
+ end
+ end
+end
diff --git a/vocab/credentials/v2/template.html b/vocab/credentials/v2/template.html
new file mode 100644
index 000000000..7dd211897
--- /dev/null
+++ b/vocab/credentials/v2/template.html
@@ -0,0 +1,227 @@
+
+
+
+ <%= ont["dc:title"]["en"] %>
+
+
+
+
+
+
+
+
This document describes the
+ <%= ont["dc:title"]["en"] %>
+ and Term definitions used for describing Verifiable Credentials [[VC-DATA-MODEL]].
+ This document provides the RDFS [[RDF-SCHEMA]] vocabulary definition.
+
+
Alternate versions of the vocabulary definition exist in
+ Turtle and
+ JSON-LD.
+
+
+
Published:
+ <%- unless Array(ont["owl:imports"]).empty?%>
+
Imports:
+ <%- Array(ont["owl:imports"]).each do |ref| %>
+
+ Union of
+ <% v.last.each do |c| %>
+ <%= c %>
+ <% end%>
+
+ <% else %>
+
<%= v %>
+ <% end %>
+ <% end %>
+ <% end %>
+ <% end %>
+
+ <% end %>
+
+
+ <% end -%>
+
+
+ <% end%>
+
+
+
diff --git a/vocab/credentials/v2/vocab.csv b/vocab/credentials/v2/vocab.csv
new file mode 100644
index 000000000..fd86ad564
--- /dev/null
+++ b/vocab/credentials/v2/vocab.csv
@@ -0,0 +1,25 @@
+id,type,label,subClassOf,domain,range,@type,@container,comment
+cred,prefix,,https://w3.org/2018/credentials#,,,,,
+odrl,prefix,,http://www.w3.org/ns/odrl/2/,,,,,
+xsd,prefix,,http://www.w3.org/2001/XMLSchema#,,,,,
+,rdfs:seeAlso,,https://www.w3.org/TR/vc-data-model-2.0/,,,,,
+JsonSchemaValidator2018,rdfs:Class,Json Schema Validator 2018,cred:CredentialSchema,,,,,A type of validator that can be used to syntactically validate JSON documents using the JSON Schema language.
+ManualRefreshService2018,rdfs:Class,Manual Refresh Service 2018,cred:RefreshService,,,,,A type of `Refresh Service` that must be interacted with in a manual fashion.
+RefreshService,rdfs:Class,Refresh Service,,,,,,A `Refresh Service` is a mechanism that can be utilized by software agents to retrieve an updated copy of a `Verifiable Credential`.
+CredentialSchema,rdfs:Class,Credential Schema,,,,,,A `Credential Schema` provides verifiers with enough information to determine if the provided data conforms to the provided schema.
+CredentialStatus,rdfs:Class,Credential Status,,,,,,"A `Credential Status` provides enough information to determine the current status of the credential (for example, suspended or revoked). It MUST include the `id` property, which MUST be a URL, and the `type` property, which expresses the credential status type (also referred to as the credential status scheme)"
+CredentialEvidence,rdfs:Class,Credential Evidence,,,,,,A `Credential Evidence` scheme provides enough information to a verifier to determine whether the evidence gathered meets their requirements for issuing a credential. The precise content of each evidence scheme is determined by the specific evidence type definition.
+VerifiableCredential,rdfs:Class,Verifiable Credential,,,,,,"A `Credential` is a set of one or more claims made by an issuer. A `Verifiable Credential` is a tamper-evident credential that has authorship that can be cryptographically verified. `Verifiable Credentials` can be used to build `Verifiable Presentations`, which can also be cryptographically verified."
+VerifiableCredentialGraph,rdfs:Class,Verifiable Credential Graph,,,,,,"Instances of this class are RDF Graphs, where each of these graphs must include exactly one `Verifiable Credential`"
+VerifiablePresentation,rdfs:Class,Verifiable Presentation,,,,,,"A `Presentation` is data derived from one or more Credentials, issued by one or more `issuers`, that is shared with a specific `verifier`. A `Verifiable Presentation` is a tamper-evident `Presentation` encoded in such a way that authorship of the data can be trusted after a process of cryptographic verification. Certain types of verifiable presentations might contain data that is synthesized from, but do not contain, the original verifiable credentials (for example, zero-knowledge proofs)."
+credentialSchema,rdf:Property,credential schema,,VerifiableCredential,cred:CredentialSchema,@id,,The value of the `credentialSchema` property MUST be one or more `Credential Schema` instances.
+credentialStatus,rdf:Property,credential status,,VerifiableCredential,cred:CredentialStatus,@id,,"The value of the `credentialStatus` property MUST be an instance of `Credential Status`."
+credentialSubject,rdf:Property,credential subject,,VerifiableCredential,,@id,,An entity about which claims are made.
+evidence,rdf:Property,evidence,,VerifiableCredential,cred:CredentialEvidence,,,The value of the `evidence` property MUST be one or more `Credential Evidence` instances.
+expirationDate,rdf:Property,expiration date,,VerifiableCredential,xsd:dateTime,,,The value of the `expirationDate` property MUST be a string value of an ISO8601 combined date and time string representing the date and time the credential ceases to be valid.
+issuanceDate,rdf:Property,issuance date,,VerifiableCredential,xsd:dateTime,,,The value of the `issuanceDate` property MUST be a string value of an ISO8601 combined date and time string representing the date and time the credential was issued. Note that this date represents the earliest date when the information associated with the `credentialSubject` property became valid.
+issuer,rdf:Property,issuer,,VerifiableCredential,,@id,,The value of the `issuer` property MUST be a URI. It is RECOMMENDED that dereferencing the URI results in a document containing machine-readable information about the issuer that can be used to verify the information expressed in the credential.
+refreshService,rdf:Property,refresh service,,VerifiableCredential,cred:RefreshService,@id,,The value of the `refreshService` property MUST be one or more `Refresh Service` instances such that the holder can refresh the credential.
+serviceEndpoint,rdf:Property,service endpoint,,RefreshService,,@id,,The value of the `serviceEndpoint` property MUST be a URL to the service endpoint associated with the subject.
+termsOfUse,rdf:Property,terms of use,,VerifiableCredential,odrl:Policy,@id,,"If specified, the value of the `termsOfUse` property MUST specify one or more terms of use policies under which the creator issued the credential or presentation. If the recipient (a holder or verifier) is not willing to adhere to the specified terms of use, then they do so on their own responsibility and might incur legal liability if they violate the stated Terms of Use. Each `termsOfUse` MUST specify its type, for example, `IssuerPolicy`, and optionally, its instance `id`. The precise contents of each term of use is determined by the specific `TermsOfUse` type definition."
+verifiableCredential,rdf:Property,verifiable credential,,VerifiablePresentation,cred:VerifiableCredentialGraph,@id,@graph,"The value of the `verifiableCredential` property MUST identify a `Verifiable Credential Graph` (informally, it indirectly identifies a `Verifiable Credential` contained in a separate graph)."
diff --git a/vocab/credentials/v2/vocabulary.html b/vocab/credentials/v2/vocabulary.html
new file mode 100644
index 000000000..dcea23871
--- /dev/null
+++ b/vocab/credentials/v2/vocabulary.html
@@ -0,0 +1,480 @@
+
+
+
+ Verifiable Credentials Vocabulary v2.0
+
+
+
+
+
+
+
+
This document describes the
+ Verifiable Credentials Vocabulary v2.0
+ and Term definitions used for describing Verifiable Credentials [[VC-DATA-MODEL]].
+ This document provides the RDFS [[RDF-SCHEMA]] vocabulary definition.
+
+
Alternate versions of the vocabulary definition exist in
+ Turtle and
+ JSON-LD.
+
This document describes the RDFS vocabulary description used for Verifiable Credentials [[VC-DATA-MODEL]].
+
This specification makes use of the following namespaces:
+
+
cred:
+
https://w3.org/2018/credentials#
+
dc:
+
http://purl.org/dc/terms/
+
odrl:
+
http://www.w3.org/ns/odrl/2/
+
xsd:
+
http://www.w3.org/2001/XMLSchema#
+
+
+
+
Class Definitions
+
The following are class definitions in the cred namespace:
+
+
CredentialEvidence
+
+ Credential Evidence
+
A `Credential Evidence` scheme provides enough information to a verifier to determine whether the evidence gathered meets their requirements for issuing a credential. The precise content of each evidence scheme is determined by the specific evidence type definition.
+
+
+
+
CredentialSchema
+
+ Credential Schema
+
A `Credential Schema` provides verifiers with enough information to determine if the provided data conforms to the provided schema.
+
+
+
+
CredentialStatus
+
+ Credential Status
+
A `Credential Status` provides enough information to determine the current status of the credential (for example, suspended or revoked). It MUST include the `id` property, which MUST be a URL, and the `type` property, which expresses the credential status type (also referred to as the credential status scheme)
+
+
+
+
JsonSchemaValidator2018
+
+ Json Schema Validator 2018
+
A type of validator that can be used to syntactically validate JSON documents using the JSON Schema language.
+
+
+
rdfs:subClassOf
+
cred:CredentialSchema
+
+
+
+
ManualRefreshService2018
+
+ Manual Refresh Service 2018
+
A type of `Refresh Service` that must be interacted with in a manual fashion.
+
+
+
rdfs:subClassOf
+
cred:RefreshService
+
+
+
+
RefreshService
+
+ Refresh Service
+
A `Refresh Service` is a mechanism that can be utilized by software agents to retrieve an updated copy of a `Verifiable Credential`.
+
+
+
+
VerifiableCredential
+
+ Verifiable Credential
+
A `Credential` is a set of one or more claims made by an issuer. A `Verifiable Credential` is a tamper-evident credential that has authorship that can be cryptographically verified. `Verifiable Credentials` can be used to build `Verifiable Presentations`, which can also be cryptographically verified.
+
+
+
+
VerifiableCredentialGraph
+
+ Verifiable Credential Graph
+
Instances of this class are RDF Graphs, where each of these graphs must include exactly one `Verifiable Credential`
+
+
+
+
VerifiablePresentation
+
+ Verifiable Presentation
+
A `Presentation` is data derived from one or more Credentials, issued by one or more `issuers`, that is shared with a specific `verifier`. A `Verifiable Presentation` is a tamper-evident `Presentation` encoded in such a way that authorship of the data can be trusted after a process of cryptographic verification. Certain types of verifiable presentations might contain data that is synthesized from, but do not contain, the original verifiable credentials (for example, zero-knowledge proofs).
+
+
+
+
+
+
+
Property Definitions
+
The following are property definitions in the cred namespace:
+
+
credentialSchema
+
+ credential schema
+
The value of the `credentialSchema` property MUST be one or more `Credential Schema` instances.
+
+
+
rdfs:range
+
cred:CredentialSchema
+
rdfs:domain
+
cred:VerifiableCredential
+
+
+
+
credentialStatus
+
+ credential status
+
The value of the `credentialStatus` property MUST be an instance of `Credential Status`.
+
+
+
rdfs:range
+
cred:CredentialStatus
+
rdfs:domain
+
cred:VerifiableCredential
+
+
+
+
credentialSubject
+
+ credential subject
+
An entity about which claims are made.
+
+
+
rdfs:domain
+
cred:VerifiableCredential
+
+
+
+
evidence
+
+ evidence
+
The value of the `evidence` property MUST be one or more `Credential Evidence` instances.
+
+
+
rdfs:range
+
cred:CredentialEvidence
+
rdfs:domain
+
cred:VerifiableCredential
+
+
+
+
expirationDate
+
+ expiration date
+
The value of the `expirationDate` property MUST be a string value of an ISO8601 combined date and time string representing the date and time the credential ceases to be valid.
+
+
+
rdfs:range
+
xsd:dateTime
+
rdfs:domain
+
cred:VerifiableCredential
+
+
+
+
issuanceDate
+
+ issuance date
+
The value of the `issuanceDate` property MUST be a string value of an ISO8601 combined date and time string representing the date and time the credential was issued. Note that this date represents the earliest date when the information associated with the `credentialSubject` property became valid.
+
+
+
rdfs:range
+
xsd:dateTime
+
rdfs:domain
+
cred:VerifiableCredential
+
+
+
+
issuer
+
+ issuer
+
The value of the `issuer` property MUST be a URI. It is RECOMMENDED that dereferencing the URI results in a document containing machine-readable information about the issuer that can be used to verify the information expressed in the credential.
+
+
+
rdfs:domain
+
cred:VerifiableCredential
+
+
+
+
refreshService
+
+ refresh service
+
The value of the `refreshService` property MUST be one or more `Refresh Service` instances such that the holder can refresh the credential.
+
+
+
rdfs:range
+
cred:RefreshService
+
rdfs:domain
+
cred:VerifiableCredential
+
+
+
+
serviceEndpoint
+
+ service endpoint
+
The value of the `serviceEndpoint` property MUST be a URL to the service endpoint associated with the subject.
+
+
+
rdfs:domain
+
cred:RefreshService
+
+
+
+
termsOfUse
+
+ terms of use
+
If specified, the value of the `termsOfUse` property MUST specify one or more terms of use policies under which the creator issued the credential or presentation. If the recipient (a holder or verifier) is not willing to adhere to the specified terms of use, then they do so on their own responsibility and might incur legal liability if they violate the stated Terms of Use. Each `termsOfUse` MUST specify its type, for example, `IssuerPolicy`, and optionally, its instance `id`. The precise contents of each term of use is determined by the specific `TermsOfUse` type definition.
+
+
+
rdfs:range
+
odrl:Policy
+
rdfs:domain
+
cred:VerifiableCredential
+
+
+
+
verifiableCredential
+
+ verifiable credential
+
The value of the `verifiableCredential` property MUST identify a `Verifiable Credential Graph` (informally, it indirectly identifies a `Verifiable Credential` contained in a separate graph).
+
+
+
rdfs:range
+
cred:VerifiableCredentialGraph
+
rdfs:domain
+
cred:VerifiablePresentation
+
+
+
+
+
+
+
+
diff --git a/vocab/credentials/v2/vocabulary.jsonld b/vocab/credentials/v2/vocabulary.jsonld
new file mode 100644
index 000000000..c57ca8c8a
--- /dev/null
+++ b/vocab/credentials/v2/vocabulary.jsonld
@@ -0,0 +1,319 @@
+{
+ "@context": {
+ "dc": "http://purl.org/dc/terms/",
+ "owl": "http://www.w3.org/2002/07/owl#",
+ "rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
+ "rdfs": "http://www.w3.org/2000/01/rdf-schema#",
+ "dc:title": {
+ "@container": "@language"
+ },
+ "dc:description": {
+ "@container": "@language"
+ },
+ "dc:date": {
+ "@type": "xsd:date"
+ },
+ "rdfs:comment": {
+ "@container": "@language"
+ },
+ "rdfs:domain": {
+ "@type": "@id"
+ },
+ "rdfs:label": {
+ "@container": "@language"
+ },
+ "rdfs:range": {
+ "@type": "@id"
+ },
+ "rdfs:seeAlso": {
+ "@type": "@id"
+ },
+ "rdfs:subClassOf": {
+ "@type": "@id"
+ },
+ "rdfs:subPropertyOf": {
+ "@type": "@id"
+ },
+ "owl:equivalentClass": {
+ "@type": "@vocab"
+ },
+ "owl:equivalentProperty": {
+ "@type": "@vocab"
+ },
+ "owl:oneOf": {
+ "@container": "@list",
+ "@type": "@vocab"
+ },
+ "owl:imports": {
+ "@type": "@id"
+ },
+ "owl:versionInfo": {
+ "@type": "@id"
+ },
+ "owl:inverseOf": {
+ "@type": "@vocab"
+ },
+ "owl:unionOf": {
+ "@type": "@vocab",
+ "@container": "@list"
+ },
+ "rdfs_classes": {
+ "@reverse": "rdfs:isDefinedBy",
+ "@type": "@id"
+ },
+ "rdfs_properties": {
+ "@reverse": "rdfs:isDefinedBy",
+ "@type": "@id"
+ },
+ "rdfs_datatypes": {
+ "@reverse": "rdfs:isDefinedBy",
+ "@type": "@id"
+ },
+ "rdfs_instances": {
+ "@reverse": "rdfs:isDefinedBy",
+ "@type": "@id"
+ },
+ "cred": "https://w3.org/2018/credentials#",
+ "odrl": "http://www.w3.org/ns/odrl/2/",
+ "xsd": "http://www.w3.org/2001/XMLSchema#"
+ },
+ "@graph": {
+ "@id": "https://w3.org/2018/credentials#",
+ "@type": "owl:Ontology",
+ "dc:title": {
+ "en": "Verifiable Credentials Vocabulary v2.0"
+ },
+ "dc:description": {
+ "en": "This document describes the RDFS vocabulary description used for Verifiable Credentials [[VC-DATA-MODEL]]."
+ },
+ "dc:date": "2022-09-02",
+ "rdfs:seeAlso": [
+ "https://www.w3.org/TR/vc-data-model-2.0/"
+ ],
+ "rdfs_classes": [
+ {
+ "@id": "cred:CredentialEvidence",
+ "@type": "rdfs:Class",
+ "rdfs:label": {
+ "en": "Credential Evidence"
+ },
+ "rdfs:comment": {
+ "en": "A `Credential Evidence` scheme provides enough information to a verifier to determine whether the evidence gathered meets their requirements for issuing a credential. The precise content of each evidence scheme is determined by the specific evidence type definition."
+ }
+ },
+ {
+ "@id": "cred:CredentialSchema",
+ "@type": "rdfs:Class",
+ "rdfs:label": {
+ "en": "Credential Schema"
+ },
+ "rdfs:comment": {
+ "en": "A `Credential Schema` provides verifiers with enough information to determine if the provided data conforms to the provided schema."
+ }
+ },
+ {
+ "@id": "cred:CredentialStatus",
+ "@type": "rdfs:Class",
+ "rdfs:label": {
+ "en": "Credential Status"
+ },
+ "rdfs:comment": {
+ "en": "A `Credential Status` provides enough information to determine the current status of the credential (for example, suspended or revoked). It MUST include the `id` property, which MUST be a URL, and the `type` property, which expresses the credential status type (also referred to as the credential status scheme)"
+ }
+ },
+ {
+ "@id": "cred:JsonSchemaValidator2018",
+ "@type": "rdfs:Class",
+ "rdfs:label": {
+ "en": "Json Schema Validator 2018"
+ },
+ "rdfs:comment": {
+ "en": "A type of validator that can be used to syntactically validate JSON documents using the JSON Schema language."
+ },
+ "rdfs:subClassOf": "cred:CredentialSchema"
+ },
+ {
+ "@id": "cred:ManualRefreshService2018",
+ "@type": "rdfs:Class",
+ "rdfs:label": {
+ "en": "Manual Refresh Service 2018"
+ },
+ "rdfs:comment": {
+ "en": "A type of `Refresh Service` that must be interacted with in a manual fashion."
+ },
+ "rdfs:subClassOf": "cred:RefreshService"
+ },
+ {
+ "@id": "cred:RefreshService",
+ "@type": "rdfs:Class",
+ "rdfs:label": {
+ "en": "Refresh Service"
+ },
+ "rdfs:comment": {
+ "en": "A `Refresh Service` is a mechanism that can be utilized by software agents to retrieve an updated copy of a `Verifiable Credential`."
+ }
+ },
+ {
+ "@id": "cred:VerifiableCredential",
+ "@type": "rdfs:Class",
+ "rdfs:label": {
+ "en": "Verifiable Credential"
+ },
+ "rdfs:comment": {
+ "en": "A `Credential` is a set of one or more claims made by an issuer. A `Verifiable Credential` is a tamper-evident credential that has authorship that can be cryptographically verified. `Verifiable Credentials` can be used to build `Verifiable Presentations`, which can also be cryptographically verified."
+ }
+ },
+ {
+ "@id": "cred:VerifiableCredentialGraph",
+ "@type": "rdfs:Class",
+ "rdfs:label": {
+ "en": "Verifiable Credential Graph"
+ },
+ "rdfs:comment": {
+ "en": "Instances of this class are RDF Graphs, where each of these graphs must include exactly one `Verifiable Credential`"
+ }
+ },
+ {
+ "@id": "cred:VerifiablePresentation",
+ "@type": "rdfs:Class",
+ "rdfs:label": {
+ "en": "Verifiable Presentation"
+ },
+ "rdfs:comment": {
+ "en": "A `Presentation` is data derived from one or more Credentials, issued by one or more `issuers`, that is shared with a specific `verifier`. A `Verifiable Presentation` is a tamper-evident `Presentation` encoded in such a way that authorship of the data can be trusted after a process of cryptographic verification. Certain types of verifiable presentations might contain data that is synthesized from, but do not contain, the original verifiable credentials (for example, zero-knowledge proofs)."
+ }
+ }
+ ],
+ "rdfs_properties": [
+ {
+ "@id": "cred:credentialSchema",
+ "@type": "rdf:Property",
+ "rdfs:label": {
+ "en": "credential schema"
+ },
+ "rdfs:comment": {
+ "en": "The value of the `credentialSchema` property MUST be one or more `Credential Schema` instances."
+ },
+ "rdfs:domain": "cred:VerifiableCredential",
+ "rdfs:range": "cred:CredentialSchema"
+ },
+ {
+ "@id": "cred:credentialStatus",
+ "@type": "rdf:Property",
+ "rdfs:label": {
+ "en": "credential status"
+ },
+ "rdfs:comment": {
+ "en": "The value of the `credentialStatus` property MUST be an instance of `Credential Status`."
+ },
+ "rdfs:domain": "cred:VerifiableCredential",
+ "rdfs:range": "cred:CredentialStatus"
+ },
+ {
+ "@id": "cred:credentialSubject",
+ "@type": "rdf:Property",
+ "rdfs:label": {
+ "en": "credential subject"
+ },
+ "rdfs:comment": {
+ "en": "An entity about which claims are made."
+ },
+ "rdfs:domain": "cred:VerifiableCredential"
+ },
+ {
+ "@id": "cred:evidence",
+ "@type": "rdf:Property",
+ "rdfs:label": {
+ "en": "evidence"
+ },
+ "rdfs:comment": {
+ "en": "The value of the `evidence` property MUST be one or more `Credential Evidence` instances."
+ },
+ "rdfs:domain": "cred:VerifiableCredential",
+ "rdfs:range": "cred:CredentialEvidence"
+ },
+ {
+ "@id": "cred:expirationDate",
+ "@type": "rdf:Property",
+ "rdfs:label": {
+ "en": "expiration date"
+ },
+ "rdfs:comment": {
+ "en": "The value of the `expirationDate` property MUST be a string value of an ISO8601 combined date and time string representing the date and time the credential ceases to be valid."
+ },
+ "rdfs:domain": "cred:VerifiableCredential",
+ "rdfs:range": "xsd:dateTime"
+ },
+ {
+ "@id": "cred:issuanceDate",
+ "@type": "rdf:Property",
+ "rdfs:label": {
+ "en": "issuance date"
+ },
+ "rdfs:comment": {
+ "en": "The value of the `issuanceDate` property MUST be a string value of an ISO8601 combined date and time string representing the date and time the credential was issued. Note that this date represents the earliest date when the information associated with the `credentialSubject` property became valid."
+ },
+ "rdfs:domain": "cred:VerifiableCredential",
+ "rdfs:range": "xsd:dateTime"
+ },
+ {
+ "@id": "cred:issuer",
+ "@type": "rdf:Property",
+ "rdfs:label": {
+ "en": "issuer"
+ },
+ "rdfs:comment": {
+ "en": "The value of the `issuer` property MUST be a URI. It is RECOMMENDED that dereferencing the URI results in a document containing machine-readable information about the issuer that can be used to verify the information expressed in the credential."
+ },
+ "rdfs:domain": "cred:VerifiableCredential"
+ },
+ {
+ "@id": "cred:refreshService",
+ "@type": "rdf:Property",
+ "rdfs:label": {
+ "en": "refresh service"
+ },
+ "rdfs:comment": {
+ "en": "The value of the `refreshService` property MUST be one or more `Refresh Service` instances such that the holder can refresh the credential."
+ },
+ "rdfs:domain": "cred:VerifiableCredential",
+ "rdfs:range": "cred:RefreshService"
+ },
+ {
+ "@id": "cred:serviceEndpoint",
+ "@type": "rdf:Property",
+ "rdfs:label": {
+ "en": "service endpoint"
+ },
+ "rdfs:comment": {
+ "en": "The value of the `serviceEndpoint` property MUST be a URL to the service endpoint associated with the subject."
+ },
+ "rdfs:domain": "cred:RefreshService"
+ },
+ {
+ "@id": "cred:termsOfUse",
+ "@type": "rdf:Property",
+ "rdfs:label": {
+ "en": "terms of use"
+ },
+ "rdfs:comment": {
+ "en": "If specified, the value of the `termsOfUse` property MUST specify one or more terms of use policies under which the creator issued the credential or presentation. If the recipient (a holder or verifier) is not willing to adhere to the specified terms of use, then they do so on their own responsibility and might incur legal liability if they violate the stated Terms of Use. Each `termsOfUse` MUST specify its type, for example, `IssuerPolicy`, and optionally, its instance `id`. The precise contents of each term of use is determined by the specific `TermsOfUse` type definition."
+ },
+ "rdfs:domain": "cred:VerifiableCredential",
+ "rdfs:range": "odrl:Policy"
+ },
+ {
+ "@id": "cred:verifiableCredential",
+ "@type": "rdf:Property",
+ "rdfs:label": {
+ "en": "verifiable credential"
+ },
+ "rdfs:comment": {
+ "en": "The value of the `verifiableCredential` property MUST identify a `Verifiable Credential Graph` (informally, it indirectly identifies a `Verifiable Credential` contained in a separate graph)."
+ },
+ "rdfs:domain": "cred:VerifiablePresentation",
+ "rdfs:range": "cred:VerifiableCredentialGraph"
+ }
+ ]
+ }
+}
diff --git a/vocab/credentials/v2/vocabulary.ttl b/vocab/credentials/v2/vocabulary.ttl
new file mode 100644
index 000000000..df5cd08d8
--- /dev/null
+++ b/vocab/credentials/v2/vocabulary.ttl
@@ -0,0 +1,120 @@
+@prefix dc: .
+@prefix owl: .
+@prefix rdf: .
+@prefix rdfs: .
+@prefix cred: .
+@prefix odrl: .
+@prefix xsd: .
+
+# CSVM Ontology definition
+cred: a owl:Ontology;
+ dc:title "Verifiable Credentials Vocabulary v2.0"@en;
+ dc:description """This document describes the RDFS vocabulary description used for Verifiable Credentials [[VC-DATA-MODEL]]."""@en;
+ dc:date "2022-09-02"^^xsd:date;
+ rdfs:seeAlso ;
+.
+
+# Class definitions
+cred:CredentialEvidence a rdfs:Class;
+ rdfs:label "Credential Evidence"@en;
+ rdfs:comment """A `Credential Evidence` scheme provides enough information to a verifier to determine whether the evidence gathered meets their requirements for issuing a credential. The precise content of each evidence scheme is determined by the specific evidence type definition."""@en;
+ rdfs:isDefinedBy cred: .
+cred:CredentialSchema a rdfs:Class;
+ rdfs:label "Credential Schema"@en;
+ rdfs:comment """A `Credential Schema` provides verifiers with enough information to determine if the provided data conforms to the provided schema."""@en;
+ rdfs:isDefinedBy cred: .
+cred:CredentialStatus a rdfs:Class;
+ rdfs:label "Credential Status"@en;
+ rdfs:comment """A `Credential Status` provides enough information to determine the current status of the credential (for example, suspended or revoked). It MUST include the `id` property, which MUST be a URL, and the `type` property, which expresses the credential status type (also referred to as the credential status scheme)"""@en;
+ rdfs:isDefinedBy cred: .
+cred:JsonSchemaValidator2018 a rdfs:Class;
+ rdfs:label "Json Schema Validator 2018"@en;
+ rdfs:comment """A type of validator that can be used to syntactically validate JSON documents using the JSON Schema language."""@en;
+ rdfs:subClassOf cred:CredentialSchema;
+ rdfs:isDefinedBy cred: .
+cred:ManualRefreshService2018 a rdfs:Class;
+ rdfs:label "Manual Refresh Service 2018"@en;
+ rdfs:comment """A type of `Refresh Service` that must be interacted with in a manual fashion."""@en;
+ rdfs:subClassOf cred:RefreshService;
+ rdfs:isDefinedBy cred: .
+cred:RefreshService a rdfs:Class;
+ rdfs:label "Refresh Service"@en;
+ rdfs:comment """A `Refresh Service` is a mechanism that can be utilized by software agents to retrieve an updated copy of a `Verifiable Credential`."""@en;
+ rdfs:isDefinedBy cred: .
+cred:VerifiableCredential a rdfs:Class;
+ rdfs:label "Verifiable Credential"@en;
+ rdfs:comment """A `Credential` is a set of one or more claims made by an issuer. A `Verifiable Credential` is a tamper-evident credential that has authorship that can be cryptographically verified. `Verifiable Credentials` can be used to build `Verifiable Presentations`, which can also be cryptographically verified."""@en;
+ rdfs:isDefinedBy cred: .
+cred:VerifiableCredentialGraph a rdfs:Class;
+ rdfs:label "Verifiable Credential Graph"@en;
+ rdfs:comment """Instances of this class are RDF Graphs, where each of these graphs must include exactly one `Verifiable Credential`"""@en;
+ rdfs:isDefinedBy cred: .
+cred:VerifiablePresentation a rdfs:Class;
+ rdfs:label "Verifiable Presentation"@en;
+ rdfs:comment """A `Presentation` is data derived from one or more Credentials, issued by one or more `issuers`, that is shared with a specific `verifier`. A `Verifiable Presentation` is a tamper-evident `Presentation` encoded in such a way that authorship of the data can be trusted after a process of cryptographic verification. Certain types of verifiable presentations might contain data that is synthesized from, but do not contain, the original verifiable credentials (for example, zero-knowledge proofs)."""@en;
+ rdfs:isDefinedBy cred: .
+
+# Property definitions
+cred:credentialSchema a rdf:Property;
+ rdfs:label "credential schema"@en;
+ rdfs:comment """The value of the `credentialSchema` property MUST be one or more `Credential Schema` instances."""@en;
+ rdfs:domain cred:VerifiableCredential;
+ rdfs:range cred:CredentialSchema;
+ rdfs:isDefinedBy cred: .
+cred:credentialStatus a rdf:Property;
+ rdfs:label "credential status"@en;
+ rdfs:comment """The value of the `credentialStatus` property MUST be an instance of `Credential Status`."""@en;
+ rdfs:domain cred:VerifiableCredential;
+ rdfs:range cred:CredentialStatus;
+ rdfs:isDefinedBy cred: .
+cred:credentialSubject a rdf:Property;
+ rdfs:label "credential subject"@en;
+ rdfs:comment """An entity about which claims are made."""@en;
+ rdfs:domain cred:VerifiableCredential;
+ rdfs:isDefinedBy cred: .
+cred:evidence a rdf:Property;
+ rdfs:label "evidence"@en;
+ rdfs:comment """The value of the `evidence` property MUST be one or more `Credential Evidence` instances."""@en;
+ rdfs:domain cred:VerifiableCredential;
+ rdfs:range cred:CredentialEvidence;
+ rdfs:isDefinedBy cred: .
+cred:expirationDate a rdf:Property;
+ rdfs:label "expiration date"@en;
+ rdfs:comment """The value of the `expirationDate` property MUST be a string value of an ISO8601 combined date and time string representing the date and time the credential ceases to be valid."""@en;
+ rdfs:domain cred:VerifiableCredential;
+ rdfs:range xsd:dateTime;
+ rdfs:isDefinedBy cred: .
+cred:issuanceDate a rdf:Property;
+ rdfs:label "issuance date"@en;
+ rdfs:comment """The value of the `issuanceDate` property MUST be a string value of an ISO8601 combined date and time string representing the date and time the credential was issued. Note that this date represents the earliest date when the information associated with the `credentialSubject` property became valid."""@en;
+ rdfs:domain cred:VerifiableCredential;
+ rdfs:range xsd:dateTime;
+ rdfs:isDefinedBy cred: .
+cred:issuer a rdf:Property;
+ rdfs:label "issuer"@en;
+ rdfs:comment """The value of the `issuer` property MUST be a URI. It is RECOMMENDED that dereferencing the URI results in a document containing machine-readable information about the issuer that can be used to verify the information expressed in the credential."""@en;
+ rdfs:domain cred:VerifiableCredential;
+ rdfs:isDefinedBy cred: .
+cred:refreshService a rdf:Property;
+ rdfs:label "refresh service"@en;
+ rdfs:comment """The value of the `refreshService` property MUST be one or more `Refresh Service` instances such that the holder can refresh the credential."""@en;
+ rdfs:domain cred:VerifiableCredential;
+ rdfs:range cred:RefreshService;
+ rdfs:isDefinedBy cred: .
+cred:serviceEndpoint a rdf:Property;
+ rdfs:label "service endpoint"@en;
+ rdfs:comment """The value of the `serviceEndpoint` property MUST be a URL to the service endpoint associated with the subject."""@en;
+ rdfs:domain cred:RefreshService;
+ rdfs:isDefinedBy cred: .
+cred:termsOfUse a rdf:Property;
+ rdfs:label "terms of use"@en;
+ rdfs:comment """If specified, the value of the `termsOfUse` property MUST specify one or more terms of use policies under which the creator issued the credential or presentation. If the recipient (a holder or verifier) is not willing to adhere to the specified terms of use, then they do so on their own responsibility and might incur legal liability if they violate the stated Terms of Use. Each `termsOfUse` MUST specify its type, for example, `IssuerPolicy`, and optionally, its instance `id`. The precise contents of each term of use is determined by the specific `TermsOfUse` type definition."""@en;
+ rdfs:domain cred:VerifiableCredential;
+ rdfs:range odrl:Policy;
+ rdfs:isDefinedBy cred: .
+cred:verifiableCredential a rdf:Property;
+ rdfs:label "verifiable credential"@en;
+ rdfs:comment """The value of the `verifiableCredential` property MUST identify a `Verifiable Credential Graph` (informally, it indirectly identifies a `Verifiable Credential` contained in a separate graph)."""@en;
+ rdfs:domain cred:VerifiablePresentation;
+ rdfs:range cred:VerifiableCredentialGraph;
+ rdfs:isDefinedBy cred: .