This document is also available in these non-normative formats: Turtle and JSON-LD
Copyright © 2010-2013 W3C® (MIT, ERCIM, Keio, Beihang), All Rights Reserved. W3C liability, trademark and document use rules apply.
This document reports on implementations of the JSON-LD 1.0 specifications. The main purpose of this document is to show that each feature of the specifications has been implemented by demonstrating interoperable implementations of each feature. To evaluate the coverage of an implementation's features, the JSON-LD Test Suite is used as a point of reference.
This document is merely a W3C-internal document. It has no official standing of any kind and does not represent consensus of the W3C Membership.
The goal of this report is to verify whether the JSON-LD 1.0 [JSON-LD] and JSON-LD 1.0 Processing Algorithms and API [JSON-LD-API] specifications are implementable.
To evaluate the coverage of an implementation's features, the JSON-LD 1.0 Test Suite [JSON-LD-TESTS] is used as a point of reference.
See JSON-LD Test Description for more information.
JSON-LD compaction tests use object comparison.
JSON-LD to Expansion tests use object compare
JSON-LD to Expansion tests use object compare
JSON-LD flattening tests use object comparison.
Tests appropriate document loading behavior as defined in the API
JSON-LD to RDF tests generate N-Quads output and use string comparison.
Test | Argo.Core.JsonLd | JSONLD-Java | JSON::LD | RDFLib-JSONLD | jsonld.js browser | jsonld.js node.js | php-json-ld | PyLD | JsonLD |
---|---|---|---|---|---|---|---|---|---|
Test 0001: Plain literal with URIs | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0002: Plain literal with CURIE from default context | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0003: Default subject is BNode | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0004: Literal with language tag | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0005: Extended character set literal | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0006: Typed literal | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0007: Tests 'a' generates rdf:type and object is implicit IRI | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0008: Test prefix defined in @context | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0009: Test using an empty suffix | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0010: Test object processing defines object | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0011: Test object processing defines object with implicit BNode | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0012: Multiple Objects for a Single Property | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0013: Creation of an empty list | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0014: Creation of a list with single element | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0015: Creation of a list with multiple elements | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0016: Empty IRI expands to resource location | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0017: Relative IRI expands relative resource location | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0018: Frag ID expands relative resource location | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0019: Test type coercion to anyURI | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0020: Test type coercion to typed literal | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0022: Test coercion of double value | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0023: Test coercion of integer value | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0024: Test coercion of boolean value | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0025: Test list coercion with single element | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0026: Test creation of multiple types | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0027: Simple named graph (Wikidata) | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0028: Simple named graph | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0029: named graph with embedded named graph | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0030: top-level graph with string subject reference | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0031: Reverse property | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0032: @context reordering | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0033: @id reordering | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0034: context properties reordering | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0035: non-fractional numbers converted to xsd:double | PASS | PASS | PASS | FAIL | PASS | PASS | PASS | PASS | PASS |
Test 0036: Use nodeMapGeneration bnode labels | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0041: drop free-floating nodes | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0042: basic | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0043: drop null and unmapped properties | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0044: optimize @set, keep empty arrays | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0045: do not expand aliased @id/@type | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0046: alias keywords | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0047: date type-coercion | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0048: @value with @language | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0049: @graph with terms | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0050: native types | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0051: coerced @id | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0052: @graph with embed | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0053: expand already expanded | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0054: @set of @value objects with keyword aliases | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0055: collapse set of sets, keep empty lists | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0056: context reset | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0057: @graph and @id aliased | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0058: override default @language | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0059: remove @value = null | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0060: do not remove @graph if not at top-level | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0061: do not remove @graph at top-level if not only property | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0062: expand value with default language | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0063: Lists and sets of properties with list/set coercion | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0064: Multiple contexts | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0065: Problematic IRI expansion tests | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0066: Expanding term mapping to @type uses @type syntax | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0067: Keep duplicate values in @list and @set | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0068: Use @vocab in properties and @type but not in @id | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0069: Relative IRIs | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0070: Language maps | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0071: type-coercion of native types | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0072: Mapping a term to null decouples it from @vocab | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0073: Using @vocab with with type-coercion | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0074: Multiple properties expanding to the same IRI | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0075: Language maps with @vocab, default language, and colliding property | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0076: Expanding @index | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0077: Expanding @reverse | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0078: Drop blank node predicates by default | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0079: Using terms in a reverse-maps | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0080: language and index expansion on non-objects | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0081: Reset the default language | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0082: Expanding reverse properties | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0083: Using reverse properties inside a @reverse-container | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0084: Ensure index maps use language mapping | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0085: Top-level value objects are removed | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0086: Free-floating nodes are removed | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0087: Remove free-floating set values and lists | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0088: Terms are ignored in @id | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0089: Using strings as value of a reverse property | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0090: Term definitions with prefix separate from prefix definitions | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0091: Expansion of keyword aliases in term definitions | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0092: @vocab-relative IRIs in term definitions | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0093: Expand absolute IRI with @type: @vocab | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0094: Expand term with @type: @vocab | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0095: Expand @vocab-relative term with @type: @vocab | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0096: Use terms with @type: @vocab but not with @type: @id | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0097: Expand relative IRI with @type: @vocab | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0098: Expand compact IRI with @type: @vocab | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0099: Reset @vocab by setting it to null | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0100: Overwrite document base with @base and reset it again | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0101: Coercing native types to arbitrary datatypes | PASS | PASS | PASS | FAIL | PASS | PASS | PASS | PASS | PASS |
Test 0102: Various relative IRIs with with @base | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0103: Expand a reverse property with an index-container | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0104: Expand reverse property whose values are unlabeled blank nodes | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0105: Keys that are not mapped to an IRI in a reverse-map are dropped | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0106: Use @vocab to expand keys in reverse-maps | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0107: prefix:://sufffix not a compact IRI | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0108: _::sufffix not a compact IRI | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0109: Compact IRI as term with type mapping | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0110: Redefine compact IRI with itself | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0111: Redefine terms looking like compact IRIs | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0112: Redefine term using @vocab, not itself | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0113: Dataset with a IRI named graph | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0114: Dataset with a IRI named graph | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0115: Dataset with a default and two named graphs | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0116: Dataset from node with embedded named graph | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0117: Dataset from node with embedded named graph (bnode) | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0118: produce generalized RDF flag | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0119: Blank nodes with reverse properties | UNTESTED | UNTESTED | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Percentage passed out of 114 Tests | 99.1% | 99.1% | 100.0% | 98.2% | 100.0% | 100.0% | 100.0% | 100.0% | 100.0% |
Transform RDF to JSON-LD tests take N-Quads input and use object comparison.
Test | Argo.Core.JsonLd | JSONLD-Java | JSON::LD | RDFLib-JSONLD | jsonld.js browser | jsonld.js node.js | php-json-ld | PyLD | JsonLD |
---|---|---|---|---|---|---|---|---|---|
Test 0001: Object Lists | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0002: Native Types | PASS | PASS | PASS | FAIL | PASS | PASS | PASS | PASS | PASS |
Test 0003: BNodes and references | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0004: Lists | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0005: Document with list | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0006: Two graphs having same subject but different values | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0007: Graph with multiple named graphs | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0008: List conversion | PASS | PASS | PASS | FAIL | PASS | PASS | PASS | PASS | PASS |
Test 0009: List conversion with IRI nodes | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0010: List pattern without rdf:nil | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0011: List pattern with extra properties | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0012: List pattern with cycles | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0013: List pattern with multiple values of rdf:first | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0014: List pattern with multiple values of rdf:rest | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0015: List pattern with IRI rdf:rest | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0016: List pattern with type rdf:List | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0017: Remove duplicate triples | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0018: use native types flag set to true | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Test 0019: use rdf:type flag set to false | PASS | UNTESTED | PASS | PASS | PASS | PASS | PASS | PASS | PASS |
Percentage passed out of 19 Tests | 100.0% | 94.7% | 100.0% | 89.5% | 100.0% | 100.0% | 100.0% | 100.0% | 100.0% |
This report was tested using the following test subjects:
Expansion | 77/77 (100.0%) |
Transform JSON-LD to RDF | 113/114 (99.1%) |
Transform RDF to JSON-LD | 19/19 (100.0%) |
Compaction | 70/71 (98.6%) |
Error handling | 43/43 (100.0%) |
Expansion | 77/77 (100.0%) |
Flattening | 44/45 (97.8%) |
Remote document | 2/12 (16.7%) |
Transform JSON-LD to RDF | 113/114 (99.1%) |
Transform RDF to JSON-LD | 18/19 (94.7%) |
Compaction | 71/71 (100.0%) |
Error handling | 43/43 (100.0%) |
Expansion | 77/77 (100.0%) |
Flattening | 45/45 (100.0%) |
Remote document | 12/12 (100.0%) |
Transform JSON-LD to RDF | 114/114 (100.0%) |
Transform RDF to JSON-LD | 19/19 (100.0%) |
Transform JSON-LD to RDF | 112/114 (98.2%) |
Transform RDF to JSON-LD | 17/19 (89.5%) |
Compaction | 71/71 (100.0%) |
Error handling | 43/43 (100.0%) |
Expansion | 77/77 (100.0%) |
Flattening | 45/45 (100.0%) |
Remote document | 12/12 (100.0%) |
Transform JSON-LD to RDF | 114/114 (100.0%) |
Transform RDF to JSON-LD | 19/19 (100.0%) |
Compaction | 71/71 (100.0%) |
Error handling | 43/43 (100.0%) |
Expansion | 77/77 (100.0%) |
Flattening | 45/45 (100.0%) |
Remote document | 12/12 (100.0%) |
Transform JSON-LD to RDF | 114/114 (100.0%) |
Transform RDF to JSON-LD | 19/19 (100.0%) |
Compaction | 71/71 (100.0%) |
Error handling | 43/43 (100.0%) |
Expansion | 77/77 (100.0%) |
Flattening | 45/45 (100.0%) |
Remote document | 12/12 (100.0%) |
Transform JSON-LD to RDF | 114/114 (100.0%) |
Transform RDF to JSON-LD | 19/19 (100.0%) |
Compaction | 71/71 (100.0%) |
Error handling | 43/43 (100.0%) |
Expansion | 77/77 (100.0%) |
Flattening | 45/45 (100.0%) |
Remote document | 12/12 (100.0%) |
Transform JSON-LD to RDF | 114/114 (100.0%) |
Transform RDF to JSON-LD | 19/19 (100.0%) |
Compaction | 71/71 (100.0%) |
Error handling | 43/43 (100.0%) |
Expansion | 77/77 (100.0%) |
Flattening | 45/45 (100.0%) |
Remote document | 12/12 (100.0%) |
Transform JSON-LD to RDF | 114/114 (100.0%) |
Transform RDF to JSON-LD | 19/19 (100.0%) |
Individual test results used to construct this report are available here:
Unreferenced nodes not containing properties are dropped
{"@id": "http://example.org/test#example"}
{}
Basic term and value compaction
[{
"@id": "http://example.com/id1",
"@type": ["http://example.com/t1"],
"http://example.com/term1": ["v1"],
"http://example.com/term2": [{"@value": "v2", "@type": "http://example.com/t2"}],
"http://example.com/term3": [{"@value": "v3", "@language": "en"}],
"http://example.com/term4": [4],
"http://example.com/term5": [50, 51]
}]
{
"@context": {
"t1": "http://example.com/t1",
"t2": "http://example.com/t2",
"term1": "http://example.com/term1",
"term2": "http://example.com/term2",
"term3": "http://example.com/term3",
"term4": "http://example.com/term4",
"term5": "http://example.com/term5"
},
"@id": "http://example.com/id1",
"@type": "t1",
"term1": "v1",
"term2": {"@value": "v2", "@type": "t2"},
"term3": {"@value": "v3", "@language": "en"},
"term4": 4,
"term5": [50, 51]
}
Properties mapped to null or which are never mapped are dropped
{
"@id": "http://example.org/id",
"http://example.org/property": null,
"regularJson": {
"nonJsonLd": "property",
"deep": [{
"foo": "bar"
}, {
"bar": "foo"
}]
}
}
{}
Containers mapped to @set keep empty arrays
{
"@id": "http://example.org/id",
"http://example.com/mylist1": {"@list": []},
"http://example.com/myset2": {"@set": []},
"http://example.com/myset3": "v1",
"http://example.org/list1": {"@list": []},
"http://example.org/list2": {"@list": [null]},
"http://example.org/set1": {"@set": []},
"http://example.org/set2": {"@set": [null]},
"http://example.org/set3": [],
"http://example.org/set4": [null]
}
{
"@context": {
"mylist1": {"@id": "http://example.com/mylist1", "@container": "@list"},
"myset2": {"@id": "http://example.com/myset2", "@container": "@set"},
"myset3": {"@id": "http://example.com/myset3", "@container": "@set"}
},
"@id": "http://example.org/id",
"mylist1": [],
"myset2": [],
"myset3": ["v1"],
"http://example.org/list1": {"@list": []},
"http://example.org/list2": {"@list": []},
"http://example.org/set1": [],
"http://example.org/set2": [],
"http://example.org/set3": [],
"http://example.org/set4": []
}
Compact uses prefixes in @type
{
"@id": "http://example.org/id1",
"@type": ["http://example.org/Type1", "http://example.org/Type2"],
"http://example.org/term1": {"@value": "v1", "@type": "http://example.org/datatype"},
"http://example.org/term2": {"@id": "http://example.org/id2"}
}
{
"@context": {
"ex": "http://example.org/",
"term1": {"@id": "ex:term1", "@type": "ex:datatype"},
"term2": {"@id": "ex:term2", "@type": "@id"}
},
"@id": "ex:id1",
"@type": ["ex:Type1", "ex:Type2"],
"term1": "v1",
"term2": "ex:id2"
}
Values not matching a coerced @type remain in expanded form
{
"@id": "http://example.org/id1",
"@type": ["http://example.org/Type1", "http://example.org/Type2"],
"http://example.org/term1": {"@value": "v1", "@type": "http://example.org/different-datatype"},
"http://example.org/term2": {"@id": "http://example.org/id2"}
}
{
"@context": {
"ex": "http://example.org/",
"term1": {
"@id": "ex:term1",
"@type": "ex:datatype"
},
"term2": "ex:term2"
},
"@id": "ex:id1",
"@type": ["ex:Type1", "ex:Type2"],
"ex:term1": {"@value": "v1", "@type": "ex:different-datatype"},
"term2": {"@id": "ex:id2"}
}
External context is added to the compacted document
{
"@graph": [
{
"@id": "http://example.org/test#chapter",
"http://purl.org/dc/elements/1.1/description": ["Fun"],
"http://purl.org/dc/elements/1.1/title": ["Chapter One"]
},
{
"@id": "http://example.org/test#jane",
"http://example.org/vocab#authored": [{"@id": "http://example.org/test#chapter"}],
"http://xmlns.com/foaf/0.1/name": ["Jane"]
},
{
"@id": "http://example.org/test#john",
"http://xmlns.com/foaf/0.1/name": ["John"]
},
{
"@id": "http://example.org/test#library",
"http://example.org/vocab#contains": [{
"@id": "http://example.org/test#book",
"http://example.org/vocab#contains": [ "this-is-not-an-IRI" ],
"http://purl.org/dc/elements/1.1/contributor": ["Writer"],
"http://purl.org/dc/elements/1.1/title": ["My Book"]
}]
}
]
}
{
"@context": {
"dc": "http://purl.org/dc/elements/1.1/",
"ex": "http://example.org/vocab#",
"ex:authored": {"@type": "@id"},
"ex:contains": {"@type": "@id"},
"foaf": "http://xmlns.com/foaf/0.1/"
},
"@graph": [
{
"@id": "http://example.org/test#chapter",
"dc:description": "Fun",
"dc:title": "Chapter One"
},
{
"@id": "http://example.org/test#jane",
"ex:authored": "http://example.org/test#chapter",
"foaf:name": "Jane"
},
{
"@id": "http://example.org/test#john",
"foaf:name": "John"
},
{
"@id": "http://example.org/test#library",
"ex:contains": {
"@id": "http://example.org/test#book",
"dc:contributor": "Writer",
"dc:title": "My Book",
"http://example.org/vocab#contains": "this-is-not-an-IRI"
}
}
]
}
Aliases for keywords are used in compacted document
[{
"@id": "http://example.org/test#example1",
"http://example.org/test#property1": [{
"@id": "http://example.org/test#example2",
"http://example.org/test#property4": ["foo"]
}],
"http://example.org/test#property2": [{
"@id": "http://example.org/test#example3"
}],
"http://example.org/test#property3": [{
"@id": "http://example.org/test#example4"
}]
}]
{
"@context": {
"http://example.org/test#property1": {"@type": "@id"},
"http://example.org/test#property2": {"@type": "@id"},
"http://example.org/test#property3": {"@type": "@id"},
"uri": "@id"
},
"http://example.org/test#property1": {
"http://example.org/test#property4": "foo",
"uri": "http://example.org/test#example2"
},
"http://example.org/test#property2": "http://example.org/test#example3",
"http://example.org/test#property3": "http://example.org/test#example4",
"uri": "http://example.org/test#example1"
}
Value with @id is compacted to string if property cast to @id
{
"@id": "http://example.org/test#book",
"http://example.org/vocab#contains": {
"@id": "http://example.org/test#chapter"
},
"http://purl.org/dc/elements/1.1/title": "Title"
}
{
"@context": {
"dc": "http://purl.org/dc/elements/1.1/",
"ex": "http://example.org/vocab#",
"ex:contains": {"@type": "@id"}
},
"@id": "http://example.org/test#book",
"dc:title": "Title",
"ex:contains": "http://example.org/test#chapter"
}
An array of objects is serialized with @graph
[
{
"@id": "http://example.com/john",
"http://xmlns.com/foaf/0.1/homepage": {
"@id": "http://john.doe.org/"
},
"http://xmlns.com/foaf/0.1/name": "John Doe"
},
{
"@id": "http://example.com/jane",
"http://xmlns.com/foaf/0.1/name": "Jane Doe"
}
]
{
"@context": {
"homepage": {
"@id": "http://xmlns.com/foaf/0.1/homepage",
"@type": "@id"
},
"name": "http://xmlns.com/foaf/0.1/name"
},
"@graph": [
{
"@id": "http://example.com/john",
"homepage": "http://john.doe.org/",
"name": "John Doe"
},
{
"@id": "http://example.com/jane",
"name": "Jane Doe"
}
]
}
Expanded value with type xsd:dateTime is represented as string with type coercion
{
"@id": "http://example.org/test#example1",
"http://example.org/vocab#date": {
"@value": "2011-01-25T00:00:00Z",
"@type": "http://www.w3.org/2001/XMLSchema#dateTime"
},
"http://example.org/vocab#embed": {
"@id": "http://example.org/test#example2",
"http://example.org/vocab#parent": {
"@id": "http://example.org/test#example1"
}
}
}
{
"@context": {
"ex": "http://example.org/vocab#",
"ex:date": {"@type": "xsd:dateTime"},
"ex:parent": {"@type": "@id"},
"xsd": "http://www.w3.org/2001/XMLSchema#"
},
"@id": "http://example.org/test#example1",
"ex:date": "2011-01-25T00:00:00Z",
"ex:embed": {
"@id": "http://example.org/test#example2",
"ex:parent": "http://example.org/test#example1"
}
}
Native values are unmodified during compaction
{
"@id": "http://example.org/test",
"http://example.org/vocab#bool": true,
"http://example.org/vocab#int": 123
}
{
"@context": {
"ex": "http://example.org/vocab#"
},
"@id": "http://example.org/test",
"ex:bool": true,
"ex:int": 123
}
Values with @language remain in expended form by default
{
"@id": "http://example.org/test",
"http://example.org/vocab#test": {"@value": "test", "@language": "en"}
}
{
"@context": {
"ex": "http://example.org/vocab#"
},
"@id": "http://example.org/test",
"ex:test": {"@value": "test", "@language": "en"}
}
Aliasing @graph uses alias in compacted document
[
{
"@id": "http://example.com/john",
"http://xmlns.com/foaf/0.1/homepage": {
"@id": "http://john.doe.org/"
},
"http://xmlns.com/foaf/0.1/name": "John Doe"
},
{
"@id": "http://example.com/jane",
"http://xmlns.com/foaf/0.1/name": "Jane Doe"
}
]
{
"@context": {
"homepage": {
"@id": "http://xmlns.com/foaf/0.1/homepage",
"@type": "@id"
},
"name": "http://xmlns.com/foaf/0.1/name",
"data": "@graph"
},
"data": [
{
"@id": "http://example.com/john",
"homepage": "http://john.doe.org/",
"name": "John Doe"
},
{
"@id": "http://example.com/jane",
"name": "Jane Doe"
}
]
}
Property with values of different types use most appropriate term when compacting
[{
"@id": "http://example.com/id1",
"@type": ["http://example.com/t1"],
"http://example.com/term": [
{"@value": "v1", "@language": "de"},
{"@value": "v2", "@type": "http://example.com/t2"},
{"@value": "v3", "@language": "en"},
{"@list": [1, 2]},
"v5",
{"@value": "plain literal"}
]
}]
{
"@context": {
"t1": "http://example.com/t1",
"t2": "http://example.com/t2",
"term1": "http://example.com/term",
"term2": {"@id": "http://example.com/term", "@type": "t2"},
"term3": {"@id": "http://example.com/term", "@language": "en"},
"term4": {"@id": "http://example.com/term", "@container": "@list"},
"term5": {"@id": "http://example.com/term", "@language": null},
"@language": "de"
},
"@id": "http://example.com/id1",
"@type": "t1",
"term1": "v1",
"term2": "v2",
"term3": "v3",
"term4": [ 1, 2 ],
"term5": [ "v5", "plain literal" ]
}
Compacting a document with multiple embedded uses of @graph
[
{
"@id": "http://data.wikipedia.org/snaks/Assertions",
"@type": "http://data.wikipedia.org/vocab#SnakSet",
"http://data.wikipedia.org/vocab#assertedBy": [
{ "@value": "Gregg Kellogg" }
],
"@graph": [
{
"@id": "http://data.wikipedia.org/snaks/BerlinFact",
"@type": [ "http://data.wikipedia.org/vocab#Snak" ],
"http://data.wikipedia.org/vocab#assertedBy": [ { "@value": "Statistik Berlin/Brandenburg" } ],
"@graph": [
{
"@id": "http://en.wikipedia.org/wiki/Berlin",
"http://data.wikipedia.org/vocab#population": [ 3499879 ]
}
]
}
]
}
]
{
"@context": {
"wd": "http://data.wikipedia.org/vocab#",
"ws": "http://data.wikipedia.org/snaks/",
"wp": "http://en.wikipedia.org/wiki/"
},
"@id": "ws:Assertions",
"@type": "wd:SnakSet",
"@graph": [
{
"@id": "ws:BerlinFact",
"@type": "wd:Snak",
"@graph": [
{
"@id": "wp:Berlin",
"wd:population": 3499879
}
],
"wd:assertedBy": "Statistik Berlin/Brandenburg"
}
],
"wd:assertedBy": "Gregg Kellogg"
}
Mapping a term to null causes the property and its values to be removed from the compacted document
{
"http://www.w3.org/2000/01/rdf-schema#comment": [
{ "@value": "Kommentar auf Deutsch.", "@language": "de" },
{ "@value": "Comment in English.", "@language": "en" }
]
}
{
"@context": [
{
"comment": { "@id": "http://www.w3.org/2000/01/rdf-schema#comment", "@language": "en" }
},
{
"comment": null,
"comment_en": { "@id": "http://www.w3.org/2000/01/rdf-schema#comment", "@language": "en" }
}
],
"comment_en": "Comment in English.",
"http://www.w3.org/2000/01/rdf-schema#comment": { "@value": "Kommentar auf Deutsch.", "@language": "de" }
}
Lists with values of different types use best term in compacted document
{
"@context": {
"type1": "http://example.com/t1",
"type2": "http://example.com/t2"
},
"@id": "http://example.com/id1",
"http://example.com/term": [
{
"@set": [
{ "@value": "v0.1", "@language": "de" },
{ "@value": "v0.2", "@language": "en" },
"v0.3",
4,
true,
false
]
},
{
"@list": [
{ "@value": "v1.1", "@language": "de" },
{ "@value": "v1.2", "@language": "en" },
"v1.3",
14,
true,
false
]
},
{
"@list": [
{ "@value": "v2.1", "@language": "en" },
{ "@value": "v2.2", "@language": "en" },
{ "@value": "v2.3", "@language": "en" },
{ "@value": "v2.4", "@language": "en" },
{ "@value": "v2.5", "@language": "en" },
{ "@value": "v2.6", "@language": "en" }
]
},
{
"@list": [
"v3.1",
"v3.2",
"v3.3",
"v3.4",
"v3.5",
"v3.6"
]
},
{
"@list": [
{ "@value": "v4.1", "@type": "type1" },
{ "@value": "v4.2", "@type": "type1" },
{ "@value": "v4.3", "@type": "type1" },
{ "@value": "v4.4", "@type": "type1" },
{ "@value": "v4.5", "@type": "type1" },
{ "@value": "v4.6", "@type": "type1" }
]
},
{
"@list": [
{ "@value": "v5.1", "@type": "type2" },
{ "@value": "v5.2", "@type": "type2" },
{ "@value": "v5.3", "@type": "type2" },
{ "@value": "v5.4", "@type": "type2" },
{ "@value": "v5.5", "@type": "type2" },
{ "@value": "v5.6", "@type": "type2" }
]
}
]
}
{
"@context": {
"type1": "http://example.com/t1",
"type2": "http://example.com/t2",
"@language": "de",
"term": { "@id": "http://example.com/term" },
"term1": { "@id": "http://example.com/term", "@container": "@list" },
"term2": { "@id": "http://example.com/term", "@container": "@list", "@language": "en" },
"term3": { "@id": "http://example.com/term", "@container": "@list", "@language": null },
"term4": { "@id": "http://example.com/term", "@container": "@list", "@type": "type1" },
"term5": { "@id": "http://example.com/term", "@container": "@list", "@type": "type2" }
},
"@id": "http://example.com/id1",
"term": [
"v0.1",
{ "@value": "v0.2", "@language": "en" },
{ "@value": "v0.3" },
4,
true,
false
],
"term1": [
"v1.1",
{ "@value": "v1.2", "@language": "en" },
{ "@value": "v1.3" },
14,
true,
false
],
"term2": [
"v2.1",
"v2.2",
"v2.3",
"v2.4",
"v2.5",
"v2.6"
],
"term3": [
"v3.1",
"v3.2",
"v3.3",
"v3.4",
"v3.5",
"v3.6"
],
"term4": [
"v4.1",
"v4.2",
"v4.3",
"v4.4",
"v4.5",
"v4.6"
],
"term5": [
"v5.1",
"v5.2",
"v5.3",
"v5.4",
"v5.5",
"v5.6"
]
}
Duplicate values in @list or @set are retained in compacted document
[{
"@id": "http://example.org/id",
"http://example.com/mylist": [{
"@list": [
{"@value": 1},
{"@value": 2},
{"@value": 2},
{"@value": 3}
]
}],
"http://example.com/myset": [
{"@value": 1},
{"@value": 2},
{"@value": 2},
{"@value": 3}
]
}]
{
"@context": {
"mylist": {"@id": "http://example.com/mylist", "@container": "@list"},
"myset": {"@id": "http://example.com/myset", "@container": "@set"}
},
"@id": "http://example.org/id",
"mylist": [1, 2, 2, 3],
"myset": [1, 2, 2, 3]
}
A term with @container: @list is also used as the value of an @id, if appropriate
{
"@context": {
"ex": "http://example.org/ns#"
},
"@id": "ex:property",
"ex:property": {
"@list": [1, 2]
}
}
{
"@context": {
"ex": "http://example.org/ns#",
"ex:property": {
"@container": "@list"
}
},
"@id": "ex:property",
"ex:property": [1, 2]
}
@vocab is used to create relative properties and types if no other term matches
[
{
"@id": "http://example.com/subdir/id/1",
"@type": [ "http://example.com/subdir/vocab/types/Test" ],
"http://example.com/subdir/vocab/date": [
{
"@value": "2011-01-25T00:00:00Z",
"@type": "http://example.com/subdir/vocab/types/dateTime"
}
],
"http://example.com/subdir/vocab/embed": [
{
"@id": "http://example.com/subdir/id/2",
"http://example.com/subdir/vocab/expandedDate": [
{
"@value": "2012-08-01T00:00:00Z",
"@type": "http://example.com/subdir/vocab/types/dateTime"
}
]
}
]
}
]
{
"@context": {
"@vocab": "http://example.com/subdir/",
"vocab/date": { "@type": "vocab/types/dateTime" }
},
"@id": "http://example.com/subdir/id/1",
"@type": "vocab/types/Test",
"vocab/date": "2011-01-25T00:00:00Z",
"vocab/embed": {
"@id": "http://example.com/subdir/id/2",
"vocab/expandedDate": {
"@value": "2012-08-01T00:00:00Z",
"@type": "vocab/types/dateTime"
}
}
}
Compact nested properties using @list containers
[
{
"@id": "https://example.org/ns#Game",
"@type": [
"http://www.w3.org/2002/07/owl#Class"
],
"https://example.org/ns#properties": [
{
"@list": [
{
"@id": "https://example.org/ns#title"
},
{
"@id": "https://example.org/ns#slug"
}
]
}
]
},
{
"@id": "https://example.org/ns#properties",
"@type": [
"http://www.w3.org/1999/02/22-rdf-syntax-ns#Property"
]
},
{
"@id": "https://example.org/ns#slug",
"@type": [
"http://www.w3.org/2002/07/owl#DataProperty",
"http://www.w3.org/2002/07/owl#FunctionalProperty"
]
},
{
"@id": "https://example.org/ns#title",
"@type": [
"http://www.w3.org/2002/07/owl#DataProperty"
]
}
]
{
"@context": {
"owl": "http://www.w3.org/2002/07/owl#",
"rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
"ex": "https://example.org/ns#",
"id": "@id",
"type": "@type",
"ex:properties": {
"@container": "@list"
}
},
"@graph": [
{
"id": "ex:Game",
"type": "owl:Class",
"ex:properties": [
{ "id": "ex:title" },
{ "id": "ex:slug" }
]
},
{
"id": "ex:properties",
"type": "rdf:Property"
},
{
"id": "ex:slug",
"type": [ "owl:DataProperty", "owl:FunctionalProperty" ]
},
{
"id": "ex:title",
"type": "owl:DataProperty"
}
]
}
@vocab takes precedence over prefixes - even if the result is longer
[
{
"@id": "http://example.com/subdir/id/1",
"@type": [ "http://example.com/subdir/vocab/types/Test" ],
"http://example.com/subdir/vocab/date": [
{
"@value": "2011-01-25T00:00:00Z",
"@type": "http://example.com/subdir/vocab/types/dateTime"
}
],
"http://example.com/subdir/vocab/embed": [
{
"@id": "http://example.com/subdir/id/2",
"http://example.com/subdir/vocab/expandedDate": [
{
"@value": "2012-08-01T00:00:00Z",
"@type": "http://example.com/subdir/vocab/types/dateTime"
}
]
}
]
}
]
{
"@context": {
"@vocab": "http://example.com/",
"ex": "http://example.com/subdir/",
"ex:vocab/date": { "@type": "ex:vocab/types/dateTime" }
},
"@id": "ex:id/1",
"@type": "subdir/vocab/types/Test",
"ex:vocab/date": "2011-01-25T00:00:00Z",
"subdir/vocab/embed": {
"@id": "ex:id/2",
"subdir/vocab/expandedDate": {
"@value": "2012-08-01T00:00:00Z",
"@type": "subdir/vocab/types/dateTime"
}
}
}
The most specific term that matches all of the elements in the list, taking into account the default language, must be selected.
{
"@context": {
"type1": "http://example.com/t1",
"type2": "http://example.com/t2"
},
"@id": "http://example.com/id1",
"http://example.com/termLanguage": [
{
"@list": [
{ "@value": "termLL0.1", "@language": "de" },
{ "@value": "termLL0.2", "@language": "de" }
]
},
{
"@list": [
{ "@value": "termLL1.1", "@language": "en" },
{ "@value": "termLL1.2", "@language": "en" }
]
},
{
"@list": [
"termLL2.1",
"termLL2.2"
]
}
],
"http://example.com/termType": [
{
"@list": [
{ "@value": "termTL0.1", "@type": "type1" },
{ "@value": "termTL0.2", "@type": "type2" }
]
},
{
"@list": [
{ "@value": "termTL1.1", "@type": "type1" },
{ "@value": "termTL1.2", "@type": "type1" }
]
},
{
"@list": [
{ "@value": "termTL2.1", "@type": "type2" },
{ "@value": "termTL2.2", "@type": "type2" }
]
}
]
}
{
"@context": {
"type1": "http://example.com/t1",
"type2": "http://example.com/t2",
"@language": "de",
"termL": { "@id": "http://example.com/termLanguage" },
"termLL0": { "@id": "http://example.com/termLanguage", "@container": "@list" },
"termLL1": { "@id": "http://example.com/termLanguage", "@container": "@list", "@language": "en" },
"termLL2": { "@id": "http://example.com/termLanguage", "@container": "@list", "@language": null },
"termT": { "@id": "http://example.com/termType" },
"termTL0": { "@id": "http://example.com/termType", "@container": "@list" },
"termTL1": { "@id": "http://example.com/termType", "@container": "@list", "@type": "type1" },
"termTL2": { "@id": "http://example.com/termType", "@container": "@list", "@type": "type2" }
},
"@id": "http://example.com/id1",
"termLL0": [
"termLL0.1",
"termLL0.2"
],
"termLL1": [
"termLL1.1",
"termLL1.2"
],
"termLL2": [
"termLL2.1",
"termLL2.2"
],
"termTL0": [
{
"@type": "type1",
"@value": "termTL0.1"
},
{
"@type": "type2",
"@value": "termTL0.2"
}
],
"termTL1": [
"termTL1.1",
"termTL1.2"
],
"termTL2": [
"termTL2.1",
"termTL2.2"
]
}
Multiple values with different languages use language maps if property has @container: @language
[
{
"@id": "http://example.com/queen",
"http://example.com/vocab/label":
[
{
"@value": "The Queen",
"@language": "en"
}, {
"@value": "Die Königin",
"@language": "de"
}, {
"@value": "Ihre Majestät",
"@language": "de"
}
]
}
]
{
"@context": {
"vocab": "http://example.com/vocab/",
"label": {
"@id": "vocab:label",
"@container": "@language"
}
},
"@id": "http://example.com/queen",
"label": {
"en": "The Queen",
"de": [ "Die Königin", "Ihre Majestät" ]
}
}
Test appropriate property use given language maps with @vocab, a default language, and a competing term
[{
"@id": "http://example.com/queen",
"http://example.com/vocab/label": [
{
"@value": "Il re",
"@language": "it"
}, {
"@value": "The king",
"@language": "en"
}, {
"@value": "The Queen",
"@language": "en"
}, {
"@value": "Die Königin",
"@language": "de"
}, {
"@value": "Ihre Majestät",
"@language": "de"
}
]
}]
{
"@context": {
"@vocab": "http://example.com/vocab/",
"@language": "it",
"s": { "@id": "label", "@language": "en" },
"label": {
"@container": "@language"
}
},
"@id": "http://example.com/queen",
"label": {
"it": "Il re",
"en": [ "The king", "The Queen" ],
"de": [ "Die Königin", "Ihre Majestät" ]
}
}
Fall back to term with @set container if term with language map is defined
[{
"@id": "http://example.com/queen",
"http://example.com/vocab/label": [
{
"@value": "Il re",
"@language": "it"
}, {
"@value": "The king",
"@language": "en"
}, {
"@value": "The Queen",
"@language": "en"
}, {
"@value": "Die Königin",
"@language": "de"
}, {
"@value": "Ihre Majestät",
"@language": "de"
}
]
}]
{
"@context": {
"label": "http://example.com/vocab/label",
"container": { "@id": "label", "@container": "@set" }
},
"@id": "http://example.com/queen",
"container": [
{
"@value": "Il re",
"@language": "it"
}, {
"@value": "The king",
"@language": "en"
}, {
"@value": "The Queen",
"@language": "en"
}, {
"@value": "Die Königin",
"@language": "de"
}, {
"@value": "Ihre Majestät",
"@language": "de"
}
]
}
Combination of keyword aliases and @vocab
{
"@context": {
"@vocab": "http://xmlns.com/foaf/0.1/",
"homepage": {
"@type": "@id"
},
"uri": "@id"
},
"uri": "http://me.markus-lanthaler.com/",
"name": "Markus Lanthaler",
"homepage": "http://www.markus-lanthaler.com/"
}
{
"@context": {
"@vocab": "http://xmlns.com/foaf/0.1/",
"homepage": {
"@type": "@id"
},
"uri": "@id"
},
"uri": "http://me.markus-lanthaler.com/",
"name": "Markus Lanthaler",
"homepage": "http://www.markus-lanthaler.com/"
}
Output uses index mapping if term is defined with @container: @index
[{
"@id": "http://example.com/article",
"http://example.com/vocab/author": [{
"@id": "http://example.org/person/1",
"@index": "regular"
}, {
"@id": "http://example.org/guest/cd24f329aa",
"@index": "guest"
}]
}]
{
"@context": {
"author": {
"@id": "http://example.com/vocab/author",
"@container": "@index"
}
},
"@id": "http://example.com/article",
"author": {
"regular": {
"@id": "http://example.org/person/1"
},
"guest": {
"@id": "http://example.org/guest/cd24f329aa"
}
}
}
Preserve @index tags if not compacted to an index map
[
{
"@id": "http://example.org/indexTest",
"http://example.com/container": [
{
"@id": "http://example.org/nodeWithoutIndexA",
"@index": "A"
},
{
"@id": "http://example.org/nodeWithIndexA",
"@index": "this overrides the 'A' index from the container"
},
{
"@value": 1,
"@index": "A"
},
{
"@value": true,
"@index": "A"
},
{
"@value": false,
"@index": "A"
},
{
"@value": "simple string A",
"@index": "A"
},
{
"@value": "typed literal A",
"@type": "http://example.org/type",
"@index": "A"
},
{
"@value": "language-tagged string A",
"@language": "en",
"@index": "A"
},
{
"@value": "simple string B",
"@index": "B"
},
{
"@id": "http://example.org/nodeWithoutIndexC",
"@index": "C"
},
{
"@id": "http://example.org/nodeWithIndexC",
"@index": "this overrides the 'C' index from the container"
},
{
"@value": 3,
"@index": "C"
},
{
"@value": true,
"@index": "C"
},
{
"@value": false,
"@index": "C"
},
{
"@value": "simple string C",
"@index": "C"
},
{
"@value": "typed literal C",
"@type": "http://example.org/type",
"@index": "C"
},
{
"@value": "language-tagged string C",
"@language": "en",
"@index": "C"
}
],
"http://example.com/property": [
{
"@id": "http://example.org/nodeWithoutIndexProp"
},
{
"@id": "http://example.org/nodeWithIndexProp",
"@index": "prop"
},
{
"@value": 3,
"@index": "prop"
},
{
"@value": true,
"@index": "prop"
},
{
"@value": false,
"@index": "prop"
},
{
"@value": "simple string no index"
},
{
"@value": "typed literal Prop",
"@type": "http://example.org/type",
"@index": "prop"
},
{
"@value": "language-tagged string Prop",
"@language": "en",
"@index": "prop"
},
{
"@value": "index using an array with just one element (automatic recovery)",
"@index": "prop"
}
]
}
]
{
"@context": {
"property": "http://example.com/property",
"indexContainer": { "@id": "http://example.com/container", "@container": "@index" }
},
"@id": "http://example.org/indexTest",
"indexContainer": {
"A": [
{
"@id": "http://example.org/nodeWithoutIndexA"
},
1,
true,
false,
"simple string A",
{
"@value": "typed literal A",
"@type": "http://example.org/type"
},
{
"@value": "language-tagged string A",
"@language": "en"
}
],
"this overrides the 'A' index from the container": {
"@id": "http://example.org/nodeWithIndexA"
},
"B": "simple string B",
"C": [
{
"@id": "http://example.org/nodeWithoutIndexC"
},
3,
true,
false,
"simple string C",
{
"@value": "typed literal C",
"@type": "http://example.org/type"
},
{
"@value": "language-tagged string C",
"@language": "en"
}
],
"this overrides the 'C' index from the container": {
"@id": "http://example.org/nodeWithIndexC"
}
},
"property": [
{
"@id": "http://example.org/nodeWithoutIndexProp"
},
{
"@id": "http://example.org/nodeWithIndexProp",
"@index": "prop"
},
{
"@value": 3,
"@index": "prop"
},
{
"@value": true,
"@index": "prop"
},
{
"@value": false,
"@index": "prop"
},
"simple string no index",
{
"@value": "typed literal Prop",
"@type": "http://example.org/type",
"@index": "prop"
},
{
"@value": "language-tagged string Prop",
"@language": "en",
"@index": "prop"
},
{
"@value": "index using an array with just one element (automatic recovery)",
"@index": "prop"
}
]
}
Compact traverses through @reverse
[
{
"@id": "http://example.com/people/markus",
"@reverse": {
"http://xmlns.com/foaf/0.1/knows": [
{
"@id": "http://example.com/people/dave",
"http://xmlns.com/foaf/0.1/name": [ { "@value": "Dave Longley" } ]
}
]
},
"http://xmlns.com/foaf/0.1/name": [ { "@value": "Markus Lanthaler" } ]
}
]
{
"@context": {
"name": "http://xmlns.com/foaf/0.1/name"
},
"@id": "http://example.com/people/markus",
"name": "Markus Lanthaler",
"@reverse": {
"http://xmlns.com/foaf/0.1/knows": {
"@id": "http://example.com/people/dave",
"name": "Dave Longley"
}
}
}
Compact traverses through @reverse
[
{
"@id": "http://example.com/people/markus",
"@reverse": {
"http://xmlns.com/foaf/0.1/knows": [
{
"@id": "http://example.com/people/dave",
"http://xmlns.com/foaf/0.1/name": [ { "@value": "Dave Longley" } ]
}
]
},
"http://xmlns.com/foaf/0.1/name": [ { "@value": "Markus Lanthaler" } ]
}
]
{
"@context": {
"name": "http://xmlns.com/foaf/0.1/name",
"knows": "http://xmlns.com/foaf/0.1/knows"
},
"@id": "http://example.com/people/markus",
"name": "Markus Lanthaler",
"@reverse": {
"knows": {
"@id": "http://example.com/people/dave",
"name": "Dave Longley"
}
}
}
A reverse map is replaced with a matching property defined with @reverse
[
{
"@id": "http://example.com/people/markus",
"@reverse": {
"http://xmlns.com/foaf/0.1/knows": [
{
"@id": "http://example.com/people/dave",
"http://xmlns.com/foaf/0.1/name": [ { "@value": "Dave Longley" } ]
}
]
},
"http://xmlns.com/foaf/0.1/name": [ { "@value": "Markus Lanthaler" } ]
}
]
{
"@context": {
"name": "http://xmlns.com/foaf/0.1/name",
"isKnownBy": { "@reverse": "http://xmlns.com/foaf/0.1/knows" }
},
"@id": "http://example.com/people/markus",
"name": "Markus Lanthaler",
"isKnownBy": {
"@id": "http://example.com/people/dave",
"name": "Dave Longley"
}
}
Do not use reverse property if no other property matches as normal property
[
{
"@id": "http://example.com/people/markus",
"http://xmlns.com/foaf/0.1/knows": [
{
"@id": "http://example.com/people/dave",
"http://xmlns.com/foaf/0.1/name": [ { "@value": "Dave Longley" } ]
},
{
"@id": "http://example.com/people/gregg",
"http://xmlns.com/foaf/0.1/name": [ { "@value": "Gregg Kellogg" } ]
}
],
"http://xmlns.com/foaf/0.1/name": [ { "@value": "Markus Lanthaler" } ]
}
]
{
"@context": {
"name": "http://xmlns.com/foaf/0.1/name",
"isKnownBy": { "@reverse": "http://xmlns.com/foaf/0.1/knows" }
},
"@id": "http://example.com/people/markus",
"name": "Markus Lanthaler",
"http://xmlns.com/foaf/0.1/knows": [
{
"@id": "http://example.com/people/dave",
"name": "Dave Longley"
},
{
"@id": "http://example.com/people/gregg",
"name": "Gregg Kellogg"
}
]
}
Compact node references to strings for reverse properties using @type: @id
[
{
"@id": "http://example.com/people/markus",
"@reverse": {
"http://xmlns.com/foaf/0.1/knows": [
{
"@id": "http://example.com/people/dave"
},
{
"@id": "http://example.com/people/gregg"
}
]
},
"http://xmlns.com/foaf/0.1/name": [ { "@value": "Markus Lanthaler" } ]
}
]
{
"@context": {
"name": "http://xmlns.com/foaf/0.1/name",
"isKnownBy": { "@reverse": "http://xmlns.com/foaf/0.1/knows", "@type": "@id" }
},
"@id": "http://example.com/people/markus",
"name": "Markus Lanthaler",
"isKnownBy": [
"http://example.com/people/dave",
"http://example.com/people/gregg"
]
}
Compact using both reverse properties and index containers
[
{
"@id": "http://example.com/people/markus",
"@reverse": {
"http://xmlns.com/foaf/0.1/knows": [
{
"@id": "http://example.com/people/dave",
"@index": "Dave",
"http://xmlns.com/foaf/0.1/name": [ { "@value": "Dave Longley" } ]
},
{
"@id": "http://example.com/people/gregg",
"@index": "Gregg",
"http://xmlns.com/foaf/0.1/name": [ { "@value": "Gregg Kellogg" } ]
}
]
},
"http://xmlns.com/foaf/0.1/name": [ { "@value": "Markus Lanthaler" } ]
}
]
{
"@context": {
"name": "http://xmlns.com/foaf/0.1/name",
"isKnownBy": { "@reverse": "http://xmlns.com/foaf/0.1/knows", "@container": "@index" }
},
"@id": "http://example.com/people/markus",
"name": "Markus Lanthaler",
"isKnownBy": {
"Dave": {
"@id": "http://example.com/people/dave",
"name": "Dave Longley"
},
"Gregg": {
"@id": "http://example.com/people/gregg",
"name": "Gregg Kellogg"
}
}
}
Compact keys in @reverse using @vocab
[
{
"@id": "http://example.com/people/markus",
"@reverse": {
"http://xmlns.com/foaf/0.1/knows": [
{
"@id": "http://example.com/people/dave",
"http://xmlns.com/foaf/0.1/name": [ { "@value": "Dave Longley" } ]
}
],
"http://example.com/vocab/noTerm": [
{
"@id": "http://json-ld.org/test-suite/tests/relative-node",
"http://xmlns.com/foaf/0.1/name": [ { "@value": "Compact keys using @vocab" } ]
}
]
},
"http://xmlns.com/foaf/0.1/name": [ { "@value": "Markus Lanthaler" } ]
}
]
{
"@context": {
"name": "http://xmlns.com/foaf/0.1/name",
"knows": "http://xmlns.com/foaf/0.1/knows",
"@vocab": "http://example.com/vocab/"
},
"@id": "http://example.com/people/markus",
"name": "Markus Lanthaler",
"@reverse": {
"knows": {
"@id": "http://example.com/people/dave",
"name": "Dave Longley"
},
"noTerm": {
"@id": "relative-node",
"name": "Compact keys using @vocab"
}
}
}
Complext round-tripping use case from Drupal
{
"@context": {
"site": "http://example.com/",
"site-cd": "site:site-schema/content-deployment/",
"title": {
"@id": "site-cd:node/article/title",
"@container": "@index"
},
"body": {
"@id": "site-cd:node/article/body",
"@container": "@index"
},
"field_tags": {
"@id": "site-cd:node/article/field_tags",
"@container": "@index"
}
},
"@id": "site:node/1",
"@type": "site-cd:node/article",
"title": {
"en": [
{
"@context": {
"value": "site-cd:node/article/title/value"
},
"@type": "site-cd:field-types/title_field",
"value": "This is the English title"
}
],
"es": [
{
"@context": {
"value": "site-cd:node/article/title/value"
},
"@type": "site-cd:field-types/title_field",
"value": "Este es el t’tulo espa–ol"
}
]
},
"body": {
"en": [
{
"@context": {
"value": "site-cd:node/article/body/value",
"summary": "site-cd:node/article/body/summary",
"format": "site-cd:node/article/body/format"
},
"@type": "site-cd:field-types/text_with_summary",
"value": "This is the English body. There is no Spanish body, so this will be displayed for both the English and Spanish versions.",
"summary": "This is the teaser for the body.",
"format": "full_html"
}
]
},
"field_tags": {
"en": [
{
"@context": {
"uuid": "site-cd:taxonomy/term/uuid"
},
"@type": "site-cd:taxonomy/term",
"@id": "site:taxonomy/term/1",
"uuid": "e34b982c-98ac-4862-9b00-fa771a388010"
}
],
"es": [
{
"@context": {
"uuid": "site-cd:taxonomy/term/uuid"
},
"@type": "site-cd:taxonomy/term",
"@id": "site:taxonomy/term/1",
"uuid": "e34b982c-98ac-4862-9b00-fa771a388010"
},
{
"@context": {
"uuid": "site-cd:taxonomy/term/uuid"
},
"@type": "site-cd:taxonomy/term",
"@id": "site:taxonomy/term/2",
"uuid": "a55b982c-58ac-4862-9b00-aa221a388010"
}
]
}
}
{
"@context": {
"site": "http://example.com/",
"site-cd": "site:site-schema/content-deployment/",
"title": {
"@id": "site-cd:node/article/title",
"@container": "@index"
},
"body": {
"@id": "site-cd:node/article/body",
"@container": "@index"
},
"field_tags": {
"@id": "site-cd:node/article/field_tags",
"@container": "@index"
}
},
"@id": "site:node/1",
"@type": "site-cd:node/article",
"title": {
"en": {
"@type": "site-cd:field-types/title_field",
"title:/value": "This is the English title"
},
"es": {
"@type": "site-cd:field-types/title_field",
"title:/value": "Este es el t’tulo espa–ol"
}
},
"body": {
"en": {
"@type": "site-cd:field-types/text_with_summary",
"body:/value": "This is the English body. There is no Spanish body, so this will be displayed for both the English and Spanish versions.",
"body:/summary": "This is the teaser for the body.",
"body:/format": "full_html"
}
},
"field_tags": {
"en": {
"@type": "site-cd:taxonomy/term",
"@id": "site:taxonomy/term/1",
"site-cd:taxonomy/term/uuid": "e34b982c-98ac-4862-9b00-fa771a388010"
},
"es": [
{
"@type": "site-cd:taxonomy/term",
"@id": "site:taxonomy/term/1",
"site-cd:taxonomy/term/uuid": "e34b982c-98ac-4862-9b00-fa771a388010"
},
{
"@type": "site-cd:taxonomy/term",
"@id": "site:taxonomy/term/2",
"site-cd:taxonomy/term/uuid": "a55b982c-58ac-4862-9b00-aa221a388010"
}
]
}
}
Value of @graph is always an array
[
{
"@id": "http://example.com/graph/1",
"@graph": [
{
"@id": "http://example.com/node/1",
"http://example.com/property": [ { "@value": "property" } ]
}
]
}
]
{
"@id": "http://example.com/graph/1",
"@graph": [
{
"@id": "http://example.com/node/1",
"http://example.com/property": "property"
}
]
}
Ensure that value of @list is always an array
[
{
"@id": "http://me.markus-lanthaler.com/",
"http://example.com/list": {
"@list": [
"one item"
]
}
}
]
{
"@id": "http://me.markus-lanthaler.com/",
"http://example.com/list": {
"@list": [
"one item"
]
}
}
If an index is present, a term having an @list container is not selected
[
{
"@id": "http://example.com/node",
"http://example.com/property": [
{
"@index": "an index",
"@list": [
{
"@value": "one item"
}
]
}
]
}
]
{
"@context": {
"name": { "@id": "http://example.com/property", "@container": "@list" }
},
"@id": "http://example.com/node",
"http://example.com/property": {
"@list": [
"one item"
],
"@index": "an index"
}
}
Make sure keyword aliasing works if a list can't be compacted
[
{
"@id": "http://example.com/node",
"http://example.com/property": [
{
"@list": [
{
"@value": "one item"
}
],
"@index": "an index"
}
]
}
]
{
"@context": {
"listAlias": "@list",
"indexAlias": "@index"
},
"@id": "http://example.com/node",
"http://example.com/property": {
"listAlias": [
"one item"
],
"indexAlias": "an index"
}
}
Ensure that @vocab compaction isn't used if the result collides with a term
[
{
"@id": "http://example.com/node",
"http://example.com/name": [
{ "@value": "Markus Lanthaler" }
]
}
]
{
"@context": {
"@vocab": "http://example.com/",
"name": "http://xmlns.com/foaf/0.1/name"
},
"@id": "http://example.com/node",
"http://example.com/name": "Markus Lanthaler"
}
Prefer properties with @type: @vocab in reverse-maps if the value can be compacted to a term
[
{
"@id": "http://example.com/people/markus",
"@reverse": {
"http://xmlns.com/foaf/0.1/knows": [
{
"@id": "http://example.com/people/dave"
},
{
"@id": "http://example.com/people/DefinedTerm"
}
]
},
"http://xmlns.com/foaf/0.1/name": [ { "@value": "Markus Lanthaler" } ]
}
]
{
"@context": {
"name": "http://xmlns.com/foaf/0.1/name",
"knows": { "@id": "http://xmlns.com/foaf/0.1/knows", "@type": "@id" },
"knowsVocab": { "@id": "http://xmlns.com/foaf/0.1/knows", "@type": "@vocab" },
"DefinedTerm": "http://example.com/people/DefinedTerm"
},
"@id": "http://example.com/people/markus",
"name": "Markus Lanthaler",
"@reverse": {
"knows": "http://example.com/people/dave",
"knowsVocab": "DefinedTerm"
}
}
Values of @id are transformed to relative IRIs, terms are ignored
[
{
"@id": "http://json-ld.org/test-suite/tests/term",
"http://example.com/property": [
{
"@id": "http://example.com/compact-iris-are-considered",
"http://example.com/property": [
{ "@value": "@id supports the following values: relative, absolute, and compact IRIs" }
]
},
{
"@id": "http://json-ld.org/test-suite/parent-node",
"http://example.com/property": [
{ "@value": "relative IRIs get resolved against the document's base IRI" }
]
}
]
}
]
{
"@context": {
"term": "http://example.com/terms-are-not-considered-in-id",
"compact-iris": "http://example.com/compact-iris-",
"property": "http://example.com/property",
"@vocab": "http://example.org/vocab-is-not-considered-for-id"
},
"@id": "term",
"property": [
{
"@id": "compact-iris:are-considered",
"property": "@id supports the following values: relative, absolute, and compact IRIs"
},
{
"@id": "../parent-node",
"property": "relative IRIs get resolved against the document's base IRI"
}
]
}
Wrap top-level array into @graph even if no context is passed
[
{
"@id": "http://me.markus-lanthaler.com/",
"http://xmlns.com/foaf/0.1/name": "Markus Lanthaler"
},
{
"@id": "http://greggkellogg.net/foaf#me",
"http://xmlns.com/foaf/0.1/name": "Gregg Kellogg"
}
]
{
"@graph": [
{
"@id": "http://me.markus-lanthaler.com/",
"http://xmlns.com/foaf/0.1/name": "Markus Lanthaler"
},
{
"@id": "http://greggkellogg.net/foaf#me",
"http://xmlns.com/foaf/0.1/name": "Gregg Kellogg"
}
]
}
Relative URLs remain relative after compaction
{
"@context": {
"@base": "http://example.com/",
"link": { "@id": "http://example.com/link", "@type": "@id" }
},
"link": "relative-url"
}
{
"@context": {
"@base": "http://example.com/",
"link": { "@id": "http://example.com/link", "@type": "@id" }
},
"link": "relative-url"
}
Prefer terms with a language mapping set to null over terms without language-mapping for non-strings
{
"http://example.com/propertyA": 5,
"http://example.com/propertyB": 5
}
{
"@context": {
"@language": "de",
"propertyLanguageNull": {
"@id": "http://example.com/propertyA",
"@language": null
},
"propertyNoLang": "http://example.com/propertyA",
"propertyB": "http://example.com/propertyB"
},
"propertyLanguageNull": 5,
"propertyB": 5
}
List compaction without @container: @list still uses strings if @type: @id
{
"@context": {
"property": { "@id": "http://example.org", "@type": "@id" }
},
"property": { "@list": [ "http://example.com/node/a", "http://example.com/node/b", "http://example.com/node/c" ] }
}
{
"@context": {
"property": { "@id": "http://example.org", "@type": "@id" }
},
"property": { "@list": [ "http://example.com/node/a", "http://example.com/node/b", "http://example.com/node/c" ] }
}
Node references in reverse properties are not compacted to strings without explicit type-coercion
[
{
"@id": "http://example.com/people/markus",
"@reverse": {
"http://xmlns.com/foaf/0.1/knows": [
{
"@id": "http://example.com/people/dave"
},
{
"@id": "http://example.com/people/gregg"
}
]
},
"http://xmlns.com/foaf/0.1/name": [ { "@value": "Markus Lanthaler" } ]
}
]
{
"@context": {
"name": "http://xmlns.com/foaf/0.1/name",
"isKnownBy": { "@reverse": "http://xmlns.com/foaf/0.1/knows" }
},
"@id": "http://example.com/people/markus",
"name": "Markus Lanthaler",
"isKnownBy": [
{ "@id": "http://example.com/people/dave" },
{ "@id": "http://example.com/people/gregg" }
]
}
Native values survive round-tripping with @list
{
"http://example.org/term": {
"@list": [1]
}
}
{
"http://example.org/term": {
"@list": [1]
}
}
Native values survive round-tripping with @list and @graph alias
{
"@context": {
"graph": "@graph",
"term": "http://example.org/term"
},
"graph": [
{
"term": {
"@list": [1]
}
},
{
"term": {
"@list": [2]
}
}
]
}
{
"@context": {
"graph": "@graph",
"term": "http://example.org/term"
},
"graph": [
{
"term": {
"@list": [1]
}
},
{
"term": {
"@list": [2]
}
}
]
}
Compact to @type: @vocab when no @type: @id term available
[{
"http://example.org/term": [{"@id": "http://example.org/enum"}]
}]
{
"@context": {
"term": {"@id": "http://example.org/term", "@type": "@vocab"}
},
"term": "http://example.org/enum"
}
Compact to @type: @vocab and compact @id to term
[{
"http://example.org/term": [{"@id": "http://example.org/enum"}]
}]
{
"@context": {
"term": {"@id": "http://example.org/term", "@type": "@vocab"},
"enum": {"@id": "http://example.org/enum"}
},
"term": "enum"
}
Compacting IRI value of property with @type: @vocab can use term
{
"@context": {
"term": {"@id": "http://example.org/term", "@type": "@vocab"},
"enum": {"@id": "http://example.org/enum"}
},
"term": "enum"
}
{
"@context": {
"term": {"@id": "http://example.org/term", "@type": "@vocab"},
"enum": {"@id": "http://example.org/enum"}
},
"term": "enum"
}
Compacting IRI value of property with @type: @vocab can use term
[{
"http://example.org/term": [{"@id": "http://example.org/enum"}]
}]
{
"@context": {
"term": {"@id": "http://example.org/term", "@type": "@vocab"},
"doNotSelect": {"@id": "http://example.org/term"},
"enum": {"@id": "http://example.org/enum"}
},
"term": "enum"
}
Compacting IRI value of property with @type: @vocab can use term; more complex
{
"@context": {
"name": "http://xmlns.com/foaf/0.1/name",
"homepageID": { "@id": "http://xmlns.com/foaf/0.1/homepage", "@type": "@id" },
"homepageV": { "@id": "http://xmlns.com/foaf/0.1/homepage", "@type": "@vocab" },
"linkID": { "@id": "http://example.com/link", "@type": "@id" },
"linkV": { "@id": "http://example.com/link", "@type": "@vocab" },
"MarkusHomepage": "http://www.markus-lanthaler.com/",
"relative-iri": "http://example.com/error-if-this-is-used-for-link"
},
"@id": "http://me.markus-lanthaler.com/",
"name": "Markus Lanthaler",
"homepageV": "MarkusHomepage",
"linkID": "relative-iri"
}
{
"@context": {
"name": "http://xmlns.com/foaf/0.1/name",
"homepageID": { "@id": "http://xmlns.com/foaf/0.1/homepage", "@type": "@id" },
"homepageV": { "@id": "http://xmlns.com/foaf/0.1/homepage", "@type": "@vocab" },
"linkID": { "@id": "http://example.com/link", "@type": "@id" },
"linkV": { "@id": "http://example.com/link", "@type": "@vocab" },
"MarkusHomepage": "http://www.markus-lanthaler.com/",
"relative-iri": "http://example.com/error-if-this-is-used-for-link"
},
"@id": "http://me.markus-lanthaler.com/",
"name": "Markus Lanthaler",
"homepageV": "MarkusHomepage",
"linkID": "relative-iri"
}
Choose a term having @type: @id over @type: @value if value is not a term
[{
"http://example.org/term": [{"@id": "http://example.org/enum"}]
}]
{
"@context": {
"notChosen": {"@id": "http://example.org/term", "@type": "@vocab"},
"chosen": {"@id": "http://example.org/term", "@type": "@id"}
},
"chosen": "http://example.org/enum"
}
If there's no term with @type: @id, use terms with @type: @vocab for IRIs not mapped to terms
[
{
"http://example.com/vocab#foo": [
{ "@id": "http://example.com/vocab#Bar" },
{ "@id": "http://example.com/vocab#Baz" }
]
}
]
{
"@context": {
"Bar": "http://example.com/vocab#Bar",
"foo": {
"@id": "http://example.com/vocab#foo",
"@type": "@vocab"
}
},
"foo": [
"Bar",
"http://example.com/vocab#Baz"
]
}
If there's no term with @type: @vocab, use terms with @type: @id for IRIs mapped to terms
[
{
"http://example.com/vocab#foo": [
{ "@id": "http://example.com/vocab#Bar" },
{ "@id": "http://example.com/vocab#Baz" }
]
}
]
{
"@context": {
"Bar": "http://example.com/vocab#Bar",
"foo": {
"@id": "http://example.com/vocab#foo",
"@type": "@id"
}
},
"foo": [
"http://example.com/vocab#Bar",
"http://example.com/vocab#Baz"
]
}
Separate IRIs for the same property to use term with more specific @type (@id vs. @vocab)
[
{
"http://example.com/vocab#foo": [
{ "@id": "http://example.com/vocab#Bar" },
{ "@id": "http://example.com/vocab#Baz" }
]
}
]
{
"@context": {
"Bar": "http://example.com/vocab#Bar",
"fooI": {
"@id": "http://example.com/vocab#foo",
"@type": "@id"
},
"fooV": {
"@id": "http://example.com/vocab#foo",
"@type": "@vocab"
}
},
"fooV": "Bar",
"fooI": "http://example.com/vocab#Baz"
}
Relative IRIs don't round-trip with @type: @vocab
{
"@context": {
"term": { "@id": "http://example.org/term", "@type": "@vocab" }
},
"term": "not-a-term-thus-a-relative-IRI"
}
{
"@context": {
"term": { "@id": "http://example.org/term", "@type": "@vocab" }
},
"term": "http://json-ld.org/test-suite/tests/not-a-term-thus-a-relative-IRI"
}
Term with @type: @vocab will use compact IRIs
{
"@context": {
"term": { "@id": "http://example.org/term", "@type": "@vocab" },
"prefix": "http://example.com/vocab#"
},
"term": "prefix:suffix"
}
{
"@context": {
"term": { "@id": "http://example.org/term", "@type": "@vocab" },
"prefix": "http://example.com/vocab#"
},
"term": "prefix:suffix"
}
Given values with both @index and @language and term index-map term, use index map
[
{
"@id": "http://example.com.com/",
"http://example.com/property": [
{
"@value": "Deutsche Zeichenfolge in @index-map",
"@index": "first",
"@language": "de"
},
{
"@value": "English string in @index-map",
"@index": "second",
"@language": "en"
}
]
}
]
{
"@context": {
"property": { "@id": "http://example.com/property", "@container": "@index" }
},
"@id": "http://example.com.com/",
"property": {
"first": {
"@language": "de",
"@value": "Deutsche Zeichenfolge in @index-map"
},
"second": {
"@language": "en",
"@value": "English string in @index-map"
}
}
}
Language-tagged and indexed strings don't compact to language-map
[
{
"@id": "http://example.com.com/",
"http://example.com/property": [
{
"@value": "Deutsche Zeichenfolge in @index-map",
"@index": "first",
"@language": "de"
},
{
"@value": "English string in @index-map",
"@index": "second",
"@language": "en"
}
]
}
]
{
"@context": {
"property": { "@id": "http://example.com/property", "@container": "@language" }
},
"@id": "http://example.com.com/",
"http://example.com/property": [
{
"@index": "first",
"@language": "de",
"@value": "Deutsche Zeichenfolge in @index-map"
},
{
"@index": "second",
"@language": "en",
"@value": "English string in @index-map"
}
]
}
Complex use cases for relative IRI compaction
[
{
"@id": "http://json-ld.org/test-suite/tests/relativeIris",
"@type": [
"http://json-ld.org/test-suite/tests/link",
"http://json-ld.org/test-suite/tests/compact-0066-in.jsonld#fragment-works",
"http://json-ld.org/test-suite/tests/compact-0066-in.jsonld?query=works",
"http://json-ld.org/test-suite/tests/",
"http://json-ld.org/test-suite/",
"http://json-ld.org/test-suite/parent",
"http://json-ld.org/parent-parent-eq-root",
"http://json-ld.org/still-root",
"http://json-ld.org/too-many-dots",
"http://json-ld.org/absolute",
"http://example.org/scheme-relative"
],
"http://www.example.com/link": [ {
"@list": [
{ "@id": "http://json-ld.org/test-suite/tests/link" },
{ "@id": "http://json-ld.org/test-suite/tests/compact-0066-in.jsonld#fragment-works" },
{ "@id": "http://json-ld.org/test-suite/tests/compact-0066-in.jsonld?query=works" },
{ "@id": "http://json-ld.org/test-suite/tests/" },
{ "@id": "http://json-ld.org/test-suite/" },
{ "@id": "http://json-ld.org/test-suite/parent" },
{ "@id": "http://json-ld.org/test-suite/parent#fragment" },
{ "@id": "http://json-ld.org/parent-parent-eq-root" },
{ "@id": "http://json-ld.org/still-root" },
{ "@id": "http://json-ld.org/too-many-dots" },
{ "@id": "http://json-ld.org/absolute" },
{ "@id": "http://example.org/scheme-relative" }
]
} ]
}
]
{
"@context": {
"links": { "@id": "http://www.example.com/link", "@type": "@id", "@container": "@list" }
},
"@id": "relativeIris",
"@type": [
"http://json-ld.org/test-suite/tests/link",
"http://json-ld.org/test-suite/tests/compact-0066-in.jsonld#fragment-works",
"http://json-ld.org/test-suite/tests/compact-0066-in.jsonld?query=works",
"http://json-ld.org/test-suite/tests/",
"http://json-ld.org/test-suite/",
"http://json-ld.org/test-suite/parent",
"http://json-ld.org/parent-parent-eq-root",
"http://json-ld.org/still-root",
"http://json-ld.org/too-many-dots",
"http://json-ld.org/absolute",
"http://example.org/scheme-relative"
],
"links": [
"link",
"#fragment-works",
"?query=works",
"./",
"../",
"../parent",
"../parent#fragment",
"../../parent-parent-eq-root",
"../../still-root",
"../../too-many-dots",
"../../absolute",
"http://example.org/scheme-relative"
]
}
Compact reverse property whose values are unlabeled blank nodes
[
{
"@id": "http://example.com/people/markus",
"@reverse": {
"http://xmlns.com/foaf/0.1/knows": [
{
"http://xmlns.com/foaf/0.1/name": [ { "@value": "Dave Longley" } ]
},
{
"http://xmlns.com/foaf/0.1/name": [ { "@value": "Gregg Kellogg" } ]
}
]
},
"http://xmlns.com/foaf/0.1/name": [ { "@value": "Markus Lanthaler" } ]
}
]
{
"@context": {
"name": "http://xmlns.com/foaf/0.1/name",
"isKnownBy": { "@reverse": "http://xmlns.com/foaf/0.1/knows" }
},
"@id": "http://example.com/people/markus",
"name": "Markus Lanthaler",
"isKnownBy": [
{
"name": "Dave Longley"
},
{
"name": "Gregg Kellogg"
}
]
}
Single values of reverse properties are compacted as values of ordinary properties
[
{
"@id": "http://example.com/people/markus",
"@reverse": {
"http://xmlns.com/foaf/0.1/knows": [
{
"@id": "http://example.com/people/dave"
}
]
},
"http://xmlns.com/foaf/0.1/name": [ { "@value": "Markus Lanthaler" } ]
}
]
{
"@context": {
"name": "http://xmlns.com/foaf/0.1/name",
"isKnownBy": { "@reverse": "http://xmlns.com/foaf/0.1/knows", "@container": "@set" }
},
"@id": "http://example.com/people/markus",
"name": "Markus Lanthaler",
"isKnownBy": [
{ "@id": "http://example.com/people/dave" }
]
}
Single values are kept in array form for reverse properties if the container is to @set
[
{
"@id": "http://example.com/people/markus",
"@reverse": {
"http://xmlns.com/foaf/0.1/knows": [
{
"@id": "http://example.com/people/dave"
}
]
},
"http://xmlns.com/foaf/0.1/name": [ { "@value": "Markus Lanthaler" } ]
}
]
{
"@context": {
"name": "http://xmlns.com/foaf/0.1/name",
"isKnownBy": { "@reverse": "http://xmlns.com/foaf/0.1/knows", "@container": "@set" }
},
"@id": "http://example.com/people/markus",
"name": "Markus Lanthaler",
"isKnownBy": [
{ "@id": "http://example.com/people/dave" }
]
}
Setting compactArrays to false causes single element arrays to be retained
[{
"@id": "http://example/foo",
"http://example/term": [{"@value": "value"}]
}]
{
"@context": {
"term": "http://example/term"
},
"@graph": [{
"@id": "http://example/foo",
"term": ["value"]
}]
}
Expanding input with multiple @contexts and compacting with just one doesn't output undefined properties
{
"@context": [{
"foo": "http://example.com/foo"
}, {
"bar": "http://example.com/bar"
}],
"foo": "foo-value",
"bar": "bar-value"
}
{
"@context": {
"foo": "http://example.com/foo"
},
"foo": "foo-value",
"http://example.com/bar": "bar-value"
}
Verifies that an exception is raised on expansion when processing an invalid context aliasing a keyword to another keyword
{
"@context": {
"@type": "@id"
},
"@type": "http://example.org/type"
}
n/a
Verifies that an exception is raised on expansion when processing a context referencing itself
{
"@context": "error-0002-in.jsonld",
"@id": "http://example/test#example"
}
n/a
Verifies that an exception is raised on expansion when processing a context referencing itself indirectly
{
"@context": "error-0003-ctx.jsonld",
"@id": "http://example/test#example"
}
n/a
Verifies that an exception is raised on expansion when a context dereference results in an error
{
"@context": "tag:non-dereferencable-iri",
"@id": "http://example/test#example"
}
n/a
Verifies that an exception is raised on expansion when a remote context is not an object containing @context
[{
"@context": "error-0005-in.jsonld",
"@id": "http://example/test#example"
}]
n/a
Verifies that an exception is raised on expansion when a context is not a string or object
{
"@context": true,
"@id": "http://example/test#example"
}
n/a
Verifies that an exception is raised on expansion when a context contains an invalid @base
{
"@context": {"@base": true},
"@id": "http://example/test#example"
}
n/a
Verifies that an exception is raised on expansion when a context contains an invalid @vocab mapping
{
"@context": {"@vocab": true},
"@id": "http://example/test#example"
}
n/a
Verifies that an exception is raised on expansion when a context contains an invalid @language
{
"@context": {"@language": true},
"@id": "http://example/test#example"
}
n/a
Verifies that an exception is raised on expansion when a cyclic IRI mapping is found
{
"@context": {
"term": {"@id": "term:term"}
},
"@id": "http://example/test#example"
}
n/a
Verifies that an exception is raised on expansion when a invalid term definition is found
{
"@context": {
"term": true
},
"@id": "http://example/test#example"
}
n/a
Verifies that an exception is raised on expansion when a invalid type mapping is found
{
"@context": {
"term": {"@id": "http://example/term", "@type": true}
},
"@id": "http://example/test#example"
}
n/a
Verifies that an exception is raised on expansion when a invalid type mapping is found
{
"@context": {
"term": {"@id": "http://example/term", "@type": "_:not-an-iri"}
},
"@id": "http://example/test#example"
}
n/a
Verifies that an exception is raised on expansion when a invalid reverse property is found
{
"@context": {
"term": {"@id": "http://example/term", "@reverse": "http://example/reverse"}
},
"@id": "http://example/test#example"
}
n/a
Verifies that an exception is raised on expansion when a invalid IRI mapping is found
{
"@context": {
"term": {"@reverse": true}
},
"@id": "http://example/test#example"
}
n/a
Verifies that an exception is raised on expansion when a invalid IRI mapping is found
{
"@context": {
"term": {"@reverse": "@reverse"}
},
"@id": "http://example/test#example"
}
n/a
Verifies that an exception is raised on expansion when a invalid reverse property is found
{
"@context": {
"term": {"@reverse": "http://example/reverse", "@container": "@list"}
},
"@id": "http://example/test#example"
}
n/a
Verifies that an exception is raised on expansion when a invalid IRI mapping is found
{
"@context": {
"term": {"@id": true}
},
"@id": "http://example/test#example"
}
n/a
Verifies that an exception is raised on expansion when a invalid keyword alias is found
{
"@context": {
"term": {"@id": "@context"}
},
"@id": "http://example/test#example"
}
n/a
Verifies that an exception is raised on expansion when a invalid IRI mapping is found
{
"@context": {
"term": {"@container": "@set"}
},
"@id": "http://example/test#example"
}
n/a
Verifies that an exception is raised on expansion when a invalid container mapping is found
{
"@context": {
"term": {"@id": "http://example/term", "@container": "@id"}
},
"@id": "http://example/test#example"
}
n/a
Verifies that an exception is raised on expansion when a invalid language mapping is found
{
"@context": {
"term": {"@id": "http://example/term", "@language": true}
},
"@id": "http://example/test#example"
}
n/a
Verifies that an exception is raised on expansion when a invalid type mapping is found
{
"@context": {
"term": {"@id": "http://example/term", "@type": "relative/iri"}
},
"@id": "http://example/test#example"
}
n/a
Verifies that an exception is raised in Expansion when a list of lists is found
{
"@context": {"foo": {"@id": "http://example.com/foo", "@container": "@list"}},
"foo": [{"@list": ["baz"]}]
}
n/a
Verifies that an exception is raised in Expansion when a invalid reverse property map is found
{
"@id": "http://example/foo",
"@reverse": {
"@id": "http://example/bar"
}
}
n/a
Verifies that an exception is raised in Expansion when colliding keywords are found
{
"@context": {
"id": "@id",
"ID": "@id"
},
"id": "http://example/foo",
"ID": "http://example/bar"
}
n/a
Verifies that an exception is raised in Expansion when an invalid @id value is found
{
"@id": true
}
n/a
Verifies that an exception is raised in Expansion when an invalid type value is found
{
"@type": true
}
n/a
Verifies that an exception is raised in Expansion when an invalid value object value is found
{
"http://example/prop": {"@value": ["foo"]}
}
n/a
Verifies that an exception is raised in Expansion when an invalid language-tagged string value is found
{
"http://example/prop": {"@value": "foo", "@language": true}
}
n/a
Verifies that an exception is raised in Expansion when an invalid @index value value is found
{
"http://example.com/vocab/indexMap": {
"@value": "simple string",
"@language": "en",
"@index": true
}
}
n/a
Verifies that an exception is raised in Expansion when a list of lists is found
{
"http://example.com/foo": {"@list": [{"@list": ["baz"]}]}
}
n/a
Verifies that an exception is raised in Expansion when an invalid @reverse value is found
{
"http://example/prop": {
"@reverse": true
}
}
n/a
Verifies that an exception is raised in Expansion when an invalid reverse property value is found
{
"@context": {
"name": "http://xmlns.com/foaf/0.1/name"
},
"@id": "http://example.com/people/markus",
"name": "Markus Lanthaler",
"@reverse": {
"http://xmlns.com/foaf/0.1/knows": "Dave Longley"
}
}
n/a
Verifies that an exception is raised in Expansion when an invalid language map value is found
{
"@context": {
"vocab": "http://example.com/vocab/",
"label": {
"@id": "vocab:label",
"@container": "@language"
}
},
"@id": "http://example.com/queen",
"label": {
"en": true
}
}
n/a
Verifies that an exception is raised in Expansion when an invalid reverse property value is found
{
"@context": {
"term": {"@reverse": "http://example/reverse"}
},
"@id": "http://example/foo",
"term": {"@list": ["http://example/bar"]}
}
n/a
Verifies that an exception is raised in Expansion when an invalid value object is found
{
"http://example/foo": {"@value": "bar", "@id": "http://example/baz"}
}
n/a
Verifies that an exception is raised in Expansion when an invalid value object is found
{
"http://example/foo": {"@value": "bar", "@language": "en", "@type": "http://example/type"}
}
n/a
Verifies that an exception is raised in Expansion when an invalid language-tagged value is found
{
"http://example/foo": {"@value": true, "@language": "en"}
}
n/a
Verifies that an exception is raised in Expansion when an invalid typed value is found
{
"http://example/foo": {"@value": "bar", "@type": "_:dt"}
}
n/a
Verifies that an exception is raised in Expansion when an invalid set or list object is found
{
"http://example/prop": {"@list": ["foo"], "@id": "http://example/bar"}
}
n/a
Verifies that an exception is raised in Compaction when attempting to compact a list of lists
{
"http://example/list": [{"@list": ["foo"]}, {"@list": ["bar"]}]
}
n/a
Verifies that an exception is raised in Flattening when conflicting indexes are found
[
{
"@id": "http://example/foo",
"@index": "bar"
},
{
"@id": "http://example/foo",
"@index": "baz"
}
]
n/a
Expand drops unreferenced nodes having only @id
{"@id": "http://example.org/test#example"}
[ ]
Expanding terms with different types of values
{
"@context": {
"t1": "http://example.com/t1",
"t2": "http://example.com/t2",
"term1": "http://example.com/term1",
"term2": "http://example.com/term2",
"term3": "http://example.com/term3",
"term4": "http://example.com/term4",
"term5": "http://example.com/term5"
},
"@id": "http://example.com/id1",
"@type": "t1",
"term1": "v1",
"term2": {"@value": "v2", "@type": "t2"},
"term3": {"@value": "v3", "@language": "en"},
"term4": 4,
"term5": [50, 51]
}
[{
"@id": "http://example.com/id1",
"@type": ["http://example.com/t1"],
"http://example.com/term1": [{"@value": "v1"}],
"http://example.com/term2": [{"@value": "v2", "@type": "http://example.com/t2"}],
"http://example.com/term3": [{"@value": "v3", "@language": "en"}],
"http://example.com/term4": [{"@value": 4}],
"http://example.com/term5": [{"@value": 50}, {"@value": 51}]
}]
Verifies that null values and unmapped properties are removed from expanded output
{
"@id": "http://example.org/id",
"http://example.org/property": null,
"regularJson": {
"nonJsonLd": "property",
"deep": [{
"foo": "bar"
}, {
"bar": "foo"
}]
}
}
[ ]
Uses of @set are removed in expansion; values of @set, or just plain values which are empty arrays are retained
{
"@context": {
"mylist1": {"@id": "http://example.com/mylist1", "@container": "@list"},
"mylist2": {"@id": "http://example.com/mylist2", "@container": "@list"},
"myset2": {"@id": "http://example.com/myset2", "@container": "@set"},
"myset3": {"@id": "http://example.com/myset3", "@container": "@set"}
},
"@id": "http://example.org/id",
"mylist1": { "@list": [ ] },
"mylist2": "one item",
"myset2": { "@set": [ ] },
"myset3": [ "v1" ],
"http://example.org/list1": { "@list": [ null ] },
"http://example.org/list2": { "@list": [ {"@value": null} ] },
"http://example.org/set1": { "@set": [ ] },
"http://example.org/set1": { "@set": [ null ] },
"http://example.org/set3": [ ],
"http://example.org/set4": [ null ],
"http://example.org/set5": "one item",
"http://example.org/property": { "@list": "one item" }
}
[{
"@id": "http://example.org/id",
"http://example.com/mylist1": [ { "@list": [ ] } ],
"http://example.com/mylist2": [ { "@list": [ {"@value": "one item"} ] } ],
"http://example.com/myset2": [ ],
"http://example.com/myset3": [ {"@value": "v1"} ],
"http://example.org/list1": [ { "@list": [ ] } ],
"http://example.org/list2": [ { "@list": [ ] } ],
"http://example.org/set1": [ ],
"http://example.org/set1": [ ],
"http://example.org/set3": [ ],
"http://example.org/set4": [ ],
"http://example.org/set5": [ {"@value": "one item"} ],
"http://example.org/property": [ { "@list": [ {"@value": "one item"} ] } ]
}]
If a keyword is aliased, it is not used when expanding
{
"@context": {
"name": "http://xmlns.com/foaf/0.1/name",
"homepage": {
"@id": "http://xmlns.com/foaf/0.1/homepage",
"@type": "@id"
},
"know": "http://xmlns.com/foaf/0.1/knows",
"@iri": "@id"
},
"@id": "#me",
"know": [
{
"@id": "http://example.com/bob#me",
"name": "Bob",
"homepage": "http://example.com/bob"
}, {
"@id": "http://example.com/alice#me",
"name": "Alice",
"homepage": "http://example.com/alice"
}
]
}
[{
"@id": "http://json-ld.org/test-suite/tests/expand-0005-in.jsonld#me",
"http://xmlns.com/foaf/0.1/knows": [
{
"@id": "http://example.com/bob#me",
"http://xmlns.com/foaf/0.1/name": [{"@value": "Bob"}],
"http://xmlns.com/foaf/0.1/homepage": [{
"@id": "http://example.com/bob"
}]
}, {
"@id": "http://example.com/alice#me",
"http://xmlns.com/foaf/0.1/name": [{"@value": "Alice"}],
"http://xmlns.com/foaf/0.1/homepage": [{
"@id": "http://example.com/alice"
}]
}
]
}]
Aliased keywords expand in resulting document
{
"@context": {
"http://example.org/test#property1": {
"@type": "@id"
},
"http://example.org/test#property2": {
"@type": "@id"
},
"uri": "@id"
},
"http://example.org/test#property1": {
"http://example.org/test#property4": "foo",
"uri": "http://example.org/test#example2"
},
"http://example.org/test#property2": "http://example.org/test#example3",
"http://example.org/test#property3": {
"uri": "http://example.org/test#example4"
},
"uri": "http://example.org/test#example1"
}
[{
"@id": "http://example.org/test#example1",
"http://example.org/test#property1": [{
"@id": "http://example.org/test#example2",
"http://example.org/test#property4": [{"@value": "foo"}]
}],
"http://example.org/test#property2": [{
"@id": "http://example.org/test#example3"
}],
"http://example.org/test#property3": [{
"@id": "http://example.org/test#example4"
}]
}]
Expand strings to expanded value with @type: xsd:dateTime
{
"@context": {
"ex": "http://example.org/vocab#",
"ex:date": {
"@type": "xsd:dateTime"
},
"ex:parent": {
"@type": "@id"
},
"xsd": "http://www.w3.org/2001/XMLSchema#"
},
"@id": "http://example.org/test#example1",
"ex:date": "2011-01-25T00:00:00Z",
"ex:embed": {
"@id": "http://example.org/test#example2",
"ex:parent": "http://example.org/test#example1"
}
}
[{
"@id": "http://example.org/test#example1",
"http://example.org/vocab#date": [{
"@value": "2011-01-25T00:00:00Z",
"@type": "http://www.w3.org/2001/XMLSchema#dateTime"
}],
"http://example.org/vocab#embed": [{
"@id": "http://example.org/test#example2",
"http://example.org/vocab#parent": [{
"@id": "http://example.org/test#example1"
}]
}]
}]
Keep expanded values with @language, drop non-conforming value objects containing just @language
{
"@context": {
"ex": "http://example.org/vocab#"
},
"@id": "http://example.org/test",
"ex:test": { "@value": "test", "@language": "en" },
"ex:drop-lang-only": { "@language": "en" },
"ex:keep-full-value": { "@value": "only value" }
}
[
{
"@id": "http://example.org/test",
"http://example.org/vocab#test": [ { "@value": "test", "@language": "en" } ],
"http://example.org/vocab#keep-full-value": [ {"@value": "only value"} ]
}
]
Use of @graph to contain multiple nodes within array
{
"@context": {
"authored": {
"@id": "http://example.org/vocab#authored",
"@type": "@id"
},
"contains": {
"@id": "http://example.org/vocab#contains",
"@type": "@id"
},
"contributor": "http://purl.org/dc/elements/1.1/contributor",
"description": "http://purl.org/dc/elements/1.1/description",
"name": "http://xmlns.com/foaf/0.1/name",
"title": {
"@id": "http://purl.org/dc/elements/1.1/title"
}
},
"@graph": [
{
"@id": "http://example.org/test#chapter",
"description": "Fun",
"title": "Chapter One"
},
{
"@id": "http://example.org/test#jane",
"authored": "http://example.org/test#chapter",
"name": "Jane"
},
{
"@id": "http://example.org/test#john",
"name": "John"
},
{
"@id": "http://example.org/test#library",
"contains": {
"@id": "http://example.org/test#book",
"contains": "http://example.org/test#chapter",
"contributor": "Writer",
"title": "My Book"
}
}
]
}
[
{
"@id": "http://example.org/test#chapter",
"http://purl.org/dc/elements/1.1/description": [{"@value": "Fun"}],
"http://purl.org/dc/elements/1.1/title": [{"@value": "Chapter One"}]
},
{
"@id": "http://example.org/test#jane",
"http://example.org/vocab#authored": [{
"@id": "http://example.org/test#chapter"
}],
"http://xmlns.com/foaf/0.1/name": [{"@value": "Jane"}]
},
{
"@id": "http://example.org/test#john",
"http://xmlns.com/foaf/0.1/name": [{"@value": "John"}]
},
{
"@id": "http://example.org/test#library",
"http://example.org/vocab#contains": [{
"@id": "http://example.org/test#book",
"http://example.org/vocab#contains": [{
"@id": "http://example.org/test#chapter"
}],
"http://purl.org/dc/elements/1.1/contributor": [{"@value": "Writer"}],
"http://purl.org/dc/elements/1.1/title": [{"@value": "My Book"}]
}]
}
]
Expanding native scalar retains native scalar within expanded value
{
"@context": {
"d": "http://purl.org/dc/elements/1.1/",
"e": "http://example.org/vocab#",
"f": "http://xmlns.com/foaf/0.1/",
"xsd": "http://www.w3.org/2001/XMLSchema#"
},
"@id": "http://example.org/test",
"e:bool": true,
"e:int": 123
}
[{
"@id": "http://example.org/test",
"http://example.org/vocab#bool": [{"@value": true}],
"http://example.org/vocab#int": [{"@value": 123}]
}]
A value of a property with @type: @id coercion expands to a node reference
{
"@context": {
"dc": "http://purl.org/dc/elements/1.1/",
"ex": "http://example.org/vocab#",
"ex:contains": {
"@type": "@id"
},
"xsd": "http://www.w3.org/2001/XMLSchema#"
},
"@id": "http://example.org/test#book",
"dc:title": "Title",
"ex:contains": "http://example.org/test#chapter"
}
[{
"@id": "http://example.org/test#book",
"http://example.org/vocab#contains": [{
"@id": "http://example.org/test#chapter"
}],
"http://purl.org/dc/elements/1.1/title": [{"@value": "Title"}]
}]
Use of @graph to contain multiple nodes within array
{
"@context": {
"dc": "http://purl.org/dc/elements/1.1/",
"ex": "http://example.org/vocab#",
"ex:authored": {
"@type": "@id"
},
"ex:contains": {
"@type": "@id"
},
"foaf": "http://xmlns.com/foaf/0.1/",
"xsd": "http://www.w3.org/2001/XMLSchema#"
},
"@graph": [
{
"@id": "http://example.org/test#chapter",
"dc:description": "Fun",
"dc:title": "Chapter One"
},
{
"@id": "http://example.org/test#jane",
"ex:authored": "http://example.org/test#chapter",
"foaf:name": "Jane"
},
{
"@id": "http://example.org/test#john",
"foaf:name": "John"
},
{
"@id": "http://example.org/test#library",
"ex:contains": {
"@id": "http://example.org/test#book",
"dc:contributor": "Writer",
"dc:title": "My Book",
"ex:contains": "http://example.org/test#chapter"
}
}
]
}
[
{
"@id": "http://example.org/test#chapter",
"http://purl.org/dc/elements/1.1/description": [{"@value": "Fun"}],
"http://purl.org/dc/elements/1.1/title": [{"@value": "Chapter One"}]
},
{
"@id": "http://example.org/test#jane",
"http://example.org/vocab#authored": [{
"@id": "http://example.org/test#chapter"
}],
"http://xmlns.com/foaf/0.1/name": [{"@value": "Jane"}]
},
{
"@id": "http://example.org/test#john",
"http://xmlns.com/foaf/0.1/name": [{"@value": "John"}]
},
{
"@id": "http://example.org/test#library",
"http://example.org/vocab#contains": [{
"@id": "http://example.org/test#book",
"http://example.org/vocab#contains": [{
"@id": "http://example.org/test#chapter"
}],
"http://purl.org/dc/elements/1.1/contributor": [{"@value": "Writer"}],
"http://purl.org/dc/elements/1.1/title": [{"@value": "My Book"}]
}]
}
]
Expand does not mess up already expanded document
[{
"@id": "http://example.com/id1",
"@type": ["http://example.com/t1"],
"http://example.com/term1": ["v1"],
"http://example.com/term2": [{"@value": "v2", "@type": "http://example.com/t2"}],
"http://example.com/term3": [{"@value": "v3", "@language": "en"}],
"http://example.com/term4": [4],
"http://example.com/term5": [50, 51]
}]
[{
"@id": "http://example.com/id1",
"@type": ["http://example.com/t1"],
"http://example.com/term1": [{"@value": "v1"}],
"http://example.com/term2": [{"@value": "v2", "@type": "http://example.com/t2"}],
"http://example.com/term3": [{"@value": "v3", "@language": "en"}],
"http://example.com/term4": [{"@value": 4}],
"http://example.com/term5": [{"@value": 50}, {"@value": 51}]
}]
Expanding aliased @set and @value
{
"@context": {
"ex": "http://example.org/test#",
"property1": {
"@id": "http://example.org/test#property1",
"@type": "@id"
},
"property2": {
"@id": "ex:property2",
"@type": "@id"
},
"uri": "@id",
"set": "@set",
"value": "@value",
"type": "@type",
"xsd": { "@id": "http://www.w3.org/2001/XMLSchema#" }
},
"property1": {
"uri": "ex:example2",
"http://example.org/test#property4": "foo"
},
"property2": "http://example.org/test#example3",
"http://example.org/test#property3": {
"uri": "http://example.org/test#example4"
},
"ex:property4": {
"uri": "ex:example4",
"ex:property5": [
{
"set": [
{
"value": "2012-03-31",
"type": "xsd:date"
}
]
}
]
},
"ex:property6": [
{
"set": [
{
"value": null,
"type": "xsd:date"
}
]
}
],
"uri": "http://example.org/test#example1"
}
[
{
"http://example.org/test#property1": [
{
"@id": "http://example.org/test#example2",
"http://example.org/test#property4": [
{"@value": "foo"}
]
}
],
"http://example.org/test#property2": [
{ "@id": "http://example.org/test#example3" }
],
"http://example.org/test#property3": [
{ "@id": "http://example.org/test#example4" }
],
"http://example.org/test#property4": [
{
"@id": "http://example.org/test#example4",
"http://example.org/test#property5": [
{
"@value": "2012-03-31",
"@type": "http://www.w3.org/2001/XMLSchema#date"
}
]
}
],
"http://example.org/test#property6": [],
"@id": "http://example.org/test#example1"
}
]
An array of multiple @set nodes are collapsed into a single array
{
"@context": {
"mylist1": {"@id": "http://example.com/mylist1", "@container": "@list"},
"mylist2": {"@id": "http://example.com/mylist2", "@container": "@list"},
"myset1": {"@id": "http://example.com/myset1", "@container": "@set" },
"myset2": {"@id": "http://example.com/myset2", "@container": "@set" },
"myset3": {"@id": "http://example.com/myset3", "@container": "@set" }
},
"@id": "http://example.org/id",
"mylist1": [],
"myset1": { "@set": [] },
"myset2": [ { "@set": [] }, [], { "@set": [ null ] }, [ null ] ],
"myset3": [ { "@set": [ "hello", "this" ] }, "will", { "@set": [ "be", "collapsed" ] } ]
}
[
{
"@id": "http://example.org/id",
"http://example.com/mylist1": [ { "@list": [] } ],
"http://example.com/myset1": [ ],
"http://example.com/myset2": [ ],
"http://example.com/myset3": [
{"@value": "hello"},
{"@value": "this"},
{"@value": "will"},
{"@value": "be"},
{"@value": "collapsed"} ]
}
]
Setting @context to null within an embedded object resets back to initial context state
{
"@context": {
"myproperty": { "@id": "http://example.com/myproperty" },
"mylist1": {"@id": "http://example.com/mylist1", "@container": "@list"},
"mylist2": {"@id": "http://example.com/mylist2", "@container": "@list"},
"myset1": {"@id": "http://example.com/myset1", "@container": "@set" },
"myset2": {"@id": "http://example.com/myset2", "@container": "@set" }
},
"@id": "http://example.org/id1",
"mylist1": [],
"mylist2": [ 2, "hi" ],
"myset1": { "@set": [] },
"myset2": [ { "@set": [] }, [], { "@set": [ null ] }, [ null ] ],
"myproperty": {
"@context": null,
"@id": "http://example.org/id2",
"mylist1": [],
"mylist2": [ 2, "hi" ],
"myset1": { "@set": [] },
"myset2": [ { "@set": [] }, [], { "@set": [ null ] }, [ null ] ],
"http://example.org/myproperty2": "ok"
},
"http://example.com/emptyobj": {
"@context": null,
"mylist1": [],
"mylist2": [ 2, "hi" ],
"myset1": { "@set": [] },
"myset2": [ { "@set": [] }, [], { "@set": [ null ] }, [ null ] ]
}
}
[
{
"@id": "http://example.org/id1",
"http://example.com/mylist1": [ { "@list": [] } ],
"http://example.com/mylist2": [
{ "@list": [ {"@value": 2}, {"@value": "hi"} ] }
],
"http://example.com/myset1": [ ],
"http://example.com/myset2": [ ],
"http://example.com/myproperty": [
{
"@id": "http://example.org/id2",
"http://example.org/myproperty2": [ {"@value": "ok"} ]
}
],
"http://example.com/emptyobj": [ { } ]
}
]
Expanding with @graph and @id aliases
{
"@context": {
"authored": {
"@id": "http://example.org/vocab#authored",
"@type": "@id"
},
"contains": {
"@id": "http://example.org/vocab#contains",
"@type": "@id"
},
"contributor": "http://purl.org/dc/elements/1.1/contributor",
"description": "http://purl.org/dc/elements/1.1/description",
"name": "http://xmlns.com/foaf/0.1/name",
"title": {
"@id": "http://purl.org/dc/elements/1.1/title"
},
"id": "@id",
"data": "@graph"
},
"data": [
{
"id": "http://example.org/test#chapter",
"description": "Fun",
"title": "Chapter One"
},
{
"@id": "http://example.org/test#jane",
"authored": "http://example.org/test#chapter",
"name": "Jane"
},
{
"id": "http://example.org/test#john",
"name": "John"
},
{
"id": "http://example.org/test#library",
"contains": {
"@id": "http://example.org/test#book",
"contains": "http://example.org/test#chapter",
"contributor": "Writer",
"title": "My Book"
}
}
]
}
[
{
"@id": "http://example.org/test#chapter",
"http://purl.org/dc/elements/1.1/description": [{"@value": "Fun"}],
"http://purl.org/dc/elements/1.1/title": [{"@value": "Chapter One"}]
},
{
"@id": "http://example.org/test#jane",
"http://example.org/vocab#authored": [{
"@id": "http://example.org/test#chapter"
}],
"http://xmlns.com/foaf/0.1/name": [{"@value": "Jane"}]
},
{
"@id": "http://example.org/test#john",
"http://xmlns.com/foaf/0.1/name": [{"@value": "John"}]
},
{
"@id": "http://example.org/test#library",
"http://example.org/vocab#contains": [{
"@id": "http://example.org/test#book",
"http://example.org/vocab#contains": [{
"@id": "http://example.org/test#chapter"
}],
"http://purl.org/dc/elements/1.1/contributor": [{"@value": "Writer"}],
"http://purl.org/dc/elements/1.1/title": [{"@value": "My Book"}]
}]
}
]
override default @language in terms; only language-tag strings
{
"@context": {
"ex": "http://example.org/vocab#",
"@language": "en",
"de": { "@id": "ex:german", "@language": "de" },
"nolang": { "@id": "ex:nolang", "@language": null }
},
"@id": "http://example.org/test",
"ex:test-default": [
"hello",
1,
true
],
"de": [
"hallo",
2,
true
],
"nolang": [
"no language",
3,
false
]
}
[
{
"@id": "http://example.org/test",
"http://example.org/vocab#test-default": [ { "@value": "hello", "@language": "en" }, { "@value": 1 }, { "@value": true } ],
"http://example.org/vocab#german": [ { "@value": "hallo", "@language": "de" }, { "@value": 2 }, { "@value": true } ],
"http://example.org/vocab#nolang": [ {"@value": "no language"}, { "@value": 3 }, { "@value": false } ]
}
]
Expanding a value of null removes the value
{
"@context": {
"myproperty": "http://example.com/myproperty"
},
"myproperty": { "@value" : null }
}
[ ]
@graph used under a node is retained
{
"@context": {
"authored": {
"@id": "http://example.org/vocab#authored",
"@type": "@id"
},
"contains": {
"@id": "http://example.org/vocab#contains",
"@type": "@id"
},
"contributor": "http://purl.org/dc/elements/1.1/contributor",
"description": "http://purl.org/dc/elements/1.1/description",
"name": "http://xmlns.com/foaf/0.1/name",
"title": {
"@id": "http://purl.org/dc/elements/1.1/title"
}
},
"@graph": [
{
"@id": "http://example.org/test#jane",
"name": "Jane",
"authored": {
"@graph": [
{
"@id": "http://example.org/test#chapter1",
"description": "Fun",
"title": "Chapter One"
},
{
"@id": "http://example.org/test#chapter2",
"description": "More fun",
"title": "Chapter Two"
}
]
}
},
{
"@id": "http://example.org/test#john",
"name": "John"
},
{
"@id": "http://example.org/test#library",
"contains": {
"@id": "http://example.org/test#book",
"contains": "http://example.org/test#chapter",
"contributor": "Writer",
"title": "My Book"
}
}
]
}
[
{
"@id": "http://example.org/test#jane",
"http://xmlns.com/foaf/0.1/name": [ {"@value": "Jane"} ],
"http://example.org/vocab#authored": [
{
"@graph": [
{
"@id": "http://example.org/test#chapter1",
"http://purl.org/dc/elements/1.1/description": [ {"@value": "Fun"} ],
"http://purl.org/dc/elements/1.1/title": [ {"@value": "Chapter One"} ]
},
{
"@id": "http://example.org/test#chapter2",
"http://purl.org/dc/elements/1.1/description": [ {"@value": "More fun"} ],
"http://purl.org/dc/elements/1.1/title": [ {"@value": "Chapter Two"} ]
}
]
}
]
},
{
"@id": "http://example.org/test#john",
"http://xmlns.com/foaf/0.1/name": [ {"@value": "John"} ]
},
{
"@id": "http://example.org/test#library",
"http://example.org/vocab#contains": [
{
"@id": "http://example.org/test#book",
"http://example.org/vocab#contains": [ { "@id": "http://example.org/test#chapter" } ],
"http://purl.org/dc/elements/1.1/contributor": [ {"@value": "Writer"} ],
"http://purl.org/dc/elements/1.1/title": [ {"@value": "My Book"} ]
}
]
}
]
@graph used at the top level is retained if there are other properties
{
"@context": {
"authored": {
"@id": "http://example.org/vocab#authored",
"@type": "@id"
},
"contains": {
"@id": "http://example.org/vocab#contains",
"@type": "@id"
},
"contributor": "http://purl.org/dc/elements/1.1/contributor",
"description": "http://purl.org/dc/elements/1.1/description",
"name": "http://xmlns.com/foaf/0.1/name",
"title": {
"@id": "http://purl.org/dc/elements/1.1/title"
}
},
"title": "My first graph",
"@graph": [
{
"@id": "http://example.org/test#jane",
"name": "Jane",
"authored": {
"@graph": [
{
"@id": "http://example.org/test#chapter1",
"description": "Fun",
"title": "Chapter One"
},
{
"@id": "http://example.org/test#chapter2",
"description": "More fun",
"title": "Chapter Two"
},
{
"@id": "http://example.org/test#chapter3",
"title": "Chapter Three"
}
]
}
},
{
"@id": "http://example.org/test#john",
"name": "John"
},
{
"@id": "http://example.org/test#library",
"contains": {
"@id": "http://example.org/test#book",
"contains": "http://example.org/test#chapter",
"contributor": "Writer",
"title": "My Book"
}
}
]
}
[
{
"http://purl.org/dc/elements/1.1/title": [ {"@value": "My first graph"} ],
"@graph": [
{
"@id": "http://example.org/test#jane",
"http://xmlns.com/foaf/0.1/name": [ {"@value": "Jane"} ],
"http://example.org/vocab#authored": [
{
"@graph": [
{
"@id": "http://example.org/test#chapter1",
"http://purl.org/dc/elements/1.1/description": [ {"@value": "Fun"} ],
"http://purl.org/dc/elements/1.1/title": [ {"@value": "Chapter One"} ]
},
{
"@id": "http://example.org/test#chapter2",
"http://purl.org/dc/elements/1.1/description": [ {"@value": "More fun"} ],
"http://purl.org/dc/elements/1.1/title": [ {"@value": "Chapter Two"} ]
},
{
"@id": "http://example.org/test#chapter3",
"http://purl.org/dc/elements/1.1/title": [ {"@value": "Chapter Three"} ]
}
]
}
]
},
{
"@id": "http://example.org/test#john",
"http://xmlns.com/foaf/0.1/name": [ {"@value": "John"} ]
},
{
"@id": "http://example.org/test#library",
"http://example.org/vocab#contains": [
{
"@id": "http://example.org/test#book",
"http://example.org/vocab#contains": [ { "@id": "http://example.org/test#chapter" } ],
"http://purl.org/dc/elements/1.1/contributor": [ {"@value": "Writer"} ],
"http://purl.org/dc/elements/1.1/title": [ {"@value": "My Book"} ]
}
]
}
]
}
]
Expanding with a default language applies that language to string values
{
"@context": {
"term": "http://example.com/term",
"@language": "en"
},
"term": "v"
}
[{
"http://example.com/term": [{"@value": "v", "@language": "en"}]
}]
Expanding lists and sets with properties having coercion coerces list/set values
{
"@context": {
"xsd": "http://www.w3.org/2001/XMLSchema#",
"idlist": {"@id": "http://example.com/idlist", "@container": "@list", "@type": "@id"},
"datelist": {"@id": "http://example.com/datelist", "@container": "@list", "@type": "xsd:date"},
"idset": {"@id": "http://example.com/idset", "@container": "@set", "@type": "@id"},
"dateset": {"@id": "http://example.com/dateset", "@container": "@set", "@type": "xsd:date"},
"idprop": {"@id": "http://example.com/idprop", "@type": "@id" },
"dateprop": {"@id": "http://example.com/dateprop", "@type": "xsd:date" },
"idprop2": {"@id": "http://example.com/idprop2", "@type": "@id" },
"dateprop2": {"@id": "http://example.com/dateprop2", "@type": "xsd:date" }
},
"idlist": ["http://example.org/id"],
"datelist": ["2012-04-12"],
"idprop": {"@list": ["http://example.org/id"]},
"dateprop": {"@list": ["2012-04-12"]},
"idset": ["http://example.org/id"],
"dateset": ["2012-04-12"],
"idprop2": {"@set": ["http://example.org/id"]},
"dateprop2": {"@set": ["2012-04-12"]}
}
[
{
"http://example.com/idlist": [{"@list": [{"@id": "http://example.org/id"}]}],
"http://example.com/datelist": [{"@list": [{"@value": "2012-04-12","@type": "http://www.w3.org/2001/XMLSchema#date"}]}],
"http://example.com/idprop": [{"@list": [{"@id": "http://example.org/id"}]}],
"http://example.com/dateprop": [{"@list": [{"@value": "2012-04-12","@type": "http://www.w3.org/2001/XMLSchema#date"}]}],
"http://example.com/idset": [{"@id": "http://example.org/id"}],
"http://example.com/dateset": [{"@value": "2012-04-12","@type": "http://www.w3.org/2001/XMLSchema#date"}],
"http://example.com/idprop2": [{"@id": "http://example.org/id"}],
"http://example.com/dateprop2": [{"@value": "2012-04-12","@type": "http://www.w3.org/2001/XMLSchema#date"}]
}
]
Tests that contexts in an array are merged
{
"@context": [
{
"name": "http://xmlns.com/foaf/0.1/name",
"homepage": {"@id": "http://xmlns.com/foaf/0.1/homepage","@type": "@id"}
},
{"ical": "http://www.w3.org/2002/12/cal/ical#"}
],
"@id": "http://example.com/speakers#Alice",
"name": "Alice",
"homepage": "http://xkcd.com/177/",
"ical:summary": "Alice Talk",
"ical:location": "Lyon Convention Centre, Lyon, France"
}
[{
"@id": "http://example.com/speakers#Alice",
"http://xmlns.com/foaf/0.1/name": [{"@value": "Alice"}],
"http://xmlns.com/foaf/0.1/homepage": [{"@id": "http://xkcd.com/177/"}],
"http://www.w3.org/2002/12/cal/ical#summary": [{"@value": "Alice Talk"}],
"http://www.w3.org/2002/12/cal/ical#location": [{"@value": "Lyon Convention Centre, Lyon, France"}]
}]
Expanding different kinds of terms and Compact IRIs
{
"@context": {
"foo": "http://example.com/foo/",
"foo:bar": "http://example.com/bar",
"bar": {"@id": "foo:bar", "@type": "@id"},
"_": "http://example.com/underscore/"
},
"@type": [ "foo", "foo:bar", "_" ]
}
[{
"@type": [
"http://example.com/foo/",
"http://example.com/bar",
"http://example.com/underscore/"
]
}]
Expanding term mapping to @type uses @type syntax
{
"@context": {
"http://www.w3.org/1999/02/22-rdf-syntax-ns#type": {"@id": "@type", "@type": "@id"}
},
"@graph": [
{
"@id": "http://example.com/a",
"http://www.w3.org/1999/02/22-rdf-syntax-ns#type": "http://example.com/b"
}, {
"@id": "http://example.com/c",
"http://www.w3.org/1999/02/22-rdf-syntax-ns#type": [
"http://example.com/d",
"http://example.com/e"
]
}, {
"@id": "http://example.com/f",
"http://www.w3.org/1999/02/22-rdf-syntax-ns#type": "http://example.com/g"
}
]
}
[
{
"@id": "http://example.com/a",
"@type": [
"http://example.com/b"
]
},
{
"@id": "http://example.com/c",
"@type": [
"http://example.com/d",
"http://example.com/e"
]
},
{
"@id": "http://example.com/f",
"@type": [
"http://example.com/g"
]
}
]
Duplicate values in @list and @set are not merged
{
"@context": {
"mylist": {"@id": "http://example.com/mylist", "@container": "@list"},
"myset": {"@id": "http://example.com/myset", "@container": "@set"}
},
"@id": "http://example.org/id",
"mylist": [1, 2, 2, 3],
"myset": [1, 2, 2, 3]
}
[{
"@id": "http://example.org/id",
"http://example.com/mylist": [{
"@list": [
{"@value": 1},
{"@value": 2},
{"@value": 2},
{"@value": 3}
]
}],
"http://example.com/myset": [
{"@value": 1},
{"@value": 2},
{"@value": 2},
{"@value": 3}
]
}]
@vocab is used to compact properties and @type, but is not used for @id
{
"@context": {
"@vocab": "http://example.org/vocab#",
"date": { "@type": "dateTime" }
},
"@id": "example1",
"@type": "test",
"date": "2011-01-25T00:00:00Z",
"embed": {
"@id": "example2",
"expandedDate": { "@value": "2012-08-01T00:00:00Z", "@type": "dateTime" }
}
}
[
{
"@id": "http://json-ld.org/test-suite/tests/example1",
"@type": [ "http://example.org/vocab#test" ],
"http://example.org/vocab#date": [
{
"@value": "2011-01-25T00:00:00Z",
"@type": "http://example.org/vocab#dateTime"
}
],
"http://example.org/vocab#embed": [
{
"@id": "http://json-ld.org/test-suite/tests/example2",
"http://example.org/vocab#expandedDate": [
{
"@value": "2012-08-01T00:00:00Z",
"@type": "http://example.org/vocab#dateTime"
}
]
}
]
}
]
@base is used to compact @id; test with different relative IRIs
{
"@context": {
"links": { "@id": "http://www.example.com/link", "@type": "@id", "@container": "@list" }
},
"@id": "relativeIris",
"@type": [
"link",
"#fragment-works",
"?query=works",
"./",
"../",
"../parent",
"../../parent-parent-eq-root",
"../../../../../still-root",
"../.././.././../../too-many-dots",
"/absolute",
"//example.org/scheme-relative"
],
"links": [
"link",
"#fragment-works",
"?query=works",
"./",
"../",
"../parent",
"../../parent-parent-eq-root",
"./../../../useless/../../../still-root",
"../.././.././../../too-many-dots",
"/absolute",
"//example.org/scheme-relative"
]
}
[
{
"@id": "http://json-ld.org/test-suite/tests/relativeIris",
"@type": [
"http://json-ld.org/test-suite/tests/link",
"http://json-ld.org/test-suite/tests/expand-0029-in.jsonld#fragment-works",
"http://json-ld.org/test-suite/tests/expand-0029-in.jsonld?query=works",
"http://json-ld.org/test-suite/tests/",
"http://json-ld.org/test-suite/",
"http://json-ld.org/test-suite/parent",
"http://json-ld.org/parent-parent-eq-root",
"http://json-ld.org/still-root",
"http://json-ld.org/too-many-dots",
"http://json-ld.org/absolute",
"http://example.org/scheme-relative"
],
"http://www.example.com/link": [ {
"@list": [
{ "@id": "http://json-ld.org/test-suite/tests/link" },
{ "@id": "http://json-ld.org/test-suite/tests/expand-0029-in.jsonld#fragment-works" },
{ "@id": "http://json-ld.org/test-suite/tests/expand-0029-in.jsonld?query=works" },
{ "@id": "http://json-ld.org/test-suite/tests/" },
{ "@id": "http://json-ld.org/test-suite/" },
{ "@id": "http://json-ld.org/test-suite/parent" },
{ "@id": "http://json-ld.org/parent-parent-eq-root" },
{ "@id": "http://json-ld.org/still-root" },
{ "@id": "http://json-ld.org/too-many-dots" },
{ "@id": "http://json-ld.org/absolute" },
{ "@id": "http://example.org/scheme-relative" }
]
} ]
}
]
Language Maps expand values to include @language
{
"@context": {
"vocab": "http://example.com/vocab/",
"label": {
"@id": "vocab:label",
"@container": "@language"
}
},
"@id": "http://example.com/queen",
"label": {
"en": "The Queen",
"de": [ "Die Königin", "Ihre Majestät" ]
}
}
[
{
"@id": "http://example.com/queen",
"http://example.com/vocab/label":
[
{
"@value": "Die Königin",
"@language": "de"
}, {
"@value": "Ihre Majestät",
"@language": "de"
}, {
"@value": "The Queen",
"@language": "en"
}
]
}
]
Expanding native types with type coercion adds the coerced type to an expanded value representation and retains the native value representation
{
"@context": {
"ex": "http://example.org/vocab#",
"xsd": "http://www.w3.org/2001/XMLSchema#",
"ex:integer": { "@type": "xsd:integer" },
"ex:double": { "@type": "xsd:double" },
"ex:boolean": { "@type": "xsd:boolean" }
},
"@id": "http://example.org/test#example1",
"ex:integer": 1,
"ex:double": 123.45,
"ex:boolean": true
}
[
{
"@id": "http://example.org/test#example1",
"http://example.org/vocab#integer": [ {
"@value": 1,
"@type": "http://www.w3.org/2001/XMLSchema#integer"
} ],
"http://example.org/vocab#double": [ {
"@value": 123.45,
"@type": "http://www.w3.org/2001/XMLSchema#double"
} ],
"http://example.org/vocab#boolean": [ {
"@value": true,
"@type": "http://www.w3.org/2001/XMLSchema#boolean"
} ]
}
]
Mapping a term to null decouples it from @vocab
{
"@context": {
"@vocab": "http://xmlns.com/foaf/0.1/",
"from": null,
"university": { "@id": null }
},
"@id": "http://me.markus-lanthaler.com/",
"name": "Markus Lanthaler",
"from": "Italy",
"university": "TU Graz"
}
[
{
"@id": "http://me.markus-lanthaler.com/",
"http://xmlns.com/foaf/0.1/name": [
{
"@value": "Markus Lanthaler"
}
]
}
]
Verifies that terms can be defined using @vocab
{
"@context": {
"@vocab": "http://example.com/vocab#",
"homepage": {
"@type": "@id"
},
"created_at": {
"@type": "http://www.w3.org/2001/XMLSchema#date"
}
},
"name": "Markus Lanthaler",
"homepage": "http://www.markus-lanthaler.com/",
"created_at": "2012-10-28"
}
[{
"http://example.com/vocab#name": [{
"@value": "Markus Lanthaler"
}],
"http://example.com/vocab#homepage": [{
"@id": "http://www.markus-lanthaler.com/"
}],
"http://example.com/vocab#created_at": [{
"@value": "2012-10-28",
"@type": "http://www.w3.org/2001/XMLSchema#date"
}]
}]
Verifies multiple values from separate terms are deterministically made multiple values of the IRI associated with the terms
{
"@context": {
"@vocab": "http://example.com/vocab/",
"colliding": "http://example.com/vocab/collidingTerm"
},
"@id": "http://example.com/IriCollissions",
"colliding": [
"value 1",
2
],
"collidingTerm": [
3,
"four"
],
"http://example.com/vocab/collidingTerm": 5
}
[{
"@id": "http://example.com/IriCollissions",
"http://example.com/vocab/collidingTerm": [
{
"@value": "value 1"
}, {
"@value": 2
}, {
"@value": 3
}, {
"@value": "four"
},
{
"@value": 5
}
]
}]
Pathological tests of language maps
{
"@context": {
"@vocab": "http://example.com/vocab/",
"@language": "it",
"label": {
"@container": "@language"
}
},
"@id": "http://example.com/queen",
"label": {
"en": "The Queen",
"de": [ "Die Königin", "Ihre Majestät" ]
},
"http://example.com/vocab/label": [
"Il re",
{ "@value": "The king", "@language": "en" }
]
}
[{
"@id": "http://example.com/queen",
"http://example.com/vocab/label": [
{
"@value": "Il re",
"@language": "it"
}, {
"@value": "The king",
"@language": "en"
}, {
"@value": "Die Königin",
"@language": "de"
}, {
"@value": "Ihre Majestät",
"@language": "de"
}, {
"@value": "The Queen",
"@language": "en"
}
]
}]
Expanding index maps for terms defined with @container: @index
{
"@context": {
"property": "http://example.com/property",
"indexContainer": { "@id": "http://example.com/container", "@container": "@index" }
},
"@id": "http://example.org/indexTest",
"indexContainer": {
"A": [
{
"@id": "http://example.org/nodeWithoutIndexA"
},
{
"@id": "http://example.org/nodeWithIndexA",
"@index": "this overrides the 'A' index from the container"
},
1,
true,
false,
null,
"simple string A",
{
"@value": "typed literal A",
"@type": "http://example.org/type"
},
{
"@value": "language-tagged string A",
"@language": "en"
}
],
"B": "simple string B",
"C": [
{
"@id": "http://example.org/nodeWithoutIndexC"
},
{
"@id": "http://example.org/nodeWithIndexC",
"@index": "this overrides the 'C' index from the container"
},
3,
true,
false,
null,
"simple string C",
{
"@value": "typed literal C",
"@type": "http://example.org/type"
},
{
"@value": "language-tagged string C",
"@language": "en"
}
]
},
"property": [
{
"@id": "http://example.org/nodeWithoutIndexProp"
},
{
"@id": "http://example.org/nodeWithIndexProp",
"@index": "prop"
},
{
"@value": 3,
"@index": "prop"
},
{
"@value": true,
"@index": "prop"
},
{
"@value": false,
"@index": "prop"
},
{
"@value": null,
"@index": "prop"
},
"simple string no index",
{
"@value": "typed literal Prop",
"@type": "http://example.org/type",
"@index": "prop"
},
{
"@value": "language-tagged string Prop",
"@language": "en",
"@index": "prop"
}
]
}
[
{
"@id": "http://example.org/indexTest",
"http://example.com/container": [
{
"@id": "http://example.org/nodeWithoutIndexA",
"@index": "A"
},
{
"@id": "http://example.org/nodeWithIndexA",
"@index": "this overrides the 'A' index from the container"
},
{
"@value": 1,
"@index": "A"
},
{
"@value": true,
"@index": "A"
},
{
"@value": false,
"@index": "A"
},
{
"@value": "simple string A",
"@index": "A"
},
{
"@value": "typed literal A",
"@type": "http://example.org/type",
"@index": "A"
},
{
"@value": "language-tagged string A",
"@language": "en",
"@index": "A"
},
{
"@value": "simple string B",
"@index": "B"
},
{
"@id": "http://example.org/nodeWithoutIndexC",
"@index": "C"
},
{
"@id": "http://example.org/nodeWithIndexC",
"@index": "this overrides the 'C' index from the container"
},
{
"@value": 3,
"@index": "C"
},
{
"@value": true,
"@index": "C"
},
{
"@value": false,
"@index": "C"
},
{
"@value": "simple string C",
"@index": "C"
},
{
"@value": "typed literal C",
"@type": "http://example.org/type",
"@index": "C"
},
{
"@value": "language-tagged string C",
"@language": "en",
"@index": "C"
}
],
"http://example.com/property": [
{
"@id": "http://example.org/nodeWithoutIndexProp"
},
{
"@id": "http://example.org/nodeWithIndexProp",
"@index": "prop"
},
{
"@value": 3,
"@index": "prop"
},
{
"@value": true,
"@index": "prop"
},
{
"@value": false,
"@index": "prop"
},
{
"@value": "simple string no index"
},
{
"@value": "typed literal Prop",
"@type": "http://example.org/type",
"@index": "prop"
},
{
"@value": "language-tagged string Prop",
"@language": "en",
"@index": "prop"
}
]
}
]
Expanding @reverse keeps @reverse
{
"@context": {
"name": "http://xmlns.com/foaf/0.1/name"
},
"@id": "http://example.com/people/markus",
"name": "Markus Lanthaler",
"@reverse": {
"http://xmlns.com/foaf/0.1/knows": {
"@id": "http://example.com/people/dave",
"name": "Dave Longley"
}
}
}
[
{
"@id": "http://example.com/people/markus",
"@reverse": {
"http://xmlns.com/foaf/0.1/knows": [
{
"@id": "http://example.com/people/dave",
"http://xmlns.com/foaf/0.1/name": [ { "@value": "Dave Longley" } ]
}
]
},
"http://xmlns.com/foaf/0.1/name": [ { "@value": "Markus Lanthaler" } ]
}
]
Blank nodes are not relabeled during expansion
{
"@context": {
"term": "_:term",
"termId": { "@id": "term", "@type": "@id" }
},
"@id": "_:term",
"@type": "_:term",
"term": [
{
"@id": "_:term",
"@type": "term"
},
{
"@id": "_:Bx",
"term": "term"
},
"plain value",
{
"@id": "_:term"
}
],
"termId": [
{
"@id": "_:term",
"@type": "term"
},
{
"@id": "_:Cx",
"term": "termId"
},
"term:AppendedToBlankNode",
"_:termAppendedToBlankNode",
"relativeIri",
{
"@id": "_:term"
}
]
}
[
{
"@id": "_:term",
"@type": [
"_:term"
],
"_:term": [
{
"@id": "_:term",
"@type": [
"_:term"
]
},
{
"@id": "_:Bx",
"_:term": [
{
"@value": "term"
}
]
},
{
"@value": "plain value"
},
{
"@id": "_:term"
},
{
"@id": "_:term",
"@type": [
"_:term"
]
},
{
"@id": "_:Cx",
"_:term": [
{
"@value": "termId"
}
]
},
{
"@id": "_:termAppendedToBlankNode"
},
{
"@id": "_:termAppendedToBlankNode"
},
{
"@id": "http://json-ld.org/test-suite/tests/relativeIri"
},
{
"@id": "_:term"
}
]
}
]
Terms within @reverse are expanded
{
"@context": {
"name": "http://xmlns.com/foaf/0.1/name",
"knows": "http://xmlns.com/foaf/0.1/knows"
},
"@id": "http://example.com/people/markus",
"name": "Markus Lanthaler",
"@reverse": {
"knows": {
"@id": "http://example.com/people/dave",
"name": "Dave Longley"
}
}
}
[
{
"@id": "http://example.com/people/markus",
"@reverse": {
"http://xmlns.com/foaf/0.1/knows": [
{
"@id": "http://example.com/people/dave",
"http://xmlns.com/foaf/0.1/name": [ { "@value": "Dave Longley" } ]
}
]
},
"http://xmlns.com/foaf/0.1/name": [ { "@value": "Markus Lanthaler" } ]
}
]
Only invoke language and index map expansion if the value is a JSON object
{
"@context": {
"vocab": "http://example.com/vocab/",
"label": {
"@id": "vocab:label",
"@container": "@language"
},
"indexes": {
"@id": "vocab:index",
"@container": "@index"
}
},
"@id": "http://example.com/queen",
"label": [
"The Queen"
],
"indexes":
[
"No",
"indexes",
{ "@id": "asTheValueIsntAnObject" }
]
}
[
{
"@id": "http://example.com/queen",
"http://example.com/vocab/label":
[
{
"@value": "The Queen"
}
],
"http://example.com/vocab/index":
[
{
"@value": "No"
},
{
"@value": "indexes"
},
{
"@id": "http://json-ld.org/test-suite/tests/asTheValueIsntAnObject"
}
]
}
]
{
"@context": {
"property": "http://example.com/property",
"nested": "http://example.com/nested",
"@language": "en"
},
"property": "this is English",
"nested": {
"@context": {
"@language": null
},
"property": "and this is a plain string"
}
}
[
{
"http://example.com/property": [ { "@value": "this is English", "@language": "en" } ],
"http://example.com/nested": [
{
"http://example.com/property": [ { "@value": "and this is a plain string" } ]
}
]
}
]
Expanding terms defined as reverse properties uses @reverse in expanded document
{
"@context": {
"name": "http://xmlns.com/foaf/0.1/name",
"isKnownBy": { "@reverse": "http://xmlns.com/foaf/0.1/knows" }
},
"@id": "http://example.com/people/markus",
"name": "Markus Lanthaler",
"isKnownBy": {
"@id": "http://example.com/people/dave",
"name": "Dave Longley"
}
}
[
{
"@id": "http://example.com/people/markus",
"@reverse": {
"http://xmlns.com/foaf/0.1/knows": [
{
"@id": "http://example.com/people/dave",
"http://xmlns.com/foaf/0.1/name": [ { "@value": "Dave Longley" } ]
}
]
},
"http://xmlns.com/foaf/0.1/name": [ { "@value": "Markus Lanthaler" } ]
}
]
Expanding a reverse property within a @reverse undoes both reversals
{
"@context": {
"name": "http://xmlns.com/foaf/0.1/name",
"isKnownBy": { "@reverse": "http://xmlns.com/foaf/0.1/knows" }
},
"@id": "http://example.com/people/markus",
"name": "Markus Lanthaler",
"@reverse": {
"isKnownBy": [
{
"@id": "http://example.com/people/dave",
"name": "Dave Longley"
},
{
"@id": "http://example.com/people/gregg",
"name": "Gregg Kellogg"
}
]
}
}
[
{
"@id": "http://example.com/people/markus",
"http://xmlns.com/foaf/0.1/knows": [
{
"@id": "http://example.com/people/dave",
"http://xmlns.com/foaf/0.1/name": [ { "@value": "Dave Longley" } ]
},
{
"@id": "http://example.com/people/gregg",
"http://xmlns.com/foaf/0.1/name": [ { "@value": "Gregg Kellogg" } ]
}
],
"http://xmlns.com/foaf/0.1/name": [ { "@value": "Markus Lanthaler" } ]
}
]
Ensure index maps use language mapping
{
"@context": {
"property": { "@id": "http://example.com/vocab/property", "@language": "de" },
"indexMap": { "@id": "http://example.com/vocab/indexMap", "@language": "en", "@container": "@index" }
},
"@id": "http://example.com/node",
"property": [
{
"@id": "http://example.com/propertyValueNode",
"indexMap": {
"expands to english string": "simple string"
}
},
"einfacher String"
]
}
[
{
"@id": "http://example.com/node",
"http://example.com/vocab/property": [
{
"@id": "http://example.com/propertyValueNode",
"http://example.com/vocab/indexMap": [
{
"@value": "simple string",
"@language": "en",
"@index": "expands to english string"
}
]
},
{
"@value": "einfacher String",
"@language": "de"
}
]
}
]
Expanding top-level value objects causes them to be removed
{
"@value": "free-floating value"
}
[ ]
Expanding free-floating nodes causes them to be removed
{
"@graph": [
{ "@id": "http://example.com/free-floating-node" },
{ "@value": "free-floating value object" },
{ "@value": "free-floating value language-tagged string", "@language": "en" },
{ "@value": "free-floating value typed value", "@type": "http://example.com/type" },
"free-floating plain string",
true,
false,
null,
1,
1.5
]
}
[ ]
Free-floating values in sets are removed, free-floating lists are removed completely
{
"@context": {
"property": "http://example.com/property"
},
"@graph": [
{
"@set": [
"free-floating strings in set objects are removed",
{
"@id": "http://example.com/free-floating-node"
},
{
"@id": "http://example.com/node",
"property": "nodes with properties are not removed"
}
]
},
{
"@list": [
"lists are removed even though they represent an invisible linked structure, they have no real meaning",
{
"@id": "http://example.com/node-in-free-floating-list",
"property": "everything inside a free-floating list is removed with the list; also nodes with properties"
}
]
}
]
}
[
{
"@id": "http://example.com/node",
"http://example.com/property": [
{
"@value": "nodes with properties are not removed"
}
]
}
]
Values of @id are not expanded as terms
{
"@context": {
"term": "http://example.com/terms-are-not-considered-in-id",
"compact-iris": "http://example.com/compact-iris-",
"property": "http://example.com/property",
"@vocab": "http://example.org/vocab-is-not-considered-for-id"
},
"@id": "term",
"property": [
{
"@id": "compact-iris:are-considered",
"property": "@id supports the following values: relative, absolute, and compact IRIs"
},
{
"@id": "../parent-node",
"property": "relative IRIs get resolved against the document's base IRI"
}
]
}
[
{
"@id": "http://json-ld.org/test-suite/tests/term",
"http://example.com/property": [
{
"@id": "http://example.com/compact-iris-are-considered",
"http://example.com/property": [
{ "@value": "@id supports the following values: relative, absolute, and compact IRIs" }
]
},
{
"@id": "http://json-ld.org/test-suite/parent-node",
"http://example.com/property": [
{ "@value": "relative IRIs get resolved against the document's base IRI" }
]
}
]
}
]
String values of a reverse property with @type: @id are treated as IRIs
{
"@context": {
"name": "http://xmlns.com/foaf/0.1/name",
"isKnownBy": { "@reverse": "http://xmlns.com/foaf/0.1/knows", "@type": "@id" }
},
"@id": "http://example.com/people/markus",
"name": "Markus Lanthaler",
"isKnownBy": [
"http://example.com/people/dave",
"http://example.com/people/gregg"
]
}
[
{
"@id": "http://example.com/people/markus",
"@reverse": {
"http://xmlns.com/foaf/0.1/knows": [
{
"@id": "http://example.com/people/dave"
},
{
"@id": "http://example.com/people/gregg"
}
]
},
"http://xmlns.com/foaf/0.1/name": [ { "@value": "Markus Lanthaler" } ]
}
]
Term definitions using compact IRIs don't inherit the definitions of the prefix
{
"@context": {
"issue": { "@id": "http://example.com/issue/", "@type": "@id" },
"issue:raisedBy": { "@container": "@set" }
},
"issue": "/issue/1",
"issue:raisedBy": "Markus"
}
[
{
"http://example.com/issue/": [ { "@id": "http://json-ld.org/issue/1" } ],
"http://example.com/issue/raisedBy": [ { "@value": "Markus" } ]
}
]
Expanding terms which are keyword aliases
{
"@context": [
{ "id": "@id" },
{ "url": "id" }
],
"url": "/issue/1",
"http://example.com/property": "ok"
}
[{
"http://example.com/property": [{
"@value": "ok"
}],
"@id": "http://json-ld.org/issue/1"
}]
If @vocab is defined, term definitions are expanded relative to @vocab
{
"@context": {
"@vocab": "http://example.org/",
"property": "vocabRelativeProperty"
},
"property": "must expand to http://example.org/vocabRelativeProperty",
"http://example.org/property": "ok"
}
[
{
"http://example.org/property": [ { "@value": "ok" } ],
"http://example.org/vocabRelativeProperty": [ { "@value": "must expand to http://example.org/vocabRelativeProperty" } ]
}
]
Expanding values of properties of @type: @vocab does not further expand absolute IRIs
{
"@context": {
"term": {"@id": "http://example.org/term", "@type": "@vocab"}
},
"term": "http://example.org/enum"
}
[{
"http://example.org/term": [{"@id": "http://example.org/enum"}]
}]
Expanding values of properties of @type: @vocab does not expand term values
{
"@context": {
"term": {"@id": "http://example.org/term", "@type": "@vocab"},
"enum": {"@id": "http://example.org/enum"}
},
"term": "enum"
}
[{
"http://example.org/term": [{"@id": "http://example.org/enum"}]
}]
Expanding values of properties of @type: @vocab expands relative IRIs using @vocab
{
"@context": {
"@vocab": "http://example.org/",
"term": {"@id": "http://example.org/term", "@type": "@vocab"}
},
"term": "enum"
}
[{
"http://example.org/term": [{"@id": "http://example.org/enum"}]
}]
Checks that expansion uses appropriate base depending on term definition having @type @id or @vocab
{
"@context": {
"name": "http://xmlns.com/foaf/0.1/name",
"homepage": { "@id": "http://xmlns.com/foaf/0.1/homepage", "@type": "@vocab" },
"link": { "@id": "http://example.com/link", "@type": "@id" },
"MarkusHomepage": "http://www.markus-lanthaler.com/",
"relative-iri": "http://example.com/error-if-this-is-used-for-link"
},
"@id": "http://me.markus-lanthaler.com/",
"name": "Markus Lanthaler",
"homepage": "MarkusHomepage",
"link": "relative-iri"
}
[
{
"@id": "http://me.markus-lanthaler.com/",
"http://xmlns.com/foaf/0.1/homepage": [ { "@id": "http://www.markus-lanthaler.com/" } ],
"http://example.com/link": [ { "@id": "http://json-ld.org/test-suite/tests/relative-iri" } ],
"http://xmlns.com/foaf/0.1/name": [ { "@value": "Markus Lanthaler" } ]
}
]
Relative values of terms with @type: @vocab expand relative to @vocab
{
"@context": {
"term": { "@id": "http://example.org/term", "@type": "@vocab" }
},
"term": "not-a-term-thus-a-relative-IRI"
}
[
{
"http://example.org/term": [ { "@id": "http://json-ld.org/test-suite/tests/not-a-term-thus-a-relative-IRI" } ]
}
]
Compact IRIs are expanded normally even if term has @type: @vocab
{
"@context": {
"term": { "@id": "http://example.org/term", "@type": "@vocab" },
"prefix": "http://example.com/vocab#"
},
"term": "prefix:suffix"
}
[
{
"http://example.org/term": [ { "@id": "http://example.com/vocab#suffix" } ]
}
]
Setting @vocab to null removes a previous definition
{
"@context": {
"@vocab": "http://example.org/vocab#"
},
"@id": "example-with-vocab",
"@type": "vocab-prefixed",
"property": "property expanded using @vocab",
"embed": {
"@context": {
"@vocab": null
},
"@id": "example-vocab-reset",
"@type": "document-relative",
"property": "@vocab reset, property will be dropped"
}
}
[
{
"@id": "http://json-ld.org/test-suite/tests/example-with-vocab",
"@type": [ "http://example.org/vocab#vocab-prefixed" ],
"http://example.org/vocab#embed": [
{
"@id": "http://json-ld.org/test-suite/tests/example-vocab-reset",
"@type": [ "http://json-ld.org/test-suite/tests/document-relative" ]
}
],
"http://example.org/vocab#property": [ { "@value": "property expanded using @vocab" } ]
}
]
Setting @base to an IRI and then resetting it to nil
{
"@context": {
"property": "http://example.com/vocab#property"
},
"@id": "../document-relative",
"@type": "#document-relative",
"property": {
"@context": {
"@base": "http://example.org/test/"
},
"@id": "../document-base-overwritten",
"@type": "#document-base-overwritten",
"property": [
{
"@context": null,
"@id": "../document-relative",
"@type": "#document-relative",
"property": "context completely reset, drops property"
},
{
"@context": {
"@base": null
},
"@id": "../document-relative",
"@type": "#document-relative",
"property": "only @base is cleared"
}
]
}
}
[
{
"@id": "http://json-ld.org/test-suite/document-relative",
"@type": [ "http://json-ld.org/test-suite/tests/expand-0060-in.jsonld#document-relative" ],
"http://example.com/vocab#property": [
{
"@id": "http://example.org/document-base-overwritten",
"@type": [ "http://example.org/test/#document-base-overwritten" ],
"http://example.com/vocab#property": [
{
"@id": "http://json-ld.org/test-suite/document-relative",
"@type": [ "http://json-ld.org/test-suite/tests/expand-0060-in.jsonld#document-relative" ]
},
{
"@id": "../document-relative",
"@type": [ "#document-relative" ],
"http://example.com/vocab#property": [ { "@value": "only @base is cleared" } ]
}
]
}
]
}
]
Expanding native types when coercing to arbitrary datatypes
{
"@context": {
"property": {
"@id": "http://example.com/property",
"@type": "http://example.com/datatype"
}
},
"property": [ 1, true, false, 5.1 ]
}
[
{
"http://example.com/property": [
{ "@value": 1, "@type": "http://example.com/datatype" },
{ "@value": true, "@type": "http://example.com/datatype" },
{ "@value": false, "@type": "http://example.com/datatype" },
{ "@value": 5.1, "@type": "http://example.com/datatype" }
]
}
]
Pathological relative IRIs
{
"@context": {
"@base": "http://example.com/some/deep/directory/and/file#with-a-fragment",
"links": { "@id": "http://www.example.com/link", "@type": "@id", "@container": "@list" }
},
"@id": "relativeIris",
"@type": [
"link",
"#fragment-works",
"?query=works",
"./",
"../",
"../parent",
"../../parent-parent-eq-root",
"../../../../../still-root",
"../.././.././../../too-many-dots",
"/absolute",
"//example.org/scheme-relative"
],
"links": [
"link",
"#fragment-works",
"?query=works",
"./",
"../",
"../parent",
"../../parent-parent-eq-root",
"./../../../../../still-root",
"../.././.././../../too-many-dots",
"/absolute",
"//example.org/scheme-relative",
"//example.org/../scheme-relative",
"//example.org/.././useless/../../scheme-relative"
]
}
[
{
"@id": "http://example.com/some/deep/directory/and/relativeIris",
"@type": [
"http://example.com/some/deep/directory/and/link",
"http://example.com/some/deep/directory/and/file#fragment-works",
"http://example.com/some/deep/directory/and/file?query=works",
"http://example.com/some/deep/directory/and/",
"http://example.com/some/deep/directory/",
"http://example.com/some/deep/directory/parent",
"http://example.com/some/deep/parent-parent-eq-root",
"http://example.com/still-root",
"http://example.com/too-many-dots",
"http://example.com/absolute",
"http://example.org/scheme-relative"
],
"http://www.example.com/link": [ {
"@list": [
{ "@id": "http://example.com/some/deep/directory/and/link" },
{ "@id": "http://example.com/some/deep/directory/and/file#fragment-works" },
{ "@id": "http://example.com/some/deep/directory/and/file?query=works" },
{ "@id": "http://example.com/some/deep/directory/and/" },
{ "@id": "http://example.com/some/deep/directory/" },
{ "@id": "http://example.com/some/deep/directory/parent" },
{ "@id": "http://example.com/some/deep/parent-parent-eq-root" },
{ "@id": "http://example.com/still-root" },
{ "@id": "http://example.com/too-many-dots" },
{ "@id": "http://example.com/absolute" },
{ "@id": "http://example.org/scheme-relative" },
{ "@id": "http://example.org/scheme-relative" },
{ "@id": "http://example.org/scheme-relative" }
]
} ]
}
]
Expaning reverse properties with an index-container
{
"@context": {
"name": "http://xmlns.com/foaf/0.1/name",
"isKnownBy": { "@reverse": "http://xmlns.com/foaf/0.1/knows", "@container": "@index" }
},
"@id": "http://example.com/people/markus",
"name": "Markus Lanthaler",
"isKnownBy": {
"Dave": {
"@id": "http://example.com/people/dave",
"name": "Dave Longley"
},
"Gregg": {
"@id": "http://example.com/people/gregg",
"name": "Gregg Kellogg"
}
}
}
[
{
"@id": "http://example.com/people/markus",
"@reverse": {
"http://xmlns.com/foaf/0.1/knows": [
{
"@id": "http://example.com/people/dave",
"@index": "Dave",
"http://xmlns.com/foaf/0.1/name": [ { "@value": "Dave Longley" } ]
},
{
"@id": "http://example.com/people/gregg",
"@index": "Gregg",
"http://xmlns.com/foaf/0.1/name": [ { "@value": "Gregg Kellogg" } ]
}
]
},
"http://xmlns.com/foaf/0.1/name": [ { "@value": "Markus Lanthaler" } ]
}
]
Expand reverse property whose values are unlabeled blank nodes
{
"@context": {
"name": "http://xmlns.com/foaf/0.1/name",
"isKnownBy": { "@reverse": "http://xmlns.com/foaf/0.1/knows" }
},
"@id": "http://example.com/people/markus",
"name": "Markus Lanthaler",
"isKnownBy": [
{
"name": "Dave Longley"
},
{
"name": "Gregg Kellogg"
}
]
}
[
{
"@id": "http://example.com/people/markus",
"@reverse": {
"http://xmlns.com/foaf/0.1/knows": [
{
"http://xmlns.com/foaf/0.1/name": [ { "@value": "Dave Longley" } ]
},
{
"http://xmlns.com/foaf/0.1/name": [ { "@value": "Gregg Kellogg" } ]
}
]
},
"http://xmlns.com/foaf/0.1/name": [ { "@value": "Markus Lanthaler" } ]
}
]
Keys that are not mapped to an IRI in a reverse-map are dropped
{
"@context": {
"name": "http://xmlns.com/foaf/0.1/name",
"knows": "http://xmlns.com/foaf/0.1/knows"
},
"@id": "http://example.com/people/markus",
"name": "Markus Lanthaler",
"@reverse": {
"knows": {
"@id": "http://example.com/people/dave",
"name": "Dave Longley"
},
"relative-iri": {
"@id": "relative-node",
"name": "Keys that are not mapped to an IRI in a reverse-map are dropped"
}
}
}
[
{
"@id": "http://example.com/people/markus",
"@reverse": {
"http://xmlns.com/foaf/0.1/knows": [
{
"@id": "http://example.com/people/dave",
"http://xmlns.com/foaf/0.1/name": [ { "@value": "Dave Longley" } ]
}
]
},
"http://xmlns.com/foaf/0.1/name": [ { "@value": "Markus Lanthaler" } ]
}
]
Expand uses @vocab to expand keys in reverse-maps
{
"@context": {
"name": "http://xmlns.com/foaf/0.1/name",
"knows": "http://xmlns.com/foaf/0.1/knows",
"@vocab": "http://example.com/vocab/"
},
"@id": "http://example.com/people/markus",
"name": "Markus Lanthaler",
"@reverse": {
"knows": {
"@id": "http://example.com/people/dave",
"name": "Dave Longley"
},
"noTerm": {
"@id": "relative-node",
"name": "Compact keys using @vocab"
}
}
}
[
{
"@id": "http://example.com/people/markus",
"@reverse": {
"http://xmlns.com/foaf/0.1/knows": [
{
"@id": "http://example.com/people/dave",
"http://xmlns.com/foaf/0.1/name": [ { "@value": "Dave Longley" } ]
}
],
"http://example.com/vocab/noTerm": [
{
"@id": "http://json-ld.org/test-suite/tests/relative-node",
"http://xmlns.com/foaf/0.1/name": [ { "@value": "Compact keys using @vocab" } ]
}
]
},
"http://xmlns.com/foaf/0.1/name": [ { "@value": "Markus Lanthaler" } ]
}
]
prefix:suffix values are not interpreted as compact IRIs if suffix begins with two slashes
{
"@context": {
"http": "http://example.com/this-prefix-would-overwrite-all-http-iris"
},
"@id": "http://example.org/node1",
"@type": "http://example.org/type",
"http://example.org/property": "all these IRIs remain unchanged because they are interpreted as absolute IRIs"
}
[
{
"@id": "http://example.org/node1",
"@type": ["http://example.org/type"],
"http://example.org/property": [
{ "@value": "all these IRIs remain unchanged because they are interpreted as absolute IRIs" }
]
}
]
prefix:suffix values are not interpreted as compact IRIs if prefix is an underscore
{
"@context": {
"_": "http://example.com/this-prefix-would-overwrite-all-blank-node-identifiers"
},
"@id": "_:node1",
"@type": "_:type",
"_:property": "all these IRIs remain unchanged because they are interpreted as blank node identifiers"
}
[
{
"@id": "_:node1",
"@type": [ "_:type" ],
"_:property": [
{ "@value": "all these IRIs remain unchanged because they are interpreted as blank node identifiers" }
]
}
]
Redefine compact IRI to define type mapping using the compact IRI itself as value of @id
{
"@context": {
"rdfs": "http://www.w3.org/2000/01/rdf-schema#",
"rdfs:subClassOf": { "@id": "rdfs:subClassOf", "@type": "@id" }
},
"@id": "http://example.com/vocab#class",
"@type": "rdfs:Class",
"rdfs:subClassOf": "http://example.com/vocab#someOtherClass"
}
[
{
"@id": "http://example.com/vocab#class",
"@type": [ "http://www.w3.org/2000/01/rdf-schema#Class" ],
"http://www.w3.org/2000/01/rdf-schema#subClassOf": [
{ "@id": "http://example.com/vocab#someOtherClass"}
]
}
]
Redefine compact IRI to define type mapping using the compact IRI itself as string value
{
"@context": {
"prefix": "http://www.example.org/vocab#",
"prefix:foo": "prefix:foo"
},
"@id": "http://example.com/vocab#id",
"@type": "prefix:Class",
"prefix:foo": "bar"
}
[
{
"@id": "http://example.com/vocab#id",
"@type": [ "http://www.example.org/vocab#Class" ],
"http://www.example.org/vocab#foo": [
{ "@value": "bar"}
]
}
]
Term definitions may look like compact IRIs
{
"@context": [
{
"v": "http://example.com/vocab#",
"v:term": "v:somethingElse",
"v:termId": { "@id": "v:somethingElseId" }
},
{
"v:term": "v:term",
"v:termId": { "@id": "v:termId" }
}
],
"v:term": "value of v:term",
"v:termId": "value of v:termId"
}
[
{
"http://example.com/vocab#term": [
{ "@value": "value of v:term" }
],
"http://example.com/vocab#termId": [
{ "@value": "value of v:termId" }
]
}
]
Redefining a term as itself when @vocab is defined uses @vocab, not previous term definition
{
"@context": [
{
"v": "http://example.com/vocab#",
"term": "v:somethingElse"
},
{
"@vocab": "http://example.com/anotherVocab#",
"term": "term"
}
],
"term": "value of term"
}
[
{
"http://example.com/anotherVocab#term": [
{ "@value": "value of term" }
]
}
]
Objects are unordered, so serialized node definition containing @context may have @context at the end of the node definition
{
"@id": "ex:node1",
"owl:sameAs": {
"@id": "ex:node2",
"rdfs:label": "Node 2",
"link": "ex:node3",
"@context": {
"rdfs": "http://www.w3.org/2000/01/rdf-schema#"
}
},
"@context": {
"ex": "http://example.org/",
"owl": "http://www.w3.org/2002/07/owl#",
"link": { "@id": "ex:link", "@type": "@id" }
}
}
[
{
"@id": "http://example.org/node1",
"http://www.w3.org/2002/07/owl#sameAs": [
{
"@id": "http://example.org/node2",
"http://example.org/link": [
{ "@id": "http://example.org/node3" }
],
"http://www.w3.org/2000/01/rdf-schema#label": [ { "@value": "Node 2" } ]
}
]
}
]
Objects are unordered, so serialized node definition containing @id may have @id at the end of the node definition
{
"@context": {
"ex": "http://example.org/",
"owl": "http://www.w3.org/2002/07/owl#",
"link": {
"@id": "ex:link",
"@type": "@id"
}
},
"owl:sameAs": {
"@context": {
"rdfs": "http://www.w3.org/2000/01/rdf-schema#"
},
"rdfs:label": "Node 2",
"link": "ex:node3",
"@id": "ex:node2"
},
"@id": "ex:node1"
}
[
{
"@id": "http://example.org/node1",
"http://www.w3.org/2002/07/owl#sameAs": [
{
"@id": "http://example.org/node2",
"http://example.org/link": [
{ "@id": "http://example.org/node3" }
],
"http://www.w3.org/2000/01/rdf-schema#label": [ { "@value": "Node 2" } ]
}
]
}
]
Use @vocab to map all properties to blank node identifiers
{
"@context": {
"@vocab": "_:"
},
"@id": "ex:node1",
"b1": "blank node property 1",
"b2": "blank node property 1"
}
[
{
"@id": "ex:node1",
"_:b1": [ { "@value": "blank node property 1" } ],
"_:b2": [ { "@value": "blank node property 1" } ]
}
]
Use of the base option overrides the document location
{
"@id": "relative-iri",
"http://prop": "value"
}
[{
"@id": "http://example/base/relative-iri",
"http://prop": [{"@value": "value"}]
}]
Use of the expandContext option to expand the input document
{
"@id": "http://example.com/id1",
"@type": "t1",
"term1": "v1",
"term2": {"@value": "v2", "@type": "t2"},
"term3": {"@value": "v3", "@language": "en"},
"term4": 4,
"term5": [50, 51]
}
[{
"@id": "http://example.com/id1",
"@type": ["http://example.com/t1"],
"http://example.com/term1": [{"@value": "v1"}],
"http://example.com/term2": [{"@value": "v2", "@type": "http://example.com/t2"}],
"http://example.com/term3": [{"@value": "v3", "@language": "en"}],
"http://example.com/term4": [{"@value": 4}],
"http://example.com/term5": [{"@value": 50}, {"@value": 51}]
}]
Flattening drops unreferenced nodes having only @id
{"@id": "http://example.org/test#example"}
[ ]
Flattening terms with different types of values
{
"@context": {
"t1": "http://example.com/t1",
"t2": "http://example.com/t2",
"term1": "http://example.com/term1",
"term2": "http://example.com/term2",
"term3": "http://example.com/term3",
"term4": "http://example.com/term4",
"term5": "http://example.com/term5"
},
"@id": "http://example.com/id1",
"@type": "t1",
"term1": "v1",
"term2": {"@value": "v2", "@type": "t2"},
"term3": {"@value": "v3", "@language": "en"},
"term4": 4,
"term5": [50, 51]
}
[
{
"@id": "http://example.com/id1",
"@type": [
"http://example.com/t1"
],
"http://example.com/term1": [
{
"@value": "v1"
}
],
"http://example.com/term2": [
{
"@type": "http://example.com/t2",
"@value": "v2"
}
],
"http://example.com/term3": [
{
"@language": "en",
"@value": "v3"
}
],
"http://example.com/term4": [
{
"@value": 4
}
],
"http://example.com/term5": [
{
"@value": 50
},
{
"@value": 51
}
]
}
]
Verifies that null values and unmapped properties are removed from expanded output
{
"@id": "http://example.org/id",
"http://example.org/property": null,
"regularJson": {
"nonJsonLd": "property",
"deep": [{
"foo": "bar"
}, {
"bar": "foo"
}]
}
}
[ ]
Uses of @set are removed in expansion; values of @set, or just plain values which are empty arrays are retained
{
"@context": {
"mylist1": {"@id": "http://example.com/mylist1", "@container": "@list"},
"mylist2": {"@id": "http://example.com/mylist2", "@container": "@list"},
"myset2": {"@id": "http://example.com/myset2", "@container": "@set"},
"myset3": {"@id": "http://example.com/myset3", "@container": "@set"}
},
"@id": "http://example.org/id",
"mylist1": { "@list": [ ] },
"mylist2": "one item",
"myset2": { "@set": [ ] },
"myset3": [ "v1" ],
"http://example.org/list1": { "@list": [ null ] },
"http://example.org/list2": { "@list": [ {"@value": null} ] },
"http://example.org/set1": { "@set": [ ] },
"http://example.org/set1": { "@set": [ null ] },
"http://example.org/set3": [ ],
"http://example.org/set4": [ null ],
"http://example.org/set5": "one item",
"http://example.org/property": { "@list": "one item" }
}
[
{
"@id": "http://example.org/id",
"http://example.com/mylist1": [
{
"@list": [
]
}
],
"http://example.com/mylist2": [
{
"@list": [
{
"@value": "one item"
}
]
}
],
"http://example.com/myset2": [
],
"http://example.com/myset3": [
{
"@value": "v1"
}
],
"http://example.org/list1": [
{
"@list": [
]
}
],
"http://example.org/list2": [
{
"@list": [
]
}
],
"http://example.org/property": [
{
"@list": [
{
"@value": "one item"
}
]
}
],
"http://example.org/set1": [
],
"http://example.org/set3": [
],
"http://example.org/set4": [
],
"http://example.org/set5": [
{
"@value": "one item"
}
]
}
]
If a keyword is aliased, it is not used when flattening
{
"@context": {
"name": "http://xmlns.com/foaf/0.1/name",
"homepage": {
"@id": "http://xmlns.com/foaf/0.1/homepage",
"@type": "@id"
},
"know": "http://xmlns.com/foaf/0.1/knows",
"@iri": "@id"
},
"@id": "#me",
"know": [
{
"@id": "http://example.com/bob#me",
"name": "Bob",
"homepage": "http://example.com/bob"
}, {
"@id": "http://example.com/alice#me",
"name": "Alice",
"homepage": "http://example.com/alice"
}
]
}
[
{
"@id": "http://example.com/alice#me",
"http://xmlns.com/foaf/0.1/homepage": [
{
"@id": "http://example.com/alice"
}
],
"http://xmlns.com/foaf/0.1/name": [
{
"@value": "Alice"
}
]
},
{
"@id": "http://example.com/bob#me",
"http://xmlns.com/foaf/0.1/homepage": [
{
"@id": "http://example.com/bob"
}
],
"http://xmlns.com/foaf/0.1/name": [
{
"@value": "Bob"
}
]
},
{
"@id": "http://json-ld.org/test-suite/tests/flatten-0005-in.jsonld#me",
"http://xmlns.com/foaf/0.1/knows": [
{
"@id": "http://example.com/bob#me"
},
{
"@id": "http://example.com/alice#me"
}
]
}
]
Aliased keywords expand in resulting document
{
"@context": {
"http://example.org/test#property1": {
"@type": "@id"
},
"http://example.org/test#property2": {
"@type": "@id"
},
"uri": "@id"
},
"http://example.org/test#property1": {
"http://example.org/test#property4": "foo",
"uri": "http://example.org/test#example2"
},
"http://example.org/test#property2": "http://example.org/test#example3",
"http://example.org/test#property3": {
"uri": "http://example.org/test#example4"
},
"uri": "http://example.org/test#example1"
}
[
{
"@id": "http://example.org/test#example1",
"http://example.org/test#property1": [
{
"@id": "http://example.org/test#example2"
}
],
"http://example.org/test#property2": [
{
"@id": "http://example.org/test#example3"
}
],
"http://example.org/test#property3": [
{
"@id": "http://example.org/test#example4"
}
]
},
{
"@id": "http://example.org/test#example2",
"http://example.org/test#property4": [
{
"@value": "foo"
}
]
}
]
Expand strings to expanded value with @type: xsd:dateTime
{
"@context": {
"ex": "http://example.org/vocab#",
"ex:date": {
"@type": "xsd:dateTime"
},
"ex:parent": {
"@type": "@id"
},
"xsd": "http://www.w3.org/2001/XMLSchema#"
},
"@id": "http://example.org/test#example1",
"ex:date": "2011-01-25T00:00:00Z",
"ex:embed": {
"@id": "http://example.org/test#example2",
"ex:parent": "http://example.org/test#example1"
}
}
[
{
"@id": "http://example.org/test#example1",
"http://example.org/vocab#date": [
{
"@value": "2011-01-25T00:00:00Z",
"@type": "http://www.w3.org/2001/XMLSchema#dateTime"
}
],
"http://example.org/vocab#embed": [
{
"@id": "http://example.org/test#example2"
}
]
},
{
"@id": "http://example.org/test#example2",
"http://example.org/vocab#parent": [
{
"@id": "http://example.org/test#example1"
}
]
}
]
Keep expanded values with @language, drop non-conforming value objects containing just @language
{
"@context": {
"ex": "http://example.org/vocab#"
},
"@id": "http://example.org/test",
"ex:test": { "@value": "test", "@language": "en" },
"ex:drop-lang-only": { "@language": "en" },
"ex:keep-full-value": { "@value": "only value" }
}
[
{
"@id": "http://example.org/test",
"http://example.org/vocab#keep-full-value": [
{
"@value": "only value"
}
],
"http://example.org/vocab#test": [
{
"@language": "en",
"@value": "test"
}
]
}
]
Use of @graph to contain multiple nodes within array
{
"@context": {
"authored": {
"@id": "http://example.org/vocab#authored",
"@type": "@id"
},
"contains": {
"@id": "http://example.org/vocab#contains",
"@type": "@id"
},
"contributor": "http://purl.org/dc/elements/1.1/contributor",
"description": "http://purl.org/dc/elements/1.1/description",
"name": "http://xmlns.com/foaf/0.1/name",
"title": {
"@id": "http://purl.org/dc/elements/1.1/title"
}
},
"@graph": [
{
"@id": "http://example.org/test#chapter",
"description": "Fun",
"title": "Chapter One"
},
{
"@id": "http://example.org/test#jane",
"authored": "http://example.org/test#chapter",
"name": "Jane"
},
{
"@id": "http://example.org/test#john",
"name": "John"
},
{
"@id": "http://example.org/test#library",
"contains": {
"@id": "http://example.org/test#book",
"contains": "http://example.org/test#chapter",
"contributor": "Writer",
"title": "My Book"
}
}
]
}
[
{
"@id": "http://example.org/test#book",
"http://example.org/vocab#contains": [
{
"@id": "http://example.org/test#chapter"
}
],
"http://purl.org/dc/elements/1.1/contributor": [
{
"@value": "Writer"
}
],
"http://purl.org/dc/elements/1.1/title": [
{
"@value": "My Book"
}
]
},
{
"@id": "http://example.org/test#chapter",
"http://purl.org/dc/elements/1.1/description": [
{
"@value": "Fun"
}
],
"http://purl.org/dc/elements/1.1/title": [
{
"@value": "Chapter One"
}
]
},
{
"@id": "http://example.org/test#jane",
"http://example.org/vocab#authored": [
{
"@id": "http://example.org/test#chapter"
}
],
"http://xmlns.com/foaf/0.1/name": [
{
"@value": "Jane"
}
]
},
{
"@id": "http://example.org/test#john",
"http://xmlns.com/foaf/0.1/name": [
{
"@value": "John"
}
]
},
{
"@id": "http://example.org/test#library",
"http://example.org/vocab#contains": [
{
"@id": "http://example.org/test#book"
}
]
}
]
Flattening native scalar retains native scalar within expanded value
{
"@context": {
"d": "http://purl.org/dc/elements/1.1/",
"e": "http://example.org/vocab#",
"f": "http://xmlns.com/foaf/0.1/",
"xsd": "http://www.w3.org/2001/XMLSchema#"
},
"@id": "http://example.org/test",
"e:bool": true,
"e:int": 123
}
[
{
"@id": "http://example.org/test",
"http://example.org/vocab#bool": [
{
"@value": true
}
],
"http://example.org/vocab#int": [
{
"@value": 123
}
]
}
]
A value of a property with @type: @id coercion expands to a node reference
{
"@context": {
"dc": "http://purl.org/dc/elements/1.1/",
"ex": "http://example.org/vocab#",
"ex:contains": {
"@type": "@id"
},
"xsd": "http://www.w3.org/2001/XMLSchema#"
},
"@id": "http://example.org/test#book",
"dc:title": "Title",
"ex:contains": "http://example.org/test#chapter"
}
[
{
"@id": "http://example.org/test#book",
"http://example.org/vocab#contains": [
{
"@id": "http://example.org/test#chapter"
}
],
"http://purl.org/dc/elements/1.1/title": [
{
"@value": "Title"
}
]
}
]
Flattening objects containing chained objects flattens all objects
{
"@context": {
"dc": "http://purl.org/dc/elements/1.1/",
"ex": "http://example.org/vocab#",
"ex:authored": {
"@type": "@id"
},
"ex:contains": {
"@type": "@id"
},
"foaf": "http://xmlns.com/foaf/0.1/",
"xsd": "http://www.w3.org/2001/XMLSchema#"
},
"@graph": [
{
"@id": "http://example.org/test#chapter",
"dc:description": "Fun",
"dc:title": "Chapter One"
},
{
"@id": "http://example.org/test#jane",
"ex:authored": "http://example.org/test#chapter",
"foaf:name": "Jane"
},
{
"@id": "http://example.org/test#john",
"foaf:name": "John"
},
{
"@id": "http://example.org/test#library",
"ex:contains": {
"@id": "http://example.org/test#book",
"dc:contributor": "Writer",
"dc:title": "My Book",
"ex:contains": "http://example.org/test#chapter"
}
}
]
}
[
{
"@id": "http://example.org/test#book",
"http://example.org/vocab#contains": [
{
"@id": "http://example.org/test#chapter"
}
],
"http://purl.org/dc/elements/1.1/contributor": [
{
"@value": "Writer"
}
],
"http://purl.org/dc/elements/1.1/title": [
{
"@value": "My Book"
}
]
},
{
"@id": "http://example.org/test#chapter",
"http://purl.org/dc/elements/1.1/description": [
{
"@value": "Fun"
}
],
"http://purl.org/dc/elements/1.1/title": [
{
"@value": "Chapter One"
}
]
},
{
"@id": "http://example.org/test#jane",
"http://example.org/vocab#authored": [
{
"@id": "http://example.org/test#chapter"
}
],
"http://xmlns.com/foaf/0.1/name": [
{
"@value": "Jane"
}
]
},
{
"@id": "http://example.org/test#john",
"http://xmlns.com/foaf/0.1/name": [
{
"@value": "John"
}
]
},
{
"@id": "http://example.org/test#library",
"http://example.org/vocab#contains": [
{
"@id": "http://example.org/test#book"
}
]
}
]
Flattening an expanded/flattened document maintains input document
[{
"@id": "http://example.com/id1",
"@type": ["http://example.com/t1"],
"http://example.com/term1": ["v1"],
"http://example.com/term2": [{"@value": "v2", "@type": "http://example.com/t2"}],
"http://example.com/term3": [{"@value": "v3", "@language": "en"}],
"http://example.com/term4": [4],
"http://example.com/term5": [50, 51]
}]
[
{
"@id": "http://example.com/id1",
"@type": [
"http://example.com/t1"
],
"http://example.com/term1": [
{
"@value": "v1"
}
],
"http://example.com/term2": [
{
"@type": "http://example.com/t2",
"@value": "v2"
}
],
"http://example.com/term3": [
{
"@language": "en",
"@value": "v3"
}
],
"http://example.com/term4": [
{
"@value": 4
}
],
"http://example.com/term5": [
{
"@value": 50
},
{
"@value": 51
}
]
}
]
Flattening aliased @set and @value
{
"@context": {
"ex": "http://example.org/test#",
"property1": {
"@id": "http://example.org/test#property1",
"@type": "@id"
},
"property2": {
"@id": "ex:property2",
"@type": "@id"
},
"uri": "@id",
"set": "@set",
"value": "@value",
"type": "@type",
"xsd": { "@id": "http://www.w3.org/2001/XMLSchema#" }
},
"property1": {
"uri": "ex:example2",
"http://example.org/test#property4": "foo"
},
"property2": "http://example.org/test#example3",
"http://example.org/test#property3": {
"uri": "http://example.org/test#example4"
},
"ex:property4": {
"uri": "ex:example4",
"ex:property5": [
{
"set": [
{
"value": "2012-03-31",
"type": "xsd:date"
}
]
}
]
},
"ex:property6": [
{
"set": [
{
"value": null,
"type": "xsd:date"
}
]
}
],
"uri": "http://example.org/test#example1"
}
[
{
"@id": "http://example.org/test#example1",
"http://example.org/test#property1": [
{
"@id": "http://example.org/test#example2"
}
],
"http://example.org/test#property2": [
{
"@id": "http://example.org/test#example3"
}
],
"http://example.org/test#property3": [
{
"@id": "http://example.org/test#example4"
}
],
"http://example.org/test#property4": [
{
"@id": "http://example.org/test#example4"
}
],
"http://example.org/test#property6": [
]
},
{
"@id": "http://example.org/test#example2",
"http://example.org/test#property4": [
{
"@value": "foo"
}
]
},
{
"@id": "http://example.org/test#example4",
"http://example.org/test#property5": [
{
"@type": "http://www.w3.org/2001/XMLSchema#date",
"@value": "2012-03-31"
}
]
}
]
An array of multiple @set nodes are collapsed into a single array
{
"@context": {
"mylist1": {"@id": "http://example.com/mylist1", "@container": "@list"},
"mylist2": {"@id": "http://example.com/mylist2", "@container": "@list"},
"myset1": {"@id": "http://example.com/myset1", "@container": "@set" },
"myset2": {"@id": "http://example.com/myset2", "@container": "@set" },
"myset3": {"@id": "http://example.com/myset3", "@container": "@set" }
},
"@id": "http://example.org/id",
"mylist1": [],
"myset1": { "@set": [] },
"myset2": [ { "@set": [] }, [], { "@set": [ null ] }, [ null ] ],
"myset3": [ { "@set": [ "hello", "this" ] }, "will", { "@set": [ "be", "collapsed" ] } ]
}
[
{
"@id": "http://example.org/id",
"http://example.com/mylist1": [
{
"@list": [
]
}
],
"http://example.com/myset1": [
],
"http://example.com/myset2": [
],
"http://example.com/myset3": [
{
"@value": "hello"
},
{
"@value": "this"
},
{
"@value": "will"
},
{
"@value": "be"
},
{
"@value": "collapsed"
}
]
}
]
Setting @context to null within an embedded object resets back to initial context state
{
"@context": {
"myproperty": { "@id": "http://example.com/myproperty" },
"mylist1": {"@id": "http://example.com/mylist1", "@container": "@list"},
"mylist2": {"@id": "http://example.com/mylist2", "@container": "@list"},
"myset1": {"@id": "http://example.com/myset1", "@container": "@set" },
"myset2": {"@id": "http://example.com/myset2", "@container": "@set" }
},
"@id": "http://example.org/id1",
"mylist1": [],
"mylist2": [ 2, "hi" ],
"myset1": { "@set": [] },
"myset2": [ { "@set": [] }, [], { "@set": [ null ] }, [ null ] ],
"myproperty": {
"@context": null,
"@id": "http://example.org/id2",
"mylist1": [],
"mylist2": [ 2, "hi" ],
"myset1": { "@set": [] },
"myset2": [ { "@set": [] }, [], { "@set": [ null ] }, [ null ] ],
"http://example.org/myproperty2": "ok"
},
"http://example.com/emptyobj": {
"@context": null,
"mylist1": [],
"mylist2": [ 2, "hi" ],
"myset1": { "@set": [] },
"myset2": [ { "@set": [] }, [], { "@set": [ null ] }, [ null ] ]
}
}
[
{
"@id": "http://example.org/id1",
"http://example.com/emptyobj": [
{
"@id": "_:b0"
}
],
"http://example.com/mylist1": [
{
"@list": [
]
}
],
"http://example.com/mylist2": [
{
"@list": [
{
"@value": 2
},
{
"@value": "hi"
}
]
}
],
"http://example.com/myproperty": [
{
"@id": "http://example.org/id2"
}
],
"http://example.com/myset1": [
],
"http://example.com/myset2": [
]
},
{
"@id": "http://example.org/id2",
"http://example.org/myproperty2": [
{
"@value": "ok"
}
]
}
]
Flattening with @graph and @id aliases
{
"@context": {
"authored": {
"@id": "http://example.org/vocab#authored",
"@type": "@id"
},
"contains": {
"@id": "http://example.org/vocab#contains",
"@type": "@id"
},
"contributor": "http://purl.org/dc/elements/1.1/contributor",
"description": "http://purl.org/dc/elements/1.1/description",
"name": "http://xmlns.com/foaf/0.1/name",
"title": {
"@id": "http://purl.org/dc/elements/1.1/title"
},
"id": "@id",
"data": "@graph"
},
"data": [
{
"id": "http://example.org/test#chapter",
"description": "Fun",
"title": "Chapter One"
},
{
"@id": "http://example.org/test#jane",
"authored": "http://example.org/test#chapter",
"name": "Jane"
},
{
"id": "http://example.org/test#john",
"name": "John"
},
{
"id": "http://example.org/test#library",
"contains": {
"@id": "http://example.org/test#book",
"contains": "http://example.org/test#chapter",
"contributor": "Writer",
"title": "My Book"
}
}
]
}
[
{
"@id": "http://example.org/test#book",
"http://example.org/vocab#contains": [
{
"@id": "http://example.org/test#chapter"
}
],
"http://purl.org/dc/elements/1.1/contributor": [
{
"@value": "Writer"
}
],
"http://purl.org/dc/elements/1.1/title": [
{
"@value": "My Book"
}
]
},
{
"@id": "http://example.org/test#chapter",
"http://purl.org/dc/elements/1.1/description": [
{
"@value": "Fun"
}
],
"http://purl.org/dc/elements/1.1/title": [
{
"@value": "Chapter One"
}
]
},
{
"@id": "http://example.org/test#jane",
"http://example.org/vocab#authored": [
{
"@id": "http://example.org/test#chapter"
}
],
"http://xmlns.com/foaf/0.1/name": [
{
"@value": "Jane"
}
]
},
{
"@id": "http://example.org/test#john",
"http://xmlns.com/foaf/0.1/name": [
{
"@value": "John"
}
]
},
{
"@id": "http://example.org/test#library",
"http://example.org/vocab#contains": [
{
"@id": "http://example.org/test#book"
}
]
}
]
override default @language in terms; only language-tag strings
{
"@context": {
"ex": "http://example.org/vocab#",
"@language": "en",
"de": { "@id": "ex:german", "@language": "de" },
"nolang": { "@id": "ex:nolang", "@language": null }
},
"@id": "http://example.org/test",
"ex:test-default": [
"hello",
1,
true
],
"de": [
"hallo",
2,
true
],
"nolang": [
"no language",
3,
false
]
}
[
{
"@id": "http://example.org/test",
"http://example.org/vocab#german": [
{
"@value": "hallo",
"@language": "de"
},
{
"@value": 2
},
{
"@value": true
}
],
"http://example.org/vocab#nolang": [
{
"@value": "no language"
},
{
"@value": 3
},
{
"@value": false
}
],
"http://example.org/vocab#test-default": [
{
"@value": "hello",
"@language": "en"
},
{
"@value": 1
},
{
"@value": true
}
]
}
]
Flattening a value of null removes the value
{
"@context": {
"myproperty": "http://example.com/myproperty"
},
"myproperty": { "@value" : null }
}
[ ]
@graph used under a node is retained
{
"@context": {
"authored": {
"@id": "http://example.org/vocab#authored",
"@type": "@id"
},
"contains": {
"@id": "http://example.org/vocab#contains",
"@type": "@id"
},
"contributor": "http://purl.org/dc/elements/1.1/contributor",
"description": "http://purl.org/dc/elements/1.1/description",
"name": "http://xmlns.com/foaf/0.1/name",
"title": {
"@id": "http://purl.org/dc/elements/1.1/title"
}
},
"@graph": [
{
"@id": "http://example.org/test#jane",
"name": "Jane",
"authored": {
"@graph": [
{
"@id": "http://example.org/test#chapter1",
"description": "Fun",
"title": "Chapter One"
},
{
"@id": "http://example.org/test#chapter2",
"description": "More fun",
"title": "Chapter Two"
}
]
}
},
{
"@id": "http://example.org/test#john",
"name": "John"
},
{
"@id": "http://example.org/test#library",
"contains": {
"@id": "http://example.org/test#book",
"contains": "http://example.org/test#chapter",
"contributor": "Writer",
"title": "My Book"
}
}
]
}
[
{
"@id": "_:b0",
"@graph": [
{
"@id": "http://example.org/test#chapter1",
"http://purl.org/dc/elements/1.1/description": [
{
"@value": "Fun"
}
],
"http://purl.org/dc/elements/1.1/title": [
{
"@value": "Chapter One"
}
]
},
{
"@id": "http://example.org/test#chapter2",
"http://purl.org/dc/elements/1.1/description": [
{
"@value": "More fun"
}
],
"http://purl.org/dc/elements/1.1/title": [
{
"@value": "Chapter Two"
}
]
}
]
},
{
"@id": "http://example.org/test#book",
"http://example.org/vocab#contains": [
{
"@id": "http://example.org/test#chapter"
}
],
"http://purl.org/dc/elements/1.1/contributor": [
{
"@value": "Writer"
}
],
"http://purl.org/dc/elements/1.1/title": [
{
"@value": "My Book"
}
]
},
{
"@id": "http://example.org/test#jane",
"http://example.org/vocab#authored": [
{
"@id": "_:b0"
}
],
"http://xmlns.com/foaf/0.1/name": [
{
"@value": "Jane"
}
]
},
{
"@id": "http://example.org/test#john",
"http://xmlns.com/foaf/0.1/name": [
{
"@value": "John"
}
]
},
{
"@id": "http://example.org/test#library",
"http://example.org/vocab#contains": [
{
"@id": "http://example.org/test#book"
}
]
}
]
@graph used at the top level is retained if there are other properties
{
"@context": {
"authored": {
"@id": "http://example.org/vocab#authored",
"@type": "@id"
},
"contains": {
"@id": "http://example.org/vocab#contains",
"@type": "@id"
},
"contributor": "http://purl.org/dc/elements/1.1/contributor",
"description": "http://purl.org/dc/elements/1.1/description",
"name": "http://xmlns.com/foaf/0.1/name",
"title": {
"@id": "http://purl.org/dc/elements/1.1/title"
}
},
"title": "My first graph",
"@graph": [
{
"@id": "http://example.org/test#jane",
"name": "Jane",
"authored": {
"@graph": [
{
"@id": "http://example.org/test#chapter1",
"description": "Fun",
"title": "Chapter One"
},
{
"@id": "http://example.org/test#chapter2",
"description": "More fun",
"title": "Chapter Two"
},
{
"@id": "http://example.org/test#chapter3",
"title": "Chapter Three"
}
]
}
},
{
"@id": "http://example.org/test#john",
"name": "John"
},
{
"@id": "http://example.org/test#library",
"contains": {
"@id": "http://example.org/test#book",
"contains": "http://example.org/test#chapter",
"contributor": "Writer",
"title": "My Book"
}
}
]
}
[
{
"@id": "_:b0",
"http://purl.org/dc/elements/1.1/title": [
{
"@value": "My first graph"
}
],
"@graph": [
{
"@id": "http://example.org/test#book",
"http://example.org/vocab#contains": [
{
"@id": "http://example.org/test#chapter"
}
],
"http://purl.org/dc/elements/1.1/contributor": [
{
"@value": "Writer"
}
],
"http://purl.org/dc/elements/1.1/title": [
{
"@value": "My Book"
}
]
},
{
"@id": "http://example.org/test#jane",
"http://example.org/vocab#authored": [
{
"@id": "_:b1"
}
],
"http://xmlns.com/foaf/0.1/name": [
{
"@value": "Jane"
}
]
},
{
"@id": "http://example.org/test#john",
"http://xmlns.com/foaf/0.1/name": [
{
"@value": "John"
}
]
},
{
"@id": "http://example.org/test#library",
"http://example.org/vocab#contains": [
{
"@id": "http://example.org/test#book"
}
]
}
]
},
{
"@id": "_:b1",
"@graph": [
{
"@id": "http://example.org/test#chapter1",
"http://purl.org/dc/elements/1.1/description": [
{
"@value": "Fun"
}
],
"http://purl.org/dc/elements/1.1/title": [
{
"@value": "Chapter One"
}
]
},
{
"@id": "http://example.org/test#chapter2",
"http://purl.org/dc/elements/1.1/description": [
{
"@value": "More fun"
}
],
"http://purl.org/dc/elements/1.1/title": [
{
"@value": "Chapter Two"
}
]
},
{
"@id": "http://example.org/test#chapter3",
"http://purl.org/dc/elements/1.1/title": [
{
"@value": "Chapter Three"
}
]
}
]
}
]
Flattening with a default language applies that language to string values
{
"@context": {
"term": "http://example.com/term",
"@language": "en"
},
"term": "v"
}
[
{
"@id": "_:b0",
"http://example.com/term": [
{
"@value": "v",
"@language": "en"
}
]
}
]
Flattening lists and sets with properties having coercion coerces list/set values
{
"@context": {
"xsd": "http://www.w3.org/2001/XMLSchema#",
"idlist": {"@id": "http://example.com/idlist", "@container": "@list", "@type": "@id"},
"datelist": {"@id": "http://example.com/datelist", "@container": "@list", "@type": "xsd:date"},
"idset": {"@id": "http://example.com/idset", "@container": "@set", "@type": "@id"},
"dateset": {"@id": "http://example.com/dateset", "@container": "@set", "@type": "xsd:date"},
"idprop": {"@id": "http://example.com/idprop", "@type": "@id" },
"dateprop": {"@id": "http://example.com/dateprop", "@type": "xsd:date" },
"idprop2": {"@id": "http://example.com/idprop2", "@type": "@id" },
"dateprop2": {"@id": "http://example.com/dateprop2", "@type": "xsd:date" }
},
"idlist": ["http://example.org/id"],
"datelist": ["2012-04-12"],
"idprop": {"@list": ["http://example.org/id"]},
"dateprop": {"@list": ["2012-04-12"]},
"idset": ["http://example.org/id"],
"dateset": ["2012-04-12"],
"idprop2": {"@set": ["http://example.org/id"]},
"dateprop2": {"@set": ["2012-04-12"]}
}
[
{
"@id": "_:b0",
"http://example.com/datelist": [
{
"@list": [
{
"@value": "2012-04-12",
"@type": "http://www.w3.org/2001/XMLSchema#date"
}
]
}
],
"http://example.com/dateprop": [
{
"@list": [
{
"@value": "2012-04-12",
"@type": "http://www.w3.org/2001/XMLSchema#date"
}
]
}
],
"http://example.com/dateprop2": [
{
"@value": "2012-04-12",
"@type": "http://www.w3.org/2001/XMLSchema#date"
}
],
"http://example.com/dateset": [
{
"@value": "2012-04-12",
"@type": "http://www.w3.org/2001/XMLSchema#date"
}
],
"http://example.com/idlist": [
{
"@list": [
{
"@id": "http://example.org/id"
}
]
}
],
"http://example.com/idprop": [
{
"@list": [
{
"@id": "http://example.org/id"
}
]
}
],
"http://example.com/idprop2": [
{
"@id": "http://example.org/id"
}
],
"http://example.com/idset": [
{
"@id": "http://example.org/id"
}
]
}
]
Tests that contexts in an array are merged
{
"@context": [
{
"name": "http://xmlns.com/foaf/0.1/name",
"homepage": {"@id": "http://xmlns.com/foaf/0.1/homepage","@type": "@id"}
},
{"ical": "http://www.w3.org/2002/12/cal/ical#"}
],
"@id": "http://example.com/speakers#Alice",
"name": "Alice",
"homepage": "http://xkcd.com/177/",
"ical:summary": "Alice Talk",
"ical:location": "Lyon Convention Centre, Lyon, France"
}
[
{
"@id": "http://example.com/speakers#Alice",
"http://www.w3.org/2002/12/cal/ical#location": [
{
"@value": "Lyon Convention Centre, Lyon, France"
}
],
"http://www.w3.org/2002/12/cal/ical#summary": [
{
"@value": "Alice Talk"
}
],
"http://xmlns.com/foaf/0.1/homepage": [
{
"@id": "http://xkcd.com/177/"
}
],
"http://xmlns.com/foaf/0.1/name": [
{
"@value": "Alice"
}
]
}
]
Flattening different kinds of terms and Compact IRIs
{
"@context": {
"foo": "http://example.com/foo/",
"foo:bar": "http://example.com/bar",
"bar": {"@id": "foo:bar", "@type": "@id"},
"_": "http://example.com/underscore/"
},
"@type": ["foo", "foo:bar", "_"]
}
[
{
"@id": "_:b0",
"@type": [
"http://example.com/foo/",
"http://example.com/bar",
"http://example.com/underscore/"
]
}
]
Flattening term mapping to @type uses @type syntax
{
"@context": {
"http://www.w3.org/1999/02/22-rdf-syntax-ns#type": {"@id": "@type", "@type": "@id"}
},
"@graph": [
{
"@id": "http://example.com/a",
"http://www.w3.org/1999/02/22-rdf-syntax-ns#type": "http://example.com/b"
}, {
"@id": "http://example.com/c",
"http://www.w3.org/1999/02/22-rdf-syntax-ns#type": [
"http://example.com/d",
"http://example.com/e"
]
}, {
"@id": "http://example.com/f",
"http://www.w3.org/1999/02/22-rdf-syntax-ns#type": "http://example.com/g"
}
]
}
[
{
"@id": "http://example.com/a",
"@type": [
"http://example.com/b"
]
},
{
"@id": "http://example.com/c",
"@type": [
"http://example.com/d",
"http://example.com/e"
]
},
{
"@id": "http://example.com/f",
"@type": [
"http://example.com/g"
]
}
]
Duplicate values in @list and @set are not merged
{
"@context": {
"mylist": {"@id": "http://example.com/mylist", "@container": "@list"},
"myset": {"@id": "http://example.com/myset", "@container": "@set"}
},
"@id": "http://example.org/id",
"mylist": [1, 2, 2, 3],
"myset": [1, 2, 2, 3]
}
[
{
"@id": "http://example.org/id",
"http://example.com/mylist": [
{
"@list": [
{
"@value": 1
},
{
"@value": 2
},
{
"@value": 2
},
{
"@value": 3
}
]
}
],
"http://example.com/myset": [
{
"@value": 1
},
{
"@value": 2
},
{
"@value": 3
}
]
}
]
@vocab is used to compact properties and @type, but is not used for @id
{
"@context": {
"@vocab": "http://example.org/vocab#",
"date": { "@type": "dateTime" }
},
"@id": "example1",
"@type": "test",
"date": "2011-01-25T00:00:00Z",
"embed": {
"@id": "example2",
"expandedDate": { "@value": "2012-08-01T00:00:00Z", "@type": "dateTime" }
}
}
[
{
"@id": "http://json-ld.org/test-suite/tests/example1",
"@type": [
"http://example.org/vocab#test"
],
"http://example.org/vocab#date": [
{
"@value": "2011-01-25T00:00:00Z",
"@type": "http://example.org/vocab#dateTime"
}
],
"http://example.org/vocab#embed": [
{
"@id": "http://json-ld.org/test-suite/tests/example2"
}
]
},
{
"@id": "http://json-ld.org/test-suite/tests/example2",
"http://example.org/vocab#expandedDate": [
{
"@type": "http://example.org/vocab#dateTime",
"@value": "2012-08-01T00:00:00Z"
}
]
}
]
@base is used to compact @id; test with different relative IRIs
{
"@context": {
"links": { "@id": "http://www.example.com/link", "@type": "@id", "@container": "@list" }
},
"@id": "relativeIris",
"@type": [
"link",
"#fragment-works",
"?query=works",
"./",
"../",
"../parent",
"../../parent-parent-eq-root",
"../../../../../still-root",
"../.././.././../../too-many-dots",
"/absolute",
"//example.org/scheme-relative"
],
"links": [
"link",
"#fragment-works",
"?query=works",
"./",
"../",
"../parent",
"../../parent-parent-eq-root",
"./../../../useless/../../../still-root",
"../.././.././../../too-many-dots",
"/absolute",
"//example.org/scheme-relative"
]
}
[
{
"@id": "http://json-ld.org/test-suite/tests/relativeIris",
"@type": [
"http://json-ld.org/test-suite/tests/link",
"http://json-ld.org/test-suite/tests/flatten-0029-in.jsonld#fragment-works",
"http://json-ld.org/test-suite/tests/flatten-0029-in.jsonld?query=works",
"http://json-ld.org/test-suite/tests/",
"http://json-ld.org/test-suite/",
"http://json-ld.org/test-suite/parent",
"http://json-ld.org/parent-parent-eq-root",
"http://json-ld.org/still-root",
"http://json-ld.org/too-many-dots",
"http://json-ld.org/absolute",
"http://example.org/scheme-relative"
],
"http://www.example.com/link": [
{
"@list": [
{
"@id": "http://json-ld.org/test-suite/tests/link"
},
{
"@id": "http://json-ld.org/test-suite/tests/flatten-0029-in.jsonld#fragment-works"
},
{
"@id": "http://json-ld.org/test-suite/tests/flatten-0029-in.jsonld?query=works"
},
{
"@id": "http://json-ld.org/test-suite/tests/"
},
{
"@id": "http://json-ld.org/test-suite/"
},
{
"@id": "http://json-ld.org/test-suite/parent"
},
{
"@id": "http://json-ld.org/parent-parent-eq-root"
},
{
"@id": "http://json-ld.org/still-root"
},
{
"@id": "http://json-ld.org/too-many-dots"
},
{
"@id": "http://json-ld.org/absolute"
},
{
"@id": "http://example.org/scheme-relative"
}
]
}
]
}
]
Language Maps expand values to include @language
{
"@context": {
"vocab": "http://example.com/vocab/",
"label": {
"@id": "vocab:label",
"@container": "@language"
}
},
"@id": "http://example.com/queen",
"label": {
"en": "The Queen",
"de": [ "Die Königin", "Ihre Majestät" ]
}
}
[
{
"@id": "http://example.com/queen",
"http://example.com/vocab/label": [
{
"@value": "Die Königin",
"@language": "de"
},
{
"@value": "Ihre Majestät",
"@language": "de"
},
{
"@value": "The Queen",
"@language": "en"
}
]
}
]
Flattening native types with type coercion adds the coerced type to an expanded value representation and retains the native value representation
{
"@context": {
"ex": "http://example.org/vocab#",
"xsd": "http://www.w3.org/2001/XMLSchema#",
"ex:integer": { "@type": "xsd:integer" },
"ex:double": { "@type": "xsd:double" },
"ex:boolean": { "@type": "xsd:boolean" }
},
"@id": "http://example.org/test#example1",
"ex:integer": 1,
"ex:double": 123.45,
"ex:boolean": true
}
[
{
"@id": "http://example.org/test#example1",
"http://example.org/vocab#boolean": [
{
"@value": true,
"@type": "http://www.w3.org/2001/XMLSchema#boolean"
}
],
"http://example.org/vocab#double": [
{
"@value": 123.45,
"@type": "http://www.w3.org/2001/XMLSchema#double"
}
],
"http://example.org/vocab#integer": [
{
"@value": 1,
"@type": "http://www.w3.org/2001/XMLSchema#integer"
}
]
}
]
Mapping a term to null decouples it from @vocab
{
"@context": {
"@vocab": "http://xmlns.com/foaf/0.1/",
"from": null,
"university": { "@id": null }
},
"@id": "http://me.markus-lanthaler.com/",
"name": "Markus Lanthaler",
"from": "Italy",
"university": "TU Graz"
}
[
{
"@id": "http://me.markus-lanthaler.com/",
"http://xmlns.com/foaf/0.1/name": [
{
"@value": "Markus Lanthaler"
}
]
}
]
Verifies that terms can be defined using @vocab
{
"@context": {
"@vocab": "http://example.com/vocab#",
"homepage": {
"@type": "@id"
},
"created_at": {
"@type": "http://www.w3.org/2001/XMLSchema#date"
}
},
"name": "Markus Lanthaler",
"homepage": "http://www.markus-lanthaler.com/",
"created_at": "2012-10-28"
}
[
{
"@id": "_:b0",
"http://example.com/vocab#created_at": [
{
"@value": "2012-10-28",
"@type": "http://www.w3.org/2001/XMLSchema#date"
}
],
"http://example.com/vocab#homepage": [
{
"@id": "http://www.markus-lanthaler.com/"
}
],
"http://example.com/vocab#name": [
{
"@value": "Markus Lanthaler"
}
]
}
]
Verifies multiple values from separate terms are deterministically made multiple values of the IRI associated with the terms
{
"@context": {
"@vocab": "http://example.com/vocab/",
"colliding": "http://example.com/vocab/collidingTerm"
},
"@id": "http://example.com/IriCollissions",
"colliding": [
"value 1",
2
],
"collidingTerm": [
3,
"four"
],
"http://example.com/vocab/collidingTerm": 5
}
[
{
"@id": "http://example.com/IriCollissions",
"http://example.com/vocab/collidingTerm": [
{
"@value": "value 1"
},
{
"@value": 2
},
{
"@value": 3
},
{
"@value": "four"
},
{
"@value": 5
}
]
}
]
Pathological tests of language maps
{
"@context": {
"@vocab": "http://example.com/vocab/",
"@language": "it",
"label": {
"@container": "@language"
}
},
"@id": "http://example.com/queen",
"label": {
"en": "The Queen",
"de": [ "Die Königin", "Ihre Majestät" ]
},
"http://example.com/vocab/label": [
"Il re",
{ "@value": "The king", "@language": "en" }
]
}
[
{
"@id": "http://example.com/queen",
"http://example.com/vocab/label": [
{
"@value": "Il re",
"@language": "it"
},
{
"@language": "en",
"@value": "The king"
},
{
"@value": "Die Königin",
"@language": "de"
},
{
"@value": "Ihre Majestät",
"@language": "de"
},
{
"@value": "The Queen",
"@language": "en"
}
]
}
]
Flattening index maps for terms defined with @container: @index
{
"@context": {
"property": "http://example.com/property",
"indexContainer": { "@id": "http://example.com/container", "@container": "@index" }
},
"@id": "http://example.org/indexTest",
"indexContainer": {
"A": [
{
"@id": "http://example.org/nodeWithoutIndexA"
},
{
"@id": "http://example.org/nodeWithIndexA",
"@index": "this overrides the 'A' index from the container"
},
1,
true,
false,
null,
"simple string A",
{
"@value": "typed literal A",
"@type": "http://example.org/type"
},
{
"@value": "language-tagged string A",
"@language": "en"
}
],
"B": "simple string B",
"C": [
{
"@id": "http://example.org/nodeWithoutIndexC"
},
{
"@id": "http://example.org/nodeWithIndexC",
"@index": "this overrides the 'C' index from the container"
},
3,
true,
false,
null,
"simple string C",
{
"@value": "typed literal C",
"@type": "http://example.org/type"
},
{
"@value": "language-tagged string C",
"@language": "en"
}
]
},
"property": [
{
"@id": "http://example.org/nodeWithoutIndexProp"
},
{
"@id": "http://example.org/nodeWithIndexProp",
"@index": "prop"
},
{
"@value": 3,
"@index": "prop"
},
{
"@value": true,
"@index": "prop"
},
{
"@value": false,
"@index": "prop"
},
{
"@value": null,
"@index": "prop"
},
"simple string no index",
{
"@value": "typed literal Prop",
"@type": "http://example.org/type",
"@index": "prop"
},
{
"@value": "language-tagged string Prop",
"@language": "en",
"@index": "prop"
}
]
}
[
{
"@id": "http://example.org/indexTest",
"http://example.com/container": [
{
"@id": "http://example.org/nodeWithoutIndexA"
},
{
"@id": "http://example.org/nodeWithIndexA"
},
{
"@value": 1,
"@index": "A"
},
{
"@value": true,
"@index": "A"
},
{
"@value": false,
"@index": "A"
},
{
"@value": "simple string A",
"@index": "A"
},
{
"@type": "http://example.org/type",
"@value": "typed literal A",
"@index": "A"
},
{
"@language": "en",
"@value": "language-tagged string A",
"@index": "A"
},
{
"@value": "simple string B",
"@index": "B"
},
{
"@id": "http://example.org/nodeWithoutIndexC"
},
{
"@id": "http://example.org/nodeWithIndexC"
},
{
"@value": 3,
"@index": "C"
},
{
"@value": true,
"@index": "C"
},
{
"@value": false,
"@index": "C"
},
{
"@value": "simple string C",
"@index": "C"
},
{
"@type": "http://example.org/type",
"@value": "typed literal C",
"@index": "C"
},
{
"@language": "en",
"@value": "language-tagged string C",
"@index": "C"
}
],
"http://example.com/property": [
{
"@id": "http://example.org/nodeWithoutIndexProp"
},
{
"@id": "http://example.org/nodeWithIndexProp"
},
{
"@index": "prop",
"@value": 3
},
{
"@index": "prop",
"@value": true
},
{
"@index": "prop",
"@value": false
},
{
"@value": "simple string no index"
},
{
"@index": "prop",
"@type": "http://example.org/type",
"@value": "typed literal Prop"
},
{
"@index": "prop",
"@language": "en",
"@value": "language-tagged string Prop"
}
]
},
{
"@id": "http://example.org/nodeWithIndexA",
"@index": "this overrides the 'A' index from the container"
},
{
"@id": "http://example.org/nodeWithIndexC",
"@index": "this overrides the 'C' index from the container"
},
{
"@id": "http://example.org/nodeWithIndexProp",
"@index": "prop"
},
{
"@id": "http://example.org/nodeWithoutIndexA",
"@index": "A"
},
{
"@id": "http://example.org/nodeWithoutIndexC",
"@index": "C"
}
]
Flattening @reverse keeps @reverse
[
{
"@id": "http://example.com/people/markus",
"@reverse": {
"http://xmlns.com/foaf/0.1/knows": [
{
"@id": "http://example.com/people/dave"
},
{
"@id": "http://example.com/people/gregg"
}
]
},
"http://xmlns.com/foaf/0.1/name": [ { "@value": "Markus Lanthaler" } ]
}
]
[
{
"@id": "http://example.com/people/dave",
"http://xmlns.com/foaf/0.1/knows": [ { "@id": "http://example.com/people/markus" } ]
},
{
"@id": "http://example.com/people/gregg",
"http://xmlns.com/foaf/0.1/knows": [ { "@id": "http://example.com/people/markus" } ]
},
{
"@id": "http://example.com/people/markus",
"http://xmlns.com/foaf/0.1/name": [ { "@value": "Markus Lanthaler" } ]
}
]
Blank nodes are not relabeled during expansion
{
"@context": {
"term": "_:term",
"termId": { "@id": "term", "@type": "@id" }
},
"@id": "_:term",
"@type": "_:term",
"term": [
{
"@id": "_:term",
"@type": "term"
},
{
"@id": "_:Bx",
"term": "term"
},
"plain value",
{
"@id": "_:term"
}
],
"termId": [
{
"@id": "_:term",
"@type": "term"
},
{
"@id": "_:Cx",
"term": "termId"
},
"term:AppendedToBlankNode",
"_:termAppendedToBlankNode",
"relativeIri",
{
"@id": "_:term"
}
]
}
[
{
"@id": "_:b0",
"@type": [
"_:b0"
],
"_:b0": [
{
"@id": "_:b0"
},
{
"@id": "_:b1"
},
{
"@value": "plain value"
},
{
"@id": "_:b2"
},
{
"@id": "_:b3"
},
{
"@id": "http://json-ld.org/test-suite/tests/relativeIri"
}
]
},
{
"@id": "_:b1",
"_:b0": [
{
"@value": "term"
}
]
},
{
"@id": "_:b2",
"_:b0": [
{
"@value": "termId"
}
]
}
]
Terms within @reverse are expanded
[
{
"@id": "http://example.com/people/markus",
"@reverse": {
"http://xmlns.com/foaf/0.1/knows": [
{
"http://xmlns.com/foaf/0.1/name": "Dave Longley"
},
{
"http://xmlns.com/foaf/0.1/name": "Gregg Kellogg"
}
]
},
"http://xmlns.com/foaf/0.1/name": [ { "@value": "Markus Lanthaler" } ]
}
]
[
{
"@id": "_:b0",
"http://xmlns.com/foaf/0.1/name": [ { "@value": "Dave Longley" } ],
"http://xmlns.com/foaf/0.1/knows": [ { "@id": "http://example.com/people/markus" } ]
},
{
"@id": "_:b1",
"http://xmlns.com/foaf/0.1/name": [ { "@value": "Gregg Kellogg" } ],
"http://xmlns.com/foaf/0.1/knows": [ { "@id": "http://example.com/people/markus" } ]
},
{
"@id": "http://example.com/people/markus",
"http://xmlns.com/foaf/0.1/name": [ { "@value": "Markus Lanthaler" } ]
}
]
Only invoke language and index map expansion if the value is a JSON object
{
"@context": {
"vocab": "http://example.com/vocab/",
"label": {
"@id": "vocab:label",
"@container": "@language"
},
"indexes": {
"@id": "vocab:index",
"@container": "@index"
}
},
"@id": "http://example.com/queen",
"label": [
"The Queen"
],
"indexes":
[
"No",
"indexes",
{ "@id": "asTheValueIsntAnObject" }
]
}
[
{
"@id": "http://example.com/queen",
"http://example.com/vocab/index": [
{
"@value": "No"
},
{
"@value": "indexes"
},
{
"@id": "http://json-ld.org/test-suite/tests/asTheValueIsntAnObject"
}
],
"http://example.com/vocab/label": [
{
"@value": "The Queen"
}
]
}
]
Free-floating values in sets are removed, free-floating lists are removed completely
{
"@context": {
"property": "http://example.com/property"
},
"@graph": [
{
"@set": [
"free-floating strings in set objects are removed",
{
"@id": "http://example.com/free-floating-node"
},
{
"@id": "http://example.com/node",
"property": "nodes with properties are not removed"
}
]
},
{
"@list": [
"lists are removed even though they represent an invisible linked structure, they have no real meaning"
]
}
]
}
[
{
"@id": "http://example.com/node",
"http://example.com/property": [
{
"@value": "nodes with properties are not removed"
}
]
}
]
Lists objects are implicit unlabeled blank nodes and thus never equivalent
{
"@context": {
"test": "http://example.com/list"
},
"@id": "list-equivalence-test",
"test": [
{ "@list": [ "1", "2" ] },
{ "@list": [ "1", "2" ] }
]
}
[
{
"@id": "http://json-ld.org/test-suite/tests/list-equivalence-test",
"http://example.com/list": [
{
"@list": [ { "@value": "1" }, { "@value": "2" } ]
},
{
"@list": [ { "@value": "1" }, { "@value": "2" } ]
}
]
}
]
Flatten a test manifest
{
"@id": "",
"http://example/sequence": {"@list": [
{
"@id": "#t0001",
"http://example/name": "Keywords cannot be aliased to other keywords",
"http://example/input": {"@id": "error-expand-0001-in.jsonld"}
}
]}
}
[
{
"@id": "http://json-ld.org/test-suite/tests/flatten-0043-in.jsonld",
"http://example/sequence": [
{"@list": [{"@id": "http://json-ld.org/test-suite/tests/flatten-0043-in.jsonld#t0001"}]}
]
},
{
"@id": "http://json-ld.org/test-suite/tests/flatten-0043-in.jsonld#t0001",
"http://example/input": [
{"@id": "http://json-ld.org/test-suite/tests/error-expand-0001-in.jsonld"}
],
"http://example/name": [
{"@value": "Keywords cannot be aliased to other keywords"}
]
}
]
Setting compactArrays to false causes single element arrays to be retained
[{
"@id": "http://example/foo",
"http://example/term": [{"@value": "value"}]
}]
{
"@context": {
"term": "http://example/term"
},
"@graph": [{
"@id": "http://example/foo",
"term": ["value"]
}]
}
Proper (re-)labeling of blank nodes if used with reverse properties.
{
"@context": {
"foo": "http://example.org/foo",
"bar": { "@reverse": "http://example.org/bar", "@type": "@id" }
},
"foo": "Foo",
"bar": [ "http://example.org/origin", "_:b0" ]
}
[
{
"@id": "_:b0",
"http://example.org/foo": [ { "@value": "Foo" } ]
},
{
"@id": "_:b1",
"http://example.org/bar": [ { "@id": "_:b0" } ]
},
{
"@id": "http://example.org/origin",
"http://example.org/bar": [ { "@id": "_:b0" } ]
}
]
Document loader loads a JSON-LD document.
{
"@context": {
"@vocab": "http://example/vocab#"
},
"@id": "",
"term": "object"
}
[{
"@id": "http://json-ld.org/test-suite/tests/remote-doc-0001-in.jsonld",
"http://example/vocab#term": [{"@value": "object"}]
}]
Document loader loads a JSON document.
{
"@context": {
"@vocab": "http://example/vocab#"
},
"@id": "",
"term": "object"
}
[{
"@id": "http://json-ld.org/test-suite/tests/remote-doc-0002-in.json",
"http://example/vocab#term": [{"@value": "object"}]
}]
Document loader loads a JSON document having an extension mime-subtype.
{
"@context": {
"@vocab": "http://example/vocab#"
},
"@id": "",
"term": "object"
}
[{
"@id": "http://json-ld.org/test-suite/tests/remote-doc-0003-in.jldt",
"http://example/vocab#term": [{"@value": "object"}]
}]
Loading a document with a non-JSON mime type raises loading document failed
n/a
Loading a document with a redirect should use the redirected URL as document base
{
"@context": {
"@vocab": "http://example/vocab#"
},
"@id": "",
"term": "object"
}
[{
"@id": "http://json-ld.org/test-suite/tests/remote-doc-0001-in.jsonld",
"http://example/vocab#term": [{"@value": "object"}]
}]
Loading a document with a redirect should use the redirected URL as document base
{
"@context": {
"@vocab": "http://example/vocab#"
},
"@id": "",
"term": "object"
}
[{
"@id": "http://json-ld.org/test-suite/tests/remote-doc-0001-in.jsonld",
"http://example/vocab#term": [{"@value": "object"}]
}]
Loading a document with a redirect should use the redirected URL as document base
{
"@context": {
"@vocab": "http://example/vocab#"
},
"@id": "",
"term": "object"
}
[{
"@id": "http://json-ld.org/test-suite/tests/remote-doc-0001-in.jsonld",
"http://example/vocab#term": [{"@value": "object"}]
}]
Loading a non-existant file raises loading document failed error
http://json-ld.org/test-suite/tests/remote-doc-0008-in.jsonld not loaded
n/a
If a context is specified in a link header, it is not used for JSON-LD.
[{
"@id": "",
"http://example/0009/term": "value1",
"term": "value2"
}]
[{
"@id": "http://json-ld.org/test-suite/tests/remote-doc-0009-in.jsonld",
"http://example/0009/term": [{"@value": "value1"}]
}]
If a context is specified in a link header, it is used for JSON.
[{
"@id": "",
"term": "value"
}]
[{
"@id": "http://json-ld.org/test-suite/tests/remote-doc-0010-in.json",
"http://example/vocab#term": [{"@value": "value"}]
}]
If a context is specified in a link header, it is used for a JSON extension type.
[{
"@id": "",
"term": "value"
}]
[{
"@id": "http://json-ld.org/test-suite/tests/remote-doc-0011-in.jldt",
"http://example/vocab#term": [{"@value": "value"}]
}]
Loading a file when multiple link headers are returned is an error
[{
"@id": "",
"term": "value"
}]
n/a
Tests generation of a triple using full URIs and a plain literal.
{
"@id": "http://greggkellogg.net/foaf#me",
"http://xmlns.com/foaf/0.1/name": "Gregg Kellogg"
}
<http://greggkellogg.net/foaf#me> <http://xmlns.com/foaf/0.1/name> "Gregg Kellogg" .
Tests generation of a triple using a CURIE defined in the default context.
{
"@context": {"foaf": "http://xmlns.com/foaf/0.1/"},
"@id": "http://greggkellogg.net/foaf#me",
"foaf:name": "Gregg Kellogg"
}
<http://greggkellogg.net/foaf#me> <http://xmlns.com/foaf/0.1/name> "Gregg Kellogg" .
Tests that a BNode is created if no explicit subject is set.
{
"@context": {"foaf": "http://xmlns.com/foaf/0.1/"},
"@type": "foaf:Person"
}
_:b0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://xmlns.com/foaf/0.1/Person> .
Tests that a plain literal is created with a language tag.
{
"http://www.w3.org/2000/01/rdf-schema#label": {
"@value": "A plain literal with a lang tag.",
"@language": "en-us"
}
}
_:b0 <http://www.w3.org/2000/01/rdf-schema#label> "A plain literal with a lang tag."@en-us .
Tests that a literal may be created using extended characters.
{
"@id": "http://greggkellogg.net/foaf#me",
"http://xmlns.com/foaf/0.1/knows": {
"http://xmlns.com/foaf/0.1/name": {"@value": "Herman Iván", "@language": "hu"}
}
}
<http://greggkellogg.net/foaf#me> <http://xmlns.com/foaf/0.1/knows> _:b0 .
_:b0 <http://xmlns.com/foaf/0.1/name> "Herman Iván"@hu .
Tests creation of a literal with a datatype.
{
"@id": "http://greggkellogg.net/foaf#me",
"http://purl.org/dc/terms/created": {
"@value": "1957-02-27",
"@type": "http://www.w3.org/2001/XMLSchema#date"
}
}
<http://greggkellogg.net/foaf#me> <http://purl.org/dc/terms/created> "1957-02-27"^^<http://www.w3.org/2001/XMLSchema#date> .
Verify that 'a' is an alias for rdf:type, and the object is created as an IRI.
{
"@id": "http://greggkellogg.net/foaf#me",
"@type": "http://xmlns.com/foaf/0.1/Person"
}
<http://greggkellogg.net/foaf#me> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://xmlns.com/foaf/0.1/Person> .
Generate an IRI using a prefix defined within an @context.
{
"@context": {"d": "http://example.com/default#"},
"d:foo": "bar"
}
_:b0 <http://example.com/default#foo> "bar" .
An empty suffix may be used.
{
"@context": {"foo": "http://example.com/default#"},
"foo:": "bar"
}
_:b0 <http://example.com/default#> "bar" .
A property referencing an associative array gets object from subject of array.
{
"@context": {"foaf": "http://xmlns.com/foaf/0.1/"},
"@id": "http://greggkellogg.net/foaf#me",
"foaf:knows": {
"@id": "http://manu.sporny.org/#me",
"foaf:name": "Manu Sporny"
}
}
<http://greggkellogg.net/foaf#me> <http://xmlns.com/foaf/0.1/knows> <http://manu.sporny.org/#me> .
<http://manu.sporny.org/#me> <http://xmlns.com/foaf/0.1/name> "Manu Sporny" .
If no @ is specified, a BNode is created, and will be used as the object of an enclosing property.
{
"@context": {
"foaf": "http://xmlns.com/foaf/0.1/"
},
"@id": "http://greggkellogg.net/foaf#me",
"foaf:knows": {
"foaf:name": "Dave Longley"
}
}
<http://greggkellogg.net/foaf#me> <http://xmlns.com/foaf/0.1/knows> _:b0 .
_:b0 <http://xmlns.com/foaf/0.1/name> "Dave Longley" .
Tests that Multiple Objects are for a Single Property using array syntax.
{
"@context": {
"foaf": "http://xmlns.com/foaf/0.1/"
},
"@id": "http://greggkellogg.net/foaf#me",
"foaf:knows": ["Manu Sporny", "Dave Longley"]
}
<http://greggkellogg.net/foaf#me> <http://xmlns.com/foaf/0.1/knows> "Dave Longley" .
<http://greggkellogg.net/foaf#me> <http://xmlns.com/foaf/0.1/knows> "Manu Sporny" .
Tests that @list: [] generates an empty list.
{
"@context": {
"foaf": "http://xmlns.com/foaf/0.1/"
},
"@id": "http://greggkellogg.net/foaf#me",
"foaf:knows": {"@list": []}
}
<http://greggkellogg.net/foaf#me> <http://xmlns.com/foaf/0.1/knows> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> .
Tests that @list generates a list.
{
"@context": {
"foaf": "http://xmlns.com/foaf/0.1/"
},
"@id": "http://greggkellogg.net/foaf#me",
"foaf:knows": {"@list": ["Manu Sporny"]}
}
<http://greggkellogg.net/foaf#me> <http://xmlns.com/foaf/0.1/knows> _:b0 .
_:b0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "Manu Sporny" .
_:b0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> .
Tests that list with multiple elements.
{
"@context": {
"foaf": "http://xmlns.com/foaf/0.1/"
},
"@id": "http://greggkellogg.net/foaf#me",
"foaf:knows": {"@list": ["Manu Sporny", "Dave Longley"]}
}
<http://greggkellogg.net/foaf#me> <http://xmlns.com/foaf/0.1/knows> _:b0 .
_:b0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "Manu Sporny" .
_:b0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b1 .
_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "Dave Longley" .
_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> .
Expanding an empty IRI uses the test file location.
{
"@id": "",
"@type": "http://www.w3.org/2000/01/rdf-schema#Resource"
}
<http://json-ld.org/test-suite/tests/toRdf-0016-in.jsonld> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2000/01/rdf-schema#Resource> .
Expanding a relative IRI uses the test file location.
{
"@id": "a/b",
"@type": "http://www.w3.org/2000/01/rdf-schema#Resource"
}
<http://json-ld.org/test-suite/tests/a/b> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2000/01/rdf-schema#Resource> .
Expanding a fragment uses the test file location.
{
"@id": "#frag",
"@type": "http://www.w3.org/2000/01/rdf-schema#Resource"
}
<http://json-ld.org/test-suite/tests/toRdf-0018-in.jsonld#frag> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2000/01/rdf-schema#Resource> .
Tests coercion of object to anyURI when specified.
{
"@context": {
"foaf": "http://xmlns.com/foaf/0.1/",
"knows": {"@id": "http://xmlns.com/foaf/0.1/knows", "@type": "@id"}
},
"@id": "http://greggkellogg.net/foaf#me",
"knows": "http://manu.sporny.org/#me"
}
<http://greggkellogg.net/foaf#me> <http://xmlns.com/foaf/0.1/knows> <http://manu.sporny.org/#me> .
Tests coercion of object to a typed literal when specified.
{
"@context": {
"xsd": "http://www.w3.org/2001/XMLSchema#",
"created": {"@id": "http://purl.org/dc/terms/created", "@type": "xsd:date"}
},
"@id": "http://greggkellogg.net/foaf#me",
"created": "1957-02-27"
}
<http://greggkellogg.net/foaf#me> <http://purl.org/dc/terms/created> "1957-02-27"^^<http://www.w3.org/2001/XMLSchema#date> .
Tests that a decimal value generates a xsd:double typed literal;.
{
"@context": { "measure": "http://example/measure#"},
"measure:cups": 5.3
}
_:b0 <http://example/measure#cups> "5.3E0"^^<http://www.w3.org/2001/XMLSchema#double> .
Tests that a decimal value generates a xsd:integer typed literal.
{
"@context": { "chem": "http://example/chem#"},
"chem:protons": 12
}
_:b0 <http://example/chem#protons> "12"^^<http://www.w3.org/2001/XMLSchema#integer> .
Tests that a decimal value generates a xsd:boolean typed literal.
{
"@context": { "sensor": "http://example/sensor#"},
"sensor:active": true
}
_:b0 <http://example/sensor#active> "true"^^<http://www.w3.org/2001/XMLSchema#boolean> .
Tests that an array with a single element on a property with @list coercion creates an RDF Collection.
{
"@context": {
"knows": {"@id": "http://xmlns.com/foaf/0.1/knows", "@container": "@list"}
},
"@id": "http://greggkellogg.net/foaf#me",
"knows": ["Manu Sporny"]
}
<http://greggkellogg.net/foaf#me> <http://xmlns.com/foaf/0.1/knows> _:b0 .
_:b0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "Manu Sporny" .
_:b0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> .
Tests that @type with an array of types creates multiple types.
{
"@context": {"rdfs": "http://www.w3.org/2000/01/rdf-schema#"},
"@type": ["rdfs:Resource", "rdfs:Class"]
}
_:b0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2000/01/rdf-schema#Class> .
_:b0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2000/01/rdf-schema#Resource> .
Using @graph with other keys places triples in a named graph.
{
"@context": {
"rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
"ex": "http://example.org/",
"xsd": "http://www.w3.org/2001/XMLSchema#",
"ex:locatedIn": {"@type": "@id"},
"ex:hasPopulaton": {"@type": "xsd:integer"},
"ex:hasReference": {"@type": "@id"}
},
"@graph": [
{
"@id": "http://example.org/ParisFact1",
"@type": "rdf:Graph",
"@graph": {
"@id": "http://example.org/location/Paris#this",
"ex:locatedIn": "http://example.org/location/France#this"
},
"ex:hasReference": ["http://www.britannica.com/", "http://www.wikipedia.org/", "http://www.brockhaus.de/"]
},
{
"@id": "http://example.org/ParisFact2",
"@type": "rdf:Graph",
"@graph": {
"@id": "http://example.org/location/Paris#this",
"ex:hasPopulation": 7000000
},
"ex:hasReference": "http://www.wikipedia.org/"
}
]
}
<http://example.org/ParisFact1> <http://example.org/hasReference> <http://www.britannica.com/> .
<http://example.org/ParisFact1> <http://example.org/hasReference> <http://www.brockhaus.de/> .
<http://example.org/ParisFact1> <http://example.org/hasReference> <http://www.wikipedia.org/> .
<http://example.org/ParisFact1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/1999/02/22-rdf-syntax-ns#Graph> .
<http://example.org/ParisFact2> <http://example.org/hasReference> <http://www.wikipedia.org/> .
<http://example.org/ParisFact2> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/1999/02/22-rdf-syntax-ns#Graph> .
<http://example.org/location/Paris#this> <http://example.org/hasPopulation> "7000000"^^<http://www.w3.org/2001/XMLSchema#integer> <http://example.org/ParisFact2> .
<http://example.org/location/Paris#this> <http://example.org/locatedIn> <http://example.org/location/France#this> <http://example.org/ParisFact1> .
Signing a graph.
{
"@context": {
"sec": "http://purl.org/security#",
"xsd": "http://www.w3.org/2001/XMLSchema#",
"rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
"dc": "http://purl.org/dc/terms/",
"sec:signer": {"@type": "@id"},
"dc:created": {"@type": "xsd:dateTime"}
},
"@id": "http://example.org/sig1",
"@type": ["rdf:Graph", "sec:SignedGraph"],
"dc:created": "2011-09-23T20:21:34Z",
"sec:signer": "http://payswarm.example.com/i/john/keys/5",
"sec:signatureValue": "OGQzNGVkMzVm4NTIyZTkZDYMmMzQzNmExMgoYzI43Q3ODIyOWM32NjI=",
"@graph": {
"@id": "http://example.org/fact1",
"dc:title": "Hello World!"
}
}
<http://example.org/fact1> <http://purl.org/dc/terms/title> "Hello World!" <http://example.org/sig1> .
<http://example.org/sig1> <http://purl.org/dc/terms/created> "2011-09-23T20:21:34Z"^^<http://www.w3.org/2001/XMLSchema#dateTime> .
<http://example.org/sig1> <http://purl.org/security#signatureValue> "OGQzNGVkMzVm4NTIyZTkZDYMmMzQzNmExMgoYzI43Q3ODIyOWM32NjI=" .
<http://example.org/sig1> <http://purl.org/security#signer> <http://payswarm.example.com/i/john/keys/5> .
<http://example.org/sig1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://purl.org/security#SignedGraph> .
<http://example.org/sig1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/1999/02/22-rdf-syntax-ns#Graph> .
Tests that named graphs containing named graphs flatten to single level of graph naming.
{
"@context": {
"wd": "http://data.wikipedia.org/vocab#",
"ws": "http://data.wikipedia.org/snaks/",
"wp": "http://en.wikipedia.org/wiki/"
},
"@id": "ws:Assertions",
"@type": "wd:SnakSet",
"@graph": {
"@id": "ws:BerlinFact",
"@type": "wd:Snak",
"@graph": {
"@id": "wp:Berlin",
"wd:population": 3499879
},
"wd:assertedBy": "http://www.statistik-berlin-brandenburg.de/"
}
}
<http://data.wikipedia.org/snaks/Assertions> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://data.wikipedia.org/vocab#SnakSet> .
<http://data.wikipedia.org/snaks/BerlinFact> <http://data.wikipedia.org/vocab#assertedBy> "http://www.statistik-berlin-brandenburg.de/" <http://data.wikipedia.org/snaks/Assertions> .
<http://data.wikipedia.org/snaks/BerlinFact> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://data.wikipedia.org/vocab#Snak> <http://data.wikipedia.org/snaks/Assertions> .
<http://en.wikipedia.org/wiki/Berlin> <http://data.wikipedia.org/vocab#population> "3499879"^^<http://www.w3.org/2001/XMLSchema#integer> <http://data.wikipedia.org/snaks/BerlinFact> .
Tests graphs containing subject references as strings.
{
"@context": {
"xsd": "http://www.w3.org/2001/XMLSchema#",
"knows": "http://xmlns.com/foaf/0.1/knows",
"name": "http://xmlns.com/foaf/0.1/name",
"asOf": "http://example.org/asOf"
},
"@id": "http://example.org/linked-data-graph",
"asOf": {"@value": "2012-04-09", "@type": "xsd:date"},
"@graph":
[
{
"@id": "http://manu.sporny.org/i/public",
"@type": "foaf:Person",
"name": "Manu Sporny",
"knows": "http://greggkellogg.net/foaf#me"
},
{
"@id": "http://greggkellogg.net/foaf#me",
"@type": "foaf:Person",
"name": "Gregg Kellogg",
"knows": "http://manu.sporny.org/i/public"
},
{
"@id": "http://www.markus-lanthaler.com/"
}
]
}
<http://example.org/linked-data-graph> <http://example.org/asOf> "2012-04-09"^^<http://www.w3.org/2001/XMLSchema#date> .
<http://greggkellogg.net/foaf#me> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <foaf:Person> <http://example.org/linked-data-graph> .
<http://greggkellogg.net/foaf#me> <http://xmlns.com/foaf/0.1/knows> "http://manu.sporny.org/i/public" <http://example.org/linked-data-graph> .
<http://greggkellogg.net/foaf#me> <http://xmlns.com/foaf/0.1/name> "Gregg Kellogg" <http://example.org/linked-data-graph> .
<http://manu.sporny.org/i/public> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <foaf:Person> <http://example.org/linked-data-graph> .
<http://manu.sporny.org/i/public> <http://xmlns.com/foaf/0.1/knows> "http://greggkellogg.net/foaf#me" <http://example.org/linked-data-graph> .
<http://manu.sporny.org/i/public> <http://xmlns.com/foaf/0.1/name> "Manu Sporny" <http://example.org/linked-data-graph> .
Tests conversion of reverse properties.
{
"@context": {
"rdfs": "http://www.w3.org/2000/01/rdf-schema#",
"defines": { "@reverse": "rdfs:definedBy" },
"label": "rdfs:label"
},
"@id": "http://example.com/vocab",
"label": "My vocabulary",
"defines": [
{
"@id": "http://example.com/vocab#property",
"label": "A property"
}
]
}
<http://example.com/vocab#property> <http://www.w3.org/2000/01/rdf-schema#definedBy> <http://example.com/vocab> .
<http://example.com/vocab#property> <http://www.w3.org/2000/01/rdf-schema#label> "A property" .
<http://example.com/vocab> <http://www.w3.org/2000/01/rdf-schema#label> "My vocabulary" .
Tests that generated triples do not depend on order of @context.
{
"@id": "ex:node1",
"owl:sameAs": {
"@id": "ex:node2",
"rdfs:label": "Node 2",
"link": "ex:node3",
"@context": {
"rdfs": "http://www.w3.org/2000/01/rdf-schema#"
}
},
"@context": {
"ex": "http://example.org/",
"owl": "http://www.w3.org/2002/07/owl#",
"link": { "@id": "ex:link", "@type": "@id" }
}
}
<http://example.org/node1> <http://www.w3.org/2002/07/owl#sameAs> <http://example.org/node2> .
<http://example.org/node2> <http://example.org/link> <http://example.org/node3> .
<http://example.org/node2> <http://www.w3.org/2000/01/rdf-schema#label> "Node 2" .
Tests that generated triples do not depend on order of @id.
{
"@context": {
"ex": "http://example.org/",
"owl": "http://www.w3.org/2002/07/owl#",
"link": {
"@id": "ex:link",
"@type": "@id"
}
},
"owl:sameAs": {
"@context": {
"rdfs": "http://www.w3.org/2000/01/rdf-schema#"
},
"rdfs:label": "Node 2",
"link": "ex:node3",
"@id": "ex:node2"
},
"@id": "ex:node1"
}
<http://example.org/node1> <http://www.w3.org/2002/07/owl#sameAs> <http://example.org/node2> .
<http://example.org/node2> <http://example.org/link> <http://example.org/node3> .
<http://example.org/node2> <http://www.w3.org/2000/01/rdf-schema#label> "Node 2" .
Tests that generated triples do not depend on order of properties inside @context.
{
"@context": {
"link": { "@id": "ex:link", "@type": "@id" },
"ex": "http://example.org/",
"owl": "http://www.w3.org/2002/07/owl#"
},
"@id": "ex:node1",
"owl:sameAs": {
"@context": {
"rdfs": "http://www.w3.org/2000/01/rdf-schema#"
},
"@id": "ex:node2",
"rdfs:label": "Node 2",
"link": "ex:node3"
}
}
<http://example.org/node1> <http://www.w3.org/2002/07/owl#sameAs> <http://example.org/node2> .
<http://example.org/node2> <http://example.org/link> <http://example.org/node3> .
<http://example.org/node2> <http://www.w3.org/2000/01/rdf-schema#label> "Node 2" .
xsd:double's canonical lexical is used when converting numbers without fraction that are coerced to xsd:double
{
"@context": {
"double": {
"@id": "http://example.com/double",
"@type": "http://www.w3.org/2001/XMLSchema#double"
},
"integer": {
"@id": "http://example.com/integer",
"@type": "http://www.w3.org/2001/XMLSchema#integer"
}
},
"double": [1, 2.2 ],
"integer": [8, 9.9 ]
}
_:b0 <http://example.com/double> "1.0E0"^^<http://www.w3.org/2001/XMLSchema#double> .
_:b0 <http://example.com/double> "2.2E0"^^<http://www.w3.org/2001/XMLSchema#double> .
_:b0 <http://example.com/integer> "8"^^<http://www.w3.org/2001/XMLSchema#integer> .
_:b0 <http://example.com/integer> "9.9E0"^^<http://www.w3.org/2001/XMLSchema#integer> .
The toRDF algorithm does not relabel blank nodes; it reuses the counter from the nodeMapGeneration to generate new ones
{
"@id": "http://example.com/",
"ex:prop1": {
"@list": [ { "@id": "_:x1" }, { "@id": "_:x2" } ]
},
"ex:prop2": { "@id": "_:x3" }
}
<http://example.com/> <ex:prop1> _:b3 .
<http://example.com/> <ex:prop2> _:b2 .
_:b3 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> _:b0 .
_:b3 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b4 .
_:b4 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> _:b1 .
_:b4 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> .
Free-floating nodes do not generate RDF triples
{"@id": "http://example.org/test#example"}
Basic RDF conversion
{
"@context": {
"t1": "http://example.com/t1",
"t2": "http://example.com/t2",
"term1": "http://example.com/term1",
"term2": "http://example.com/term2",
"term3": "http://example.com/term3",
"term4": "http://example.com/term4",
"term5": "http://example.com/term5"
},
"@id": "http://example.com/id1",
"@type": "t1",
"term1": "v1",
"term2": {"@value": "v2", "@type": "t2"},
"term3": {"@value": "v3", "@language": "en"},
"term4": 4,
"term5": [50, 51]
}
<http://example.com/id1> <http://example.com/term1> "v1" .
<http://example.com/id1> <http://example.com/term2> "v2"^^<http://example.com/t2> .
<http://example.com/id1> <http://example.com/term3> "v3"@en .
<http://example.com/id1> <http://example.com/term4> "4"^^<http://www.w3.org/2001/XMLSchema#integer> .
<http://example.com/id1> <http://example.com/term5> "50"^^<http://www.w3.org/2001/XMLSchema#integer> .
<http://example.com/id1> <http://example.com/term5> "51"^^<http://www.w3.org/2001/XMLSchema#integer> .
<http://example.com/id1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.com/t1> .
Properties mapped to null or which are never mapped are dropped
{
"@id": "http://example.org/id",
"http://example.org/property": null,
"regularJson": {
"nonJsonLd": "property",
"deep": [{
"foo": "bar"
}, {
"bar": "foo"
}]
}
}
RDF version of expand-0004
{
"@context": {
"mylist1": {"@id": "http://example.com/mylist1", "@container": "@list"},
"mylist2": {"@id": "http://example.com/mylist2", "@container": "@list"},
"myset2": {"@id": "http://example.com/myset2", "@container": "@set"},
"myset3": {"@id": "http://example.com/myset3", "@container": "@set"}
},
"@id": "http://example.org/id",
"mylist1": { "@list": [ ] },
"mylist2": "one item",
"myset2": { "@set": [ ] },
"myset3": [ "v1" ],
"http://example.org/list1": { "@list": [ null ] },
"http://example.org/list2": { "@list": [ {"@value": null} ] },
"http://example.org/set1": { "@set": [ ] },
"http://example.org/set1": { "@set": [ null ] },
"http://example.org/set3": [ ],
"http://example.org/set4": [ null ],
"http://example.org/set5": "one item",
"http://example.org/property": { "@list": "one item" }
}
<http://example.org/id> <http://example.com/mylist1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> .
<http://example.org/id> <http://example.com/mylist2> _:b0 .
<http://example.org/id> <http://example.com/myset3> "v1" .
<http://example.org/id> <http://example.org/list1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> .
<http://example.org/id> <http://example.org/list2> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> .
<http://example.org/id> <http://example.org/property> _:b1 .
<http://example.org/id> <http://example.org/set5> "one item" .
_:b0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "one item" .
_:b0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> .
_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "one item" .
_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> .
RDF version of expand-0005
{
"@context": {
"name": "http://xmlns.com/foaf/0.1/name",
"homepage": {
"@id": "http://xmlns.com/foaf/0.1/homepage",
"@type": "@id"
},
"know": "http://xmlns.com/foaf/0.1/knows",
"@iri": "@id"
},
"@id": "#me",
"know": [
{
"@id": "http://example.com/bob#me",
"name": "Bob",
"homepage": "http://example.com/bob"
}, {
"@id": "http://example.com/alice#me",
"name": "Alice",
"homepage": "http://example.com/alice"
}
]
}
<http://example.com/alice#me> <http://xmlns.com/foaf/0.1/homepage> <http://example.com/alice> .
<http://example.com/alice#me> <http://xmlns.com/foaf/0.1/name> "Alice" .
<http://example.com/bob#me> <http://xmlns.com/foaf/0.1/homepage> <http://example.com/bob> .
<http://example.com/bob#me> <http://xmlns.com/foaf/0.1/name> "Bob" .
<http://json-ld.org/test-suite/tests/toRdf-0045-in.jsonld#me> <http://xmlns.com/foaf/0.1/knows> <http://example.com/alice#me> .
<http://json-ld.org/test-suite/tests/toRdf-0045-in.jsonld#me> <http://xmlns.com/foaf/0.1/knows> <http://example.com/bob#me> .
RDF version of expand-0006
{
"@context": {
"http://example.org/test#property1": {
"@type": "@id"
},
"http://example.org/test#property2": {
"@type": "@id"
},
"uri": "@id"
},
"http://example.org/test#property1": {
"http://example.org/test#property4": "foo",
"uri": "http://example.org/test#example2"
},
"http://example.org/test#property2": "http://example.org/test#example3",
"http://example.org/test#property3": {
"uri": "http://example.org/test#example4"
},
"uri": "http://example.org/test#example1"
}
<http://example.org/test#example1> <http://example.org/test#property1> <http://example.org/test#example2> .
<http://example.org/test#example1> <http://example.org/test#property2> <http://example.org/test#example3> .
<http://example.org/test#example1> <http://example.org/test#property3> <http://example.org/test#example4> .
<http://example.org/test#example2> <http://example.org/test#property4> "foo" .
Type-coerced dates generate typed literals
{
"@context": {
"ex": "http://example.org/vocab#",
"ex:date": {
"@type": "xsd:dateTime"
},
"ex:parent": {
"@type": "@id"
},
"xsd": "http://www.w3.org/2001/XMLSchema#"
},
"@id": "http://example.org/test#example1",
"ex:date": "2011-01-25T00:00:00Z",
"ex:embed": {
"@id": "http://example.org/test#example2",
"ex:parent": "http://example.org/test#example1"
}
}
<http://example.org/test#example1> <http://example.org/vocab#date> "2011-01-25T00:00:00Z"^^<http://www.w3.org/2001/XMLSchema#dateTime> .
<http://example.org/test#example1> <http://example.org/vocab#embed> <http://example.org/test#example2> .
<http://example.org/test#example2> <http://example.org/vocab#parent> <http://example.org/test#example1> .
RDF version of expand-0008
{
"@context": {
"ex": "http://example.org/vocab#"
},
"@id": "http://example.org/test",
"ex:test": { "@value": "test", "@language": "en" },
"ex:drop-lang-only": { "@language": "en" },
"ex:keep-full-value": { "@value": "only value" }
}
<http://example.org/test> <http://example.org/vocab#keep-full-value> "only value" .
<http://example.org/test> <http://example.org/vocab#test> "test"@en .
RDF version of expand-0009
{
"@context": {
"authored": {
"@id": "http://example.org/vocab#authored",
"@type": "@id"
},
"contains": {
"@id": "http://example.org/vocab#contains",
"@type": "@id"
},
"contributor": "http://purl.org/dc/elements/1.1/contributor",
"description": "http://purl.org/dc/elements/1.1/description",
"name": "http://xmlns.com/foaf/0.1/name",
"title": {
"@id": "http://purl.org/dc/elements/1.1/title"
}
},
"@graph": [
{
"@id": "http://example.org/test#chapter",
"description": "Fun",
"title": "Chapter One"
},
{
"@id": "http://example.org/test#jane",
"authored": "http://example.org/test#chapter",
"name": "Jane"
},
{
"@id": "http://example.org/test#john",
"name": "John"
},
{
"@id": "http://example.org/test#library",
"contains": {
"@id": "http://example.org/test#book",
"contains": "http://example.org/test#chapter",
"contributor": "Writer",
"title": "My Book"
}
}
]
}
<http://example.org/test#book> <http://example.org/vocab#contains> <http://example.org/test#chapter> .
<http://example.org/test#book> <http://purl.org/dc/elements/1.1/contributor> "Writer" .
<http://example.org/test#book> <http://purl.org/dc/elements/1.1/title> "My Book" .
<http://example.org/test#chapter> <http://purl.org/dc/elements/1.1/description> "Fun" .
<http://example.org/test#chapter> <http://purl.org/dc/elements/1.1/title> "Chapter One" .
<http://example.org/test#jane> <http://example.org/vocab#authored> <http://example.org/test#chapter> .
<http://example.org/test#jane> <http://xmlns.com/foaf/0.1/name> "Jane" .
<http://example.org/test#john> <http://xmlns.com/foaf/0.1/name> "John" .
<http://example.org/test#library> <http://example.org/vocab#contains> <http://example.org/test#book> .
Native types generate typed literals
{
"@context": {
"d": "http://purl.org/dc/elements/1.1/",
"e": "http://example.org/vocab#",
"f": "http://xmlns.com/foaf/0.1/",
"xsd": "http://www.w3.org/2001/XMLSchema#"
},
"@id": "http://example.org/test",
"e:bool": true,
"e:int": 123
}
<http://example.org/test> <http://example.org/vocab#bool> "true"^^<http://www.w3.org/2001/XMLSchema#boolean> .
<http://example.org/test> <http://example.org/vocab#int> "123"^^<http://www.w3.org/2001/XMLSchema#integer> .
RDF version of expand-0011
{
"@context": {
"dc": "http://purl.org/dc/elements/1.1/",
"ex": "http://example.org/vocab#",
"ex:contains": {
"@type": "@id"
},
"xsd": "http://www.w3.org/2001/XMLSchema#"
},
"@id": "http://example.org/test#book",
"dc:title": "Title",
"ex:contains": "http://example.org/test#chapter"
}
<http://example.org/test#book> <http://example.org/vocab#contains> <http://example.org/test#chapter> .
<http://example.org/test#book> <http://purl.org/dc/elements/1.1/title> "Title" .
RDF version of expand-0012
{
"@context": {
"dc": "http://purl.org/dc/elements/1.1/",
"ex": "http://example.org/vocab#",
"ex:authored": {
"@type": "@id"
},
"ex:contains": {
"@type": "@id"
},
"foaf": "http://xmlns.com/foaf/0.1/",
"xsd": "http://www.w3.org/2001/XMLSchema#"
},
"@graph": [
{
"@id": "http://example.org/test#chapter",
"dc:description": "Fun",
"dc:title": "Chapter One"
},
{
"@id": "http://example.org/test#jane",
"ex:authored": "http://example.org/test#chapter",
"foaf:name": "Jane"
},
{
"@id": "http://example.org/test#john",
"foaf:name": "John"
},
{
"@id": "http://example.org/test#library",
"ex:contains": {
"@id": "http://example.org/test#book",
"dc:contributor": "Writer",
"dc:title": "My Book",
"ex:contains": "http://example.org/test#chapter"
}
}
]
}
<http://example.org/test#book> <http://example.org/vocab#contains> <http://example.org/test#chapter> .
<http://example.org/test#book> <http://purl.org/dc/elements/1.1/contributor> "Writer" .
<http://example.org/test#book> <http://purl.org/dc/elements/1.1/title> "My Book" .
<http://example.org/test#chapter> <http://purl.org/dc/elements/1.1/description> "Fun" .
<http://example.org/test#chapter> <http://purl.org/dc/elements/1.1/title> "Chapter One" .
<http://example.org/test#jane> <http://example.org/vocab#authored> <http://example.org/test#chapter> .
<http://example.org/test#jane> <http://xmlns.com/foaf/0.1/name> "Jane" .
<http://example.org/test#john> <http://xmlns.com/foaf/0.1/name> "John" .
<http://example.org/test#library> <http://example.org/vocab#contains> <http://example.org/test#book> .
RDF version of expand-0013
[{
"@id": "http://example.com/id1",
"@type": ["http://example.com/t1"],
"http://example.com/term1": ["v1"],
"http://example.com/term2": [{"@value": "v2", "@type": "http://example.com/t2"}],
"http://example.com/term3": [{"@value": "v3", "@language": "en"}],
"http://example.com/term4": [4],
"http://example.com/term5": [50, 51]
}]
<http://example.com/id1> <http://example.com/term1> "v1" .
<http://example.com/id1> <http://example.com/term2> "v2"^^<http://example.com/t2> .
<http://example.com/id1> <http://example.com/term3> "v3"@en .
<http://example.com/id1> <http://example.com/term4> "4"^^<http://www.w3.org/2001/XMLSchema#integer> .
<http://example.com/id1> <http://example.com/term5> "50"^^<http://www.w3.org/2001/XMLSchema#integer> .
<http://example.com/id1> <http://example.com/term5> "51"^^<http://www.w3.org/2001/XMLSchema#integer> .
<http://example.com/id1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.com/t1> .
RDF version of expand-0014
{
"@context": {
"ex": "http://example.org/test#",
"property1": {
"@id": "http://example.org/test#property1",
"@type": "@id"
},
"property2": {
"@id": "ex:property2",
"@type": "@id"
},
"uri": "@id",
"set": "@set",
"value": "@value",
"type": "@type",
"xsd": { "@id": "http://www.w3.org/2001/XMLSchema#" }
},
"property1": {
"uri": "ex:example2",
"http://example.org/test#property4": "foo"
},
"property2": "http://example.org/test#example3",
"http://example.org/test#property3": {
"uri": "http://example.org/test#example4"
},
"ex:property4": {
"uri": "ex:example4",
"ex:property5": [
{
"set": [
{
"value": "2012-03-31",
"type": "xsd:date"
}
]
}
]
},
"ex:property6": [
{
"set": [
{
"value": null,
"type": "xsd:date"
}
]
}
],
"uri": "http://example.org/test#example1"
}
<http://example.org/test#example1> <http://example.org/test#property1> <http://example.org/test#example2> .
<http://example.org/test#example1> <http://example.org/test#property2> <http://example.org/test#example3> .
<http://example.org/test#example1> <http://example.org/test#property3> <http://example.org/test#example4> .
<http://example.org/test#example1> <http://example.org/test#property4> <http://example.org/test#example4> .
<http://example.org/test#example2> <http://example.org/test#property4> "foo" .
<http://example.org/test#example4> <http://example.org/test#property5> "2012-03-31"^^<http://www.w3.org/2001/XMLSchema#date> .
RDF version of expand-0015
{
"@context": {
"mylist1": {"@id": "http://example.com/mylist1", "@container": "@list"},
"mylist2": {"@id": "http://example.com/mylist2", "@container": "@list"},
"myset1": {"@id": "http://example.com/myset1", "@container": "@set" },
"myset2": {"@id": "http://example.com/myset2", "@container": "@set" },
"myset3": {"@id": "http://example.com/myset3", "@container": "@set" }
},
"@id": "http://example.org/id",
"mylist1": [],
"myset1": { "@set": [] },
"myset2": [ { "@set": [] }, [], { "@set": [ null ] }, [ null ] ],
"myset3": [ { "@set": [ "hello", "this" ] }, "will", { "@set": [ "be", "collapsed" ] } ]
}
<http://example.org/id> <http://example.com/mylist1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> .
<http://example.org/id> <http://example.com/myset3> "be" .
<http://example.org/id> <http://example.com/myset3> "collapsed" .
<http://example.org/id> <http://example.com/myset3> "hello" .
<http://example.org/id> <http://example.com/myset3> "this" .
<http://example.org/id> <http://example.com/myset3> "will" .
RDF version of expand-0016
{
"@context": {
"myproperty": { "@id": "http://example.com/myproperty" },
"mylist1": {"@id": "http://example.com/mylist1", "@container": "@list"},
"mylist2": {"@id": "http://example.com/mylist2", "@container": "@list"},
"myset1": {"@id": "http://example.com/myset1", "@container": "@set" },
"myset2": {"@id": "http://example.com/myset2", "@container": "@set" }
},
"@id": "http://example.org/id1",
"mylist1": [],
"mylist2": [ 2, "hi" ],
"myset1": { "@set": [] },
"myset2": [ { "@set": [] }, [], { "@set": [ null ] }, [ null ] ],
"myproperty": {
"@context": null,
"@id": "http://example.org/id2",
"mylist1": [],
"mylist2": [ 2, "hi" ],
"myset1": { "@set": [] },
"myset2": [ { "@set": [] }, [], { "@set": [ null ] }, [ null ] ],
"http://example.org/myproperty2": "ok"
},
"http://example.com/emptyobj": {
"@context": null,
"mylist1": [],
"mylist2": [ 2, "hi" ],
"myset1": { "@set": [] },
"myset2": [ { "@set": [] }, [], { "@set": [ null ] }, [ null ] ]
}
}
<http://example.org/id1> <http://example.com/emptyobj> _:b0 .
<http://example.org/id1> <http://example.com/mylist1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> .
<http://example.org/id1> <http://example.com/mylist2> _:b1 .
<http://example.org/id1> <http://example.com/myproperty> <http://example.org/id2> .
<http://example.org/id2> <http://example.org/myproperty2> "ok" .
_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "2"^^<http://www.w3.org/2001/XMLSchema#integer> .
_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b2 .
_:b2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "hi" .
_:b2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> .
RDF version of expand-0017
{
"@context": {
"authored": {
"@id": "http://example.org/vocab#authored",
"@type": "@id"
},
"contains": {
"@id": "http://example.org/vocab#contains",
"@type": "@id"
},
"contributor": "http://purl.org/dc/elements/1.1/contributor",
"description": "http://purl.org/dc/elements/1.1/description",
"name": "http://xmlns.com/foaf/0.1/name",
"title": {
"@id": "http://purl.org/dc/elements/1.1/title"
},
"id": "@id",
"data": "@graph"
},
"data": [
{
"id": "http://example.org/test#chapter",
"description": "Fun",
"title": "Chapter One"
},
{
"@id": "http://example.org/test#jane",
"authored": "http://example.org/test#chapter",
"name": "Jane"
},
{
"id": "http://example.org/test#john",
"name": "John"
},
{
"id": "http://example.org/test#library",
"contains": {
"@id": "http://example.org/test#book",
"contains": "http://example.org/test#chapter",
"contributor": "Writer",
"title": "My Book"
}
}
]
}
<http://example.org/test#book> <http://example.org/vocab#contains> <http://example.org/test#chapter> .
<http://example.org/test#book> <http://purl.org/dc/elements/1.1/contributor> "Writer" .
<http://example.org/test#book> <http://purl.org/dc/elements/1.1/title> "My Book" .
<http://example.org/test#chapter> <http://purl.org/dc/elements/1.1/description> "Fun" .
<http://example.org/test#chapter> <http://purl.org/dc/elements/1.1/title> "Chapter One" .
<http://example.org/test#jane> <http://example.org/vocab#authored> <http://example.org/test#chapter> .
<http://example.org/test#jane> <http://xmlns.com/foaf/0.1/name> "Jane" .
<http://example.org/test#john> <http://xmlns.com/foaf/0.1/name> "John" .
<http://example.org/test#library> <http://example.org/vocab#contains> <http://example.org/test#book> .
RDF version of expand-0018
{
"@context": {
"ex": "http://example.org/vocab#",
"@language": "en",
"de": { "@id": "ex:german", "@language": "de" },
"nolang": { "@id": "ex:nolang", "@language": null }
},
"@id": "http://example.org/test",
"ex:test-default": [
"hello",
1,
true
],
"de": [
"hallo",
2,
true
],
"nolang": [
"no language",
3,
false
]
}
<http://example.org/test> <http://example.org/vocab#german> "2"^^<http://www.w3.org/2001/XMLSchema#integer> .
<http://example.org/test> <http://example.org/vocab#german> "hallo"@de .
<http://example.org/test> <http://example.org/vocab#german> "true"^^<http://www.w3.org/2001/XMLSchema#boolean> .
<http://example.org/test> <http://example.org/vocab#nolang> "3"^^<http://www.w3.org/2001/XMLSchema#integer> .
<http://example.org/test> <http://example.org/vocab#nolang> "false"^^<http://www.w3.org/2001/XMLSchema#boolean> .
<http://example.org/test> <http://example.org/vocab#nolang> "no language" .
<http://example.org/test> <http://example.org/vocab#test-default> "1"^^<http://www.w3.org/2001/XMLSchema#integer> .
<http://example.org/test> <http://example.org/vocab#test-default> "hello"@en .
<http://example.org/test> <http://example.org/vocab#test-default> "true"^^<http://www.w3.org/2001/XMLSchema#boolean> .
RDF version of expand-0019
{
"@context": {
"myproperty": "http://example.com/myproperty"
},
"myproperty": { "@value" : null }
}
Embedded @graph without @id creates BNode-labeled named graph
{
"@context": {
"authored": {
"@id": "http://example.org/vocab#authored",
"@type": "@id"
},
"contains": {
"@id": "http://example.org/vocab#contains",
"@type": "@id"
},
"contributor": "http://purl.org/dc/elements/1.1/contributor",
"description": "http://purl.org/dc/elements/1.1/description",
"name": "http://xmlns.com/foaf/0.1/name",
"title": {
"@id": "http://purl.org/dc/elements/1.1/title"
}
},
"@graph": [
{
"@id": "http://example.org/test#jane",
"name": "Jane",
"authored": {
"@graph": [
{
"@id": "http://example.org/test#chapter1",
"description": "Fun",
"title": "Chapter One"
},
{
"@id": "http://example.org/test#chapter2",
"description": "More fun",
"title": "Chapter Two"
}
]
}
},
{
"@id": "http://example.org/test#john",
"name": "John"
},
{
"@id": "http://example.org/test#library",
"contains": {
"@id": "http://example.org/test#book",
"contains": "http://example.org/test#chapter",
"contributor": "Writer",
"title": "My Book"
}
}
]
}
<http://example.org/test#book> <http://example.org/vocab#contains> <http://example.org/test#chapter> .
<http://example.org/test#book> <http://purl.org/dc/elements/1.1/contributor> "Writer" .
<http://example.org/test#book> <http://purl.org/dc/elements/1.1/title> "My Book" .
<http://example.org/test#chapter1> <http://purl.org/dc/elements/1.1/description> "Fun" _:b0 .
<http://example.org/test#chapter1> <http://purl.org/dc/elements/1.1/title> "Chapter One" _:b0 .
<http://example.org/test#chapter2> <http://purl.org/dc/elements/1.1/description> "More fun" _:b0 .
<http://example.org/test#chapter2> <http://purl.org/dc/elements/1.1/title> "Chapter Two" _:b0 .
<http://example.org/test#jane> <http://example.org/vocab#authored> _:b0 .
<http://example.org/test#jane> <http://xmlns.com/foaf/0.1/name> "Jane" .
<http://example.org/test#john> <http://xmlns.com/foaf/0.1/name> "John" .
<http://example.org/test#library> <http://example.org/vocab#contains> <http://example.org/test#book> .
RDF version of expand-0021
{
"@context": {
"authored": {
"@id": "http://example.org/vocab#authored",
"@type": "@id"
},
"contains": {
"@id": "http://example.org/vocab#contains",
"@type": "@id"
},
"contributor": "http://purl.org/dc/elements/1.1/contributor",
"description": "http://purl.org/dc/elements/1.1/description",
"name": "http://xmlns.com/foaf/0.1/name",
"title": {
"@id": "http://purl.org/dc/elements/1.1/title"
}
},
"title": "My first graph",
"@graph": [
{
"@id": "http://example.org/test#jane",
"name": "Jane",
"authored": {
"@graph": [
{
"@id": "http://example.org/test#chapter1",
"description": "Fun",
"title": "Chapter One"
},
{
"@id": "http://example.org/test#chapter2",
"description": "More fun",
"title": "Chapter Two"
},
{
"@id": "http://example.org/test#chapter3",
"title": "Chapter Three"
}
]
}
},
{
"@id": "http://example.org/test#john",
"name": "John"
},
{
"@id": "http://example.org/test#library",
"contains": {
"@id": "http://example.org/test#book",
"contains": "http://example.org/test#chapter",
"contributor": "Writer",
"title": "My Book"
}
}
]
}
<http://example.org/test#book> <http://example.org/vocab#contains> <http://example.org/test#chapter> _:b0 .
<http://example.org/test#book> <http://purl.org/dc/elements/1.1/contributor> "Writer" _:b0 .
<http://example.org/test#book> <http://purl.org/dc/elements/1.1/title> "My Book" _:b0 .
<http://example.org/test#chapter1> <http://purl.org/dc/elements/1.1/description> "Fun" _:b1 .
<http://example.org/test#chapter1> <http://purl.org/dc/elements/1.1/title> "Chapter One" _:b1 .
<http://example.org/test#chapter2> <http://purl.org/dc/elements/1.1/description> "More fun" _:b1 .
<http://example.org/test#chapter2> <http://purl.org/dc/elements/1.1/title> "Chapter Two" _:b1 .
<http://example.org/test#chapter3> <http://purl.org/dc/elements/1.1/title> "Chapter Three" _:b1 .
<http://example.org/test#jane> <http://example.org/vocab#authored> _:b1 _:b0 .
<http://example.org/test#jane> <http://xmlns.com/foaf/0.1/name> "Jane" _:b0 .
<http://example.org/test#john> <http://xmlns.com/foaf/0.1/name> "John" _:b0 .
<http://example.org/test#library> <http://example.org/vocab#contains> <http://example.org/test#book> _:b0 .
_:b0 <http://purl.org/dc/elements/1.1/title> "My first graph" .
RDF version of expand-0022
{
"@context": {
"term": "http://example.com/term",
"@language": "en"
},
"term": "v"
}
_:b0 <http://example.com/term> "v"@en .
RDF version of expand-0023
{
"@context": {
"xsd": "http://www.w3.org/2001/XMLSchema#",
"idlist": {"@id": "http://example.com/idlist", "@container": "@list", "@type": "@id"},
"datelist": {"@id": "http://example.com/datelist", "@container": "@list", "@type": "xsd:date"},
"idset": {"@id": "http://example.com/idset", "@container": "@set", "@type": "@id"},
"dateset": {"@id": "http://example.com/dateset", "@container": "@set", "@type": "xsd:date"},
"idprop": {"@id": "http://example.com/idprop", "@type": "@id" },
"dateprop": {"@id": "http://example.com/dateprop", "@type": "xsd:date" },
"idprop2": {"@id": "http://example.com/idprop2", "@type": "@id" },
"dateprop2": {"@id": "http://example.com/dateprop2", "@type": "xsd:date" }
},
"idlist": ["http://example.org/id"],
"datelist": ["2012-04-12"],
"idprop": {"@list": ["http://example.org/id"]},
"dateprop": {"@list": ["2012-04-12"]},
"idset": ["http://example.org/id"],
"dateset": ["2012-04-12"],
"idprop2": {"@set": ["http://example.org/id"]},
"dateprop2": {"@set": ["2012-04-12"]}
}
_:b0 <http://example.com/datelist> _:b1 .
_:b0 <http://example.com/dateprop2> "2012-04-12"^^<http://www.w3.org/2001/XMLSchema#date> .
_:b0 <http://example.com/dateprop> _:b2 .
_:b0 <http://example.com/dateset> "2012-04-12"^^<http://www.w3.org/2001/XMLSchema#date> .
_:b0 <http://example.com/idlist> _:b3 .
_:b0 <http://example.com/idprop2> <http://example.org/id> .
_:b0 <http://example.com/idprop> _:b4 .
_:b0 <http://example.com/idset> <http://example.org/id> .
_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "2012-04-12"^^<http://www.w3.org/2001/XMLSchema#date> .
_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> .
_:b2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "2012-04-12"^^<http://www.w3.org/2001/XMLSchema#date> .
_:b2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> .
_:b3 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.org/id> .
_:b3 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> .
_:b4 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.org/id> .
_:b4 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> .
RDF version of expand-0024
{
"@context": [
{
"name": "http://xmlns.com/foaf/0.1/name",
"homepage": {"@id": "http://xmlns.com/foaf/0.1/homepage","@type": "@id"}
},
{"ical": "http://www.w3.org/2002/12/cal/ical#"}
],
"@id": "http://example.com/speakers#Alice",
"name": "Alice",
"homepage": "http://xkcd.com/177/",
"ical:summary": "Alice Talk",
"ical:location": "Lyon Convention Centre, Lyon, France"
}
<http://example.com/speakers#Alice> <http://www.w3.org/2002/12/cal/ical#location> "Lyon Convention Centre, Lyon, France" .
<http://example.com/speakers#Alice> <http://www.w3.org/2002/12/cal/ical#summary> "Alice Talk" .
<http://example.com/speakers#Alice> <http://xmlns.com/foaf/0.1/homepage> <http://xkcd.com/177/> .
<http://example.com/speakers#Alice> <http://xmlns.com/foaf/0.1/name> "Alice" .
RDF version of expand-0025
{
"@context": {
"foo": "http://example.com/foo/",
"foo:bar": "http://example.com/bar",
"bar": {"@id": "foo:bar", "@type": "@id"},
"_": "http://example.com/underscore/"
},
"@type": [ "foo", "foo:bar", "_" ]
}
_:b0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.com/bar> .
_:b0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.com/foo/> .
_:b0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.com/underscore/> .
RDF version of expand-0026
{
"@context": {
"http://www.w3.org/1999/02/22-rdf-syntax-ns#type": {"@id": "@type", "@type": "@id"}
},
"@graph": [
{
"@id": "http://example.com/a",
"http://www.w3.org/1999/02/22-rdf-syntax-ns#type": "http://example.com/b"
}, {
"@id": "http://example.com/c",
"http://www.w3.org/1999/02/22-rdf-syntax-ns#type": [
"http://example.com/d",
"http://example.com/e"
]
}, {
"@id": "http://example.com/f",
"http://www.w3.org/1999/02/22-rdf-syntax-ns#type": "http://example.com/g"
}
]
}
<http://example.com/a> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.com/b> .
<http://example.com/c> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.com/d> .
<http://example.com/c> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.com/e> .
<http://example.com/f> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.com/g> .
RDF version of expand-0027
{
"@context": {
"mylist": {"@id": "http://example.com/mylist", "@container": "@list"},
"myset": {"@id": "http://example.com/myset", "@container": "@set"}
},
"@id": "http://example.org/id",
"mylist": [1, 2, 2, 3],
"myset": [1, 2, 2, 3]
}
<http://example.org/id> <http://example.com/mylist> _:b0 .
<http://example.org/id> <http://example.com/myset> "1"^^<http://www.w3.org/2001/XMLSchema#integer> .
<http://example.org/id> <http://example.com/myset> "2"^^<http://www.w3.org/2001/XMLSchema#integer> .
<http://example.org/id> <http://example.com/myset> "3"^^<http://www.w3.org/2001/XMLSchema#integer> .
_:b0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "1"^^<http://www.w3.org/2001/XMLSchema#integer> .
_:b0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b1 .
_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "2"^^<http://www.w3.org/2001/XMLSchema#integer> .
_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b2 .
_:b2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "2"^^<http://www.w3.org/2001/XMLSchema#integer> .
_:b2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b3 .
_:b3 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "3"^^<http://www.w3.org/2001/XMLSchema#integer> .
_:b3 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> .
RDF version of expand-0028
{
"@context": {
"@vocab": "http://example.org/vocab#",
"date": { "@type": "dateTime" }
},
"@id": "example1",
"@type": "test",
"date": "2011-01-25T00:00:00Z",
"embed": {
"@id": "example2",
"expandedDate": { "@value": "2012-08-01T00:00:00Z", "@type": "dateTime" }
}
}
<http://json-ld.org/test-suite/tests/example1> <http://example.org/vocab#date> "2011-01-25T00:00:00Z"^^<http://example.org/vocab#dateTime> .
<http://json-ld.org/test-suite/tests/example1> <http://example.org/vocab#embed> <http://json-ld.org/test-suite/tests/example2> .
<http://json-ld.org/test-suite/tests/example1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.org/vocab#test> .
<http://json-ld.org/test-suite/tests/example2> <http://example.org/vocab#expandedDate> "2012-08-01T00:00:00Z"^^<http://example.org/vocab#dateTime> .
RDF version of expand-0029
{
"@context": {
"links": { "@id": "http://www.example.com/link", "@type": "@id", "@container": "@list" }
},
"@id": "relativeIris",
"@type": [
"link",
"#fragment-works",
"?query=works",
"./",
"../",
"../parent",
"../../parent-parent-eq-root",
"../../../../../still-root",
"../.././.././../../too-many-dots",
"/absolute",
"//example.org/scheme-relative"
],
"links": [
"link",
"#fragment-works",
"?query=works",
"./",
"../",
"../parent",
"../../parent-parent-eq-root",
"./../../../useless/../../../still-root",
"../.././.././../../too-many-dots",
"/absolute",
"//example.org/scheme-relative"
]
}
<http://json-ld.org/test-suite/tests/relativeIris> <http://www.example.com/link> _:b0 .
<http://json-ld.org/test-suite/tests/relativeIris> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.org/scheme-relative> .
<http://json-ld.org/test-suite/tests/relativeIris> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://json-ld.org/absolute> .
<http://json-ld.org/test-suite/tests/relativeIris> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://json-ld.org/parent-parent-eq-root> .
<http://json-ld.org/test-suite/tests/relativeIris> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://json-ld.org/still-root> .
<http://json-ld.org/test-suite/tests/relativeIris> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://json-ld.org/test-suite/> .
<http://json-ld.org/test-suite/tests/relativeIris> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://json-ld.org/test-suite/parent> .
<http://json-ld.org/test-suite/tests/relativeIris> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://json-ld.org/test-suite/tests/> .
<http://json-ld.org/test-suite/tests/relativeIris> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://json-ld.org/test-suite/tests/link> .
<http://json-ld.org/test-suite/tests/relativeIris> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://json-ld.org/test-suite/tests/toRdf-0069-in.jsonld#fragment-works> .
<http://json-ld.org/test-suite/tests/relativeIris> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://json-ld.org/test-suite/tests/toRdf-0069-in.jsonld?query=works> .
<http://json-ld.org/test-suite/tests/relativeIris> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://json-ld.org/too-many-dots> .
_:b0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://json-ld.org/test-suite/tests/link> .
_:b0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b1 .
_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://json-ld.org/test-suite/tests/toRdf-0069-in.jsonld#fragment-works> .
_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b2 .
_:b10 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.org/scheme-relative> .
_:b10 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> .
_:b2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://json-ld.org/test-suite/tests/toRdf-0069-in.jsonld?query=works> .
_:b2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b3 .
_:b3 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://json-ld.org/test-suite/tests/> .
_:b3 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b4 .
_:b4 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://json-ld.org/test-suite/> .
_:b4 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b5 .
_:b5 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://json-ld.org/test-suite/parent> .
_:b5 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b6 .
_:b6 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://json-ld.org/parent-parent-eq-root> .
_:b6 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b7 .
_:b7 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://json-ld.org/still-root> .
_:b7 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b8 .
_:b8 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://json-ld.org/too-many-dots> .
_:b8 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b9 .
_:b9 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://json-ld.org/absolute> .
_:b9 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b10 .
RDF version of expand-0030
{
"@context": {
"vocab": "http://example.com/vocab/",
"label": {
"@id": "vocab:label",
"@container": "@language"
}
},
"@id": "http://example.com/queen",
"label": {
"en": "The Queen",
"de": [ "Die Königin", "Ihre Majestät" ]
}
}
<http://example.com/queen> <http://example.com/vocab/label> "Die Königin"@de .
<http://example.com/queen> <http://example.com/vocab/label> "Ihre Majestät"@de .
<http://example.com/queen> <http://example.com/vocab/label> "The Queen"@en .
RDF version of expand-0031
{
"@context": {
"ex": "http://example.org/vocab#",
"xsd": "http://www.w3.org/2001/XMLSchema#",
"ex:integer": { "@type": "xsd:integer" },
"ex:double": { "@type": "xsd:double" },
"ex:boolean": { "@type": "xsd:boolean" }
},
"@id": "http://example.org/test#example1",
"ex:integer": 1,
"ex:double": 123.45,
"ex:boolean": true
}
<http://example.org/test#example1> <http://example.org/vocab#boolean> "true"^^<http://www.w3.org/2001/XMLSchema#boolean> .
<http://example.org/test#example1> <http://example.org/vocab#double> "1.2345E2"^^<http://www.w3.org/2001/XMLSchema#double> .
<http://example.org/test#example1> <http://example.org/vocab#integer> "1"^^<http://www.w3.org/2001/XMLSchema#integer> .
RDF version of expand-0032
{
"@context": {
"@vocab": "http://xmlns.com/foaf/0.1/",
"from": null,
"university": { "@id": null }
},
"@id": "http://me.markus-lanthaler.com/",
"name": "Markus Lanthaler",
"from": "Italy",
"university": "TU Graz"
}
<http://me.markus-lanthaler.com/> <http://xmlns.com/foaf/0.1/name> "Markus Lanthaler" .
RDF version of expand-0033
{
"@context": {
"@vocab": "http://example.com/vocab#",
"homepage": {
"@type": "@id"
},
"created_at": {
"@type": "http://www.w3.org/2001/XMLSchema#date"
}
},
"name": "Markus Lanthaler",
"homepage": "http://www.markus-lanthaler.com/",
"created_at": "2012-10-28"
}
_:b0 <http://example.com/vocab#created_at> "2012-10-28"^^<http://www.w3.org/2001/XMLSchema#date> .
_:b0 <http://example.com/vocab#homepage> <http://www.markus-lanthaler.com/> .
_:b0 <http://example.com/vocab#name> "Markus Lanthaler" .
RDF version of expand-0034
{
"@context": {
"@vocab": "http://example.com/vocab/",
"colliding": "http://example.com/vocab/collidingTerm"
},
"@id": "http://example.com/IriCollissions",
"colliding": [
"value 1",
2
],
"collidingTerm": [
3,
"four"
],
"http://example.com/vocab/collidingTerm": 5
}
<http://example.com/IriCollissions> <http://example.com/vocab/collidingTerm> "2"^^<http://www.w3.org/2001/XMLSchema#integer> .
<http://example.com/IriCollissions> <http://example.com/vocab/collidingTerm> "3"^^<http://www.w3.org/2001/XMLSchema#integer> .
<http://example.com/IriCollissions> <http://example.com/vocab/collidingTerm> "5"^^<http://www.w3.org/2001/XMLSchema#integer> .
<http://example.com/IriCollissions> <http://example.com/vocab/collidingTerm> "four" .
<http://example.com/IriCollissions> <http://example.com/vocab/collidingTerm> "value 1" .
RDF version of expand-0035
{
"@context": {
"@vocab": "http://example.com/vocab/",
"@language": "it",
"label": {
"@container": "@language"
}
},
"@id": "http://example.com/queen",
"label": {
"en": "The Queen",
"de": [ "Die Königin", "Ihre Majestät" ]
},
"http://example.com/vocab/label": [
"Il re",
{ "@value": "The king", "@language": "en" }
]
}
<http://example.com/queen> <http://example.com/vocab/label> "Die Königin"@de .
<http://example.com/queen> <http://example.com/vocab/label> "Ihre Majestät"@de .
<http://example.com/queen> <http://example.com/vocab/label> "Il re"@it .
<http://example.com/queen> <http://example.com/vocab/label> "The Queen"@en .
<http://example.com/queen> <http://example.com/vocab/label> "The king"@en .
RDF version of expand-0036
{
"@context": {
"property": "http://example.com/property",
"indexContainer": { "@id": "http://example.com/container", "@container": "@index" }
},
"@id": "http://example.org/indexTest",
"indexContainer": {
"A": [
{
"@id": "http://example.org/nodeWithoutIndexA"
},
{
"@id": "http://example.org/nodeWithIndexA",
"@index": "this overrides the 'A' index from the container"
},
1,
true,
false,
null,
"simple string A",
{
"@value": "typed literal A",
"@type": "http://example.org/type"
},
{
"@value": "language-tagged string A",
"@language": "en"
}
],
"B": "simple string B",
"C": [
{
"@id": "http://example.org/nodeWithoutIndexC"
},
{
"@id": "http://example.org/nodeWithIndexC",
"@index": "this overrides the 'C' index from the container"
},
3,
true,
false,
null,
"simple string C",
{
"@value": "typed literal C",
"@type": "http://example.org/type"
},
{
"@value": "language-tagged string C",
"@language": "en"
}
]
},
"property": [
{
"@id": "http://example.org/nodeWithoutIndexProp"
},
{
"@id": "http://example.org/nodeWithIndexProp",
"@index": "prop"
},
{
"@value": 3,
"@index": "prop"
},
{
"@value": true,
"@index": "prop"
},
{
"@value": false,
"@index": "prop"
},
{
"@value": null,
"@index": "prop"
},
"simple string no index",
{
"@value": "typed literal Prop",
"@type": "http://example.org/type",
"@index": "prop"
},
{
"@value": "language-tagged string Prop",
"@language": "en",
"@index": "prop"
}
]
}
<http://example.org/indexTest> <http://example.com/container> "1"^^<http://www.w3.org/2001/XMLSchema#integer> .
<http://example.org/indexTest> <http://example.com/container> "3"^^<http://www.w3.org/2001/XMLSchema#integer> .
<http://example.org/indexTest> <http://example.com/container> "false"^^<http://www.w3.org/2001/XMLSchema#boolean> .
<http://example.org/indexTest> <http://example.com/container> "false"^^<http://www.w3.org/2001/XMLSchema#boolean> .
<http://example.org/indexTest> <http://example.com/container> "language-tagged string A"@en .
<http://example.org/indexTest> <http://example.com/container> "language-tagged string C"@en .
<http://example.org/indexTest> <http://example.com/container> "simple string A" .
<http://example.org/indexTest> <http://example.com/container> "simple string B" .
<http://example.org/indexTest> <http://example.com/container> "simple string C" .
<http://example.org/indexTest> <http://example.com/container> "true"^^<http://www.w3.org/2001/XMLSchema#boolean> .
<http://example.org/indexTest> <http://example.com/container> "true"^^<http://www.w3.org/2001/XMLSchema#boolean> .
<http://example.org/indexTest> <http://example.com/container> "typed literal A"^^<http://example.org/type> .
<http://example.org/indexTest> <http://example.com/container> "typed literal C"^^<http://example.org/type> .
<http://example.org/indexTest> <http://example.com/container> <http://example.org/nodeWithIndexA> .
<http://example.org/indexTest> <http://example.com/container> <http://example.org/nodeWithIndexC> .
<http://example.org/indexTest> <http://example.com/container> <http://example.org/nodeWithoutIndexA> .
<http://example.org/indexTest> <http://example.com/container> <http://example.org/nodeWithoutIndexC> .
<http://example.org/indexTest> <http://example.com/property> "3"^^<http://www.w3.org/2001/XMLSchema#integer> .
<http://example.org/indexTest> <http://example.com/property> "false"^^<http://www.w3.org/2001/XMLSchema#boolean> .
<http://example.org/indexTest> <http://example.com/property> "language-tagged string Prop"@en .
<http://example.org/indexTest> <http://example.com/property> "simple string no index" .
<http://example.org/indexTest> <http://example.com/property> "true"^^<http://www.w3.org/2001/XMLSchema#boolean> .
<http://example.org/indexTest> <http://example.com/property> "typed literal Prop"^^<http://example.org/type> .
<http://example.org/indexTest> <http://example.com/property> <http://example.org/nodeWithIndexProp> .
<http://example.org/indexTest> <http://example.com/property> <http://example.org/nodeWithoutIndexProp> .
RDF version of expand-0037
{
"@context": {
"name": "http://xmlns.com/foaf/0.1/name"
},
"@id": "http://example.com/people/markus",
"name": "Markus Lanthaler",
"@reverse": {
"http://xmlns.com/foaf/0.1/knows": {
"@id": "http://example.com/people/dave",
"name": "Dave Longley"
}
}
}
<http://example.com/people/dave> <http://xmlns.com/foaf/0.1/knows> <http://example.com/people/markus> .
<http://example.com/people/dave> <http://xmlns.com/foaf/0.1/name> "Dave Longley" .
<http://example.com/people/markus> <http://xmlns.com/foaf/0.1/name> "Markus Lanthaler" .
Triples with blank node predicates are dropped by default.
{
"@context": {
"term": "_:term",
"termId": { "@id": "term", "@type": "@id" }
},
"@id": "_:term",
"@type": "_:term",
"term": [
{
"@id": "_:term",
"@type": "term"
},
{
"@id": "_:Bx",
"term": "term"
},
"plain value",
{
"@id": "_:term"
}
],
"termId": [
{
"@id": "_:term",
"@type": "term"
},
{
"@id": "_:Cx",
"term": "termId"
},
"term:AppendedToBlankNode",
"_:termAppendedToBlankNode",
"relativeIri",
{
"@id": "_:term"
}
]
}
_:b0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> _:b0 .
RDF version of expand-0039
{
"@context": {
"name": "http://xmlns.com/foaf/0.1/name",
"knows": "http://xmlns.com/foaf/0.1/knows"
},
"@id": "http://example.com/people/markus",
"name": "Markus Lanthaler",
"@reverse": {
"knows": {
"@id": "http://example.com/people/dave",
"name": "Dave Longley"
}
}
}
<http://example.com/people/dave> <http://xmlns.com/foaf/0.1/knows> <http://example.com/people/markus> .
<http://example.com/people/dave> <http://xmlns.com/foaf/0.1/name> "Dave Longley" .
<http://example.com/people/markus> <http://xmlns.com/foaf/0.1/name> "Markus Lanthaler" .
RDF version of expand-0040
{
"@context": {
"vocab": "http://example.com/vocab/",
"label": {
"@id": "vocab:label",
"@container": "@language"
},
"indexes": {
"@id": "vocab:index",
"@container": "@index"
}
},
"@id": "http://example.com/queen",
"label": [
"The Queen"
],
"indexes":
[
"No",
"indexes",
{ "@id": "asTheValueIsntAnObject" }
]
}
<http://example.com/queen> <http://example.com/vocab/index> "No" .
<http://example.com/queen> <http://example.com/vocab/index> "indexes" .
<http://example.com/queen> <http://example.com/vocab/index> <http://json-ld.org/test-suite/tests/asTheValueIsntAnObject> .
<http://example.com/queen> <http://example.com/vocab/label> "The Queen" .
RDF version of expand-0041
{
"@context": {
"property": "http://example.com/property",
"nested": "http://example.com/nested",
"@language": "en"
},
"property": "this is English",
"nested": {
"@context": {
"@language": null
},
"property": "and this is a plain string"
}
}
_:b0 <http://example.com/nested> _:b1 .
_:b0 <http://example.com/property> "this is English"@en .
_:b1 <http://example.com/property> "and this is a plain string" .
RDF version of expand-0042
{
"@context": {
"name": "http://xmlns.com/foaf/0.1/name",
"isKnownBy": { "@reverse": "http://xmlns.com/foaf/0.1/knows" }
},
"@id": "http://example.com/people/markus",
"name": "Markus Lanthaler",
"isKnownBy": {
"@id": "http://example.com/people/dave",
"name": "Dave Longley"
}
}
<http://example.com/people/dave> <http://xmlns.com/foaf/0.1/knows> <http://example.com/people/markus> .
<http://example.com/people/dave> <http://xmlns.com/foaf/0.1/name> "Dave Longley" .
<http://example.com/people/markus> <http://xmlns.com/foaf/0.1/name> "Markus Lanthaler" .
RDF version of expand-0043
{
"@context": {
"name": "http://xmlns.com/foaf/0.1/name",
"isKnownBy": { "@reverse": "http://xmlns.com/foaf/0.1/knows" }
},
"@id": "http://example.com/people/markus",
"name": "Markus Lanthaler",
"@reverse": {
"isKnownBy": [
{
"@id": "http://example.com/people/dave",
"name": "Dave Longley"
},
{
"@id": "http://example.com/people/gregg",
"name": "Gregg Kellogg"
}
]
}
}
<http://example.com/people/dave> <http://xmlns.com/foaf/0.1/name> "Dave Longley" .
<http://example.com/people/gregg> <http://xmlns.com/foaf/0.1/name> "Gregg Kellogg" .
<http://example.com/people/markus> <http://xmlns.com/foaf/0.1/knows> <http://example.com/people/dave> .
<http://example.com/people/markus> <http://xmlns.com/foaf/0.1/knows> <http://example.com/people/gregg> .
<http://example.com/people/markus> <http://xmlns.com/foaf/0.1/name> "Markus Lanthaler" .
RDF version of expand-0044
{
"@context": {
"property": { "@id": "http://example.com/vocab/property", "@language": "de" },
"indexMap": { "@id": "http://example.com/vocab/indexMap", "@language": "en", "@container": "@index" }
},
"@id": "http://example.com/node",
"property": [
{
"@id": "http://example.com/propertyValueNode",
"indexMap": {
"expands to english string": "simple string"
}
},
"einfacher String"
]
}
<http://example.com/node> <http://example.com/vocab/property> "einfacher String"@de .
<http://example.com/node> <http://example.com/vocab/property> <http://example.com/propertyValueNode> .
<http://example.com/propertyValueNode> <http://example.com/vocab/indexMap> "simple string"@en .
RDF version of expand-0045
{
"@value": "free-floating value"
}
RDF version of expand-0046
{
"@graph": [
{ "@id": "http://example.com/free-floating-node" },
{ "@value": "free-floating value object" },
{ "@value": "free-floating value language-tagged string", "@language": "en" },
{ "@value": "free-floating value typed value", "@type": "http://example.com/type" },
"free-floating plain string",
true,
false,
null,
1,
1.5
]
}
RDF version of expand-0047
{
"@context": {
"property": "http://example.com/property"
},
"@graph": [
{
"@set": [
"free-floating strings in set objects are removed",
{
"@id": "http://example.com/free-floating-node"
},
{
"@id": "http://example.com/node",
"property": "nodes with properties are not removed"
}
]
},
{
"@list": [
"lists are removed even though they represent an invisible linked structure, they have no real meaning",
{
"@id": "http://example.com/node-in-free-floating-list",
"property": "everything inside a free-floating list is removed with the list; also nodes with properties"
}
]
}
]
}
<http://example.com/node> <http://example.com/property> "nodes with properties are not removed" .
RDF version of expand-0048
{
"@context": {
"term": "http://example.com/terms-are-not-considered-in-id",
"compact-iris": "http://example.com/compact-iris-",
"property": "http://example.com/property",
"@vocab": "http://example.org/vocab-is-not-considered-for-id"
},
"@id": "term",
"property": [
{
"@id": "compact-iris:are-considered",
"property": "@id supports the following values: relative, absolute, and compact IRIs"
},
{
"@id": "../parent-node",
"property": "relative IRIs get resolved against the document's base IRI"
}
]
}
<http://example.com/compact-iris-are-considered> <http://example.com/property> "@id supports the following values: relative, absolute, and compact IRIs" .
<http://json-ld.org/test-suite/parent-node> <http://example.com/property> "relative IRIs get resolved against the document's base IRI" .
<http://json-ld.org/test-suite/tests/term> <http://example.com/property> <http://example.com/compact-iris-are-considered> .
<http://json-ld.org/test-suite/tests/term> <http://example.com/property> <http://json-ld.org/test-suite/parent-node> .
RDF version of expand-0049
{
"@context": {
"name": "http://xmlns.com/foaf/0.1/name",
"isKnownBy": { "@reverse": "http://xmlns.com/foaf/0.1/knows", "@type": "@id" }
},
"@id": "http://example.com/people/markus",
"name": "Markus Lanthaler",
"isKnownBy": [
"http://example.com/people/dave",
"http://example.com/people/gregg"
]
}
<http://example.com/people/dave> <http://xmlns.com/foaf/0.1/knows> <http://example.com/people/markus> .
<http://example.com/people/gregg> <http://xmlns.com/foaf/0.1/knows> <http://example.com/people/markus> .
<http://example.com/people/markus> <http://xmlns.com/foaf/0.1/name> "Markus Lanthaler" .
RDF version of expand-0050
{
"@context": {
"issue": { "@id": "http://example.com/issue/", "@type": "@id" },
"issue:raisedBy": { "@container": "@set" }
},
"issue": "/issue/1",
"issue:raisedBy": "Markus"
}
_:b0 <http://example.com/issue/> <http://json-ld.org/issue/1> .
_:b0 <http://example.com/issue/raisedBy> "Markus" .
RDF version of expand-0051
{
"@context": [
{ "id": "@id" },
{ "url": "id" }
],
"url": "/issue/1",
"http://example.com/property": "ok"
}
<http://json-ld.org/issue/1> <http://example.com/property> "ok" .
RDF version of expand-0052
{
"@context": {
"@vocab": "http://example.org/",
"property": "vocabRelativeProperty"
},
"property": "must expand to http://example.org/vocabRelativeProperty",
"http://example.org/property": "ok"
}
_:b0 <http://example.org/property> "ok" .
_:b0 <http://example.org/vocabRelativeProperty> "must expand to http://example.org/vocabRelativeProperty" .
RDF version of expand-0053
{
"@context": {
"term": {"@id": "http://example.org/term", "@type": "@vocab"}
},
"term": "http://example.org/enum"
}
_:b0 <http://example.org/term> <http://example.org/enum> .
RDF version of expand-0054
{
"@context": {
"term": {"@id": "http://example.org/term", "@type": "@vocab"},
"enum": {"@id": "http://example.org/enum"}
},
"term": "enum"
}
_:b0 <http://example.org/term> <http://example.org/enum> .
RDF version of expand-0055
{
"@context": {
"@vocab": "http://example.org/",
"term": {"@id": "http://example.org/term", "@type": "@vocab"}
},
"term": "enum"
}
_:b0 <http://example.org/term> <http://example.org/enum> .
RDF version of expand-0056
{
"@context": {
"name": "http://xmlns.com/foaf/0.1/name",
"homepage": { "@id": "http://xmlns.com/foaf/0.1/homepage", "@type": "@vocab" },
"link": { "@id": "http://example.com/link", "@type": "@id" },
"MarkusHomepage": "http://www.markus-lanthaler.com/",
"relative-iri": "http://example.com/error-if-this-is-used-for-link"
},
"@id": "http://me.markus-lanthaler.com/",
"name": "Markus Lanthaler",
"homepage": "MarkusHomepage",
"link": "relative-iri"
}
<http://me.markus-lanthaler.com/> <http://example.com/link> <http://json-ld.org/test-suite/tests/relative-iri> .
<http://me.markus-lanthaler.com/> <http://xmlns.com/foaf/0.1/homepage> <http://www.markus-lanthaler.com/> .
<http://me.markus-lanthaler.com/> <http://xmlns.com/foaf/0.1/name> "Markus Lanthaler" .
RDF version of expand-0057
{
"@context": {
"term": { "@id": "http://example.org/term", "@type": "@vocab" }
},
"term": "not-a-term-thus-a-relative-IRI"
}
_:b0 <http://example.org/term> <http://json-ld.org/test-suite/tests/not-a-term-thus-a-relative-IRI> .
RDF version of expand-0058
{
"@context": {
"term": { "@id": "http://example.org/term", "@type": "@vocab" },
"prefix": "http://example.com/vocab#"
},
"term": "prefix:suffix"
}
_:b0 <http://example.org/term> <http://example.com/vocab#suffix> .
RDF version of expand-0059
{
"@context": {
"@vocab": "http://example.org/vocab#"
},
"@id": "example-with-vocab",
"@type": "vocab-prefixed",
"property": "property expanded using @vocab",
"embed": {
"@context": {
"@vocab": null
},
"@id": "example-vocab-reset",
"@type": "document-relative",
"property": "@vocab reset, property will be dropped"
}
}
<http://json-ld.org/test-suite/tests/example-vocab-reset> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://json-ld.org/test-suite/tests/document-relative> .
<http://json-ld.org/test-suite/tests/example-with-vocab> <http://example.org/vocab#embed> <http://json-ld.org/test-suite/tests/example-vocab-reset> .
<http://json-ld.org/test-suite/tests/example-with-vocab> <http://example.org/vocab#property> "property expanded using @vocab" .
<http://json-ld.org/test-suite/tests/example-with-vocab> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.org/vocab#vocab-prefixed> .
RDF version of expand-0060
{
"@context": {
"property": "http://example.com/vocab#property"
},
"@id": "../document-relative",
"@type": "#document-relative",
"property": {
"@context": {
"@base": "http://example.org/test/"
},
"@id": "../document-base-overwritten",
"@type": "#document-base-overwritten",
"property": [
{
"@context": null,
"@id": "../document-relative",
"@type": "#document-relative",
"property": "context completely reset, drops property"
},
{
"@context": {
"@base": null
},
"@id": "../document-relative",
"@type": "#document-relative",
"property": "@base is set to none"
}
]
}
}
<http://example.org/document-base-overwritten> <http://example.com/vocab#property> <http://json-ld.org/test-suite/document-relative> .
<http://example.org/document-base-overwritten> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.org/test/#document-base-overwritten> .
<http://json-ld.org/test-suite/document-relative> <http://example.com/vocab#property> <http://example.org/document-base-overwritten> .
<http://json-ld.org/test-suite/document-relative> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://json-ld.org/test-suite/tests/toRdf-0100-in.jsonld#document-relative> .
RDF version of expand-0061
{
"@context": {
"property": {
"@id": "http://example.com/property",
"@type": "http://example.com/datatype"
}
},
"property": [ 1, true, false, 5.1 ]
}
_:b0 <http://example.com/property> "1"^^<http://example.com/datatype> .
_:b0 <http://example.com/property> "5.1E0"^^<http://example.com/datatype> .
_:b0 <http://example.com/property> "false"^^<http://example.com/datatype> .
_:b0 <http://example.com/property> "true"^^<http://example.com/datatype> .
RDF version of expand-0062
{
"@context": {
"@base": "http://example.com/some/deep/directory/and/file#with-a-fragment",
"links": { "@id": "http://www.example.com/link", "@type": "@id", "@container": "@list" }
},
"@id": "relativeIris",
"@type": [
"link",
"#fragment-works",
"?query=works",
"./",
"../",
"../parent",
"../../parent-parent-eq-root",
"../../../../../still-root",
"../.././.././../../too-many-dots",
"/absolute",
"//example.org/scheme-relative"
],
"links": [
"link",
"#fragment-works",
"?query=works",
"./",
"../",
"../parent",
"../../parent-parent-eq-root",
"./../../../../../still-root",
"../.././.././../../too-many-dots",
"/absolute",
"//example.org/scheme-relative",
"//example.org/../scheme-relative",
"//example.org/.././useless/../../scheme-relative"
]
}
<http://example.com/some/deep/directory/and/relativeIris> <http://www.example.com/link> _:b0 .
<http://example.com/some/deep/directory/and/relativeIris> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.com/absolute> .
<http://example.com/some/deep/directory/and/relativeIris> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.com/some/deep/directory/> .
<http://example.com/some/deep/directory/and/relativeIris> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.com/some/deep/directory/and/> .
<http://example.com/some/deep/directory/and/relativeIris> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.com/some/deep/directory/and/file#fragment-works> .
<http://example.com/some/deep/directory/and/relativeIris> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.com/some/deep/directory/and/file?query=works> .
<http://example.com/some/deep/directory/and/relativeIris> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.com/some/deep/directory/and/link> .
<http://example.com/some/deep/directory/and/relativeIris> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.com/some/deep/directory/parent> .
<http://example.com/some/deep/directory/and/relativeIris> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.com/some/deep/parent-parent-eq-root> .
<http://example.com/some/deep/directory/and/relativeIris> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.com/still-root> .
<http://example.com/some/deep/directory/and/relativeIris> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.com/too-many-dots> .
<http://example.com/some/deep/directory/and/relativeIris> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.org/scheme-relative> .
_:b0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.com/some/deep/directory/and/link> .
_:b0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b1 .
_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.com/some/deep/directory/and/file#fragment-works> .
_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b2 .
_:b10 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.org/scheme-relative> .
_:b10 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b11 .
_:b11 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.org/scheme-relative> .
_:b11 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b12 .
_:b12 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.org/scheme-relative> .
_:b12 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> .
_:b2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.com/some/deep/directory/and/file?query=works> .
_:b2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b3 .
_:b3 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.com/some/deep/directory/and/> .
_:b3 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b4 .
_:b4 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.com/some/deep/directory/> .
_:b4 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b5 .
_:b5 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.com/some/deep/directory/parent> .
_:b5 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b6 .
_:b6 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.com/some/deep/parent-parent-eq-root> .
_:b6 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b7 .
_:b7 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.com/still-root> .
_:b7 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b8 .
_:b8 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.com/too-many-dots> .
_:b8 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b9 .
_:b9 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.com/absolute> .
_:b9 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b10 .
RDF version of expand-0063
{
"@context": {
"name": "http://xmlns.com/foaf/0.1/name",
"isKnownBy": { "@reverse": "http://xmlns.com/foaf/0.1/knows", "@container": "@index" }
},
"@id": "http://example.com/people/markus",
"name": "Markus Lanthaler",
"isKnownBy": {
"Dave": {
"@id": "http://example.com/people/dave",
"name": "Dave Longley"
},
"Gregg": {
"@id": "http://example.com/people/gregg",
"name": "Gregg Kellogg"
}
}
}
<http://example.com/people/dave> <http://xmlns.com/foaf/0.1/knows> <http://example.com/people/markus> .
<http://example.com/people/dave> <http://xmlns.com/foaf/0.1/name> "Dave Longley" .
<http://example.com/people/gregg> <http://xmlns.com/foaf/0.1/knows> <http://example.com/people/markus> .
<http://example.com/people/gregg> <http://xmlns.com/foaf/0.1/name> "Gregg Kellogg" .
<http://example.com/people/markus> <http://xmlns.com/foaf/0.1/name> "Markus Lanthaler" .
RDF version of expand-0064
{
"@context": {
"name": "http://xmlns.com/foaf/0.1/name",
"isKnownBy": { "@reverse": "http://xmlns.com/foaf/0.1/knows" }
},
"@id": "http://example.com/people/markus",
"name": "Markus Lanthaler",
"isKnownBy": [
{
"name": "Dave Longley"
},
{
"name": "Gregg Kellogg"
}
]
}
<http://example.com/people/markus> <http://xmlns.com/foaf/0.1/name> "Markus Lanthaler" .
_:b0 <http://xmlns.com/foaf/0.1/knows> <http://example.com/people/markus> .
_:b0 <http://xmlns.com/foaf/0.1/name> "Dave Longley" .
_:b1 <http://xmlns.com/foaf/0.1/knows> <http://example.com/people/markus> .
_:b1 <http://xmlns.com/foaf/0.1/name> "Gregg Kellogg" .
RDF version of expand-0065
{
"@context": {
"name": "http://xmlns.com/foaf/0.1/name",
"knows": "http://xmlns.com/foaf/0.1/knows"
},
"@id": "http://example.com/people/markus",
"name": "Markus Lanthaler",
"@reverse": {
"knows": {
"@id": "http://example.com/people/dave",
"name": "Dave Longley"
},
"relative-iri": {
"@id": "relative-node",
"name": "Keys that are not mapped to an IRI in a reverse-map are dropped"
}
}
}
<http://example.com/people/dave> <http://xmlns.com/foaf/0.1/knows> <http://example.com/people/markus> .
<http://example.com/people/dave> <http://xmlns.com/foaf/0.1/name> "Dave Longley" .
<http://example.com/people/markus> <http://xmlns.com/foaf/0.1/name> "Markus Lanthaler" .
RDF version of expand-0066
{
"@context": {
"name": "http://xmlns.com/foaf/0.1/name",
"knows": "http://xmlns.com/foaf/0.1/knows",
"@vocab": "http://example.com/vocab/"
},
"@id": "http://example.com/people/markus",
"name": "Markus Lanthaler",
"@reverse": {
"knows": {
"@id": "http://example.com/people/dave",
"name": "Dave Longley"
},
"noTerm": {
"@id": "relative-node",
"name": "Compact keys using @vocab"
}
}
}
<http://example.com/people/dave> <http://xmlns.com/foaf/0.1/knows> <http://example.com/people/markus> .
<http://example.com/people/dave> <http://xmlns.com/foaf/0.1/name> "Dave Longley" .
<http://example.com/people/markus> <http://xmlns.com/foaf/0.1/name> "Markus Lanthaler" .
<http://json-ld.org/test-suite/tests/relative-node> <http://example.com/vocab/noTerm> <http://example.com/people/markus> .
<http://json-ld.org/test-suite/tests/relative-node> <http://xmlns.com/foaf/0.1/name> "Compact keys using @vocab" .
RDF version of expand-0067
{
"@context": {
"http": "http://example.com/this-prefix-would-overwrite-all-http-iris"
},
"@id": "http://example.org/node1",
"@type": "http://example.org/type",
"http://example.org/property": "all these IRIs remain unchanged because they are interpreted as absolute IRIs"
}
<http://example.org/node1> <http://example.org/property> "all these IRIs remain unchanged because they are interpreted as absolute IRIs" .
<http://example.org/node1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.org/type> .
RDF version of expand-0068
{
"@context": {
"_": "http://example.com/this-prefix-would-overwrite-all-blank-node-identifiers"
},
"@id": "_:node1",
"@type": "_:type",
"_:property": "all these IRIs remain unchanged because they are interpreted as blank node identifiers"
}
_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> _:b0 .
RDF version of expand-0069
{
"@context": {
"rdfs": "http://www.w3.org/2000/01/rdf-schema#",
"rdfs:subClassOf": { "@id": "rdfs:subClassOf", "@type": "@id" }
},
"@id": "http://example.com/vocab#class",
"@type": "rdfs:Class",
"rdfs:subClassOf": "http://example.com/vocab#someOtherClass"
}
<http://example.com/vocab#class> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2000/01/rdf-schema#Class> .
<http://example.com/vocab#class> <http://www.w3.org/2000/01/rdf-schema#subClassOf> <http://example.com/vocab#someOtherClass> .
RDF version of expand-0070
{
"@context": {
"prefix": "http://www.example.org/vocab#",
"prefix:foo": "prefix:foo"
},
"@id": "http://example.com/vocab#id",
"@type": "prefix:Class",
"prefix:foo": "bar"
}
<http://example.com/vocab#id> <http://www.example.org/vocab#foo> "bar" .
<http://example.com/vocab#id> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.example.org/vocab#Class> .
RDF version of expand-0071
{
"@context": [
{
"v": "http://example.com/vocab#",
"v:term": "v:somethingElse",
"v:termId": { "@id": "v:somethingElseId" }
},
{
"v:term": "v:term",
"v:termId": { "@id": "v:termId" }
}
],
"v:term": "value of v:term",
"v:termId": "value of v:termId"
}
_:b0 <http://example.com/vocab#term> "value of v:term" .
_:b0 <http://example.com/vocab#termId> "value of v:termId" .
RDF version of expand-0072
{
"@context": [
{
"v": "http://example.com/vocab#",
"term": "v:somethingElse"
},
{
"@vocab": "http://example.com/anotherVocab#",
"term": "term"
}
],
"term": "value of term"
}
_:b0 <http://example.com/anotherVocab#term> "value of term" .
Basic use of creating a named graph using an IRI name
{
"@id": "http://example/g",
"@graph": {
"@id": "http://example/s",
"http://example/p": {"@id": "http://example/o"}
}
}
<http://example/s> <http://example/p> <http://example/o> <http://example/g> .
Basic use of creating a named graph using a BNode name
{
"@id": "_:g",
"@graph": {
"@id": "http://example/s",
"http://example/p": {"@id": "http://example/o"}
}
}
<http://example/s> <http://example/p> <http://example/o> _:b0 .
Dataset with a default and two named graphs (IRI and BNode)
{
"@graph": [{
"@id": "http://example/s0",
"http://example/p0": {"@id": "http://example/o0"}
},
{
"@id": "http://example/g",
"@graph": {
"@id": "http://example/s1",
"http://example/p1": {"@id": "http://example/o1"}
}
},
{
"@id": "_:g",
"@graph": {
"@id": "http://example/s2",
"http://example/p2": {"@id": "http://example/o2"}
}
}]
}
<http://example/s0> <http://example/p0> <http://example/o0> .
<http://example/s1> <http://example/p1> <http://example/o1> <http://example/g> .
<http://example/s2> <http://example/p2> <http://example/o2> _:b0 .
Embedding @graph in a node creates a named graph
{
"@id": "http://example/s0",
"http://example/p0": {"@id": "http://example/o0"},
"@graph": {
"@id": "http://example/s1",
"http://example/p1": {"@id": "http://example/o1"}
}
}
<http://example/s0> <http://example/p0> <http://example/o0> .
<http://example/s1> <http://example/p1> <http://example/o1> <http://example/s0> .
Embedding @graph in a node creates a named graph. Graph name is created if there is no subject
{
"http://example/p0": {"@id": "http://example/o0"},
"@graph": {
"@id": "http://example/s1",
"http://example/p1": {"@id": "http://example/o1"}
}
}
<http://example/s1> <http://example/p1> <http://example/o1> _:b0 .
_:b0 <http://example/p0> <http://example/o0> .
Triples with blank node predicates are not dropped if the produce generalized RDF flag is true.
{
"@context": {
"term": "_:term",
"termId": { "@id": "term", "@type": "@id" }
},
"@id": "_:term",
"@type": "_:term",
"term": [
{
"@id": "_:term",
"@type": "term"
},
{
"@id": "_:Bx",
"term": "term"
},
"plain value",
{
"@id": "_:term"
}
],
"termId": [
{
"@id": "_:term",
"@type": "term"
},
{
"@id": "_:Cx",
"term": "termId"
},
"term:AppendedToBlankNode",
"_:termAppendedToBlankNode",
"relativeIri",
{
"@id": "_:term"
}
]
}
_:b0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> _:b0 .
_:b0 _:b0 "plain value" .
_:b0 _:b0 <http://json-ld.org/test-suite/tests/relativeIri> .
_:b0 _:b0 _:b0 .
_:b0 _:b0 _:b1 .
_:b0 _:b0 _:b2 .
_:b0 _:b0 _:b3 .
_:b1 _:b0 "term" .
_:b2 _:b0 "termId" .
Proper (re-)labeling of blank nodes if used with reverse properties.
{
"@context": {
"foo": "http://example.org/foo",
"bar": { "@reverse": "http://example.org/bar", "@type": "@id" }
},
"foo": "Foo",
"bar": [ "http://example.org/origin", "_:b0" ]
}
<http://example.org/origin> <http://example.org/bar> _:b0 .
_:b0 <http://example.org/foo> "Foo" .
_:b1 <http://example.org/bar> _:b0 .
Tests generation using different types of objects.
<http://example.com/Subj1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.com/Type> .
<http://example.com/Subj1> <http://example.com/prop1> <http://example.com/Obj1> .
<http://example.com/Subj1> <http://example.com/prop2> "Plain" .
<http://example.com/Subj1> <http://example.com/prop2> "2012-05-12"^^<http://www.w3.org/2001/XMLSchema#date> .
<http://example.com/Subj1> <http://example.com/prop2> "English"@en .
[
{
"@id": "http://example.com/Subj1",
"@type": ["http://example.com/Type"],
"http://example.com/prop1": [{"@id": "http://example.com/Obj1"}],
"http://example.com/prop2": [
{"@value": "Plain"},
{"@value": "2012-05-12", "@type": "http://www.w3.org/2001/XMLSchema#date"},
{"@value": "English", "@language": "en"}
]
}
]
Do not use native datatypes for xsd:boolean, xsd:integer, and xsd:double by default.
<http://example.com/Subj1> <http://example.com/prop> "true"^^<http://www.w3.org/2001/XMLSchema#boolean> .
<http://example.com/Subj1> <http://example.com/prop> "false"^^<http://www.w3.org/2001/XMLSchema#boolean> .
<http://example.com/Subj1> <http://example.com/prop> "1"^^<http://www.w3.org/2001/XMLSchema#integer> .
<http://example.com/Subj1> <http://example.com/prop> "1.1"^^<http://www.w3.org/2001/XMLSchema#decimal> .
<http://example.com/Subj1> <http://example.com/prop> "1.1E-1"^^<http://www.w3.org/2001/XMLSchema#double> .
[
{
"@id": "http://example.com/Subj1",
"http://example.com/prop": [
{
"@value": "true",
"@type": "http://www.w3.org/2001/XMLSchema#boolean"
},
{
"@value": "false",
"@type": "http://www.w3.org/2001/XMLSchema#boolean"
},
{
"@value": "1",
"@type": "http://www.w3.org/2001/XMLSchema#integer"
},
{
"@value": "1.1",
"@type": "http://www.w3.org/2001/XMLSchema#decimal"
},
{
"@value": "1.1E-1",
"@type": "http://www.w3.org/2001/XMLSchema#double"
}
]
}
]
BNode name generation and references between resources.
<http://example.com/Subj1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.com/Type> .
_:a <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.com/SubType> .
<http://example.com/Subj1> <http://example.com/ref> _:a .
<http://example.com/Subj1> <http://example.com/ref> <http://example.com/Subj2> .
<http://example.com/Subj2> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.com/Type> .
<http://example.com/Subj2> <http://example.com/ref> <http://example.com/Subj1> .
[
{
"@id": "_:a",
"@type": ["http://example.com/SubType"]
},
{
"@id": "http://example.com/Subj1",
"@type": ["http://example.com/Type"],
"http://example.com/ref": [
{"@id": "_:a"},
{"@id": "http://example.com/Subj2"}
]
},
{
"@id": "http://example.com/Subj2",
"@type": ["http://example.com/Type"],
"http://example.com/ref": [{"@id": "http://example.com/Subj1"}]
}
]
Multiple lists with different types of element.
<http://example.com/Subj1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.com/Type> .
_:a <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "apple" .
_:a <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b .
_:b <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "bananna" .
_:b <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> .
<http://example.com/Subj1> <http://example.com/literalList> _:a .
<http://example.com/Subj1> <http://example.com/emptyList> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> .
_:c <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.com/iri> .
_:c <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> .
<http://example.com/Subj1> <http://example.com/iriList> _:c .
[
{
"@id": "http://example.com/Subj1",
"@type": ["http://example.com/Type"],
"http://example.com/literalList": [{
"@list": [
{"@value": "apple"},
{"@value": "bananna"}
]
}],
"http://example.com/emptyList": [{
"@list": []
}],
"http://example.com/iriList": [{
"@list": [{"@id": "http://example.com/iri"}]
}]
}
]
Uses a named graph containing a list.
<http://example.com/Subj1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.com/Type> <http://example.com/U> .
<http://example.com/Subj1> <http://example.com/ref> <http://example.com/U> <http://example.com/U> .
_:a <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "a" <http://example.com/U> .
_:a <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b <http://example.com/U> .
_:b <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "b" <http://example.com/U> .
_:b <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> <http://example.com/U> .
<http://example.com/Subj1> <http://example.com/list> _:a <http://example.com/U> .
<http://example.com/U> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.com/Graph> .
<http://example.com/U> <http://example.com/name> "Graph" .
[
{
"@id": "http://example.com/U",
"@graph": [
{
"@id": "http://example.com/Subj1",
"@type": ["http://example.com/Type"],
"http://example.com/ref": [{"@id": "http://example.com/U"}],
"http://example.com/list": [{
"@list": [
{"@value": "a"},
{"@value": "b"}
]
}]
}
],
"@type": ["http://example.com/Graph"],
"http://example.com/name": [{"@value": "Graph"}]
}
]
Ensure that properties and list elements aren't confused between graphs.
<http://example.com/Subj1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.com/Type> <http://example.com/U> .
<http://example.com/Subj1> <http://example.com/ref> <http://example.com/U> <http://example.com/U> .
<http://example.com/Subj1> <http://example.com/list> _:a <http://example.com/U> .
_:a <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "a" <http://example.com/U> .
_:a <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b <http://example.com/U> .
_:b <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "b" <http://example.com/U> .
_:b <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> <http://example.com/U> .
<http://example.com/Subj1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.com/Type2> <http://example.com/V> .
<http://example.com/Subj1> <http://example.com/ref> <http://example.com/V> <http://example.com/V> .
<http://example.com/Subj1> <http://example.com/list> _:c <http://example.com/V> .
_:c <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "c" <http://example.com/V> .
_:c <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:d <http://example.com/V> .
_:d <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "d" <http://example.com/V> .
_:d <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> <http://example.com/V> .
[
{
"@id": "http://example.com/U",
"@graph": [
{
"@id": "http://example.com/Subj1",
"@type": ["http://example.com/Type"],
"http://example.com/ref": [{"@id": "http://example.com/U"}],
"http://example.com/list": [{
"@list": [
{"@value": "a"},
{"@value": "b"}
]
}]
}
]
},
{
"@id": "http://example.com/V",
"@graph": [
{
"@id": "http://example.com/Subj1",
"@type": ["http://example.com/Type2"],
"http://example.com/ref": [{"@id": "http://example.com/V"}],
"http://example.com/list": [{
"@list": [
{"@value": "c"},
{"@value": "d"}
]
}]
}
]
}
]
Testing @graph recursion.
<http://data.wikipedia.org/snaks/Assertions> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://data.wikipedia.org/vocab#SnakSet> .
<http://data.wikipedia.org/snaks/Assertions> <http://data.wikipedia.org/vocab#assertedBy> "http://gregkellogg.net/foaf#me" .
<http://data.wikipedia.org/snaks/BerlinFact> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://data.wikipedia.org/vocab#Snak> <http://data.wikipedia.org/snaks/Assertions> .
<http://data.wikipedia.org/snaks/BerlinFact> <http://data.wikipedia.org/vocab#assertedBy> "http://www.statistik-berlin-brandenburg.de/" <http://data.wikipedia.org/snaks/Assertions> .
<http://en.wikipedia.org/wiki/Berlin> <http://data.wikipedia.org/vocab#population> "3499879"^^<http://www.w3.org/2001/XMLSchema#integer> <http://data.wikipedia.org/snaks/BerlinFact> .
[
{
"@id": "http://data.wikipedia.org/snaks/Assertions",
"@type": ["http://data.wikipedia.org/vocab#SnakSet"],
"http://data.wikipedia.org/vocab#assertedBy": [{"@value": "http://gregkellogg.net/foaf#me"}
],
"@graph": [
{
"@id": "http://data.wikipedia.org/snaks/BerlinFact",
"@type": ["http://data.wikipedia.org/vocab#Snak"],
"http://data.wikipedia.org/vocab#assertedBy": [{"@value": "http://www.statistik-berlin-brandenburg.de/"}]
}
]
},
{
"@id": "http://data.wikipedia.org/snaks/BerlinFact",
"@graph": [
{
"@id": "http://en.wikipedia.org/wiki/Berlin",
"http://data.wikipedia.org/vocab#population": [{
"@value": "3499879",
"@type": "http://www.w3.org/2001/XMLSchema#integer"
}]
}
]
}
]
Conversion of lists of lists (the triples in the input are only partially ordered on purpose
<http://example.com> <http://example.com/property> _:outerlist .
_:outerlist <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> _:lista .
_:outerlist <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b0 .
_:lista <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "a1" .
_:lista <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:a2 .
_:a2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "a2" .
_:a2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:a3 .
_:a3 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "a3" .
_:a3 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> .
_:c0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> _:c1 .
_:c0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> .
_:c1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "c1" .
_:c1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:c2 .
_:c2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "c2" .
_:c2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:c3 .
_:c3 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "c3" .
_:c3 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> .
_:b0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> _:b1 .
_:b0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:c0 .
_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "b1" .
_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b2 .
_:b2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "b2" .
_:b2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b3 .
_:b3 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "b3" .
_:b3 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> .
[
{
"@id": "_:b1",
"http://www.w3.org/1999/02/22-rdf-syntax-ns#first": [ { "@value": "b1" } ],
"http://www.w3.org/1999/02/22-rdf-syntax-ns#rest": [
{
"@list": [
{ "@value": "b2" },
{ "@value": "b3" }
]
}
]
},
{
"@id": "_:c1",
"http://www.w3.org/1999/02/22-rdf-syntax-ns#first": [ { "@value": "c1" } ],
"http://www.w3.org/1999/02/22-rdf-syntax-ns#rest": [
{
"@list": [
{ "@value": "c2" },
{ "@value": "c3" }
]
}
]
},
{
"@id": "_:lista",
"http://www.w3.org/1999/02/22-rdf-syntax-ns#first": [ { "@value": "a1" } ],
"http://www.w3.org/1999/02/22-rdf-syntax-ns#rest": [
{
"@list": [
{ "@value": "a2" },
{ "@value": "a3" }
]
}
]
},
{
"@id": "http://example.com",
"http://example.com/property": [
{
"@list": [
{ "@id": "_:lista" },
{ "@id": "_:b1" },
{ "@id": "_:c1" }
]
}
]
}
]
Preserve IRI list nodes (i.e., not blank nodes) when converting to @list
<http://example.com> <http://example.com/property> <http://example.com/list> .
<http://example.com/list> <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "a" .
<http://example.com/list> <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b .
_:b <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "b" .
_:b <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:c .
_:c <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "c" .
_:c <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> .
[
{
"@id": "http://example.com",
"http://example.com/property": [ { "@id": "http://example.com/list" } ]
},
{
"@id": "http://example.com/list",
"http://www.w3.org/1999/02/22-rdf-syntax-ns#first": [ { "@value": "a" } ],
"http://www.w3.org/1999/02/22-rdf-syntax-ns#rest": [
{
"@list": [
{ "@value": "b" },
{ "@value": "c" }
]
}
]
}
]
Do not convert lists that are not terminated by rdf:nil to @list.
<http://example.com> <http://example.com/property> _:a .
_:a <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "a" .
_:a <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b .
_:b <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "b" .
_:b <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:c .
_:c <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "c" .
[
{
"@id": "_:a",
"http://www.w3.org/1999/02/22-rdf-syntax-ns#first": [ { "@value": "a" } ],
"http://www.w3.org/1999/02/22-rdf-syntax-ns#rest": [ { "@id": "_:b" } ]
},
{
"@id": "_:b",
"http://www.w3.org/1999/02/22-rdf-syntax-ns#first": [ { "@value": "b" } ],
"http://www.w3.org/1999/02/22-rdf-syntax-ns#rest": [ { "@id": "_:c" } ]
},
{
"@id": "_:c",
"http://www.w3.org/1999/02/22-rdf-syntax-ns#first": [ { "@value": "c" } ]
},
{
"@id": "http://example.com",
"http://example.com/property": [ { "@id": "_:a" } ]
}
]
If additional properties are associated to a list node, the list is only partially converted to @list.
<http://example.com> <http://example.com/property> _:a .
_:a <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "a" .
_:a <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b .
_:b <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "b" .
_:b <http://example.com/other-property> "This list node has also properties other than rdf:first and rdf:rest" .
_:b <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:c .
_:c <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "c" .
_:c <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> .
[
{
"@id": "_:a",
"http://www.w3.org/1999/02/22-rdf-syntax-ns#first": [ { "@value": "a" } ],
"http://www.w3.org/1999/02/22-rdf-syntax-ns#rest": [ { "@id": "_:b" } ]
},
{
"@id": "_:b",
"http://example.com/other-property": [
{ "@value": "This list node has also properties other than rdf:first and rdf:rest" }
],
"http://www.w3.org/1999/02/22-rdf-syntax-ns#first": [ { "@value": "b" } ],
"http://www.w3.org/1999/02/22-rdf-syntax-ns#rest": [
{
"@list": [
{ "@value": "c" }
]
}
]
},
{
"@id": "http://example.com",
"http://example.com/property": [ { "@id": "_:a" } ]
}
]
Detect lists containing cycles and do not convert them to @list.
<http://example.com> <http://example.com/property> _:a .
_:a <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "a" .
_:a <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b .
_:b <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "b" .
_:b <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:c .
_:c <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "c" .
_:c <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b .
[
{
"@id": "_:a",
"http://www.w3.org/1999/02/22-rdf-syntax-ns#first": [ { "@value": "a" } ],
"http://www.w3.org/1999/02/22-rdf-syntax-ns#rest": [ { "@id": "_:b" } ]
},
{
"@id": "_:b",
"http://www.w3.org/1999/02/22-rdf-syntax-ns#first": [ { "@value": "b" } ],
"http://www.w3.org/1999/02/22-rdf-syntax-ns#rest": [ { "@id": "_:c" } ]
},
{
"@id": "_:c",
"http://www.w3.org/1999/02/22-rdf-syntax-ns#first": [ { "@value": "c" } ],
"http://www.w3.org/1999/02/22-rdf-syntax-ns#rest": [ { "@id": "_:b" } ]
},
{
"@id": "http://example.com",
"http://example.com/property": [ { "@id": "_:a" } ]
}
]
Do not convert list nodes to @list if nodes contain more than one value for rdf:first.
<http://example.com> <http://example.com/property> _:a .
_:a <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "a" .
_:a <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b .
_:b <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "b1" .
_:b <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "b2" .
_:b <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:c .
_:c <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "c" .
_:c <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> .
[
{
"@id": "_:a",
"http://www.w3.org/1999/02/22-rdf-syntax-ns#first": [ { "@value": "a" } ],
"http://www.w3.org/1999/02/22-rdf-syntax-ns#rest": [ { "@id": "_:b" } ]
},
{
"@id": "_:b",
"http://www.w3.org/1999/02/22-rdf-syntax-ns#first": [
{ "@value": "b1" },
{ "@value": "b2" }
],
"http://www.w3.org/1999/02/22-rdf-syntax-ns#rest": [
{
"@list": [
{
"@value": "c"
}
]
}
]
},
{
"@id": "http://example.com",
"http://example.com/property": [ { "@id": "_:a" } ]
}
]
Do not convert list nodes to @list if nodes contain more than one value for rdf:rest.
<http://example.com> <http://example.com/property> _:a .
_:a <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "a" .
_:a <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b .
_:b <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "b" .
_:b <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:c .
_:b <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:d .
_:c <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "c" .
_:c <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> .
_:d <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "d" .
_:d <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> .
[
{
"@id": "_:a",
"http://www.w3.org/1999/02/22-rdf-syntax-ns#first": [ { "@value": "a" } ],
"http://www.w3.org/1999/02/22-rdf-syntax-ns#rest": [ { "@id": "_:b" } ]
},
{
"@id": "_:b",
"http://www.w3.org/1999/02/22-rdf-syntax-ns#first": [ { "@value": "b" } ],
"http://www.w3.org/1999/02/22-rdf-syntax-ns#rest": [
{ "@list": [ { "@value": "c" } ] },
{ "@list": [ { "@value": "d" } ] }
]
},
{
"@id": "http://example.com",
"http://example.com/property": [ { "@id": "_:a" } ]
}
]
Do not convert lists to @list if a list node's rdf:rest is an IRI.
<http://example.com> <http://example.com/property> _:a .
_:a <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "a" .
_:a <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> "b" .
[
{
"@id": "_:a",
"http://www.w3.org/1999/02/22-rdf-syntax-ns#first": [ { "@value": "a" } ],
"http://www.w3.org/1999/02/22-rdf-syntax-ns#rest": [ { "@value": "b" } ]
},
{
"@id": "http://example.com",
"http://example.com/property": [ { "@id": "_:a" } ]
}
]
List nodes may have a rdf:type rdf:List.
<http://example.com/> <http://example.com/list> _:b0 .
_:b0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/1999/02/22-rdf-syntax-ns#List> .
_:b0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "A" .
_:b0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b1 .
_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "B" .
_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b2 .
_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/1999/02/22-rdf-syntax-ns#List> .
_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/1999/02/22-rdf-syntax-ns#List> .
_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/1999/02/22-rdf-syntax-ns#List> .
_:b2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "C" .
_:b2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> .
[
{
"@id": "http://example.com/",
"http://example.com/list": [
{
"@list": [
{
"@value": "A"
},
{
"@value": "B"
},
{
"@value": "C"
}
]
}
]
}
]
Equivalent triples are used only once
<http://example.com/nodeA> <http://example.com/property> "1" .
<http://example.com/nodeA> <http://example.com/property> "1" .
<http://example.com/nodeA> <http://example.com/property> "2"^^<http://www.w3.org/2001/XMLSchema#integer> .
<http://example.com/nodeA> <http://example.com/property> "2"^^<http://www.w3.org/2001/XMLSchema#integer> .
<http://example.com/nodeA> <http://example.com/property> <http://example.com/nodeB> .
<http://example.com/nodeA> <http://example.com/property> <http://example.com/nodeB> .
<http://example.com/nodeA> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.com/TypeA> .
<http://example.com/nodeA> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.com/TypeA> .
<http://example.com/nodeA> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.com/TypeA> .
[
{
"@id": "http://example.com/nodeA",
"http://example.com/property": [
{ "@value": "1" },
{
"@value": "2",
"@type": "http://www.w3.org/2001/XMLSchema#integer"
},
{ "@id": "http://example.com/nodeB" }
],
"@type": [ "http://example.com/TypeA" ]
}
]
Literals with datatype xsd:boolean, xsd:integer, and xsd:double are serialized using native scalar values
<http://example.com/Subj1> <http://example.com/prop> "true"^^<http://www.w3.org/2001/XMLSchema#boolean> .
<http://example.com/Subj1> <http://example.com/prop> "false"^^<http://www.w3.org/2001/XMLSchema#boolean> .
<http://example.com/Subj1> <http://example.com/prop> "1"^^<http://www.w3.org/2001/XMLSchema#integer> .
<http://example.com/Subj1> <http://example.com/prop> "1.1"^^<http://www.w3.org/2001/XMLSchema#decimal> .
<http://example.com/Subj1> <http://example.com/prop> "1.1E-1"^^<http://www.w3.org/2001/XMLSchema#double> .
[
{
"@id": "http://example.com/Subj1",
"http://example.com/prop": [
{ "@value": true },
{ "@value": false },
{ "@value": 1 },
{ "@value": "1.1", "@type": "http://www.w3.org/2001/XMLSchema#decimal"},
{ "@value": 0.11 }
]
}
]
Setting useRdfType to true causes an rdf:type predicate to be treated like a normal property, not @type
<http://example.com/Subj1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.com/Type> .
<http://example.com/Subj1> <http://example.com/prop1> <http://example.com/Obj1> .
<http://example.com/Subj1> <http://example.com/prop2> "Plain" .
<http://example.com/Subj1> <http://example.com/prop2> "2012-05-12"^^<http://www.w3.org/2001/XMLSchema#date> .
<http://example.com/Subj1> <http://example.com/prop2> "English"@en .
[
{
"@id": "http://example.com/Subj1",
"http://example.com/prop1": [{"@id": "http://example.com/Obj1"}],
"http://example.com/prop2": [
{"@value": "Plain"},
{"@value": "2012-05-12", "@type": "http://www.w3.org/2001/XMLSchema#date"},
{"@value": "English", "@language": "en"}
],
"http://www.w3.org/1999/02/22-rdf-syntax-ns#type": [
{"@id": "http://example.com/Type"}
]
}
]
This report generated by earl-report version 0.2.7.2 an Unlicensed Ruby application. More information is available at https://github.com/gkellogg/earl-report .
This software is provided by Gregg Kellogg in hopes that it might make the lives of conformance testers easier.