diff --git a/index.html b/index.html index a4066ca3..858d4605 100644 --- a/index.html +++ b/index.html @@ -1,38 +1,5628 @@ - + -
- -JSON is a useful data serialization and messaging format. + This specification defines JSON-LD, a JSON-based format to serialize + Linked Data. The syntax is designed to easily integrate into deployed + systems that already use JSON, and provides a smooth upgrade path from + JSON to JSON-LD. + It is primarily intended to be a way to use Linked Data in Web-based + programming environments, to build interoperable Web services, and to + store Linked Data in JSON-based storage engines.
+This document has been developed by the + JSON-LD Working Group.
+ + + +This document is one of three JSON-LD 1.1 Recommendations produced by the + JSON-LD Working Group:
+ + +Linked Data [[LINKED-DATA]] is a way to create a network of + standards-based machine interpretable data across different documents and + Web sites. It allows an application to start at one piece of Linked Data, + and follow embedded links to other pieces of Linked Data that are hosted on + different sites across the Web.
+ +JSON-LD is a lightweight syntax to serialize Linked Data in + JSON [[!RFC7159]]. Its design allows existing JSON to be interpreted as + Linked Data with minimal changes. JSON-LD is primarily intended to be a + way to use Linked Data in Web-based programming environments, to build + interoperable Web services, and to store Linked Data in JSON-based storage engines. Since + JSON-LD is 100% compatible with JSON, the large number of JSON parsers and libraries + available today can be reused. In addition to all the features JSON provides, + JSON-LD introduces:
+ ++ JSON-LD is designed to be usable directly as JSON, with no knowledge of RDF + [[RDF11-CONCEPTS]]. It is also designed to be usable as RDF, if desired, for + use with other Linked Data technologies like SPARQL. Developers who + require any of the facilities listed above or need to serialize an RDF Graph + or RDF Dataset in a JSON-based syntax will find JSON-LD of interest. People + intending to use JSON-LD with RDF tools will find it can be used as another + RDF syntax, like Turtle [[TURTLE]]. Complete details of how JSON-LD relates + to RDF are in section . +
+ ++ The syntax is designed to not disturb already + deployed systems running on JSON, but provide a smooth upgrade path from + JSON to JSON-LD. Since the shape of such data varies wildly, JSON-LD + features mechanisms to reshape documents into a deterministic structure + which simplifies their processing.
+ +This document is a detailed specification for a serialization of Linked + Data in JSON. The document is primarily intended for the following audiences:
+ +A companion document, the JSON-LD 1.1 Processing Algorithms and API specification + [[JSON-LD11-API]], specifies how to work with JSON-LD at a higher level by + providing a standard library interface for common JSON-LD operations.
+ +To understand the basics in this specification you must first be familiar with + JSON, which is detailed in [[!RFC7159]].
+ +This document almost exclusively uses the term IRI + (Internationalized Resource Indicator) + when discussing hyperlinks. Many Web developers are more familiar with the + URL (Uniform Resource Locator) + terminology. The document also uses, albeit rarely, the URI + (Uniform Resource Indicator) + terminology. While these terms are often used interchangeably among + technical communities, they do have important distinctions from one + another and the specification goes to great lengths to try and use the + proper terminology at all times. +
+There are a number of ways that one may participate in the development of + this specification:
+ +This document uses the following terms as defined in JSON [[!RFC7159]]. Refer + to the JSON Grammar section in [[!RFC7159]] for formal definitions.
+ +JSON-LD satisfies the following design goals:
+ +@context
+ and @id
) to use the basic functionality in JSON-LD.Generally speaking, the data model described by a + JSON-LD document is a labeled, + directed graph. The graph contains + nodes, which are connected by + edges. A node is typically data + such as a string, number, + typed values (like dates and times) + or an IRI. + There is also a special class of node called a + blank node, which is typically used to express data that does + not have a global identifier like an IRI. + Blank nodes are identified using a + blank node identifier. This simple data model is incredibly + flexible and powerful, capable of modeling almost any kind of + data. For a deeper explanation of the data model, see + section . +
+ +Developers who are familiar with Linked Data technologies will + recognize the data model as the RDF Data Model. To dive deeper into how + JSON-LD and RDF are related, see + section .
+ +At the surface level, a JSON-LD document is simply + JSON, detailed in [[!RFC7159]]. + For the purpose of describing the core data structures, + this is limited to arrays, dictionaries (the parsed version of a JSON Object), + strings, numbers, booleans, and null, + called the JSON-LD internal representation. + This allows surface syntaxes other than JSON + to be manipulated using the same algorithms, when the syntax maps + to equivalent core data structures.
+Although not discussed in this specification, + parallel work using YAML [[YAML]] + and binary representations such as CBOR [[RFC7049]] + could be used to map into the internal representation, allowing + the JSON-LD 1.1 API [[JSON-LD11-API]] to operate as if the source was a + JSON document.
+JSON-LD specifies a number of syntax tokens and keywords + that are a core part of the language:
+ +@context
@context
keyword is described in detail in
+ .@id
@value
@language
@type
@container
@list
@set
@reverse
@index
@base
@vocab
@type
with a common prefix
+ IRI. This keyword is described in .@graph
@nest
@none
@prefix
@version
json-ld-1.1
.
+ :
All keys, keywords, and values in JSON-LD are case-sensitive.
+Conformance criteria are relevant to authors and authoring tool implementers. 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.
+ +A JSON-LD document complies with this specification if it follows + the normative statements in appendix . JSON documents + can be interpreted as JSON-LD by following the normative statements in + . For convenience, normative + statements for documents are often phrased as statements on the properties of the document.
+ +This specification makes use of the following namespaces:
+dc
:http://purl.org/dc/terms/
cred
:https://w3id.org/credentials#
foaf
:http://xmlns.com/foaf/0.1/
prov
http://www.w3.org/ns/prov#
rdf
:http://www.w3.org/1999/02/22-rdf-syntax-ns#
schema
:http://schema.org/
xsd
:http://www.w3.org/2001/XMLSchema#
JSON [[RFC7159]] is a lightweight, language-independent data interchange format. + It is easy to parse and easy to generate. However, it is difficult to integrate JSON + from different sources as the data may contain keys that conflict with other + data sources. Furthermore, JSON has no + built-in support for hyperlinks, which are a fundamental building block on + the Web. Let's start by looking at an example that we will be using for the + rest of this section:
+ ++ ++ +
It's obvious to humans that the data is about a person whose
+ name
is "Manu Sporny"
+ and that the homepage
property contains the URL of that person's homepage.
+ A machine doesn't have such an intuitive understanding and sometimes,
+ even for humans, it is difficult to resolve ambiguities in such representations. This problem
+ can be solved by using unambiguous identifiers to denote the different concepts instead of
+ tokens such as "name", "homepage", etc.
Linked Data, and the Web in general, uses IRIs
+ (Internationalized Resource Identifiers as described in [[!RFC3987]]) for unambiguous
+ identification. The idea is to use IRIs
+ to assign unambiguous identifiers to data that may be of use to other developers.
+ It is useful for terms,
+ like name
and homepage
, to expand to IRIs
+ so that developers don't accidentally step on each other's terms. Furthermore, developers and
+ machines are able to use this IRI (by using a web browser, for instance) to go to
+ the term and get a definition of what the term means. This process is known as IRI
+ dereferencing.
Leveraging the popular schema.org vocabulary, + the example above could be unambiguously expressed as follows:
+ ++ ++ +
In the example above, every property is unambiguously identified by an IRI and all values
+ representing IRIs are explicitly marked as such by the
+ @id
keyword. While this is a valid JSON-LD
+ document that is very specific about its data, the document is also overly verbose and difficult
+ to work with for human developers. To address this issue, JSON-LD introduces the notion
+ of a context as described in the next section.
When two people communicate with one another, the conversation takes + place in a shared environment, typically called + "the context of the conversation". This shared context allows the + individuals to use shortcut terms, like the first name of a mutual friend, + to communicate more quickly but without losing accuracy. A context in + JSON-LD works in the same way. It allows two applications to use shortcut + terms to communicate with one another more efficiently, but without + losing accuracy.
+ +Simply speaking, a context is used to map terms to + IRIs. Terms are case sensitive + and any valid string that is not a reserved JSON-LD keyword + can be used as a term.
+ +For the sample document in the previous section, a context would + look something like this:
+ ++ ++ +
As the context above shows, the value of a term definition can + either be a simple string, mapping the term to an IRI, + or a JSON object.
+ +When a JSON object is associated with a term, it is called
+ an expanded term definition. The example above specifies that
+ the values of image
and homepage
, if they are
+ strings, are to be interpreted as
+ IRIs. Expanded term definitions
+ also allow terms to be used for index maps
+ and to specify whether array values are to be
+ interpreted as sets or lists.
+ Expanded term definitions may
+ be defined using absolute or
+ compact IRIs as keys, which is
+ mainly used to associate type or language information with an
+ absolute or compact IRI.
Contexts can either be directly embedded
+ into the document or be referenced. Assuming the context document in the previous
+ example can be retrieved at https://json-ld.org/contexts/person.jsonld
,
+ it can be referenced by adding a single line and allows a JSON-LD document to
+ be expressed much more concisely as shown in the example below:
+ ++ +
The referenced context not only specifies how the terms map to
+ IRIs in the Schema.org vocabulary but also
+ specifies that string values associated with
+ the homepage
and image
property
+ can be interpreted as an IRI ("@type": "@id"
,
+ see for more details). This information allows developers
+ to re-use each other's data without having to agree to how their data will interoperate
+ on a site-by-site basis. External JSON-LD context documents may contain extra
+ information located outside of the @context
key, such as
+ documentation about the terms declared in the
+ document. Information contained outside of the @context
value
+ is ignored when the document is used as an external JSON-LD context document.
JSON documents can be interpreted as JSON-LD without having to be modified by + referencing a context via an HTTP Link Header + as described in . It is also + possible to apply a custom context using the JSON-LD 1.1 API [[JSON-LD11-API]].
+ +In JSON-LD documents, + contexts may also be specified inline. + This has the advantage that documents can be processed even in the + absence of a connection to the Web. Ultimately, this is a modeling decision + and different use cases may require different handling.
+ ++ ++ +
This section only covers the most basic features of the JSON-LD + Context. More advanced features related to the JSON-LD Context are covered + in section . +
+IRIs (Internationalized Resource Identifiers + [[!RFC3987]]) are fundamental to Linked Data as that is how most + nodes and properties + are identified. In JSON-LD, IRIs may be represented as an + absolute IRI or a relative IRI. An + absolute IRI is defined in [[!RFC3987]] as containing a + scheme along with path and optional query and + fragment segments. A relative IRI is an IRI + that is relative to some other absolute IRI. + In JSON-LD, with exceptions are as described below, all relative IRIs + are resolved relative to the base IRI.
+ +Properties, values of @type
,
+ and values of properties with a term definition
+ that defines them as being relative to the vocabulary mapping,
+ may have the form of a relative IRI, but are resolved using the
+ vocabulary mapping, and not the base IRI.
A string is interpreted as an IRI when it is the
+ value of an @id
member:
+ ++ +
Values that are interpreted as IRIs, can also be
+ expressed as relative IRIs. For example,
+ assuming that the following document is located at
+ http://example.com/about/
, the relative IRI
+ ../
would expand to http://example.com/
(for more
+ information on where relative IRIs can be
+ used, please refer to section ).
+ ++ +
Absolute IRIs can be expressed directly + in the key position like so:
+ ++ ++ +
In the example above, the key http://schema.org/name
+ is interpreted as an absolute IRI.
Term-to-IRI expansion occurs if the key matches a term defined + within the active context:
+ ++ ++ +
JSON keys that do not expand to an IRI, such as status
+ in the example above, are not Linked Data and thus ignored when processed.
If type coercion rules are specified in the @context
for
+ a particular term or property IRI, an IRI is generated:
+ ++ +
In the example above, since the value http://manu.sporny.org/
+ is expressed as a JSON string, the type coercion
+ rules will transform the value into an IRI when processing the data.
+ See for more
+ details about this feature.
In summary, IRIs can be expressed in a variety of + different ways in JSON-LD:
+ +@id
or @type
.@type
key that is
+ set to a value of @id
or @vocab
.This section only covers the most basic features associated with IRIs + in JSON-LD. More advanced features related to IRIs are covered in + section . +
+ +To be able to externally reference nodes + in a graph, it is important that + nodes have an identifier. IRIs + are a fundamental concept of Linked Data, for + nodes to be truly linked, dereferencing the + identifier should result in a representation of that node. + This may allow an application to retrieve further information about a + node.
+ +In JSON-LD, a node is identified using the @id
+ keyword:
+ ++ +
The example above contains a node object identified by the IRI
+ http://me.markus-lanthaler.com/
.
This section only covers the most basic features associated with + node identifiers in JSON-LD. More advanced features related to + node identifiers are covered in section . +
+ +The type of a particular node can be specified using the @type
+ keyword. In Linked Data, types are uniquely
+ identified with an IRI.
+ ++ +
A node can be assigned more than one type by using an array:
+ ++ ++ +
The value of an @type
key may also be a term defined in the active context:
+ ++ +
This section only covers the most basic features associated with
+ types in JSON-LD. It is worth noting that the @type
+ keyword is not only used to specify the type of a
+ node but also to express typed values
+ (as described in ) and to
+ type coerce values (as described in
+ ). Specifically, @type
+ cannot be used in a context to define a node's
+ type. For a detailed description of the differences, please refer to
+ .
JSON-LD has a number of features that provide functionality above and beyond + the core functionality described above. The following section describes this + advanced functionality in more detail.
+ +New features defined in JSON-LD 1.1 are available
+ when the processing mode is set to json-ld-1.1
.
+ This may be set using the @version
member in a context
+ set to the value 1.1
as a number, or through an API option.
+ ++ +
The first context
encountered when processing a
+ document which contains @version
determines the processing mode
,
+ unless it is defined explicitly through an API option.
Setting the processing mode explicitly + for JSON-LD 1.1 is necessary so that a JSON-LD 1.0 processor + does not attempt to process a JSON-LD 1.1 document and silently + produce different results.
+JSON-LD allows IRIs
+ to be specified in a relative form which is
+ resolved against the document base according
+ section 5.1 Establishing a Base URI
+ of [[RFC3986]]. The base IRI may be explicitly set with a context
+ using the @base
keyword.
For example, if a JSON-LD document was retrieved from http://example.com/document.jsonld
,
+ relative IRIs would resolve against that IRI:
+ ++ +
This document uses an empty @id
, which resolves to the document base.
+ However, if the document is moved to a different location, the IRI would change.
+ To prevent this without having to use an absolute IRI, a context
+ may define an @base
mapping, to overwrite the base IRI for the document.
+ ++ +
Setting @base
to null will prevent
+ relative IRIs to be expanded to
+ absolute IRIs.
Please note that the @base
will be ignored if used in
+ external contexts.
At times, all properties and types may come from the same vocabulary. JSON-LD's
+ @vocab
keyword allows an author to set a common prefix which
+ is used as the vocabulary mapping and is used
+ for all properties and types that do not match a term and are neither
+ a compact IRI nor an absolute IRI (i.e., they do
+ not contain a colon).
+ ++ +
If @vocab
is used but certain keys in an
+ object should not be expanded using
+ the vocabulary IRI, a term can be explicitly set
+ to null in the context. For instance, in the
+ example below the databaseId
member would not expand to an
+ IRI causing the property to be dropped when expanding.
+ ++ +
In some cases, vocabulary terms are defined directly within the document
+ itself, rather than in an external vocabulary. Since
+ json-ld-1.1
, the vocabulary mapping in the active
+ context can be set to the empty string ""
, which causes terms which
+ are expanded relative to the vocabulary, such as the keys of node
+ objects, to use the base IRI to create absolute
+ IRIs.
+ ++
If this document were located at http://example/document
, it would expand as follows:
+ ++
A compact IRI is a way of expressing an IRI
+ using a prefix and suffix separated by a colon (:
).
+ The prefix is a term taken from the
+ active context and is a short string identifying a
+ particular IRI in a JSON-LD document. For example, the
+ prefix foaf
may be used as a short hand for the
+ Friend-of-a-Friend vocabulary, which is identified using the IRI
+ http://xmlns.com/foaf/0.1/
. A developer may append
+ any of the FOAF vocabulary terms to the end of the prefix to specify a short-hand
+ version of the absolute IRI for the vocabulary term. For example,
+ foaf:name
would be expanded to the IRI
+ http://xmlns.com/foaf/0.1/name
.
+ ++ +
In the example above, foaf:name
expands to the IRI
+ http://xmlns.com/foaf/0.1/name
and foaf:Person
expands
+ to http://xmlns.com/foaf/0.1/Person
.
Prefixes are expanded when the form of the value
+ is a compact IRI represented as a prefix:suffix
+ combination, the prefix matches a term defined within the
+ active context, and the suffix does not begin with two
+ slashes (//
). The compact IRI is expanded by
+ concatenating the IRI mapped to the prefix to the (possibly empty)
+ suffix. If the prefix is not defined in the active context,
+ or the suffix begins with two slashes (such as in http://example.com
),
+ the value is interpreted as absolute IRI instead. If the prefix is an
+ underscore (_
), the value is interpreted as blank node identifier
+ instead.
It's also possible to use compact IRIs within the context as shown in the + following example:
+ ++ ++ +
In JSON-LD 1.0, terms may be chosen as compact IRI prefixes when
+ compacting only if a simple term definition is used where the value ends with a
+ URI gen-delim character (e.g, /
,
+ #
and others, see [[!RFC3986]]).
+ The previous specification allows any term to be chosen as
+ a compact IRI prefix, which led to a poor experience.
In JSON-LD 1.1, terms may be chosen as compact IRI prefixes
+ when compacting only if
+ a simple term definition is used where the value ends with a URI gen-delim character,
+ or if their expanded term definition contains
+ a @prefix
member with the value true.
This represents a small change to the 1.0 algorithm to prevent IRIs + that are not really intended to be used as prefixes from being used for creating + compact IRIs.
+ +When processing mode is set to json-ld-1.1
, terms will be used as compact IRI prefixes
+ when compacting only if their expanded term definition contains
+ a @prefix
member with the value true, or if it has a
+ a simple term definition where the value ends with a URI gen-delim character
+ (e.g, /
, #
and others, see [[!RFC3986]]).
+ ++ +
In this case, the compact-iris term would not normally be usable as a prefix, both
+ because it is defined with an expanded term definition, and because
+ it's @id
does not end in a
+ gen-delim character. Adding
+ "@prefix": true
allows it to be used as the prefix portion of
+ the compact IRI compact-iris:are-considered.
+ A value with an associated type, also known as a + typed value, is indicated by associating a value with + an IRI which indicates the value's type. Typed values may be + expressed in JSON-LD in three ways: +
+ +@type
keyword when defining
+ a term within an @context
section.The first example uses the @type
keyword to associate a
+type with a particular term in the @context
:
+ ++ +
The modified key's value above is automatically type coerced to a
+ dateTime value because of the information specified in the
+ @context
. A JSON-LD processor will interpret the example above
+ as follows:
Subject | +Property | +Value | +Value Type | +
---|---|---|---|
http://example.com/docs/1 | +http://purl.org/dc/terms/modified | +2010-05-29T14:17:39+02:00 | +xsd:dateTime | +
The second example uses the expanded form of setting the type information +in the body of a JSON-LD document:
+ ++ ++ +
Both examples above would generate the value
+ 2010-05-29T14:17:39+02:00
with the type
+ http://www.w3.org/2001/XMLSchema#dateTime
. Note that it is
+ also possible to use a term or a compact IRI to
+ express the value of a type.
The @type
keyword is also used to associate a type
+ with a node. The concept of a node type and
+ a value type are different.
A node type specifies the type of thing + that is being described, like a person, place, event, or web page. A + value type specifies the data type of a particular value, such + as an integer, a floating point number, or a date.
+ ++ ++ +
The first use of @type
associates a node type
+ (http://schema.org/BlogPosting
) with the node,
+ which is expressed using the @id
keyword.
+ The second use of @type
associates a value type
+ (http://www.w3.org/2001/XMLSchema#dateTime
) with the
+ value expressed using the @value
keyword. As a
+ general rule, when @value
and @type
are used in
+ the same JSON object, the @type
+ keyword is expressing a value type.
+ Otherwise, the @type
keyword is expressing a
+ node type. The example above expresses the following data:
Subject | +Property | +Value | +Value Type | +
---|---|---|---|
http://example.org/posts#TripToWestVirginia | +rdf:type | +schema:BlogPosting | +- | +
http://example.org/posts#TripToWestVirginia | +dc:modified | +2010-05-29T14:17:39+02:00 | +xsd:dateTime | +
JSON-LD supports the coercion of values to particular data types. +Type coercion allows someone deploying JSON-LD to coerce the incoming or +outgoing values to the proper data type based on a mapping of data type IRIs to +terms. Using type coercion, value representation is preserved without requiring +the data type to be specified with each piece of data.
+ +Type coercion is specified within an expanded term definition
+ using the @type
key. The value of this key expands to an IRI.
+ Alternatively, the keyword @id
or @vocab
may be used
+ as value to indicate that within the body of a JSON-LD document, a string value of a
+ term coerced to @id
or @vocab
is to be interpreted as an
+ IRI. The difference between @id
and @vocab
is how values are expanded
+ to absolute IRIs. @vocab
first tries to expand the value
+ by interpreting it as term. If no matching term is found in the
+ active context, it tries to expand it as compact IRI or absolute IRI
+ if there's a colon in the value; otherwise, it will expand the value using the
+ active context's vocabulary mapping, if present.
+ Values coerced to @id
in contrast are expanded as
+ compact IRI or absolute IRI if a colon is present; otherwise, they are interpreted
+ as relative IRI.
Terms or compact IRIs used as the value of a
+ @type
key may be defined within the same context. This means that one may specify a
+ term like xsd
and then use xsd:integer
within the same
+ context definition.
The example below demonstrates how a JSON-LD author can coerce values to +typed values and IRIs.
+ ++ ++ +
The example shown above would generate the following data.
+ +Subject | +Property | +Value | +Value Type | +
---|---|---|---|
http://example.com/people#john | +foaf:name | +John Smith | ++ |
http://example.com/people#john | +foaf:age | +41 | +xsd:integer | +
http://example.com/people#john | +foaf:homepage | +http://personal.example.org/ | +IRI | +
http://work.example.com/jsmith/ | +IRI | +
Terms may also be defined using absolute IRIs + or compact IRIs. This allows coercion rules + to be applied to keys which are not represented as a simple term. + For example:
+ ++ ++ +
In this case the @id
definition in the term definition is optional.
+ If it does exist, the compact IRI or IRI representing
+ the term will always be expanded to IRI defined by the @id
+ key—regardless of whether a prefix is defined or not.
Type coercion is always performed using the unexpanded value of the key. In the
+ example above, that means that type coercion is done looking for foaf:age
+ in the active context and not for the corresponding, expanded
+ IRI http://xmlns.com/foaf/0.1/age
.
Keys in the context are treated as terms for the purpose of
+ expansion and value coercion. At times, this may result in multiple representations for the same expanded IRI.
+ For example, one could specify that dog
and cat
both expanded to http://example.com/vocab#animal
.
+ Doing this could be useful for establishing different type coercion or language specification rules. It also allows a compact IRI (or even an
+ absolute IRI) to be defined as something else entirely. For example, one could specify that
+ the term http://example.org/zoo
should expand to
+ http://example.org/river
, but this usage is discouraged because it would lead to a
+ great deal of confusion among developers attempting to understand the JSON-LD document.
Embedding is a JSON-LD feature that allows an author to + use node objects as + property values. This is a commonly used mechanism for + creating a parent-child relationship between two nodes.
+ +Without embedding, node objects can be linked by referencing the + identifier of another node object. For example:
+ ++ ++ +
The previous example describes two node objects, for Manu and Gregg, with
+ the knows
property defined to treat string values as identifiers.
+ Embedding allows the node object for Gregg to be embedded as a value
+ of the knows
property:
+ ++ +
A node object, like the one used above, may be used in
+ any value position in the body of a JSON-LD document. Note that type coercion of the knows
property
+ is not required, as the value is not a string.
Section introduced the basics of what makes + JSON-LD work. This section expands on the basic principles of the + context and demonstrates how more advanced use cases can + be achieved using JSON-LD.
+ +In general, contexts may be used at any time a + JSON object is defined. + The only time that one cannot express a context is as a direct child of another context definition. + For example, a JSON-LD document may use more than one context at different + points in a document:
+ ++ ++ +
Duplicate context terms are overridden using a + most-recently-defined-wins mechanism.
+ ++ ++ +
In the example above, the name
term is overridden
+ in the more deeply nested details
structure. Note that this is
+ rarely a good authoring practice and is typically used when working with
+ legacy applications that depend on a specific structure of the
+ JSON object. If a term is redefined within a
+ context, all previous rules associated with the previous definition are
+ removed. If a term is redefined to null
,
+ the term is effectively removed from the list of
+ terms defined in the active context.
Multiple contexts may be combined using an array, which is processed
+ in order. The set of contexts defined within a specific JSON object are
+ referred to as local contexts. The
+ active context refers to the accumulation of
+ local contexts that are in scope at a
+ specific point within the document. Setting a local context
+ to null
effectively resets the active context
+ to an empty context. The following example specifies an external context
+ and then layers an embedded context on top of the external context:
+ ++ +
When possible, the context definition should be put + at the top of a JSON-LD document. This makes the document easier to read and + might make streaming parsers more efficient. Documents that do not have the + context at the top are still conformant JSON-LD.
+ +To avoid forward-compatibility issues, terms
+ starting with an @
character are to be avoided as they
+ might be used as keyword in future versions
+ of JSON-LD. Terms starting with an @
character that are not
+ JSON-LD 1.1 keywords are treated as any other term, i.e.,
+ they are ignored unless mapped to an IRI. Furthermore, the use of
+ empty terms (""
) is not allowed as
+ not all programming languages are able to handle empty JSON keys.
Ordinary JSON documents can be interpreted as JSON-LD
+ by providing an explicit JSON-LD context document. One way
+ to provide this is by using referencing a JSON-LD
+ context document in an HTTP Link Header.
+ Doing so allows JSON to be unambiguously machine-readable without requiring developers to drastically
+ change their documents and provides an upgrade path for existing infrastructure
+ without breaking existing clients that rely on the application/json
+ media type or a media type with a +json
suffix as defined in
+ [[RFC6839]].
In order to use an external context with an ordinary JSON document, + when retrieving an ordinary JSON document via HTTP, processors MUST + retrieve any JSON-LD document referenced by a + Link Header with:
+ +rel="http://www.w3.org/ns/json-ld#context"
, andtype="application/ld+json"
.The referenced document MUST have a top-level JSON object.
+ The @context
subtree within that object is added to the top-level
+ JSON object of the referencing document. If an array
+ is at the top-level of the referencing document and its items are
+ JSON objects, the @context
+ subtree is added to all array items. All extra information located outside
+ of the @context
subtree in the referenced document MUST be
+ discarded. Effectively this means that the active context is
+ initialized with the referenced external context. A response MUST NOT
+ contain more than one HTTP Link Header [[!RFC5988]] using the
+ http://www.w3.org/ns/json-ld#context
link relation.
Other mechanisms for providing a JSON-LD Context MAY be described for other + URI schemes.
+ +The JSON-LD 1.1 Processing Algorithms and API specification [[JSON-LD11-API]] + provides for an expandContext option for specifying + a context to use when expanding JSON documents programatically.
+ +The following example demonstrates the use of an external context with an + ordinary JSON document over HTTP:
+ ++ ++ +
Please note that JSON-LD documents
+ served with the application/ld+json
+ media type MUST have all context information, including references to external
+ contexts, within the body of the document. Contexts linked via a
+ http://www.w3.org/ns/json-ld#context
HTTP Link Header MUST be
+ ignored for such documents.
At times, it is important to annotate a string
+ with its language. In JSON-LD this is possible in a variety of ways.
+ First, it is possible to define a default language for a JSON-LD document
+ by setting the @language
key in the context:
+ ++ +
The example above would associate the ja
language
+ code with the two strings 花澄 and 科学者.
+ Languages codes are defined in [[!BCP47]]. The default language applies to all
+ string values that are not type coerced.
To clear the default language for a subtree, @language
can
+ be set to null
in a local context as follows:
+ ++ +
Second, it is possible to associate a language with a specific term + using an expanded term definition:
+ ++ ++ +
The example above would associate 忍者 with the specified default
+ language code ja
, Ninja with the language code
+ en
, and Nindža with the language code cs
.
+ The value of name
, Yagyū Muneyoshi wouldn't be
+ associated with any language code since @language
was reset to
+ null in the expanded term definition.
Language associations are only applied to plain + strings. Typed values + or values that are subject to type coercion + are not language tagged.
+ +Just as in the example above, systems often need to express the value of a + property in multiple languages. Typically, such systems also try to ensure that + developers have a programmatically easy way to navigate the data structures for + the language-specific data. In this case, language maps + may be utilized.
+ ++ ++ +
The example above expresses exactly the same information as the previous
+ example but consolidates all values in a single property. To access the
+ value in a specific language in a programming language supporting dot-notation
+ accessors for object properties, a developer may use the
+ property.language
pattern. For example, to access the occupation
+ in English, a developer would use the following code snippet:
+ obj.occupation.en
.
Third, it is possible to override the default language by using a + value object:
+ ++ ++ +
This makes it possible to specify a plain string by omitting the
+ @language
tag or setting it to null
when expressing
+ it using a value object:
+ ++ +
In general, normal IRI expansion rules apply
+ anywhere an IRI is expected (see ). Within
+ a context definition, this can mean that terms defined
+ within the context may also be used within that context as long as
+ there are no circular dependencies. For example, it is common to use
+ the xsd
namespace when defining typed values:
+ ++ +
In this example, the xsd
term is defined
+ and used as a prefix for the @type
coercion
+ of the age
property.
Terms may also be used when defining the IRI of another +term:
+ ++ ++ +
Compact IRIs + and IRIs may be used on the left-hand side of a + term definition.
+ ++ ++ +
+In this example, the compact IRI form is used in two different
+ways.
+In the first approach, foaf:age
declares both the
+IRI for the term (using short-form) as well as the
+@type
associated with the term. In the second
+approach, only the @type
associated with the term is
+specified. The full IRI for
+foaf:homepage
is determined by looking up the foaf
+prefix in the
+context.
+
+Absolute IRIs may also be used in the key position in a context: +
+ ++ ++ +
In order for the absolute IRI to match above, the absolute IRI
+ needs to be used in the JSON-LD document. Also note that foaf:homepage
+ will not use the { "@type": "@id" }
declaration because
+ foaf:homepage
is not the same as http://xmlns.com/foaf/0.1/homepage
.
+ That is, terms are looked up in a context using
+ direct string comparison before the prefix lookup mechanism is applied.
While it is possible to define a compact IRI, or
+ an absolute IRI to expand to some other unrelated IRI
+ (for example, foaf:name
expanding to
+ http://example.org/unrelated#species
), such usage is strongly
+ discouraged.
The only exception for using terms in the context is that + circular definitions are not allowed. That is, + a definition of term1 cannot depend on the + definition of term2 if term2 also depends on + term1. For example, the following context definition + is illegal:
++ ++
A JSON-LD author can express multiple values in a compact way by using + arrays. Since graphs do not describe ordering for links + between nodes, arrays in JSON-LD do not provide an ordering of the + contained elements by default. This is exactly the opposite from regular JSON + arrays, which are ordered by default. For example, consider the following + simple document:
+ ++ ++ +
The example shown above would result in the following data being generated, + each relating the node to an individual value, with no inherent order:
+ +Subject | +Property | +Value | +
---|---|---|
http://example.org/people#joebob | +foaf:nick | +joe | +
http://example.org/people#joebob | +foaf:nick | +bob | +
http://example.org/people#joebob | +foaf:nick | +JB | +
Multiple values may also be expressed using the expanded form:
+ ++ ++ +
The example shown above would generate the following data, again with + no inherent order:
+ +Subject | +Property | +Value | +Language | +
---|---|---|---|
http://example.org/articles/8 | +dc:title | +Das Kapital | +de | +
http://example.org/articles/8 | +dc:title | +Capital | +en | +
Although multiple values of a property are typically of the same type, + JSON-LD places no restriction on this, and a property may have values + of different types:
+ ++ ++ +
The example shown above would generate the following data, also with + no inherent order:
+ +Subject | +Property | +Value | +Language | +Value Type | +
---|---|---|---|---|
http://example.org/people#michael | +dc:name | +Michael | ++ | + |
http://example.org/people#michael | +dc:name | +Mike | ++ | + |
http://example.org/people#michael | +dc:name | +Miguel | +es | ++ |
http://example.org/people#michael | +dc:name | +https://www.wikidata.org/wiki/Q4927524 | ++ | + |
http://example.org/people#michael | +dc:name | +42 | ++ | xsd:integer | +
As the notion of ordered collections is rather important in data
+ modeling, it is useful to have specific language support. In JSON-LD,
+ a list may be represented using the @list
keyword as follows:
+ ++ +
This describes the use of this array as being ordered,
+ and order is maintained when processing a document. If every use of a given multi-valued
+ property is a list, this may be abbreviated by setting @container
+ to @list
in the context:
+ ++ +
List of lists in the form of list objects + are not allowed in this version of JSON-LD. This decision was made due to the + extreme amount of added complexity when processing lists of lists.
+ +While @list
is used to describe ordered lists,
+ the @set
keyword is used to describe unordered sets.
+ The use of @set
in the body of a JSON-LD document
+ is optimized away when processing the document, as it is just syntactic
+ sugar. However, @set
is helpful when used within the context
+ of a document.
+ Values of terms associated with an @set
or @list
container
+ are always represented in the form of an array,
+ even if there is just a single value that would otherwise be optimized to
+ a non-array form in compact form (see
+ ). This makes post-processing of
+ JSON-LD documents easier as the data is always in array form, even if the
+ array only contains a single value.
JSON-LD serializes directed graphs. That means that + every property points from a node to another node + or value. However, in some cases, it is desirable + to serialize in the reverse direction. Consider for example the case where a person + and its children should be described in a document. If the used vocabulary does not + provide a children property but just a parent + property, every node representing a child would have to + be expressed with a property pointing to the parent as in the following + example.
+ ++ ++ +
Expressing such data is much simpler by using JSON-LD's @reverse
+ keyword:
+ ++ +
The @reverse
keyword can also be used in
+ expanded term definitions
+ to create reverse properties as shown in the following example:
+ ++
An expanded term definition can include a @context
+ property, which defines a context (an embedded context) for values of properties defined using that term. This allows
+ values to use term definitions, base IRI,
+ vocabulary mapping or default language which is different from the
+ node object they are contained in, as if the
+ context was specified within the value itself.
+ ++ +
In this case, the social profile is defined using the schema.org vocabulary, but interest is imported from FOAF, and is used to define a node describing one of Manu's interests where those properties now come from the FOAF vocabulary.
+ +Expanding this document, uses a combination of terms defined in the outer context, and those defined specifically for that term in an embedded context.
+ ++ ++ +
Scoping can also be performed using a term used as a value of @type
:
+ ++ +
Scoping on @type
is useful when common properties are used to
+ relate things of different types, where the vocabularies in use within
+ different entities calls for different context scoping. For example,
+ hasPart
/partOf
may be common terms used in a document, but mean
+ different things depending on the context.
When expanding, each value of @type
is considered
+ (ordering them lexographically) where that value is also a term in
+ the active context having its own embedded context. If so, that
+ embedded context is applied to the active context. When compacting, if
+ a term is chosen to represent an IRI used as a value of @type
where that
+ term definition also has an embedded context, it is then applied to the
+ active context to affect further compaction.
The values of @type
are unordered, so if multiple
+ types are listed, the order that scoped contexts are applied is based on
+ lexicographical ordering.
If a term defines a scoped context, and then that term + is later re-defined, the association of the context defined in the earlier + expanded term definition is lost + within the scope of that re-definition. This is consistent with + term definitions of a term overriding previous term definitions from + earlier less deeply nested definitions, as discussed in + .
+ +Scoped Contexts are a new feature in JSON-LD 1.1, requiring
+ processing mode set to json-ld-1.1
.
At times, it is necessary to make statements about a graph
+ itself, rather than just a single node. This can be done by
+ grouping a set of nodes using the @graph
+ keyword. A developer may also name data expressed using the
+ @graph
keyword by pairing it with an
+ @id
keyword as shown in the following example:
+ ++ +
The example above expresses a named graph that is identified
+ by the Blank Node identifier _:graph
. That
+ graph is composed of the statements about Manu and Gregg. Metadata about
+ the graph itself is expressed via the generatedAt
property,
+ which specifies when the graph was generated. An alternative view of the
+ information above is represented in table form below:
Graph | +Subject | +Property | +Value | +Value Type | +
---|---|---|---|---|
+ | _:graph | +prov:generatedAtTime | +2012-04-09 | +xsd:date | +
_:graph | +http://manu.sporny.org/about#manu | +xsd:type | +foaf:Person | ++ |
_:graph | +http://manu.sporny.org/about#manu | +foaf:name | +Manu Sporny | ++ |
_:graph | +http://manu.sporny.org/about#manu | +foaf:knows | +http://greggkellogg.net/foaf#me | ++ |
_:graph | +http://greggkellogg.net/foaf#me | +xsd:type | +foaf:Person | ++ |
_:graph | +http://greggkellogg.net/foaf#me | +foaf:name | +Gregg Kellogg | ++ |
_:graph | +http://greggkellogg.net/foaf#me | +foaf:knows | +http://manu.sporny.org/about#manu | ++ |
When a JSON-LD document's top-level structure is an
+ object that contains no other
+ properties than @graph
and
+ optionally @context
(properties that are not mapped to an
+ IRI or a keyword are ignored),
+ @graph
is considered to express the otherwise implicit
+ default graph. This mechanism can be useful when a number
+ of nodes exist at the document's top level that
+ share the same context, which is, e.g., the case when a
+ document is flattened. The
+ @graph
keyword collects such nodes in an array
+ and allows the use of a shared context.
+ ++ +
In this case, embedding doesn't work as each node object
+ references the other. This is equivalent to using multiple
+ node objects in array and defining
+ the @context
within each node object:
+ ++ +
In some cases, it is useful to logically partition data into separate
+ graphs, without making this explicit within the JSON expression. For
+ example, a JSON document may contain data against which other metadata is
+ asserted and it is useful to separate this data in the data model using
+ the notion of named graphs, without the syntactic overhead
+ associated with the @graph
keyword.
An expanded term definition can use @graph
as the
+ value of @container
. This indicates that values of this
+ term should be considered to be named graphs, where the
+ graph name is an automatically assigned blank node identifier
+ creating an implicitly named graph. When expanded, these become
+ simple graph objects.
An alternative to our example above could use an anonymously named graph + as follows:
+ ++ ++ +
The example above expresses a named graph that is identified
+ by the blank node identifier _:claim
. That
+ graph is composed of the statements about Manu and Gregg. Metadata about
+ the graph itself is expressed via the generatedAt
property,
+ which specifies when the graph was generated. An alternative view of the
+ information above is represented in table form below:
Graph | +Subject | +Property | +Value | +Value Type | +
---|---|---|---|---|
+ | _:metadata | +prov:generatedAtTime | +2012-04-09 | +xsd:date | +
+ | _:metadata | +cred:claim | +_:claim | ++ |
_:claim | +http://manu.sporny.org/about#manu | +xsd:type | +foaf:Person | ++ |
_:claim | +http://manu.sporny.org/about#manu | +foaf:name | +Manu Sporny | ++ |
_:claim | +http://manu.sporny.org/about#manu | +foaf:knows | +http://greggkellogg.net/foaf#me | ++ |
_:claim | +http://greggkellogg.net/foaf#me | +xsd:type | +foaf:Person | ++ |
_:claim | +http://greggkellogg.net/foaf#me | +foaf:name | +Gregg Kellogg | ++ |
_:claim | +http://greggkellogg.net/foaf#me | +foaf:knows | +http://manu.sporny.org/about#manu | ++ |
Expanding this graph results in the following:
+ ++ ++ +
Strictly speaking, the value of such a term + is not a named graph, rather it is the graph name + associated with the named graph, which exists separately within + the dataset.
+ +Graph Containers are a new feature in JSON-LD 1.1, requiring
+ processing mode set to json-ld-1.1
.
At times, it becomes necessary to be able to express information without
+ being able to uniquely identify the node with an IRI.
+ This type of node is called a blank node. JSON-LD does not require
+ all nodes to be identified using @id
. However, some graph topologies
+ may require identifiers to be serializable. Graphs containing loops, e.g., cannot
+ be serialized using embedding alone, @id
must be used to connect the nodes.
+ In these situations, one can use blank node identifiers,
+ which look like IRIs using an underscore (_
)
+ as scheme. This allows one to reference the node locally within the document, but
+ makes it impossible to reference the node from an external document. The
+ blank node identifier is scoped to the document in which it is used.
+ ++ +
The example above contains information about two secret agents that cannot be identified + with an IRI. While expressing that agent 1 knows agent 2 + is possible without using blank node identifiers, + it is necessary to assign agent 1 an identifier so that it can be referenced + from agent 2.
+It is worth noting that blank node identifiers may be relabeled during processing. + If a developer finds that they refer to the blank node more than once, + they should consider naming the node using a dereferenceable IRI so that + it can also be referenced from other documents.
+Each of the JSON-LD keywords,
+ except for @context
, may be aliased to application-specific
+ keywords. This feature allows legacy JSON content to be utilized
+ by JSON-LD by re-using JSON keys that already exist in legacy documents.
+ This feature also allows developers to design domain-specific implementations
+ using only the JSON-LD context.
+ ++ +
In the example above, the @id
and @type
+ keywords have been given the aliases
+ url and a, respectively.
Since keywords cannot be redefined, they can also not be aliased to + other keywords.
+Databases are typically used to make access to + data more efficient. Developers often extend this sort of functionality into + their application data to deliver similar performance gains. Often this + data does not have any meaning from a Linked Data standpoint, but is + still useful for an application.
+ +JSON-LD introduces the notion of index maps
+ that can be used to structure data into a form that is
+ more efficient to access. The data indexing feature allows an author to
+ structure data using a simple key-value map where the keys do not map
+ to IRIs. This enables direct access to data
+ instead of having to scan an array in search of a specific item.
+ In JSON-LD such data can be specified by associating the
+ @index
keyword with a
+ @container
declaration in the context:
+ ++ +
In the example above, the post term has
+ been marked as an index map. The en and
+ de keys will be ignored semantically, but preserved
+ syntactically, by the JSON-LD Processor. This allows a developer to
+ access the German version of the post using the
+ following code snippet: obj.post.de
.
The interpretation of the data above is expressed in + the table below. Note how the index keys do not appear in the Linked Data + below, but would continue to exist if the document were compacted or + expanded (see and + ) using a JSON-LD processor:
+ +Subject | +Property | +Value | +
---|---|---|
http://example.com/ | +rdf:type | +schema:Blog | +
http://example.com/ | +schema:name | +World Financial News | +
http://example.com/ | +schema:blogPost | +http://example.com/posts/1/en | +
http://example.com/ | +schema:blogPost | +http://example.com/posts/1/de | +
http://example.com/posts/1/en | +schema:articleBody | +World commodities were up today with heavy trading of crude oil... | +
http://example.com/posts/1/en | +schema:wordCount | +1539 | +
http://example.com/posts/1/de | +schema:articleBody | +Die Werte an Warenbörsen stiegen im Sog eines starken Handels von Rohöl... | +
http://example.com/posts/1/de | +schema:wordCount | +1204 | +
The value of @container
can also
+ be an array containing both @index
and @set
.
+ When compacting, this ensures that a JSON-LD Processor will use
+ the array form for all values of indexes.
+ ++ +
If the processing mode is set to json-ld-1.1
,
+ the special index @none
is used for indexing
+ data which does not have an associated index, which is useful to maintain
+ a normalized representation.
+ ++
In addition to indexing node objects by index, graph objects may
+ also be indexed by an index. By using the @graph
+ container type, introduced in
+ in addition to @index
, an object value of such a property is
+ treated as a key-value map where the keys do not map to IRIs, but
+ are taken from an @index
property associated with named graphs
+ which are their values. When expanded, these must be simple graph objects
The following example describes a default graph referencing multiple named + graphs using an index map.
+ ++ ++ +
This expands to the following:
+ ++ ++ +
When expressed as Quads, this becomes the following:
+ +Graph | +Subject | +Property | +Value | +Value Type | +
---|---|---|---|---|
+ | http://example.com/ | +rdf:type | +schema:Blog | ++ |
+ | http://example.com/ | +schema:name | +World Financial News | ++ |
+ | http://example.com/ | +schema:blogPost | +_:b1 | ++ |
+ | http://example.com/ | +schema:blogPost | +_:b2 | ++ |
_:b1 | +http://example.com/posts/1/de | +schema:wordCount | +1204 | +xsd:integer | +
_:b1 | +http://example.com/posts/1/de | +schema:articleBody | +Die Werte an Warenbörsen stiegen im Sog eines starken Handels von Rohöl... | ++ |
_:b2 | +http://example.com/posts/1/en | +schema:wordCount | +1539 | +xsd:integer | +
_:b2 | +http://example.com/posts/1/en | +schema:articleBody | +World commodities were up today with heavy trading of crude oil... | ++ |
As with index maps, when used with @graph
, a container may also
+ include @set
to ensure that key values are always contained in an array.
If the processing mode is set to json-ld-1.1
,
+ the special index @none
is used for indexing
+ graphs which does not have an @index
key, which is useful to maintain
+ a normalized representation. Note, however, that
+ compacting a document where multiple unidentified named graphs are
+ compacted using the @none
index will result in the content
+ of those graphs being merged. To prevent this, give each graph a distinct
+ @index
key.
+ ++ +
This expands to the following:
+ ++ ++
JSON which includes string values in multiple languages may be
+ represented using a language map to allow for easily
+ indexing property values by language tag. This enables direct access to
+ language values instead of having to scan an array in search of a specific item.
+ In JSON-LD such data can be specified by associating the
+ @language
keyword with a
+ @container
declaration in the context:
+ ++ +
In the example above, the label term has
+ been marked as an language map. The en and
+ de keys are implicitly associated with their respective
+ values by the JSON-LD Processor. This allows a developer to
+ access the German version of the label using the
+ following code snippet: obj.label.de
.
The value of @container
can also
+ be an array containing both @language
and @set
.
+ When compacting, this ensures that a JSON-LD Processor will use
+ the array form for all values of language tags.
+ ++ +
If the processing mode is set to json-ld-1.1
,
+ the special index @none
is used for indexing
+ data which does not have a language, which is useful to maintain
+ a normalized representation.
+ ++
In addition to index maps, JSON-LD introduces the notion of id maps
+ for structuring data. The id indexing feature allows an author to
+ structure data using a simple key-value map where the keys map
+ to IRIs. This enables direct access to associated node objects
+ instead of having to scan an array in search of a specific item.
+ In JSON-LD such data can be specified by associating the
+ @id
keyword with a
+ @container
declaration in the context:
+ ++ +
In the example above, the post
term has
+ been marked as an id map. The http://example.com/posts/1/en
and
+ http://example.com/posts/1/de
keys will be interpreted
+ as the @id
property of the node object value.
The interpretation of the data above is exactly the same + as that in + using a JSON-LD processor.
+ +The value of @container
can also
+ be an array containing both @id
and @set
.
+ When compacting, this ensures that a JSON-LD processor will use
+ the array form for all values of node identifiers.
+ ++ +
The special index @none
is used for indexing
+ node objects which do not have an @id
, which is useful to maintain
+ a normalized representation. The @none
index may also be
+ a term which expands to @none
, such as the term none
+ used in the example below.
+ ++ +
Id maps are a new feature in JSON-LD 1.1, requiring
+ processing mode set to json-ld-1.1
.
In addition to indexing node objects by identifier, graph objects may
+ also be indexed by their graph name. By using the @graph
+ container type, introduced in
+ in addition to @id
, an object value of such a property is
+ treated as a key-value map where the keys represent the identifiers of named graphs
+ which are their values.
The following example describes a default graph referencing multiple named + graphs using an id map.
+ ++ ++ +
This expands to the following:
+ ++ ++ +
When expressed as Quads, this becomes the following:
+ +Graph | +Subject | +Property | +Value | +Value Type | +
---|---|---|---|---|
+ | _:graph | +prov:generatedAtTime | +2012-04-09 | +xsd:date | +
+ | _:graph | +http://example.org/graphMap | +http://manu.sporny.org/about#manu | ++ |
+ | _:graph | +http://example.org/graphMap | +http://greggkellogg.net/foaf#me | ++ |
_:manu | +http://manu.sporny.org/about#manu | +xsd:type | +foaf:Person | ++ |
_:manu | +http://manu.sporny.org/about#manu | +foaf:name | +Manu Sporny | ++ |
_:manu | +http://manu.sporny.org/about#manu | +foaf:knows | +http://greggkellogg.net/foaf#me | ++ |
_:gregg | +http://greggkellogg.net/foaf#me | +xsd:type | +foaf:Person | ++ |
_:gregg | +http://greggkellogg.net/foaf#me | +foaf:name | +Gregg Kellogg | ++ |
_:gregg | +http://greggkellogg.net/foaf#me | +foaf:knows | +http://manu.sporny.org/about#manu | ++ |
As with id maps, when used with @graph
, a container may also
+ include @set
to ensure that key values are always contained in an array.
As with id maps, the special index @none
is used for indexing
+ named graphs which do not have an @id
, which is useful to maintain
+ a normalized representation. The @none
index may also be
+ a term which expands to @none
.
+ Note, however, that if multiple graphs are represented without
+ an @id
, they will be merged on expansion. To prevent this,
+ use @none
judiciously, and consider giving graphs
+ their own distinct identifier.
+ ++ +
Graph Containers are a new feature in JSON-LD 1.1, requiring
+ processing mode set to json-ld-1.1
.
In addition to id and index maps, JSON-LD introduces the notion of type maps
+ for structuring data. The type indexing feature allows an author to
+ structure data using a simple key-value map where the keys map
+ to IRIs. This enables data to be structured based on the @type
+ of specific node objects.
+ In JSON-LD such data can be specified by associating the
+ @type
keyword with a
+ @container
declaration in the context:
+ ++ +
In the example above, the affiliation
term has
+ been marked as an type map. The schema:Corporation
and
+ schema:ProfessionalService
keys will be interpreted
+ as the @type
property of the node object value.
The value of @container
can also
+ be an array containing both @type
and @set
.
+ When compacting, this ensures that a JSON-LD processor will use
+ the array form for all values of types.
+ ++ +
The special index @none
is used for indexing
+ node objects which do not have an @type
, which is useful to maintain
+ a normalized representation. The @none
index may also be
+ a term which expands to @none
, such as the term none
+ used in the example below.
+ ++ +
As with id maps, when used with @type
, a container may also
+ include @set
to ensure that key values are always contained in an array.
Type maps are a new feature in JSON-LD 1.1, requiring
+ processing mode set to json-ld-1.1
.
Many JSON APIs separate properties from their entities using an + intermediate object; in JSON-LD these are called nested properties. + For example, a set of possible labels may be grouped + under a common property:
++ ++ +
By defining labels using the keyword @nest
,
+ a JSON-LD processor will ignore the nesting created by using the
+ labels property and process the contents as if it were declared
+ directly within containing object. In this case, the labels
+ property is semantically meaningless. Defining it as equivalent to
+ @nest
causes it to be ignored when expanding, making it
+ equivalent to the following:
+ ++ +
Similarly, node definitions may contain a @nest
property to
+ reference a term aliased to @nest
which causes such
+ values to be nested under that aliased term.
+ ++ +
Nested properties are a new feature in JSON-LD 1.1, requiring
+ processing mode set to json-ld-1.1
.
The JSON-LD 1.1 Processing Algorithms and API specification [[JSON-LD11-API]]
+ defines a method for expanding a JSON-LD document.
+ Expansion is the process of taking a JSON-LD document and applying a
+ @context
such that all IRIs, types, and values
+ are expanded so that the @context
is no longer necessary.
For example, assume the following JSON-LD input document:
+ ++ ++ +
Running the JSON-LD Expansion algorithm against the JSON-LD input document + provided above would result in the following output:
+ ++ ++ +
JSON-LD's media type defines a
+ profile
parameter which can be used to signal or request
+ expanded document form. The profile URI identifying expanded document
+ form is http://www.w3.org/ns/json-ld#expanded
.
The JSON-LD 1.1 Processing Algorithms and API specification [[JSON-LD11-API]] defines + a method for compacting a JSON-LD document. Compaction is the process + of applying a developer-supplied context to shorten IRIs + to terms or compact IRIs + and JSON-LD values expressed in expanded form to simple values such as + strings or numbers. + Often this makes it simpler to work with document as the data is expressed in + application-specific terms. Compacted documents are also typically easier to read + for humans.
+ +For example, assume the following JSON-LD input document:
+ ++ ++ +
Additionally, assume the following developer-supplied JSON-LD context:
+ ++ ++ +
Running the JSON-LD Compaction algorithm given the context supplied above + against the JSON-LD input document provided above would result in the following + output:
+ ++ ++ +
JSON-LD's media type defines a
+ profile
parameter which can be used to signal or request
+ compacted document form. The profile URI identifying compacted document
+ form is http://www.w3.org/ns/json-ld#compacted
.
The JSON-LD 1.1 Processing Algorithms and API specification [[JSON-LD11-API]] defines + a method for flattening a JSON-LD document. Flattening collects all + properties of a node in a single JSON object and labels + all blank nodes with + blank node identifiers. + This ensures a shape of the data and consequently may drastically simplify the code + required to process JSON-LD in certain applications.
+ +For example, assume the following JSON-LD input document:
+ ++ ++ +
Running the JSON-LD Flattening algorithm against the JSON-LD input document in + the example above and using the same context would result in the following + output:
+ ++ ++ +
JSON-LD's media type defines a
+ profile
parameter which can be used to signal or request
+ flattened document form. The profile URI identifying flattened document
+ form is http://www.w3.org/ns/json-ld#flattened
. It can be
+ combined with the profile URI identifying
+ expanded document form or
+ compacted document from.
HTML script tags can be used to embed blocks of data in documents.
+ This way, JSON-LD content can be easily embedded in HTML by placing
+ it in a script element with the type
attribute set to
+ application/ld+json
.
+ ++ +
Depending on how the HTML document is served, certain strings may need + to be escaped.
+ +Defining how such data may be used is beyond the scope of this specification. + The embedded JSON-LD document might be extracted as is or, e.g., be + interpreted as RDF.
+ +If JSON-LD content is extracted as RDF [[RDF11-CONCEPTS]], it should be expanded into an + RDF Dataset using the + Deserialize JSON-LD to RDF Algorithm + [[JSON-LD11-API]].
+JSON-LD is a serialization format for Linked Data based on JSON. + It is therefore important to distinguish between the syntax, which is + defined by JSON in [[!RFC7159]], and the data model which is + an extension of the RDF data model [[!RDF11-CONCEPTS]]. The precise + details of how JSON-LD relates to the RDF data model are given in + .
+ +To ease understanding for developers unfamiliar with the RDF model, the + following summary is provided:
+ ++ ++
@id
.
+ A document may have nodes which are unrelated, as long as one or more
+ properties are defined, or the node is referenced from another node object.
+ _:
.xsd:string
), a number
+ (numbers with a non-zero fractional part, i.e., the result of a modulo‑1 operation,
+ are interpreted as typed values with type xsd:double
, all other
+ numbers are interpreted as typed values
+ with type xsd:integer
), true or false (which are interpreted as
+ typed values with type xsd:boolean
),
+ or a language-tagged string.JSON-LD documents MAY contain data + that cannot be represented by the data model + defined above. Unless otherwise specified, such data is ignored when a + JSON-LD document is being processed. One result of this rule + is that properties which are not mapped to an IRI, + a blank node, or keyword will be ignored.
+ +Additionally, the JSON serialization format is internally represented using + the JSON-LD internal representation, which uses the generic + concepts of arrays, dictionaries, + strings, numbers, booleans, and null to describe + the data represented by a JSON document.
+Figure 1: An illustration of the data model.
+This appendix restates the syntactic conventions described in the + previous sections more formally.
+ +A JSON-LD document MUST be valid JSON text as described + in [[!RFC7159]], or some format that can be represented + in the JSON-LD internal representation that is equivalent to + valid JSON text.
+ +A JSON-LD document MUST be a single node object,
+ a JSON object consisting of only
+ the members @context
and/or @graph
,
+ or an array or zero or more node objects.
In contrast to JSON, in JSON-LD the keys in objects + MUST be unique.
+ +JSON-LD allows keywords to be aliased
+ (see for details). Whenever a keyword is
+ discussed in this grammar, the statements also apply to an alias for
+ that keyword. For example, if the active context
+ defines the term id
as an alias for @id
,
+ that alias may be legitimately used as a substitution for @id
.
+ Note that keyword aliases are not expanded during context
+ processing.
A term is a short-hand string that expands + to an IRI or a blank node identifier.
+ +A term MUST NOT equal any of the JSON-LD + keywords.
+ +When used as the prefix in a Compact IRI, to avoid
+ the potential ambiguity of a prefix being confused with an IRI
+ scheme, terms SHOULD NOT come from the list of URI schemes as defined in
+ [[!IANA-URI-SCHEMES]]. Similarly, to avoid confusion between a
+ Compact IRI and a term, terms SHOULD NOT include a colon (:
)
+ and SHOULD be restricted to the form of
+ isegment-nz-nc
+ as defined in [[!RFC3987]].
To avoid forward-compatibility issues, a term SHOULD NOT start
+ with an @
character as future versions of JSON-LD may introduce
+ additional keywords. Furthermore, the term MUST NOT
+ be an empty string (""
) as not all programming languages
+ are able to handle empty JSON keys.
See and + for further discussion + on mapping terms to IRIs.
+A node object represents zero or more properties of a + node in the graph serialized by the + JSON-LD document. A JSON object is a + node object if it exists outside of a JSON-LD + context and:
+ +@graph
and @context
,@value
, @list
,
+ or @set
keywords, andThe properties of a node in + a graph may be spread among different + node objects within a document. When + that happens, the keys of the different + node objects need to be merged to create the + properties of the resulting node.
+ +A node object MUST be a JSON object. All keys + which are not IRIs, compact IRIs, terms valid in the + active context, or one of the following keywords + (or alias of such a keyword) + MUST be ignored when processed:
+ +@context
,@id
,@graph
,@nest
,@type
,@reverse
, or@index
If the node object contains the @context
+ key, its value MUST be null, an absolute IRI,
+ a relative IRI, a context definition, or
+ an array composed of any of these.
If the node object contains the @id
key,
+ its value MUST be an absolute IRI, a relative IRI,
+ or a compact IRI (including
+ blank node identifiers).
+ See ,
+ , and
+ for further discussion on
+ @id
values.
If the node object contains the @graph
+ key, its value MUST be
+ a node object or
+ an array of zero or more node objects.
+ If the node object contains an @id
keyword,
+ its value is used as the graph name of a named graph.
+ See for further discussion on
+ @graph
values. As a special case, if a JSON object
+ contains no keys other than @graph
and @context
, and the
+ JSON object is the root of the JSON-LD document, the
+ JSON object is not treated as a node object; this
+ is used as a way of defining node objects
+ that may not form a connected graph. This allows a
+ context to be defined which is shared by all of the constituent
+ node objects.
If the node object contains the @type
+ key, its value MUST be either an absolute IRI, a
+ relative IRI, a compact IRI
+ (including blank node identifiers),
+ a term defined in the active context expanding into an absolute IRI, or
+ an array of any of these.
+ See for further discussion on
+ @type
values.
If the node object contains the @reverse
key,
+ its value MUST be a JSON object containing members representing reverse
+ properties. Each value of such a reverse property MUST be an absolute IRI,
+ a relative IRI, a compact IRI, a blank node identifier,
+ a node object or an array containing a combination of these.
If the node object contains the @index
key,
+ its value MUST be a string. See
+ for further discussion
+ on @index
values.
If the node object contains the @nest
key,
+ its value MUST be an JSON object or an array of JSON objects
+ which MUST NOT include a value object. See
+ for further discussion
+ on @nest
values.
Keys in a node object that are not + keywords MAY expand to an absolute IRI + using the active context. The values associated with keys that expand + to an absolute IRI MUST be one of the following:
+ +A graph object represents a named graph, which MAY include
+ include an explicit graph name.
+ A JSON object is a graph object if
+ it exists outside of a JSON-LD context,
+ it is not a node object,
+ it is not the top-most JSON object in the JSON-LD document, and
+ it consists of no members other than @graph
,
+ @index
, @id
+ and @context
, or an alias of one of these keywords.
If the graph object contains the @context
+ key, its value MUST be null, an absolute IRI,
+ a relative IRI, a context definition, or
+ an array composed of any of these.
If the graph object contains the @id
key,
+ its value is used as the identifier (graph name) of a named graph, and
+ MUST be an absolute IRI, a relative IRI,
+ or a compact IRI (including
+ blank node identifiers).
+ See ,
+ , and
+ for further discussion on
+ @id
values.
A graph object without an @id
member is also a
+ simple graph object and represents a named graph without an
+ explicit identifier, although in the data model it still has a
+ graph name, which is an implicitly allocated
+ blank node identifier.
The value of the @graph
key MUST be
+ a node object or
+ an array of zero or more node objects.
+ See for further discussion on
+ @graph
values..
A value object is used to explicitly associate a type or a + language with a value to create a typed value or a language-tagged + string.
+ +A value object MUST be a JSON object containing the
+ @value
key. It MAY also contain an @type
,
+ an @language
, an @index
, or an @context
key but MUST NOT contain
+ both an @type
and an @language
key at the same time.
+ A value object MUST NOT contain any other keys that expand to an
+ absolute IRI or keyword.
The value associated with the @value
key MUST be either a
+ string, a number, true,
+ false or null.
The value associated with the @type
key MUST be a
+ term, a compact IRI,
+ an absolute IRI, a string which can be turned
+ into an absolute IRI using the vocabulary mapping, or null.
The value associated with the @language
key MUST have the
+ lexical form described in [[!BCP47]], or be null.
The value associated with the @index
key MUST be a
+ string.
See and + + for more information on value objects.
+A list represents an ordered set of values. A set
+ represents an unordered set of values. Unless otherwise specified,
+ arrays are unordered in JSON-LD. As such, the
+ @set
keyword, when used in the body of a JSON-LD document,
+ represents just syntactic sugar which is optimized away when processing the document.
+ However, it is very helpful when used within the context of a document. Values
+ of terms associated with an @set
or @list
container
+ will always be represented in the form of an array when a document
+ is processed—even if there is just a single value that would otherwise be optimized to
+ a non-array form in compact document form.
+ This simplifies post-processing of the data as the data is always in a
+ deterministic form.
A list object MUST be a JSON object that contains no
+ keys that expand to an absolute IRI or keyword other
+ than @list
, @context
, and @index
.
A set object MUST be a JSON object that contains no
+ keys that expand to an absolute IRI or keyword other
+ than @set
, @context
, and @index
.
+ Please note that the @index
key will be ignored when being processed.
In both cases, the value associated with the keys @list
and @set
+ MUST be one of the following types:
A language map is used to associate a language with a value in a
+ way that allows easy programmatic access. A language map may be
+ used as a term value within a node object if the term is defined
+ with @container
set to @language
,
+
+ or an array containing both @language
and @set
+ . The keys of a
+ language map MUST be strings representing
+ [[BCP47]] language codes, the keyword @none
,
+ or a term which expands to @none
,
+ and the values MUST be any of the following types:
An index map allows keys that have no semantic meaning,
+ but should be preserved regardless, to be used in JSON-LD documents.
+ An index map may
+ be used as a term value within a node object if the
+ term is defined with @container
set to @index
,
+
+ or an array containing both @index
and @set
+ .
+ The values of the members of an index map MUST be one
+ of the following types:
See for further information on this topic.
+ +Index Maps may also be used to map indexes to associated
+ named graphs, if the term is defined with @container
+ set to an array containing both @graph
and
+ @index
, and optionally including @set
. The
+ value consists of the node objects contained within the named
+ graph which is named using the referencing key, which can be
+ represented as a simple graph object.
An id map is used to associate an IRI with a value that allows easy
+ programmatic access. An id map may be used as a term value within a node object if the term
+ is defined with @container
set to @id
,
+ or an array containing both @id
and @set
.
+ The keys of an id map MUST be IRIs
+ (relative IRI, compact IRI (including blank node identifiers), or absolute IRI),
+ the keyword @none
,
+ or a term which expands to @none
,
+ and the values MUST be node objects.
If the value contains a property expanding to @id
, it's value MUST
+ be equivalent to the referencing key. Otherwise, the property from the value is used as
+ the @id
of the node object value when expanding.
Id Maps may also be used to map graph names to their
+ named graphs, if the term is defined with @container
+ set to an array containing both @graph
and @id
,
+ and optionally including @set
. The value consists of the
+ node objects contained within the named graph
+ which is named using the referencing key.
A type map is used to associate an IRI with a value that allows easy
+ programmatic access. A type map may be used as a term value within a node object if the term
+ is defined with @container
set to @type
,
+ or an array containing both @type
and @set
.
+ The keys of a type map MUST be IRIs
+ (relative IRI, compact IRI (including blank node identifiers), or absolute IRI),
+ the keyword @none
,
+ or a term which expands to @none
,
+ and the values MUST be node objects.
If the value contains a property expanding to @type
, and it's value
+ is contains the referencing key after suitable expansion of both the referencing key
+ and the value, then the node object already contains the type. Otherwise, the property from the value is
+ added as a @type
of the node object value when expanding.
A nested property is used to gather properties of a node object in a separate + JSON object, or array of JSON objects which are not + value objects. It is semantically transparent and is removed + during the process of expansion. Property nesting is recursive, and + collections of nested properties may contain further nesting.
+ +Semantically, nesting is treated as if the properties and values were declared directly + within the containing node object.
+A context definition defines a local context in a + node object.
+ +A context definition MUST be a JSON object whose
+ keys MUST be either terms, compact IRIs, absolute IRIs,
+ or one of the keywords @language
, @base
,
+ @vocab
, or @version
.
If the context definition has an @language
key,
+ its value MUST have the lexical form described in [[!BCP47]] or be null.
If the context definition has an @base
key,
+ its value MUST be an absolute IRI, a relative IRI,
+ or null.
If the context definition has an @vocab
key,
+ its value MUST be a absolute IRI, a compact IRI,
+ a blank node identifier,
+ an empty string (""
),
+ a term, or null.
If the context definition has an @version
key,
+ its value MUST be a number with the value 1.1
.
The value of keys that are not keywords MUST be either an + absolute IRI, a compact IRI, a term, + a blank node identifier, a keyword, null, + or an expanded term definition.
+ +An expanded term definition is used to describe the mapping + between a term and its expanded identifier, as well as other + properties of the value associated with the term when it is + used as key in a node object.
+ +An expanded term definition MUST be a JSON object
+ composed of zero or more keys from
+ @id
,
+ @reverse
,
+ @type
,
+ @language
,
+ @context
,
+ @prefix
, or
+ @container
. An
+ expanded term definition SHOULD NOT contain any other keys.
If the term being defined is not a compact IRI or
+ absolute IRI and the active context does not have an
+ @vocab
mapping, the expanded term definition MUST
+ include the @id
key.
If the expanded term definition contains the @id
+ keyword, its value MUST be null, an absolute IRI,
+ a blank node identifier, a compact IRI, a term,
+ or a keyword.
If an expanded term definition has an @reverse
member,
+ it MUST NOT have @id
or @nest
members at the same time,
+ its value MUST be an absolute IRI,
+ a blank node identifier, a compact IRI, or a term. If an
+ @container
member exists, its value MUST be null,
+ @set
, or @index
.
If the expanded term definition contains the @type
+ keyword, its value MUST be an absolute IRI, a
+ compact IRI, a term, null, or one of the
+ keywords @id
or @vocab
.
If the expanded term definition contains the @language
keyword,
+ its value MUST have the lexical form described in [[!BCP47]] or be null.
If the expanded term definition contains the @container
+ keyword, its value MUST be either
+ @list
,
+ @set
,
+ @language
,
+ @index
,
+ @id
,
+ @graph
,
+ @type
, or be
+ null
+
+ or an array containing exactly any one of those keywords, or a
+ combination of @set
and any of @index
,
+ @id
, @graph
, @type
,
+ @language
in any order
+ .
+ @container
may also be an array
+ containing @graph
along with either @id
or
+ @index
and also optionally including @set
.
+ If the value
+ is @language
, when the term is used outside of the
+ @context
, the associated value MUST be a language map.
+ If the value is @index
, when the term is used outside of
+ the @context
, the associated value MUST be an
+ index map.
If an expanded term definition has an @context
member,
+ it MUST be a valid context definition
.
If the expanded term definition contains the @nest
+ keyword, its value MUST be either @nest
, or a term
+ which expands to @nest
.
If the expanded term definition contains the @prefix
+ keyword, its value MUST be true
or false
.
Terms MUST NOT be used in a circular manner. That is, + the definition of a term cannot depend on the definition of another term if that other + term also depends on the first term.
+ + +JSON-LD is a + concrete RDF syntax + as described in [[RDF11-CONCEPTS]]. Hence, a JSON-LD document is both an + RDF document and a JSON document and correspondingly represents an + instance of an RDF data model. However, JSON-LD also extends the RDF data + model to optionally allow JSON-LD to serialize + generalized RDF Datasets. + The JSON-LD extensions to the RDF data model are:
+ +Summarized, these differences mean that JSON-LD is capable of serializing any RDF + graph or dataset and most, but not all, JSON-LD documents can be directly + interpreted as RDF as described in RDF 1.1 Concepts [[RDF11-CONCEPTS]].
+ +For authors and developers working with blank nodes + as properties when deserializing to RDF, + three potential approaches are suggested:
+ +The normative algorithms for interpreting JSON-LD as RDF and serializing + RDF as JSON-LD are specified in the JSON-LD 1.1 Processing Algorithms and API + specification [[JSON-LD11-API]].
+ +Even though JSON-LD serializes + generalized RDF Datasets, it can + also be used as a RDF graph source. + In that case, a consumer MUST only use the default graph and ignore all named graphs. + This allows servers to expose data in languages such as Turtle and JSON-LD + using content negotiation.
+ +Publishers supporting both dataset and graph syntaxes have to ensure that + the primary data is stored in the default graph to enable consumers that do not support + datasets to process the information.
+ +The process of serializing RDF as JSON-LD and deserializing JSON-LD to RDF + depends on executing the algorithms defined in + RDF Serialization-Deserialization Algorithms + in the JSON-LD 1.1 Processing Algorithms and API specification [[JSON-LD11-API]]. + It is beyond the scope of this document to detail these algorithms any further, + but a summary of the necessary operations is provided to illustrate the process.
+ +The procedure to deserialize a JSON-LD document to RDF involves the + following steps:
+ +For example, consider the following JSON-LD document in compact form:
+ ++ ++ +
Running the JSON-LD Expansion and Flattening algorithms against the + JSON-LD input document in the example above would result in the + following output:
+ ++ ++ +
Deserializing this to RDF now is a straightforward process of turning + each node object into one or more RDF triples. This can be + expressed in Turtle as follows:
+ ++ ++ +
The process of serializing RDF as JSON-LD can be thought of as the + inverse of this last step, creating an expanded JSON-LD document closely + matching the triples from RDF, using a single node object + for all triples having a common subject, and a single property + for those triples also having a common predicate.
+@version
member which is used to set the processing mode.@context
property, which defines a context used for values of
+ a property identified with such a term.@container
values within an expanded term definition may now
+ include @id
, @graph
and @type
, corresponding to id maps and type maps.@nest
property, which identifies a term expanding to
+ @nest
which is used for containing properties using the same
+ @nest
mapping. When expanding, the values of a property
+ expanding to @nest
are treated as if they were contained
+ within the enclosing node object directly.@none
value, but
+ JSON-LD 1.0 only allowed string values. This has been updated
+ to allow (and ignore) @null
values.@container
in an expanded term definition
+ can also be an array containing any appropriate container
+ keyword along with @set
(other than @list
).
+ This allows a way to ensure that such property values will always
+ be expressed in array form.@prefix
member with the value true. The 1.0 algorithm has
+ been updated to only consider terms that map to a value that ends with a URI
+ gen-delim character.@container
set to @graph
are interpreted as
+ implicitly named graphs, where the associated graph name is
+ assigned from a new blank node identifier. Other combinations
+ include ["@container", "@id"]
, ["@container", "@index"]
each also
+ may include "@set"
, which create maps from the
+ graph identifier or index value similar to index maps
+ and id maps.""
) has been added as a possible value for @vocab
in
+ a context. When this is set, vocabulary-relative IRIs, such as the
+ keys of node objects, are expanded or compacted relative
+ to the base IRI using string concatenation.The following is a list of issues open at the time of publication.
+ +The JSON-LD examples below demonstrate how JSON-LD can be used to + express semantic data marked up in other linked data formats such as Turtle, + RDFa, Microformats, and Microdata. These sections are merely provided as + evidence that JSON-LD is very flexible in what it can express across different + Linked Data approaches.
+ +The following are examples of transforming RDF expressed in Turtle [[TURTLE]] + into JSON-LD.
+ +The JSON-LD context has direct equivalents for the Turtle
+ @prefix
declaration:
+ ++ +
+ ++
Both Turtle and JSON-LD allow embedding, although Turtle only allows embedding of + blank nodes.
+ ++ ++ +
+ +
- This is an unofficial proposal. -
+ +In JSON-LD numbers and boolean values are native data types. While Turtle
+ has a shorthand syntax to express such values, RDF's abstract syntax requires
+ that numbers and boolean values are represented as typed literals. Thus,
+ to allow full round-tripping, the JSON-LD 1.1 Processing Algorithms and API specification [[JSON-LD11-API]]
+ defines conversion rules between JSON-LD's native data types and RDF's
+ counterparts. Numbers without fractions are
+ converted to xsd:integer
-typed literals, numbers with fractions
+ to xsd:double
-typed literals and the two boolean values
+ true and false to a xsd:boolean
-typed
+ literal. All typed literals are in canonical lexical form.
+ ++ +
+ ++
- See ReSpec's user guide - for how toget started! -
+Both JSON-LD and Turtle can represent sequential lists of values.
+ ++ ++ +
+ +
The following example describes three people with their respective names and + homepages in RDFa [[RDFA-CORE]].
+ ++ ++ +
An example JSON-LD implementation using a single context is + described below.
+ ++ ++
The following example uses a simple Microformats hCard example to express + how Microformats [[MICROFORMATS]] are represented in JSON-LD.
+ ++ ++ +
The representation of the hCard expresses the Microformat terms in the
+ context and uses them directly for the url
and fn
+ properties. Also note that the Microformat to JSON-LD processor has
+ generated the proper URL type for http://tantek.com/
.
+ ++
The HTML Microdata [[MICRODATA]] example below expresses book information as + a Microdata Work item.
+ ++ ++ +
Note that the JSON-LD representation of the Microdata information stays + true to the desires of the Microdata community to avoid contexts and + instead refer to items by their full IRI.
+ ++ ++
This section has been submitted to the Internet Engineering Steering + Group (IESG) for review, approval, and registration with IANA.
+ +profile
A non-empty list of space-separated URIs identifying specific
+ constraints or conventions that apply to a JSON-LD document according to [[RFC6906]].
+ A profile does not change the semantics of the resource representation
+ when processed without profile knowledge, so that clients both with
+ and without knowledge of a profiled resource can safely use the same
+ representation. The profile
parameter MAY be used by
+ clients to express their preferences in the content negotiation process.
+ If the profile parameter is given, a server SHOULD return a document that
+ honors the profiles in the list which are recognized by the server.
+ It is RECOMMENDED that profile URIs are dereferenceable and provide
+ useful documentation at that URI. For more information and background
+ please refer to [[RFC6906]].
This specification defines three values for the profile
parameter.
+ To request or specify expanded JSON-LD document form,
+ the URI http://www.w3.org/ns/json-ld#expanded
SHOULD be used.
+ To request or specify compacted JSON-LD document form,
+ the URI http://www.w3.org/ns/json-ld#compacted
SHOULD be used.
+ To request or specify flattened JSON-LD document form,
+ the URI http://www.w3.org/ns/json-ld#flattened
SHOULD be used.
+ Please note that, according [[HTTP11]], the value of the profile
+ parameter has to be enclosed in quotes ("
) because it contains
+ special characters and, if multiple profiles are combined, whitespace.
When processing the "profile" media type parameter, it is important to + note that its value contains one or more URIs and not IRIs. In some cases + it might therefore be necessary to convert between IRIs and URIs as specified in + section 3 Relationship between IRIs and URIs + of [[RFC3987]].
+Since JSON-LD is intended to be a pure data exchange format for
+ directed graphs, the serialization SHOULD NOT be passed through a
+ code execution mechanism such as JavaScript's eval()
+ function to be parsed. An (invalid) document may contain code that,
+ when executed, could lead to unexpected side effects compromising
+ the security of a system.
When processing JSON-LD documents, links to remote contexts are + typically followed automatically, resulting in the transfer of files + without the explicit request of the user for each one. If remote + contexts are served by third parties, it may allow them to gather + usage patterns or similar information leading to privacy concerns. + Specific implementations, such as the API defined in the + JSON-LD 1.1 Processing Algorithms and API specification [[!JSON-LD11-API]], + may provide fine-grained mechanisms to control this behavior.
+JSON-LD contexts that are loaded from the Web over non-secure connections, + such as HTTP, run the risk of being altered by an attacker such that + they may modify the JSON-LD active context in a way that + could compromise security. It is advised that any application that + depends on a remote context for mission critical purposes vet and + cache the remote context before allowing the system to use it.
+Given that JSON-LD allows the substitution of long IRIs with short terms, + JSON-LD documents may expand considerably when processed and, in the worst case, + the resulting data might consume all of the recipient's resources. Applications + should treat any data with due skepticism.
+Fragment identifiers used with application/ld+json + are treated as in RDF syntaxes, as per + RDF 1.1 Concepts and Abstract Syntax + [[RDF11-CONCEPTS]].
+Consider requirements from Self-Review Questionnaire: Security and Privacy.
+ +