JSON-LD
Implementation Report
JSON-LD Implementation Report
Unofficial Draft
07 April 2015
Editors:
Gregg Kellogg
Kellogg Associates
Markus Lanthaler
Graz University of Technology
Manu Sporny
Digital Bazaar
Authors:
Manu Sporny
Digital Bazaar
Dave Longley
Digital Bazaar
Gregg Kellogg
Kellogg Associates
Markus Lanthaler
Graz University of Technology
Niklas Lindström
This document is also available in these non-normative formats:
Turtle
and
JSON-LD
This document is licensed under a
Creative Commons
Attribution 3.0 License
Abstract
This document report test subject conformance for and related specifications for
JSON-LD
JSON-LD-API
according to the requirements of the Evaluation and Report Language (EARL) 1.0 Schema [
EARL10-SCHEMA
].
This report is also available in alternate formats:
Turtle
and
JSON-LD
Status of This Document
This document is merely a public working draft of a potential specification. It has
no official standing of any kind and does not represent the support or consensus of any
standards organisation.
Table of Contents
1.
Instructions for submitting implementation reports
2.
Test Manifests
2.1
Compaction
2.2
Error handling
2.3
Expansion
2.4
Flattening
2.5
Remote document
2.6
Transform JSON-LD to RDF
2.7
Transform RDF to JSON-LD
A.
Test Subjects
B.
Individual Test Results
C.
Test Definitions
D.
Report Generation Software
E.
References
E.1
Informative references
1.
Instructions for submitting implementation reports
Tests should be run using the test manifests defined in the
Test Manifests
Section.
Each test manifest
MAY
contain a
baseIri
property, indicating
the base IRI to be used for running each test.
Reports should be submitted in Turtle format to
[email protected]
and include an
earl:Assertion
for each test, referencing the test resource from the associated manifest
and the test subject being reported upon. An example test entry is be the following:
[ a earl:Assertion;
earl:assertedBy ;
earl:subject ;
earl:test ;
earl:result [
a earl:TestResult;
earl:outcome earl:passed;
dc:date "2013-02-22T15:12:30-08:00"^^xsd:dateTime];
earl:mode earl:automatic ] .
The Test Subject should be defined as a
doap:Project
, including the name,
homepage and developer(s) of the software (see [
DOAP
]). Optionally, including the
project description and programming language. An example test subject description is the following:
a doap:Project, earl:TestSubject, earl:Software ;
doap:name "JSON::LD" ;
doap:homepage ;
doap:license ;
doap:description "JSON::LD parses and serializes JSON-LD into RDF and implements expansion, compaction and framing API interfaces."@en ;
doap:programming-language "Ruby" ;
doap:developer ;
dc:title "JSON::LD" ;
dc:date "2011-08-29"^^xsd:date ;
dc:creator ;
The software developer, either an organization or one or more individuals
SHOULD
be
referenced from
doap:developer
using [
FOAF
]. For example:
a foaf:Person, earl:Assertor;
foaf:name "Gregg Kellogg";
foaf:title "Implementor";
foaf:homepage .
See
JSON-LD Test Description
for more information.
2.
Test Manifests
2.1
Compaction
JSON-LD compaction tests use object comparison.
Test
JSON::LD
jsonld.js browser
jsonld.js node.js
php-json-ld
PyLD
JSONLD-Java
JSON-goLD
JsonLD
Test 0001: drop free-floating nodes
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0002: basic
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0003: drop null and unmapped properties
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0004: optimize @set, keep empty arrays
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0005: @type and prefix compaction
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0006: keep expanded object format if @type doesn't match
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0007: add context
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0008: alias keywords
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0009: compact @id
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0010: array to @graph
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0011: compact date
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0012: native types
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0013: @value with @language
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0014: array to aliased @graph
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0015: best match compaction
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0016: recursive named graphs
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0017: A term mapping to null removes the mapping
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0018: best matching term for lists
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0019: Keep duplicate values in @list and @set
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0020: Compact @id that is a property IRI when @container is @list
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0021: Compact properties and types using @vocab
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0022: @list compaction of nested properties
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0023: prefer @vocab over compacted IRIs
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0024: most specific term matching in @list.
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0025: Language maps
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0026: Language map term selection with complications
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0027: @container: @set with multiple values
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0028: Alias keywords and use @vocab
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0029: Simple @index map
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0030: non-matching @container: @index
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0031: Compact @reverse
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0032: Compact keys in reverse-maps
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0033: Compact reverse-map to reverse property
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0034: Skip property with @reverse if no match
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0035: Compact @reverse node references using strings
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0036: Compact reverse properties using index containers
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0037: Compact keys in @reverse using @vocab
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0038: Index map round-tripping
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0039: @graph is array
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0040: @list is array
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0041: index rejects term having @list
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0042: @list keyword aliasing
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0043: select term over @vocab
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0044: @type: @vocab in reverse-map
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0045: @id value uses relative IRI, not term
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0046: multiple objects without @context use @graph
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0047: Round-trip relative URLs
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0048: term with @language: null
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0049: Round tripping of lists that contain just IRIs
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0050: Reverse properties require @type: @id to use string values
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0051: Round tripping @list with scalar
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0052: Round tripping @list with scalar and @graph alias
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0053: Use @type: @vocab if no @type: @id
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0054: Compact to @type: @vocab and compact @id to term
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0055: Round tripping @type: @vocab
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0056: Prefer @type: @vocab over @type: @id for terms
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0057: Complex round tripping @type: @vocab and @type: @id
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0058: Prefer @type: @id over @type: @vocab for non-terms
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0059: Term with @type: @vocab if no @type: @id
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0060: Term with @type: @id if no @type: @vocab and term value
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0061: @type: @vocab/@id with values matching either
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0062: @type: @vocab and relative IRIs
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0063: Compact IRI round-tripping with @type: @vocab
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0064: Compact language-tagged and indexed strings to index-map
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0065: Language-tagged and indexed strings with language-map
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0066: Relative IRIs
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0067: Reverse properties with blank nodes
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0068: Single value reverse properties
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0069: Single value reverse properties with @set
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0070: compactArrays option
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0071: Input has multiple @contexts, output has one
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0072: Default language and unmapped properties
UNTESTED
UNTESTED
UNTESTED
UNTESTED
UNTESTED
UNTESTED
PASS
UNTESTED
Percentage passed out of 72 Tests
98.6%
98.6%
98.6%
98.6%
98.6%
98.6%
100.0%
98.6%
2.2
Error handling
JSON-LD to Expansion tests use object compare
Test
JSON::LD
jsonld.js browser
jsonld.js node.js
php-json-ld
PyLD
JSONLD-Java
JSON-goLD
JsonLD
Test 0001: Keywords cannot be aliased to other keywords
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0002: A context may not include itself recursively (direct)
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0003: A context may not include itself recursively (indirect)
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0004: Error dereferencing a remote context
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0005: Invalid remote context
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0006: Invalid local context
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0007: Invalid base IRI
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0008: Invalid vocab mapping
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0009: Invalid default language
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0010: Cyclic IRI mapping
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0011: Invalid term definition
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0012: Invalid type mapping (not a string)
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0013: Invalid type mapping (not absolute IRI)
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0014: Invalid reverse property (contains @id)
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0015: Invalid IRI mapping (@reverse not a string)
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0016: Invalid IRI mapping (not an absolute IRI)
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0017: Invalid reverse property (invalid @container)
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0018: Invalid IRI mapping (@id not a string)
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0019: Invalid keyword alias
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0020: Invalid IRI mapping (no vocab mapping)
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0021: Invalid container mapping
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0022: Invalid language mapping
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0023: Invalid IRI mapping (relative IRI in @type)
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0024: List of lists (from array)
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0025: Invalid reverse property map
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0026: Colliding keywords
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0027: Invalid @id value
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0028: Invalid type value
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0029: Invalid value object value
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0030: Invalid language-tagged string
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0031: Invalid @index value
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0032: List of lists (from array)
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0033: Invalid @reverse value
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0034: Invalid reverse property value (in @reverse)
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0035: Invalid language map value
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0036: Invalid reverse property value (through coercion)
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0037: Invalid value object (unexpected keyword)
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0038: Invalid value object (@type and @language)
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0039: Invalid language-tagged value
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0040: Invalid typed value
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0041: Invalid set or list object
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0042: Compaction to list of lists
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0043: Conflicting indexes
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Percentage passed out of 43 Tests
100.0%
100.0%
100.0%
100.0%
100.0%
100.0%
100.0%
100.0%
2.3
Expansion
JSON-LD to Expansion tests use object compare
Test
Argo.Core.JsonLd
JSON::LD
jsonld.js browser
jsonld.js node.js
php-json-ld
PyLD
JSONLD-Java
JSON-goLD
JsonLD
Test 0001: drop free-floating nodes
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0002: basic
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0003: drop null and unmapped properties
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0004: optimize @set, keep empty arrays
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0005: do not expand aliased @id/@type
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0006: alias keywords
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0007: date type-coercion
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0008: @value with @language
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0009: @graph with terms
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0010: native types
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0011: coerced @id
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0012: @graph with embed
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0013: expand already expanded
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0014: @set of @value objects with keyword aliases
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0015: collapse set of sets, keep empty lists
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0016: context reset
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0017: @graph and @id aliased
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0018: override default @language
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0019: remove @value = null
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0020: do not remove @graph if not at top-level
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0021: do not remove @graph at top-level if not only property
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0022: expand value with default language
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0023: Expanding list/set with coercion
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0024: Multiple contexts
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0025: Problematic IRI expansion tests
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0026: Term definition with @id: @type
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0027: Duplicate values in @list and @set
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0028: Use @vocab in properties and @type but not in @id
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0029: Relative IRIs
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0030: Language maps
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0031: type-coercion of native types
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0032: Null term and @vocab
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0033: Using @vocab with with type-coercion
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0034: Multiple properties expanding to the same IRI
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0035: Language maps with @vocab, default language, and colliding property
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0036: Expanding @index
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0037: Expanding @reverse
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0038: Expanding blank node labels
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0039: Using terms in a reverse-maps
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0040: language and index expansion on non-objects
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0041: @language: null resets the default language
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0042: Reverse properties
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0043: Using reverse properties inside a @reverse-container
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0044: Index maps with language mappings
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0045: Top-level value objects
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0046: Free-floating nodes
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0047: Free-floating values in sets and free-floating lists
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0048: Terms are ignored in @id
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0049: String values of reverse properties
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0050: Term definitions with prefix separate from prefix definitions
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0051: Expansion of keyword aliases in term definitions
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0052: @vocab-relative IRIs in term definitions
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0053: Expand absolute IRI with @type: @vocab
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0054: Expand term with @type: @vocab
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0055: Expand @vocab-relative term with @type: @vocab
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0056: Use terms with @type: @vocab but not with @type: @id
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0057: Expand relative IRI with @type: @vocab
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0058: Expand compact IRI with @type: @vocab
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0059: Reset @vocab by setting it to null
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0060: Overwrite document base with @base and reset it again
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0061: Coercing native types to arbitrary datatypes
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0062: Various relative IRIs with with @base
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0063: Reverse property and index container
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0064: bnode values of reverse properties
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0065: Drop unmapped keys in reverse map
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0066: Reverse-map keys with @vocab
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0067: prefix://suffix not a compact IRI
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0068: _:suffix values are not a compact IRI
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0069: Compact IRI as term with type mapping
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0070: Compact IRI as term defined using equivalent compact IRI
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0071: Redefine terms looking like compact IRIs
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0072: Redefine term using @vocab, not itself
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0073: @context not first property
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0074: @id not first property
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0075: @vocab as blank node identifier
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0076: base option overrides document location
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0077: expandContext option
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0078: multiple reverse properties
UNTESTED
UNTESTED
UNTESTED
UNTESTED
UNTESTED
UNTESTED
UNTESTED
PASS
UNTESTED
Percentage passed out of 78 Tests
98.7%
98.7%
98.7%
98.7%
98.7%
98.7%
98.7%
100.0%
98.7%
2.4
Flattening
JSON-LD flattening tests use object comparison.
Test
JSON::LD
jsonld.js browser
jsonld.js node.js
php-json-ld
PyLD
JSONLD-Java
JSON-goLD
JsonLD
Test 0001: drop free-floating nodes
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0002: basic
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0003: drop null and unmapped properties
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0004: optimize @set, keep empty arrays
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0005: do not expand aliased @id/@type
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0006: alias keywords
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0007: date type-coercion
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0008: @value with @language
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0009: @graph with terms
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0010: native types
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0011: coerced @id
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0012: @graph with embed
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0013: flatten already expanded
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0014: @set of @value objects with keyword aliases
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0015: collapse set of sets, keep empty lists
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0016: context reset
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0017: @graph and @id aliased
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0018: override default @language
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0019: remove @value = null
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0020: do not remove @graph if not at top-level
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0021: do not remove @graph at top-level if not only property
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0022: flatten value with default language
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0023: Flattening list/set with coercion
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0024: Multiple contexts
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0025: Problematic IRI flattening tests
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0026: Term definition with @id: @type
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0027: Duplicate values in @list and @set
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0028: Use @vocab in properties and @type but not in @id
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0029: Relative IRIs
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0030: Language maps
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0031: type-coercion of native types
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0032: Null term and @vocab
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0033: Using @vocab with with type-coercion
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0034: Multiple properties expanding to the same IRI
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0035: Language maps with @vocab, default language, and colliding property
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0036: Flattening @index
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0037: Flattening reverse properties
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0038: Flattening blank node labels
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0039: Using terms in a reverse-maps
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0040: language and index expansion on non-objects
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0041: Free-floating sets and lists
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0042: List objects not equivalent
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0043: Sample test manifest extract
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0044: compactArrays option
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0045: Blank nodes with reverse properties
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0046: Empty string as identifier
UNTESTED
UNTESTED
UNTESTED
UNTESTED
UNTESTED
UNTESTED
PASS
UNTESTED
Percentage passed out of 46 Tests
97.8%
97.8%
97.8%
97.8%
97.8%
97.8%
100.0%
97.8%
2.5
Remote document
Tests appropriate document loading behavior as defined in the API
Test
JSON::LD
jsonld.js browser
jsonld.js node.js
php-json-ld
PyLD
JSON-goLD
JsonLD
Test 0001: load JSON-LD document
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0002: load JSON document
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0003: load JSON document with extension-type
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0004: loading an unknown type raises loading document failed
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0005: Load JSON-LD through 301 redirect
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0006: Load JSON-LD through 303 redirect
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0007: Load JSON-LD through 307 redirect
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0008: Non-existant file (404)
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0009: load JSON-LD document with link
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0010: load JSON document with link
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0011: load JSON document with extension-type with link
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0012: Multiple context link headers
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Percentage passed out of 12 Tests
100.0%
100.0%
100.0%
100.0%
100.0%
100.0%
100.0%
2.6
Transform JSON-LD to RDF
JSON-LD to RDF tests generate N-Quads output and use string comparison.
Test
Argo.Core.JsonLd
JSON::LD
RDFLib-JSONLD
jsonld.js browser
jsonld.js node.js
php-json-ld
PyLD
JSONLD-Java
JSON-goLD
JsonLD
Test 0001: Plain literal with URIs
PASS
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
PASS
Test 0003: Default subject is BNode
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0004: Literal with language tag
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0005: Extended character set literal
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0006: Typed literal
PASS
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
PASS
Test 0008: Test prefix defined in @context
PASS
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
PASS
Test 0010: Test object processing defines object
PASS
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
PASS
Test 0012: Multiple Objects for a Single Property
PASS
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
PASS
Test 0014: Creation of a list with single element
PASS
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
PASS
Test 0016: Empty IRI expands to resource location
PASS
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
PASS
Test 0018: Frag ID expands relative resource location
PASS
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
PASS
Test 0020: Test type coercion to typed literal
PASS
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
PASS
Test 0023: Test coercion of integer value
PASS
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
PASS
Test 0025: Test list coercion with single element
PASS
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
PASS
Test 0027: Simple named graph (Wikidata)
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0028: Simple named graph
PASS
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
PASS
Test 0030: top-level graph with string subject reference
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0031: Reverse property
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0032: @context reordering
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0033: @id reordering
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0034: context properties reordering
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0035: non-fractional numbers converted to xsd:double
PASS
PASS
FAIL
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0036: Use nodeMapGeneration bnode labels
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0041: drop free-floating nodes
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0042: basic
PASS
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
PASS
Test 0044: optimize @set, keep empty arrays
PASS
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
PASS
Test 0046: alias keywords
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0047: date type-coercion
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0048: @value with @language
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0049: @graph with terms
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0050: native types
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0051: coerced @id
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0052: @graph with embed
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0053: expand already expanded
PASS
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
PASS
Test 0055: collapse set of sets, keep empty lists
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0056: context reset
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0057: @graph and @id aliased
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0058: override default @language
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0059: remove @value = null
PASS
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
PASS
Test 0061: do not remove @graph at top-level if not only property
PASS
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
PASS
Test 0063: Lists and sets of properties with list/set coercion
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0064: Multiple contexts
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0065: Problematic IRI expansion tests
PASS
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
PASS
Test 0067: Keep duplicate values in @list and @set
PASS
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
PASS
Test 0069: Relative IRIs
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0070: Language maps
PASS
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
PASS
Test 0072: Mapping a term to null decouples it from @vocab
PASS
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
PASS
Test 0074: Multiple properties expanding to the same IRI
PASS
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
PASS
Test 0076: Expanding @index
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0077: Expanding @reverse
PASS
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
PASS
Test 0079: Using terms in a reverse-maps
PASS
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
PASS
Test 0081: Reset the default language
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0082: Expanding reverse properties
PASS
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
PASS
Test 0084: Ensure index maps use language mapping
PASS
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
PASS
Test 0086: Free-floating nodes are removed
PASS
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
PASS
Test 0088: Terms are ignored in @id
PASS
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
PASS
Test 0090: Term definitions with prefix separate from prefix definitions
PASS
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
PASS
Test 0092: @vocab-relative IRIs in term definitions
PASS
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
PASS
Test 0094: Expand term with @type: @vocab
PASS
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
PASS
Test 0096: Use terms with @type: @vocab but not with @type: @id
PASS
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
PASS
Test 0098: Expand compact IRI with @type: @vocab
PASS
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
PASS
Test 0100: Overwrite document base with @base and reset it again
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0101: Coercing native types to arbitrary datatypes
PASS
PASS
FAIL
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0102: Various relative IRIs with with @base
PASS
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
PASS
Test 0104: Expand reverse property whose values are unlabeled blank nodes
PASS
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
PASS
Test 0106: Use @vocab to expand keys in reverse-maps
PASS
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
PASS
Test 0108: _::sufffix not a compact IRI
PASS
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
PASS
Test 0110: Redefine compact IRI with itself
PASS
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
PASS
Test 0112: Redefine term using @vocab, not itself
PASS
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
PASS
Test 0114: Dataset with a IRI named graph
PASS
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
PASS
Test 0116: Dataset from node with embedded named graph
PASS
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
PASS
Test 0118: produce generalized RDF flag
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0119: Blank nodes with reverse properties
UNTESTED
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Percentage passed out of 114 Tests
99.1%
100.0%
98.2%
100.0%
100.0%
100.0%
100.0%
100.0%
100.0%
100.0%
2.7
Transform RDF to JSON-LD
Transform RDF to JSON-LD tests take N-Quads input and use object comparison.
Test
Argo.Core.JsonLd
JSON::LD
RDFLib-JSONLD
jsonld.js browser
jsonld.js node.js
php-json-ld
PyLD
JSONLD-Java
JSON-goLD
JsonLD
Test 0001: Object Lists
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0002: Native Types
PASS
PASS
FAIL
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0003: BNodes and references
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0004: Lists
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0005: Document with list
PASS
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
PASS
Test 0007: Graph with multiple named graphs
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0008: List conversion
PASS
PASS
FAIL
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0009: List conversion with IRI nodes
PASS
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
PASS
Test 0011: List pattern with extra properties
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0012: List pattern with cycles
PASS
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
PASS
Test 0014: List pattern with multiple values of rdf:rest
PASS
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
PASS
Test 0016: List pattern with type rdf:List
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0017: Remove duplicate triples
PASS
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
PASS
Test 0019: use rdf:type flag set to false
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
PASS
Test 0020: list with node shared across graphs
UNTESTED
UNTESTED
UNTESTED
UNTESTED
UNTESTED
UNTESTED
UNTESTED
UNTESTED
PASS
UNTESTED
Test 0021: list with node shared across graphs (same triple in different graphs)
UNTESTED
UNTESTED
UNTESTED
UNTESTED
UNTESTED
UNTESTED
UNTESTED
UNTESTED
PASS
UNTESTED
Test 0022: list from duplicate triples
UNTESTED
UNTESTED
UNTESTED
UNTESTED
UNTESTED
UNTESTED
UNTESTED
UNTESTED
PASS
UNTESTED
Percentage passed out of 22 Tests
86.4%
86.4%
77.3%
86.4%
86.4%
86.4%
86.4%
86.4%
100.0%
86.4%
A.
Test Subjects
This report was tested using the following test subjects:
Argo.Core.JsonLd
Description
Argo.Core.JsonLd library for parsing/serializing JSON-LD data in .Net.
Programming Language
C#
Home Page
Developer
Argo Data Resource Corporation
Argo Data Resource Corporation
Test Suite Compliance
Compaction
Untested
Error handling
Untested
Expansion
77/78 (98.7%)
Flattening
Untested
Remote document
Untested
Transform JSON-LD to RDF
113/114 (99.1%)
Transform RDF to JSON-LD
19/22 (86.4%)
JSON::LD
Description
RDF.rb plugin for parsing/serializing JSON-LD data.
Home Page
Developer
Gregg Kellogg
Test Suite Compliance
Compaction
71/72 (98.6%)
Error handling
43/43 (100.0%)
Expansion
77/78 (98.7%)
Flattening
45/46 (97.8%)
Remote document
12/12 (100.0%)
Transform JSON-LD to RDF
114/114 (100.0%)
Transform RDF to JSON-LD
19/22 (86.4%)
RDFLib-JSONLD
Programming Language
Python
Home Page
Developer
Niklas Lindström
Test Suite Compliance
Compaction
Untested
Error handling
Untested
Expansion
Untested
Flattening
Untested
Remote document
Untested
Transform JSON-LD to RDF
112/114 (98.2%)
Transform RDF to JSON-LD
17/22 (77.3%)
jsonld.js browser
Description
A JSON-LD processor for JavaScript
Programming Language
JavaScript
Home Page
Developer
Dave Longley
Test Suite Compliance
Compaction
71/72 (98.6%)
Error handling
43/43 (100.0%)
Expansion
77/78 (98.7%)
Flattening
45/46 (97.8%)
Remote document
12/12 (100.0%)
Transform JSON-LD to RDF
114/114 (100.0%)
Transform RDF to JSON-LD
19/22 (86.4%)
jsonld.js node.js
Description
A JSON-LD processor for JavaScript
Programming Language
JavaScript
Home Page
Developer
Dave Longley
Test Suite Compliance
Compaction
71/72 (98.6%)
Error handling
43/43 (100.0%)
Expansion
77/78 (98.7%)
Flattening
45/46 (97.8%)
Remote document
12/12 (100.0%)
Transform JSON-LD to RDF
114/114 (100.0%)
Transform RDF to JSON-LD
19/22 (86.4%)
php-json-ld
Description
A JSON-LD processor for PHP
Programming Language
PHP
Home Page
Developer
Dave Longley
Test Suite Compliance
Compaction
71/72 (98.6%)
Error handling
43/43 (100.0%)
Expansion
77/78 (98.7%)
Flattening
45/46 (97.8%)
Remote document
12/12 (100.0%)
Transform JSON-LD to RDF
114/114 (100.0%)
Transform RDF to JSON-LD
19/22 (86.4%)
PyLD
Description
A JSON-LD processor for Python
Programming Language
Python
Home Page
Developer
Dave Longley
Test Suite Compliance
Compaction
71/72 (98.6%)
Error handling
43/43 (100.0%)
Expansion
77/78 (98.7%)
Flattening
45/46 (97.8%)
Remote document
12/12 (100.0%)
Transform JSON-LD to RDF
114/114 (100.0%)
Transform RDF to JSON-LD
19/22 (86.4%)
JSONLD-Java
Description
An Implementation of the JSON-LD Specification for Java
Programming Language
Java
Home Page
Developer
Tristan King
Peter Ansell
Test Suite Compliance
Compaction
71/72 (98.6%)
Error handling
43/43 (100.0%)
Expansion
77/78 (98.7%)
Flattening
45/46 (97.8%)
Remote document
Untested
Transform JSON-LD to RDF
114/114 (100.0%)
Transform RDF to JSON-LD
19/22 (86.4%)
JSON-goLD
Description
A JSON-LD processor for Go
Programming Language
Go
Home Page
Developer
Stan Nazarenko
Test Suite Compliance
Compaction
72/72 (100.0%)
Error handling
43/43 (100.0%)
Expansion
78/78 (100.0%)
Flattening
46/46 (100.0%)
Remote document
12/12 (100.0%)
Transform JSON-LD to RDF
114/114 (100.0%)
Transform RDF to JSON-LD
22/22 (100.0%)
JsonLD
Description
JSON-LD processor for PHP
Programming Language
PHP
Home Page
Developer
Markus Lanthaler
Test Suite Compliance
Compaction
71/72 (98.6%)
Error handling
43/43 (100.0%)
Expansion
77/78 (98.7%)
Flattening
45/46 (97.8%)
Remote document
12/12 (100.0%)
Transform JSON-LD to RDF
114/114 (100.0%)
Transform RDF to JSON-LD
19/22 (86.4%)
B.
Individual Test Results
Individual test results used to construct this report are available here:
csharp-earl.ttl
java-earl.ttl
json_gold_earl.ttl
jsonld.js-browser-earl.ttl
jsonld.js-node.js-earl.ttl
markus-earl.ttl
php-json-ld-earl.ttl
pyld-earl.ttl
rdflib-jsonld-earl.ttl
ruby-earl.ttl
C.
Test Definitions
Test 0001:
drop free-floating nodes
Unreferenced nodes not containing properties are dropped
Example 1
: drop free-floating nodes Input
{"@id": "http://example.org/test#example"}
Example 2
: drop free-floating nodes Result
{}
Test 0002:
basic
Basic term and value compaction
Example 3
: basic Input
[{
"@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]
}]
Example 4
: basic Result
"@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]
Test 0003:
drop null and unmapped properties
Properties mapped to null or which are never mapped are dropped
Example 5
: drop null and unmapped properties Input
"@id": "http://example.org/id",
"http://example.org/property": null,
"regularJson": {
"nonJsonLd": "property",
"deep": [{
"foo": "bar"
}, {
"bar": "foo"
}]
Example 6
: drop null and unmapped properties Result
{}
Test 0004:
optimize @set, keep empty arrays
Containers mapped to @set keep empty arrays
Example 7
: optimize @set, keep empty arrays Input
"@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]
Example 8
: optimize @set, keep empty arrays Result
"@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": []
Test 0005:
@type and prefix compaction
Compact uses prefixes in @type
Example 9
: @type and prefix compaction Input
"@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"}
Example 10
: @type and prefix compaction Result
"@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"
Test 0006:
keep expanded object format if @type doesn't match
Values not matching a coerced @type remain in expanded form
Example 11
: keep expanded object format if @type doesn't match Input
"@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"}
Example 12
: keep expanded object format if @type doesn't match Result
"@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"}
Test 0007:
add context
External context is added to the compacted document
Example 13
: add context Input
"@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"]
}]
Example 14
: add context Result
"@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"
Test 0008:
alias keywords
Aliases for keywords are used in compacted document
Example 15
: alias keywords Input
[{
"@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"
}]
}]
Example 16
: alias keywords Result
"@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"
Test 0009:
compact @id
Value with @id is compacted to string if property cast to @id
Example 17
: compact @id Input
"@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"
Example 18
: compact @id Result
"@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"
Test 0010:
array to @graph
An array of objects is serialized with @graph
Example 19
: array to @graph Input
"@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"
Example 20
: array to @graph Result
"@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"
Test 0011:
compact date
Expanded value with type xsd:dateTime is represented as string with type coercion
Example 21
: compact date Input
"@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"
Example 22
: compact date Result
"@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"
Test 0012:
native types
Native values are unmodified during compaction
Example 23
: native types Input
"@id": "http://example.org/test",
"http://example.org/vocab#bool": true,
"http://example.org/vocab#int": 123
Example 24
: native types Result
"@context": {
"ex": "http://example.org/vocab#"
},
"@id": "http://example.org/test",
"ex:bool": true,
"ex:int": 123
Test 0013:
@value with @language
Values with @language remain in expended form by default
Example 25
: @value with @language Input
"@id": "http://example.org/test",
"http://example.org/vocab#test": {"@value": "test", "@language": "en"}
Example 26
: @value with @language Result
"@context": {
"ex": "http://example.org/vocab#"
},
"@id": "http://example.org/test",
"ex:test": {"@value": "test", "@language": "en"}
Test 0014:
array to aliased @graph
Aliasing @graph uses alias in compacted document
Example 27
: array to aliased @graph Input
"@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"
Example 28
: array to aliased @graph Result
"@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"
Test 0015:
best match compaction
Property with values of different types use most appropriate term when compacting
Example 29
: best match compaction Input
[{
"@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"}
}]
Example 30
: best match compaction Result
"@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" ]
Test 0016:
recursive named graphs
Compacting a document with multiple embedded uses of @graph
Example 31
: recursive named graphs Input
"@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 ]
Example 32
: recursive named graphs Result
"@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"
Test 0017:
A term mapping to null removes the mapping
Mapping a term to null causes the property and its values to be removed from the compacted document
Example 33
: A term mapping to null removes the mapping Input
"http://www.w3.org/2000/01/rdf-schema#comment": [
{ "@value": "Kommentar auf Deutsch.", "@language": "de" },
{ "@value": "Comment in English.", "@language": "en" }
Example 34
: A term mapping to null removes the mapping Result
"@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" }
Test 0018:
best matching term for lists
Lists with values of different types use best term in compacted document
Example 35
: best matching term for lists Input
"@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" }
Example 36
: best matching term for lists Result
"@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"
Test 0019:
Keep duplicate values in @list and @set
Duplicate values in @list or @set are retained in compacted document
Example 37
: Keep duplicate values in @list and @set Input
[{
"@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}
}]
Example 38
: Keep duplicate values in @list and @set Result
"@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]
Test 0020:
Compact @id that is a property IRI when @container is @list
A term with @container: @list is also used as the value of an @id, if appropriate
Example 39
: Compact @id that is a property IRI when @container is @list Input
"@context": {
"ex": "http://example.org/ns#"
},
"@id": "ex:property",
"ex:property": {
"@list": [1, 2]
Example 40
: Compact @id that is a property IRI when @container is @list Result
"@context": {
"ex": "http://example.org/ns#",
"ex:property": {
"@container": "@list"
},
"@id": "ex:property",
"ex:property": [1, 2]
Test 0021:
Compact properties and types using @vocab
@vocab is used to create relative properties and types if no other term matches
Example 41
: Compact properties and types using @vocab Input
"@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"
Example 42
: Compact properties and types using @vocab Result
"@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"
Test 0022:
@list compaction of nested properties
Compact nested properties using @list containers
Example 43
: @list compaction of nested properties Input
"@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"
Example 44
: @list compaction of nested properties Result
"@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"
Test 0023:
prefer @vocab over compacted IRIs
@vocab takes precedence over prefixes - even if the result is longer
Example 45
: prefer @vocab over compacted IRIs Input
"@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"
Example 46
: prefer @vocab over compacted IRIs Result
"@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"
Test 0024:
most specific term matching in @list.
The most specific term that matches all of the elements in the list, taking into account the default language, must be selected.
Example 47
: most specific term matching in @list. Input
"@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" }
Example 48
: most specific term matching in @list. Result
"@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"
Test 0025:
Language maps
Multiple values with different languages use language maps if property has @container: @language
Example 49
: Language maps Input
"@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"
Example 50
: Language maps Result
"@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 0026:
Language map term selection with complications
Test appropriate property use given language maps with @vocab, a default language, and a competing term
Example 51
: Language map term selection with complications Input
[{
"@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"
}]
Example 52
: Language map term selection with complications Result
"@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" ]
Test 0027:
@container: @set with multiple values
Fall back to term with @set container if term with language map is defined
Example 53
: @container: @set with multiple values Input
[{
"@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"
}]
Example 54
: @container: @set with multiple values Result
"@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"
Test 0028:
Alias keywords and use @vocab
Combination of keyword aliases and @vocab
Example 55
: Alias keywords and use @vocab Input
"@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/"
Example 56
: Alias keywords and use @vocab Result
"@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/"
Test 0029:
Simple @index map
Output uses index mapping if term is defined with @container: @index
Example 57
: Simple @index map Input
[{
"@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"
}]
}]
Example 58
: Simple @index map Result
"@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"
Test 0030:
non-matching @container: @index
Preserve @index tags if not compacted to an index map
Example 59
: non-matching @container: @index Input
"@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"
Example 60
: non-matching @container: @index Result
"@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"
Test 0031:
Compact @reverse
Compact traverses through @reverse
Example 61
: Compact @reverse Input
"@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" } ]
Example 62
: Compact @reverse Result
"@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"
Test 0032:
Compact keys in reverse-maps
Compact traverses through @reverse
Example 63
: Compact keys in reverse-maps Input
"@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" } ]
Example 64
: Compact keys in reverse-maps Result
"@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"
Test 0033:
Compact reverse-map to reverse property
A reverse map is replaced with a matching property defined with @reverse
Example 65
: Compact reverse-map to reverse property Input
"@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" } ]
Example 66
: Compact reverse-map to reverse property Result
"@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"
Test 0034:
Skip property with @reverse if no match
Do not use reverse property if no other property matches as normal property
Example 67
: Skip property with @reverse if no match Input
"@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" } ]
Example 68
: Skip property with @reverse if no match Result
"@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"
Test 0035:
Compact @reverse node references using strings
Compact node references to strings for reverse properties using @type: @id
Example 69
: Compact @reverse node references using strings Input
"@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" } ]
Example 70
: Compact @reverse node references using strings Result
"@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"
Test 0036:
Compact reverse properties using index containers
Compact using both reverse properties and index containers
Example 71
: Compact reverse properties using index containers Input
"@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" } ]
Example 72
: Compact reverse properties using index containers Result
"@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"
Test 0037:
Compact keys in @reverse using @vocab
Compact keys in @reverse using @vocab
Example 73
: Compact keys in @reverse using @vocab Input
"@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" } ]
Example 74
: Compact keys in @reverse using @vocab Result
"@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"
Test 0038:
Index map round-tripping
Complext round-tripping use case from Drupal
Example 75
: Index map round-tripping Input
"@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"
Example 76
: Index map round-tripping Result
"@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"
Test 0039:
@graph is array
Value of @graph is always an array
Example 77
: @graph is array Input
"@id": "http://example.com/graph/1",
"@graph": [
"@id": "http://example.com/node/1",
"http://example.com/property": [ { "@value": "property" } ]
Example 78
: @graph is array Result
"@id": "http://example.com/graph/1",
"@graph": [
"@id": "http://example.com/node/1",
"http://example.com/property": "property"
Test 0040:
@list is array
Ensure that value of @list is always an array
Example 79
: @list is array Input
"@id": "http://me.markus-lanthaler.com/",
"http://example.com/list": {
"@list": [
"one item"
Example 80
: @list is array Result
"@id": "http://me.markus-lanthaler.com/",
"http://example.com/list": {
"@list": [
"one item"
Test 0041:
index rejects term having @list
If an index is present, a term having an @list container is not selected
Example 81
: index rejects term having @list Input
"@id": "http://example.com/node",
"http://example.com/property": [
"@index": "an index",
"@list": [
"@value": "one item"
Example 82
: index rejects term having @list Result
"@context": {
"name": { "@id": "http://example.com/property", "@container": "@list" }
},
"@id": "http://example.com/node",
"http://example.com/property": {
"@list": [
"one item"
],
"@index": "an index"
Test 0042:
@list keyword aliasing
Make sure keyword aliasing works if a list can't be compacted
Example 83
: @list keyword aliasing Input
"@id": "http://example.com/node",
"http://example.com/property": [
"@list": [
"@value": "one item"
],
"@index": "an index"
Example 84
: @list keyword aliasing Result
"@context": {
"listAlias": "@list",
"indexAlias": "@index"
},
"@id": "http://example.com/node",
"http://example.com/property": {
"listAlias": [
"one item"
],
"indexAlias": "an index"
Test 0043:
select term over @vocab
Ensure that @vocab compaction isn't used if the result collides with a term
Example 85
: select term over @vocab Input
"@id": "http://example.com/node",
"http://example.com/name": [
{ "@value": "Markus Lanthaler" }
Example 86
: select term over @vocab Result
"@context": {
"@vocab": "http://example.com/",
"name": "http://xmlns.com/foaf/0.1/name"
},
"@id": "http://example.com/node",
"http://example.com/name": "Markus Lanthaler"
Test 0044:
@type: @vocab in reverse-map
Prefer properties with @type: @vocab in reverse-maps if the value can be compacted to a term
Example 87
: @type: @vocab in reverse-map Input
"@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" } ]
Example 88
: @type: @vocab in reverse-map Result
"@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"
Test 0045:
@id value uses relative IRI, not term
Values of @id are transformed to relative IRIs, terms are ignored
Example 89
: @id value uses relative IRI, not term Input
"@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" }
Example 90
: @id value uses relative IRI, not term Result
"@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"
Test 0046:
multiple objects without @context use @graph
Wrap top-level array into @graph even if no context is passed
Example 91
: multiple objects without @context use @graph Input
"@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"
Example 92
: multiple objects without @context use @graph Result
"@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"
Test 0047:
Round-trip relative URLs
Relative URLs remain relative after compaction
Example 93
: Round-trip relative URLs Input
"@context": {
"@base": "http://example.com/",
"link": { "@id": "http://example.com/link", "@type": "@id" }
},
"link": "relative-url"
Example 94
: Round-trip relative URLs Result
"@context": {
"@base": "http://example.com/",
"link": { "@id": "http://example.com/link", "@type": "@id" }
},
"link": "relative-url"
Test 0048:
term with @language: null
Prefer terms with a language mapping set to null over terms without language-mapping for non-strings
Example 95
: term with @language: null Input
"http://example.com/propertyA": 5,
"http://example.com/propertyB": 5
Example 96
: term with @language: null Result
"@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
Test 0049:
Round tripping of lists that contain just IRIs
List compaction without @container: @list still uses strings if @type: @id
Example 97
: Round tripping of lists that contain just IRIs Input
"@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" ] }
Example 98
: Round tripping of lists that contain just IRIs Result
"@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" ] }
Test 0050:
Reverse properties require @type: @id to use string values
Node references in reverse properties are not compacted to strings without explicit type-coercion
Example 99
: Reverse properties require @type: @id to use string values Input
"@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" } ]
Example 100
: Reverse properties require @type: @id to use string values Result
"@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" }
Test 0051:
Round tripping @list with scalar
Native values survive round-tripping with @list
Example 101
: Round tripping @list with scalar Input
"http://example.org/term": {
"@list": [1]
Example 102
: Round tripping @list with scalar Result
"http://example.org/term": {
"@list": [1]
Test 0052:
Round tripping @list with scalar and @graph alias
Native values survive round-tripping with @list and @graph alias
Example 103
: Round tripping @list with scalar and @graph alias Input
"@context": {
"graph": "@graph",
"term": "http://example.org/term"
},
"graph": [
"term": {
"@list": [1]
},
"term": {
"@list": [2]
Example 104
: Round tripping @list with scalar and @graph alias Result
"@context": {
"graph": "@graph",
"term": "http://example.org/term"
},
"graph": [
"term": {
"@list": [1]
},
"term": {
"@list": [2]
Test 0053:
Use @type: @vocab if no @type: @id
Compact to @type: @vocab when no @type: @id term available
Example 105
: Use @type: @vocab if no @type: @id Input
[{
"http://example.org/term": [{"@id": "http://example.org/enum"}]
}]
Example 106
: Use @type: @vocab if no @type: @id Result
"@context": {
"term": {"@id": "http://example.org/term", "@type": "@vocab"}
},
"term": "http://example.org/enum"
Test 0054:
Compact to @type: @vocab and compact @id to term
Compact to @type: @vocab and compact @id to term
Example 107
: Compact to @type: @vocab and compact @id to term Input
[{
"http://example.org/term": [{"@id": "http://example.org/enum"}]
}]
Example 108
: Compact to @type: @vocab and compact @id to term Result
"@context": {
"term": {"@id": "http://example.org/term", "@type": "@vocab"},
"enum": {"@id": "http://example.org/enum"}
},
"term": "enum"
Test 0055:
Round tripping @type: @vocab
Compacting IRI value of property with @type: @vocab can use term
Example 109
: Round tripping @type: @vocab Input
"@context": {
"term": {"@id": "http://example.org/term", "@type": "@vocab"},
"enum": {"@id": "http://example.org/enum"}
},
"term": "enum"
Example 110
: Round tripping @type: @vocab Result
"@context": {
"term": {"@id": "http://example.org/term", "@type": "@vocab"},
"enum": {"@id": "http://example.org/enum"}
},
"term": "enum"
Test 0056:
Prefer @type: @vocab over @type: @id for terms
Compacting IRI value of property with @type: @vocab can use term
Example 111
: Prefer @type: @vocab over @type: @id for terms Input
[{
"http://example.org/term": [{"@id": "http://example.org/enum"}]
}]
Example 112
: Prefer @type: @vocab over @type: @id for terms Result
"@context": {
"term": {"@id": "http://example.org/term", "@type": "@vocab"},
"doNotSelect": {"@id": "http://example.org/term"},
"enum": {"@id": "http://example.org/enum"}
},
"term": "enum"
Test 0057:
Complex round tripping @type: @vocab and @type: @id
Compacting IRI value of property with @type: @vocab can use term; more complex
Example 113
: Complex round tripping @type: @vocab and @type: @id Input
"@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"
Example 114
: Complex round tripping @type: @vocab and @type: @id Result
"@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"
Test 0058:
Prefer @type: @id over @type: @vocab for non-terms
Choose a term having @type: @id over @type: @value if value is not a term
Example 115
: Prefer @type: @id over @type: @vocab for non-terms Input
[{
"http://example.org/term": [{"@id": "http://example.org/enum"}]
}]
Example 116
: Prefer @type: @id over @type: @vocab for non-terms Result
"@context": {
"notChosen": {"@id": "http://example.org/term", "@type": "@vocab"},
"chosen": {"@id": "http://example.org/term", "@type": "@id"}
},
"chosen": "http://example.org/enum"
Test 0059:
Term with @type: @vocab if no @type: @id
If there's no term with @type: @id, use terms with @type: @vocab for IRIs not mapped to terms
Example 117
: Term with @type: @vocab if no @type: @id Input
"http://example.com/vocab#foo": [
{ "@id": "http://example.com/vocab#Bar" },
{ "@id": "http://example.com/vocab#Baz" }
Example 118
: Term with @type: @vocab if no @type: @id Result
"@context": {
"Bar": "http://example.com/vocab#Bar",
"foo": {
"@id": "http://example.com/vocab#foo",
"@type": "@vocab"
},
"foo": [
"Bar",
"http://example.com/vocab#Baz"
Test 0060:
Term with @type: @id if no @type: @vocab and term value
If there's no term with @type: @vocab, use terms with @type: @id for IRIs mapped to terms
Example 119
: Term with @type: @id if no @type: @vocab and term value Input
"http://example.com/vocab#foo": [
{ "@id": "http://example.com/vocab#Bar" },
{ "@id": "http://example.com/vocab#Baz" }
Example 120
: Term with @type: @id if no @type: @vocab and term value Result
"@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"
Test 0061:
@type: @vocab/@id with values matching either
Separate IRIs for the same property to use term with more specific @type (@id vs. @vocab)
Example 121
: @type: @vocab/@id with values matching either Input
"http://example.com/vocab#foo": [
{ "@id": "http://example.com/vocab#Bar" },
{ "@id": "http://example.com/vocab#Baz" }
Example 122
: @type: @vocab/@id with values matching either Result
"@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"
Test 0062:
@type: @vocab and relative IRIs
Relative IRIs don't round-trip with @type: @vocab
Example 123
: @type: @vocab and relative IRIs Input
"@context": {
"term": { "@id": "http://example.org/term", "@type": "@vocab" }
},
"term": "not-a-term-thus-a-relative-IRI"
Example 124
: @type: @vocab and relative IRIs Result
"@context": {
"term": { "@id": "http://example.org/term", "@type": "@vocab" }
},
"term": "http://json-ld.org/test-suite/tests/not-a-term-thus-a-relative-IRI"
Test 0063:
Compact IRI round-tripping with @type: @vocab
Term with @type: @vocab will use compact IRIs
Example 125
: Compact IRI round-tripping with @type: @vocab Input
"@context": {
"term": { "@id": "http://example.org/term", "@type": "@vocab" },
"prefix": "http://example.com/vocab#"
},
"term": "prefix:suffix"
Example 126
: Compact IRI round-tripping with @type: @vocab Result
"@context": {
"term": { "@id": "http://example.org/term", "@type": "@vocab" },
"prefix": "http://example.com/vocab#"
},
"term": "prefix:suffix"
Test 0064:
Compact language-tagged and indexed strings to index-map
Given values with both @index and @language and term index-map term, use index map
Example 127
: Compact language-tagged and indexed strings to index-map Input
"@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"
Example 128
: Compact language-tagged and indexed strings to index-map Result
"@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"
Test 0065:
Language-tagged and indexed strings with language-map
Language-tagged and indexed strings don't compact to language-map
Example 129
: Language-tagged and indexed strings with language-map Input
"@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"
Example 130
: Language-tagged and indexed strings with language-map Result
"@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"
Test 0066:
Relative IRIs
Complex use cases for relative IRI compaction
Example 131
: Relative IRIs Input
"@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" }
} ]
Example 132
: Relative IRIs Result
"@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"
Test 0067:
Reverse properties with blank nodes
Compact reverse property whose values are unlabeled blank nodes
Example 133
: Reverse properties with blank nodes Input
"@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" } ]
Example 134
: Reverse properties with blank nodes Result
"@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"
Test 0068:
Single value reverse properties
Single values of reverse properties are compacted as values of ordinary properties
Example 135
: Single value reverse properties Input
"@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" } ]
Example 136
: Single value reverse properties Result
"@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" }
Test 0069:
Single value reverse properties with @set
Single values are kept in array form for reverse properties if the container is to @set
Example 137
: Single value reverse properties with @set Input
"@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" } ]
Example 138
: Single value reverse properties with @set Result
"@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" }
Test 0070:
compactArrays option
Setting compactArrays to false causes single element arrays to be retained
Example 139
: compactArrays option Input
[{
"@id": "http://example/foo",
"http://example/term": [{"@value": "value"}]
}]
Example 140
: compactArrays option Result
"@context": {
"term": "http://example/term"
},
"@graph": [{
"@id": "http://example/foo",
"term": ["value"]
}]
Test 0071:
Input has multiple @contexts, output has one
Expanding input with multiple @contexts and compacting with just one doesn't output undefined properties
Example 141
: Input has multiple @contexts, output has one Input
"@context": [{
"foo": "http://example.com/foo"
}, {
"bar": "http://example.com/bar"
}],
"foo": "foo-value",
"bar": "bar-value"
Example 142
: Input has multiple @contexts, output has one Result
"@context": {
"foo": "http://example.com/foo"
},
"foo": "foo-value",
"http://example.com/bar": "bar-value"
Test 0072:
Default language and unmapped properties
Ensure that the default language is handled correctly for unmapped properties
Example 143
: Default language and unmapped properties Input
"http://example.com/foo": "foo-value"
Example 144
: Default language and unmapped properties Result
"http://example.com/foo": {
"@value": "foo-value"
},
"@context": {
"@language": "en"
Test 0001:
Keywords cannot be aliased to other keywords
Verifies that an exception is raised on expansion when processing an invalid context aliasing a keyword to another keyword
Example 145
: Keywords cannot be aliased to other keywords Input
"@context": {
"@type": "@id"
},
"@type": "http://example.org/type"
Example 146
: Keywords cannot be aliased to other keywords Result
Test 0002:
A context may not include itself recursively (direct)
Verifies that an exception is raised on expansion when processing a context referencing itself
Example 147
: A context may not include itself recursively (direct) Input
"@context": "error-0002-in.jsonld",
"@id": "http://example/test#example"
Example 148
: A context may not include itself recursively (direct) Result
Test 0003:
A context may not include itself recursively (indirect)
Verifies that an exception is raised on expansion when processing a context referencing itself indirectly
Example 149
: A context may not include itself recursively (indirect) Input
"@context": "error-0003-ctx.jsonld",
"@id": "http://example/test#example"
Example 150
: A context may not include itself recursively (indirect) Result
Test 0004:
Error dereferencing a remote context
Verifies that an exception is raised on expansion when a context dereference results in an error
Example 151
: Error dereferencing a remote context Input
"@context": "tag:non-dereferencable-iri",
"@id": "http://example/test#example"
Example 152
: Error dereferencing a remote context Result
Test 0005:
Invalid remote context
Verifies that an exception is raised on expansion when a remote context is not an object containing @context
Example 153
: Invalid remote context Input
[{
"@context": "error-0005-in.jsonld",
"@id": "http://example/test#example"
}]
Example 154
: Invalid remote context Result
Test 0006:
Invalid local context
Verifies that an exception is raised on expansion when a context is not a string or object
Example 155
: Invalid local context Input
"@context": true,
"@id": "http://example/test#example"
Example 156
: Invalid local context Result
Test 0007:
Invalid base IRI
Verifies that an exception is raised on expansion when a context contains an invalid @base
Example 157
: Invalid base IRI Input
"@context": {"@base": true},
"@id": "http://example/test#example"
Example 158
: Invalid base IRI Result
Test 0008:
Invalid vocab mapping
Verifies that an exception is raised on expansion when a context contains an invalid @vocab mapping
Example 159
: Invalid vocab mapping Input
"@context": {"@vocab": true},
"@id": "http://example/test#example"
Example 160
: Invalid vocab mapping Result
Test 0009:
Invalid default language
Verifies that an exception is raised on expansion when a context contains an invalid @language
Example 161
: Invalid default language Input
"@context": {"@language": true},
"@id": "http://example/test#example"
Example 162
: Invalid default language Result
Test 0010:
Cyclic IRI mapping
Verifies that an exception is raised on expansion when a cyclic IRI mapping is found
Example 163
: Cyclic IRI mapping Input
"@context": {
"term": {"@id": "term:term"}
},
"@id": "http://example/test#example"
Example 164
: Cyclic IRI mapping Result
Test 0011:
Invalid term definition
Verifies that an exception is raised on expansion when a invalid term definition is found
Example 165
: Invalid term definition Input
"@context": {
"term": true
},
"@id": "http://example/test#example"
Example 166
: Invalid term definition Result
Test 0012:
Invalid type mapping (not a string)
Verifies that an exception is raised on expansion when a invalid type mapping is found
Example 167
: Invalid type mapping (not a string) Input
"@context": {
"term": {"@id": "http://example/term", "@type": true}
},
"@id": "http://example/test#example"
Example 168
: Invalid type mapping (not a string) Result
Test 0013:
Invalid type mapping (not absolute IRI)
Verifies that an exception is raised on expansion when a invalid type mapping is found
Example 169
: Invalid type mapping (not absolute IRI) Input
"@context": {
"term": {"@id": "http://example/term", "@type": "_:not-an-iri"}
},
"@id": "http://example/test#example"
Example 170
: Invalid type mapping (not absolute IRI) Result
Test 0014:
Invalid reverse property (contains @id)
Verifies that an exception is raised on expansion when a invalid reverse property is found
Example 171
: Invalid reverse property (contains @id) Input
"@context": {
"term": {"@id": "http://example/term", "@reverse": "http://example/reverse"}
},
"@id": "http://example/test#example"
Example 172
: Invalid reverse property (contains @id) Result
Test 0015:
Invalid IRI mapping (@reverse not a string)
Verifies that an exception is raised on expansion when a invalid IRI mapping is found
Example 173
: Invalid IRI mapping (@reverse not a string) Input
"@context": {
"term": {"@reverse": true}
},
"@id": "http://example/test#example"
Example 174
: Invalid IRI mapping (@reverse not a string) Result
Test 0016:
Invalid IRI mapping (not an absolute IRI)
Verifies that an exception is raised on expansion when a invalid IRI mapping is found
Example 175
: Invalid IRI mapping (not an absolute IRI) Input
"@context": {
"term": {"@reverse": "@reverse"}
},
"@id": "http://example/test#example"
Example 176
: Invalid IRI mapping (not an absolute IRI) Result
Test 0017:
Invalid reverse property (invalid @container)
Verifies that an exception is raised on expansion when a invalid reverse property is found
Example 177
: Invalid reverse property (invalid @container) Input
"@context": {
"term": {"@reverse": "http://example/reverse", "@container": "@list"}
},
"@id": "http://example/test#example"
Example 178
: Invalid reverse property (invalid @container) Result
Test 0018:
Invalid IRI mapping (@id not a string)
Verifies that an exception is raised on expansion when a invalid IRI mapping is found
Example 179
: Invalid IRI mapping (@id not a string) Input
"@context": {
"term": {"@id": true}
},
"@id": "http://example/test#example"
Example 180
: Invalid IRI mapping (@id not a string) Result
Test 0019:
Invalid keyword alias
Verifies that an exception is raised on expansion when a invalid keyword alias is found
Example 181
: Invalid keyword alias Input
"@context": {
"term": {"@id": "@context"}
},
"@id": "http://example/test#example"
Example 182
: Invalid keyword alias Result
Test 0020:
Invalid IRI mapping (no vocab mapping)
Verifies that an exception is raised on expansion when a invalid IRI mapping is found
Example 183
: Invalid IRI mapping (no vocab mapping) Input
"@context": {
"term": {"@container": "@set"}
},
"@id": "http://example/test#example"
Example 184
: Invalid IRI mapping (no vocab mapping) Result
Test 0021:
Invalid container mapping
Verifies that an exception is raised on expansion when a invalid container mapping is found
Example 185
: Invalid container mapping Input
"@context": {
"term": {"@id": "http://example/term", "@container": "@id"}
},
"@id": "http://example/test#example"
Example 186
: Invalid container mapping Result
Test 0022:
Invalid language mapping
Verifies that an exception is raised on expansion when a invalid language mapping is found
Example 187
: Invalid language mapping Input
"@context": {
"term": {"@id": "http://example/term", "@language": true}
},
"@id": "http://example/test#example"
Example 188
: Invalid language mapping Result
Test 0023:
Invalid IRI mapping (relative IRI in @type)
Verifies that an exception is raised on expansion when a invalid type mapping is found
Example 189
: Invalid IRI mapping (relative IRI in @type) Input
"@context": {
"term": {"@id": "http://example/term", "@type": "relative/iri"}
},
"@id": "http://example/test#example"
Example 190
: Invalid IRI mapping (relative IRI in @type) Result
Test 0024:
List of lists (from array)
Verifies that an exception is raised in Expansion when a list of lists is found
Example 191
: List of lists (from array) Input
"@context": {"foo": {"@id": "http://example.com/foo", "@container": "@list"}},
"foo": [{"@list": ["baz"]}]
Example 192
: List of lists (from array) Result
Test 0025:
Invalid reverse property map
Verifies that an exception is raised in Expansion when a invalid reverse property map is found
Example 193
: Invalid reverse property map Input
"@id": "http://example/foo",
"@reverse": {
"@id": "http://example/bar"
Example 194
: Invalid reverse property map Result
Test 0026:
Colliding keywords
Verifies that an exception is raised in Expansion when colliding keywords are found
Example 195
: Colliding keywords Input
"@context": {
"id": "@id",
"ID": "@id"
},
"id": "http://example/foo",
"ID": "http://example/bar"
Example 196
: Colliding keywords Result
Test 0027:
Invalid @id value
Verifies that an exception is raised in Expansion when an invalid @id value is found
Example 197
: Invalid @id value Input
"@id": true
Example 198
: Invalid @id value Result
Test 0028:
Invalid type value
Verifies that an exception is raised in Expansion when an invalid type value is found
Example 199
: Invalid type value Input
"@type": true
Example 200
: Invalid type value Result
Test 0029:
Invalid value object value
Verifies that an exception is raised in Expansion when an invalid value object value is found
Example 201
: Invalid value object value Input
"http://example/prop": {"@value": ["foo"]}
Example 202
: Invalid value object value Result
Test 0030:
Invalid language-tagged string
Verifies that an exception is raised in Expansion when an invalid language-tagged string value is found
Example 203
: Invalid language-tagged string Input
"http://example/prop": {"@value": "foo", "@language": true}
Example 204
: Invalid language-tagged string Result
Test 0031:
Invalid @index value
Verifies that an exception is raised in Expansion when an invalid @index value value is found
Example 205
: Invalid @index value Input
"http://example.com/vocab/indexMap": {
"@value": "simple string",
"@language": "en",
"@index": true
Example 206
: Invalid @index value Result
Test 0032:
List of lists (from array)
Verifies that an exception is raised in Expansion when a list of lists is found
Example 207
: List of lists (from array) Input
"http://example.com/foo": {"@list": [{"@list": ["baz"]}]}
Example 208
: List of lists (from array) Result
Test 0033:
Invalid @reverse value
Verifies that an exception is raised in Expansion when an invalid @reverse value is found
Example 209
: Invalid @reverse value Input
"http://example/prop": {
"@reverse": true
Example 210
: Invalid @reverse value Result
Test 0034:
Invalid reverse property value (in @reverse)
Verifies that an exception is raised in Expansion when an invalid reverse property value is found
Example 211
: Invalid reverse property value (in @reverse) Input
"@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"
Example 212
: Invalid reverse property value (in @reverse) Result
Test 0035:
Invalid language map value
Verifies that an exception is raised in Expansion when an invalid language map value is found
Example 213
: Invalid language map value Input
"@context": {
"vocab": "http://example.com/vocab/",
"label": {
"@id": "vocab:label",
"@container": "@language"
},
"@id": "http://example.com/queen",
"label": {
"en": true
Example 214
: Invalid language map value Result
Test 0036:
Invalid reverse property value (through coercion)
Verifies that an exception is raised in Expansion when an invalid reverse property value is found
Example 215
: Invalid reverse property value (through coercion) Input
"@context": {
"term": {"@reverse": "http://example/reverse"}
},
"@id": "http://example/foo",
"term": {"@list": ["http://example/bar"]}
Example 216
: Invalid reverse property value (through coercion) Result
Test 0037:
Invalid value object (unexpected keyword)
Verifies that an exception is raised in Expansion when an invalid value object is found
Example 217
: Invalid value object (unexpected keyword) Input
"http://example/foo": {"@value": "bar", "@id": "http://example/baz"}
Example 218
: Invalid value object (unexpected keyword) Result
Test 0038:
Invalid value object (@type and @language)
Verifies that an exception is raised in Expansion when an invalid value object is found
Example 219
: Invalid value object (@type and @language) Input
"http://example/foo": {"@value": "bar", "@language": "en", "@type": "http://example/type"}
Example 220
: Invalid value object (@type and @language) Result
Test 0039:
Invalid language-tagged value
Verifies that an exception is raised in Expansion when an invalid language-tagged value is found
Example 221
: Invalid language-tagged value Input
"http://example/foo": {"@value": true, "@language": "en"}
Example 222
: Invalid language-tagged value Result
Test 0040:
Invalid typed value
Verifies that an exception is raised in Expansion when an invalid typed value is found
Example 223
: Invalid typed value Input
"http://example/foo": {"@value": "bar", "@type": "_:dt"}
Example 224
: Invalid typed value Result
Test 0041:
Invalid set or list object
Verifies that an exception is raised in Expansion when an invalid set or list object is found
Example 225
: Invalid set or list object Input
"http://example/prop": {"@list": ["foo"], "@id": "http://example/bar"}
Example 226
: Invalid set or list object Result
Test 0042:
Compaction to list of lists
Verifies that an exception is raised in Compaction when attempting to compact a list of lists
Example 227
: Compaction to list of lists Input
"http://example/list": [{"@list": ["foo"]}, {"@list": ["bar"]}]
Example 228
: Compaction to list of lists Result
Test 0043:
Conflicting indexes
Verifies that an exception is raised in Flattening when conflicting indexes are found
Example 229
: Conflicting indexes Input
"@id": "http://example/foo",
"@index": "bar"
},
"@id": "http://example/foo",
"@index": "baz"
Example 230
: Conflicting indexes Result
Test 0001:
drop free-floating nodes
Expand drops unreferenced nodes having only @id
Example 231
: drop free-floating nodes Input
{"@id": "http://example.org/test#example"}
Example 232
: drop free-floating nodes Result
[ ]
Test 0002:
basic
Expanding terms with different types of values
Example 233
: basic Input
"@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]
Example 234
: basic Result
[{
"@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}]
}]
Test 0003:
drop null and unmapped properties
Verifies that null values and unmapped properties are removed from expanded output
Example 235
: drop null and unmapped properties Input
"@id": "http://example.org/id",
"http://example.org/property": null,
"regularJson": {
"nonJsonLd": "property",
"deep": [{
"foo": "bar"
}, {
"bar": "foo"
}]
Example 236
: drop null and unmapped properties Result
[ ]
Test 0004:
optimize @set, keep empty arrays
Uses of @set are removed in expansion; values of @set, or just plain values which are empty arrays are retained
Example 237
: optimize @set, keep empty arrays Input
"@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/set2": { "@set": [ null ] },
"http://example.org/set3": [ ],
"http://example.org/set4": [ null ],
"http://example.org/set5": "one item",
"http://example.org/property": { "@list": "one item" }
Example 238
: optimize @set, keep empty arrays Result
[{
"@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/set2": [ ],
"http://example.org/set3": [ ],
"http://example.org/set4": [ ],
"http://example.org/set5": [ {"@value": "one item"} ],
"http://example.org/property": [ { "@list": [ {"@value": "one item"} ] } ]
}]
Test 0005:
do not expand aliased @id/@type
If a keyword is aliased, it is not used when expanding
Example 239
: do not expand aliased @id/@type Input
"@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"
Example 240
: do not expand aliased @id/@type Result
[{
"@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"
}]
}]
Test 0006:
alias keywords
Aliased keywords expand in resulting document
Example 241
: alias keywords Input
"@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"
Example 242
: alias keywords Result
[{
"@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"
}]
}]
Test 0007:
date type-coercion
Expand strings to expanded value with @type: xsd:dateTime
Example 243
: date type-coercion Input
"@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"
Example 244
: date type-coercion Result
[{
"@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"
}]
}]
}]
Test 0008:
@value with @language
Keep expanded values with @language, drop non-conforming value objects containing just @language
Example 245
: @value with @language Input
"@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" }
Example 246
: @value with @language Result
"@id": "http://example.org/test",
"http://example.org/vocab#test": [ { "@value": "test", "@language": "en" } ],
"http://example.org/vocab#keep-full-value": [ {"@value": "only value"} ]
Test 0009:
@graph with terms
Use of @graph to contain multiple nodes within array
Example 247
: @graph with terms Input
"@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"
Example 248
: @graph with terms Result
"@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"}]
}]
Test 0010:
native types
Expanding native scalar retains native scalar within expanded value
Example 249
: native types Input
"@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
Example 250
: native types Result
[{
"@id": "http://example.org/test",
"http://example.org/vocab#bool": [{"@value": true}],
"http://example.org/vocab#int": [{"@value": 123}]
}]
Test 0011:
coerced @id
A value of a property with @type: @id coercion expands to a node reference
Example 251
: coerced @id Input
"@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"
Example 252
: coerced @id Result
[{
"@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"}]
}]
Test 0012:
@graph with embed
Use of @graph to contain multiple nodes within array
Example 253
: @graph with embed Input
"@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"
Example 254
: @graph with embed Result
"@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"}]
}]
Test 0013:
expand already expanded
Expand does not mess up already expanded document
Example 255
: expand already expanded Input
[{
"@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]
}]
Example 256
: expand already expanded Result
[{
"@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}]
}]
Test 0014:
@set of @value objects with keyword aliases
Expanding aliased @set and @value
Example 257
: @set of @value objects with keyword aliases Input
"@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"
Example 258
: @set of @value objects with keyword aliases Result
"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"
Test 0015:
collapse set of sets, keep empty lists
An array of multiple @set nodes are collapsed into a single array
Example 259
: collapse set of sets, keep empty lists Input
"@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" ] } ]
Example 260
: collapse set of sets, keep empty lists Result
"@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"} ]
Test 0016:
context reset
Setting @context to null within an embedded object resets back to initial context state
Example 261
: context reset Input
"@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 ] ]
Example 262
: context reset Result
"@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": [ { } ]
Test 0017:
@graph and @id aliased
Expanding with @graph and @id aliases
Example 263
: @graph and @id aliased Input
"@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"
Example 264
: @graph and @id aliased Result
"@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"}]
}]
Test 0018:
override default @language
override default @language in terms; only language-tag strings
Example 265
: override default @language Input
"@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
Example 266
: override default @language Result
"@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 } ]
Test 0019:
remove @value = null
Expanding a value of null removes the value
Example 267
: remove @value = null Input
"@context": {
"myproperty": "http://example.com/myproperty"
},
"myproperty": { "@value" : null }
Example 268
: remove @value = null Result
[ ]
Test 0020:
do not remove @graph if not at top-level
@graph used under a node is retained
Example 269
: do not remove @graph if not at top-level Input
"@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"
Example 270
: do not remove @graph if not at top-level Result
"@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"} ]
Test 0021:
do not remove @graph at top-level if not only property
@graph used at the top level is retained if there are other properties
Example 271
: do not remove @graph at top-level if not only property Input
"@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"
Example 272
: do not remove @graph at top-level if not only property Result
"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"} ]
Test 0022:
expand value with default language
Expanding with a default language applies that language to string values
Example 273
: expand value with default language Input
"@context": {
"term": "http://example.com/term",
"@language": "en"
},
"term": "v"
Example 274
: expand value with default language Result
[{
"http://example.com/term": [{"@value": "v", "@language": "en"}]
}]
Test 0023:
Expanding list/set with coercion
Expanding lists and sets with properties having coercion coerces list/set values
Example 275
: Expanding list/set with coercion Input
"@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"]}
Example 276
: Expanding list/set with coercion Result
"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"}]
Test 0024:
Multiple contexts
Tests that contexts in an array are merged
Example 277
: Multiple contexts Input
"@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"
Example 278
: Multiple contexts Result
[{
"@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"}]
}]
Test 0025:
Problematic IRI expansion tests
Expanding different kinds of terms and Compact IRIs
Example 279
: Problematic IRI expansion tests Input
"@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", "_" ]
Example 280
: Problematic IRI expansion tests Result
[{
"@type": [
"http://example.com/foo/",
"http://example.com/bar",
"http://example.com/underscore/"
}]
Test 0026:
Term definition with @id: @type
Expanding term mapping to @type uses @type syntax
Example 281
: Term definition with @id: @type Input
"@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"
Example 282
: Term definition with @id: @type Result
"@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"
Test 0027:
Duplicate values in @list and @set
Duplicate values in @list and @set are not merged
Example 283
: Duplicate values in @list and @set Input
"@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]
Example 284
: Duplicate values in @list and @set Result
[{
"@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}
}]
Test 0028:
Use @vocab in properties and @type but not in @id
@vocab is used to compact properties and @type, but is not used for @id
Example 285
: Use @vocab in properties and @type but not in @id Input
"@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" }
Example 286
: Use @vocab in properties and @type but not in @id Result
"@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"
Test 0029:
Relative IRIs
@base is used to compact @id; test with different relative IRIs
Example 287
: Relative IRIs Input
"@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"
Example 288
: Relative IRIs Result
"@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" }
} ]
Test 0030:
Language maps
Language Maps expand values to include @language
Example 289
: Language maps Input
"@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" ]
Example 290
: Language maps Result
"@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"
Test 0031:
type-coercion of native types
Expanding native types with type coercion adds the coerced type to an expanded value representation and retains the native value representation
Example 291
: type-coercion of native types Input
"@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
Example 292
: type-coercion of native types Result
"@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"
} ]
Test 0032:
Null term and @vocab
Mapping a term to null decouples it from @vocab
Example 293
: Null term and @vocab Input
"@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"
Example 294
: Null term and @vocab Result
"@id": "http://me.markus-lanthaler.com/",
"http://xmlns.com/foaf/0.1/name": [
"@value": "Markus Lanthaler"
Test 0033:
Using @vocab with with type-coercion
Verifies that terms can be defined using @vocab
Example 295
: Using @vocab with with type-coercion Input
"@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"
Example 296
: Using @vocab with with type-coercion Result
[{
"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"
}]
}]
Test 0034:
Multiple properties expanding to the same IRI
Verifies multiple values from separate terms are deterministically made multiple values of the IRI associated with the terms
Example 297
: Multiple properties expanding to the same IRI Input
"@context": {
"@vocab": "http://example.com/vocab/",
"colliding": "http://example.com/vocab/collidingTerm"
},
"@id": "http://example.com/IriCollissions",
"colliding": [
"value 1",
],
"collidingTerm": [
3,
"four"
],
"http://example.com/vocab/collidingTerm": 5
Example 298
: Multiple properties expanding to the same IRI Result
[{
"@id": "http://example.com/IriCollissions",
"http://example.com/vocab/collidingTerm": [
"@value": "value 1"
}, {
"@value": 2
}, {
"@value": 3
}, {
"@value": "four"
},
"@value": 5
}]
Test 0035:
Language maps with @vocab, default language, and colliding property
Pathological tests of language maps
Example 299
: Language maps with @vocab, default language, and colliding property Input
"@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" }
Example 300
: Language maps with @vocab, default language, and colliding property Result
[{
"@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"
}]
Test 0036:
Expanding @index
Expanding index maps for terms defined with @container: @index
Example 301
: Expanding @index Input
"@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"
Example 302
: Expanding @index Result
"@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"
Test 0037:
Expanding @reverse
Expanding @reverse keeps @reverse
Example 303
: Expanding @reverse Input
"@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"
Example 304
: Expanding @reverse Result
"@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" } ]
Test 0038:
Expanding blank node labels
Blank nodes are not relabeled during expansion
Example 305
: Expanding blank node labels Input
"@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"
Example 306
: Expanding blank node labels Result
"@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"
Test 0039:
Using terms in a reverse-maps
Terms within @reverse are expanded
Example 307
: Using terms in a reverse-maps Input
"@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"
Example 308
: Using terms in a reverse-maps Result
"@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" } ]
Test 0040:
language and index expansion on non-objects
Only invoke language and index map expansion if the value is a JSON object
Example 309
: language and index expansion on non-objects Input
"@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" }
Example 310
: language and index expansion on non-objects Result
"@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"
Test 0041:
@language: null resets the default language
Example 311
: @language: null resets the default language Input
"@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"
Example 312
: @language: null resets the default language Result
"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" } ]
Test 0042:
Reverse properties
Expanding terms defined as reverse properties uses @reverse in expanded document
Example 313
: Reverse properties Input
"@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"
Example 314
: Reverse properties Result
"@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" } ]
Test 0043:
Using reverse properties inside a @reverse-container
Expanding a reverse property within a @reverse undoes both reversals
Example 315
: Using reverse properties inside a @reverse-container Input
"@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"
Example 316
: Using reverse properties inside a @reverse-container Result
"@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" } ]
Test 0044:
Index maps with language mappings
Ensure index maps use language mapping
Example 317
: Index maps with language mappings Input
"@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"
Example 318
: Index maps with language mappings Result
"@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"
Test 0045:
Top-level value objects
Expanding top-level value objects causes them to be removed
Example 319
: Top-level value objects Input
"@value": "free-floating value"
Example 320
: Top-level value objects Result
[ ]
Test 0046:
Free-floating nodes
Expanding free-floating nodes causes them to be removed
Example 321
: Free-floating nodes Input
"@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
Example 322
: Free-floating nodes Result
[ ]
Test 0047:
Free-floating values in sets and free-floating lists
Free-floating values in sets are removed, free-floating lists are removed completely
Example 323
: Free-floating values in sets and free-floating lists Input
"@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"
Example 324
: Free-floating values in sets and free-floating lists Result
"@id": "http://example.com/node",
"http://example.com/property": [
"@value": "nodes with properties are not removed"
Test 0048:
Terms are ignored in @id
Values of @id are not expanded as terms
Example 325
: Terms are ignored in @id Input
"@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"
Example 326
: Terms are ignored in @id Result
"@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" }
Test 0049:
String values of reverse properties
String values of a reverse property with @type: @id are treated as IRIs
Example 327
: String values of reverse properties Input
"@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"
Example 328
: String values of reverse properties Result
"@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" } ]
Test 0050:
Term definitions with prefix separate from prefix definitions
Term definitions using compact IRIs don't inherit the definitions of the prefix
Example 329
: Term definitions with prefix separate from prefix definitions Input
"@context": {
"issue": { "@id": "http://example.com/issue/", "@type": "@id" },
"issue:raisedBy": { "@container": "@set" }
},
"issue": "/issue/1",
"issue:raisedBy": "Markus"
Example 330
: Term definitions with prefix separate from prefix definitions Result
"http://example.com/issue/": [ { "@id": "http://json-ld.org/issue/1" } ],
"http://example.com/issue/raisedBy": [ { "@value": "Markus" } ]
Test 0051:
Expansion of keyword aliases in term definitions
Expanding terms which are keyword aliases
Example 331
: Expansion of keyword aliases in term definitions Input
"@context": [
{ "id": "@id" },
{ "url": "id" }
],
"url": "/issue/1",
"http://example.com/property": "ok"
Example 332
: Expansion of keyword aliases in term definitions Result
[{
"http://example.com/property": [{
"@value": "ok"
}],
"@id": "http://json-ld.org/issue/1"
}]
Test 0052:
@vocab-relative IRIs in term definitions
If @vocab is defined, term definitions are expanded relative to @vocab
Example 333
: @vocab-relative IRIs in term definitions Input
"@context": {
"@vocab": "http://example.org/",
"property": "vocabRelativeProperty"
},
"property": "must expand to http://example.org/vocabRelativeProperty",
"http://example.org/property": "ok"
Example 334
: @vocab-relative IRIs in term definitions Result
"http://example.org/property": [ { "@value": "ok" } ],
"http://example.org/vocabRelativeProperty": [ { "@value": "must expand to http://example.org/vocabRelativeProperty" } ]
Test 0053:
Expand absolute IRI with @type: @vocab
Expanding values of properties of @type: @vocab does not further expand absolute IRIs
Example 335
: Expand absolute IRI with @type: @vocab Input
"@context": {
"term": {"@id": "http://example.org/term", "@type": "@vocab"}
},
"term": "http://example.org/enum"
Example 336
: Expand absolute IRI with @type: @vocab Result
[{
"http://example.org/term": [{"@id": "http://example.org/enum"}]
}]
Test 0054:
Expand term with @type: @vocab
Expanding values of properties of @type: @vocab does not expand term values
Example 337
: Expand term with @type: @vocab Input
"@context": {
"term": {"@id": "http://example.org/term", "@type": "@vocab"},
"enum": {"@id": "http://example.org/enum"}
},
"term": "enum"
Example 338
: Expand term with @type: @vocab Result
[{
"http://example.org/term": [{"@id": "http://example.org/enum"}]
}]
Test 0055:
Expand @vocab-relative term with @type: @vocab
Expanding values of properties of @type: @vocab expands relative IRIs using @vocab
Example 339
: Expand @vocab-relative term with @type: @vocab Input
"@context": {
"@vocab": "http://example.org/",
"term": {"@id": "http://example.org/term", "@type": "@vocab"}
},
"term": "enum"
Example 340
: Expand @vocab-relative term with @type: @vocab Result
[{
"http://example.org/term": [{"@id": "http://example.org/enum"}]
}]
Test 0056:
Use terms with @type: @vocab but not with @type: @id
Checks that expansion uses appropriate base depending on term definition having @type @id or @vocab
Example 341
: Use terms with @type: @vocab but not with @type: @id Input
"@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"
Example 342
: Use terms with @type: @vocab but not with @type: @id Result
"@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" } ]
Test 0057:
Expand relative IRI with @type: @vocab
Relative values of terms with @type: @vocab expand relative to @vocab
Example 343
: Expand relative IRI with @type: @vocab Input
"@context": {
"term": { "@id": "http://example.org/term", "@type": "@vocab" }
},
"term": "not-a-term-thus-a-relative-IRI"
Example 344
: Expand relative IRI with @type: @vocab Result
"http://example.org/term": [ { "@id": "http://json-ld.org/test-suite/tests/not-a-term-thus-a-relative-IRI" } ]
Test 0058:
Expand compact IRI with @type: @vocab
Compact IRIs are expanded normally even if term has @type: @vocab
Example 345
: Expand compact IRI with @type: @vocab Input
"@context": {
"term": { "@id": "http://example.org/term", "@type": "@vocab" },
"prefix": "http://example.com/vocab#"
},
"term": "prefix:suffix"
Example 346
: Expand compact IRI with @type: @vocab Result
"http://example.org/term": [ { "@id": "http://example.com/vocab#suffix" } ]
Test 0059:
Reset @vocab by setting it to null
Setting @vocab to null removes a previous definition
Example 347
: Reset @vocab by setting it to null Input
"@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"
Example 348
: Reset @vocab by setting it to null Result
"@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" } ]
Test 0060:
Overwrite document base with @base and reset it again
Setting @base to an IRI and then resetting it to nil
Example 349
: Overwrite document base with @base and reset it again Input
"@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"
Example 350
: Overwrite document base with @base and reset it again Result
"@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" } ]
Test 0061:
Coercing native types to arbitrary datatypes
Expanding native types when coercing to arbitrary datatypes
Example 351
: Coercing native types to arbitrary datatypes Input
"@context": {
"property": {
"@id": "http://example.com/property",
"@type": "http://example.com/datatype"
},
"property": [ 1, true, false, 5.1 ]
Example 352
: Coercing native types to arbitrary datatypes Result
"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" }
Test 0062:
Various relative IRIs with with @base
Pathological relative IRIs
Example 353
: Various relative IRIs with with @base Input
"@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"
Example 354
: Various relative IRIs with with @base Result
"@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" }
} ]
Test 0063:
Reverse property and index container
Expaning reverse properties with an index-container
Example 355
: Reverse property and index container Input
"@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"
Example 356
: Reverse property and index container Result
"@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" } ]
Test 0064:
bnode values of reverse properties
Expand reverse property whose values are unlabeled blank nodes
Example 357
: bnode values of reverse properties Input
"@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"
Example 358
: bnode values of reverse properties Result
"@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" } ]
Test 0065:
Drop unmapped keys in reverse map
Keys that are not mapped to an IRI in a reverse-map are dropped
Example 359
: Drop unmapped keys in reverse map Input
"@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"
Example 360
: Drop unmapped keys in reverse map Result
"@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" } ]
Test 0066:
Reverse-map keys with @vocab
Expand uses @vocab to expand keys in reverse-maps
Example 361
: Reverse-map keys with @vocab Input
"@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"
Example 362
: Reverse-map keys with @vocab Result
"@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" } ]
Test 0067:
prefix://suffix not a compact IRI
prefix:suffix values are not interpreted as compact IRIs if suffix begins with two slashes
Example 363
: prefix://suffix not a compact IRI Input
"@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"
Example 364
: prefix://suffix not a compact IRI Result
"@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" }
Test 0068:
_:suffix values are not a compact IRI
prefix:suffix values are not interpreted as compact IRIs if prefix is an underscore
Example 365
: _:suffix values are not a compact IRI Input
"@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"
Example 366
: _:suffix values are not a compact IRI Result
"@id": "_:node1",
"@type": [ "_:type" ],
"_:property": [
{ "@value": "all these IRIs remain unchanged because they are interpreted as blank node identifiers" }
Test 0069:
Compact IRI as term with type mapping
Redefine compact IRI to define type mapping using the compact IRI itself as value of @id
Example 367
: Compact IRI as term with type mapping Input
"@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"
Example 368
: Compact IRI as term with type mapping Result
"@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"}
Test 0070:
Compact IRI as term defined using equivalent compact IRI
Redefine compact IRI to define type mapping using the compact IRI itself as string value
Example 369
: Compact IRI as term defined using equivalent compact IRI Input
"@context": {
"prefix": "http://www.example.org/vocab#",
"prefix:foo": "prefix:foo"
},
"@id": "http://example.com/vocab#id",
"@type": "prefix:Class",
"prefix:foo": "bar"
Example 370
: Compact IRI as term defined using equivalent compact IRI Result
"@id": "http://example.com/vocab#id",
"@type": [ "http://www.example.org/vocab#Class" ],
"http://www.example.org/vocab#foo": [
{ "@value": "bar"}
Test 0071:
Redefine terms looking like compact IRIs
Term definitions may look like compact IRIs
Example 371
: Redefine terms looking like compact IRIs Input
"@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"
Example 372
: Redefine terms looking like compact IRIs Result
"http://example.com/vocab#term": [
{ "@value": "value of v:term" }
],
"http://example.com/vocab#termId": [
{ "@value": "value of v:termId" }
Test 0072:
Redefine term using @vocab, not itself
Redefining a term as itself when @vocab is defined uses @vocab, not previous term definition
Example 373
: Redefine term using @vocab, not itself Input
"@context": [
"v": "http://example.com/vocab#",
"term": "v:somethingElse"
},
"@vocab": "http://example.com/anotherVocab#",
"term": "term"
],
"term": "value of term"
Example 374
: Redefine term using @vocab, not itself Result
"http://example.com/anotherVocab#term": [
{ "@value": "value of term" }
Test 0073:
@context not first property
Objects are unordered, so serialized node definition containing @context may have @context at the end of the node definition
Example 375
: @context not first property Input
"@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" }
Example 376
: @context not first property Result
"@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" } ]
Test 0074:
@id not first property
Objects are unordered, so serialized node definition containing @id may have @id at the end of the node definition
Example 377
: @id not first property Input
"@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"
Example 378
: @id not first property Result
"@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" } ]
Test 0075:
@vocab as blank node identifier
Use @vocab to map all properties to blank node identifiers
Example 379
: @vocab as blank node identifier Input
"@context": {
"@vocab": "_:"
},
"@id": "ex:node1",
"b1": "blank node property 1",
"b2": "blank node property 1"
Example 380
: @vocab as blank node identifier Result
"@id": "ex:node1",
"_:b1": [ { "@value": "blank node property 1" } ],
"_:b2": [ { "@value": "blank node property 1" } ]
Test 0076:
base option overrides document location
Use of the base option overrides the document location
Example 381
: base option overrides document location Input
"@id": "relative-iri",
"http://prop": "value"
Example 382
: base option overrides document location Result
[{
"@id": "http://example/base/relative-iri",
"http://prop": [{"@value": "value"}]
}]
Test 0077:
expandContext option
Use of the expandContext option to expand the input document
Example 383
: expandContext option Input
"@id": "http://example.com/id1",
"@type": "t1",
"term1": "v1",
"term2": {"@value": "v2", "@type": "t2"},
"term3": {"@value": "v3", "@language": "en"},
"term4": 4,
"term5": [50, 51]
Example 384
: expandContext option Result
[{
"@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}]
}]
Test 0078:
multiple reverse properties
Use of multiple reverse properties
Example 385
: multiple reverse properties Input
"@context": {
"name": "http://example.com/vocab#name",
"children": { "@reverse": "http://example.com/vocab#parent" },
"pets": { "@reverse": "http://example.com/vocab#owner" }
},
"@id": "#homer",
"name": "Homer",
"children": [
"@id": "#bart",
"name": "Bart"
},
"@id": "#lisa",
"name": "Lisa"
],
"pets": [
"@id": "#snowball-ii",
"name": "Snowball II"
},
"@id": "#santas-little-helper",
"name": "Santa's Little Helper"
Example 386
: multiple reverse properties Result
[{
"@id": "http://json-ld.org/test-suite/tests/expand-0078-in.jsonld#homer",
"@reverse": {
"http://example.com/vocab#parent": [
"@id": "http://json-ld.org/test-suite/tests/expand-0078-in.jsonld#bart",
"http://example.com/vocab#name": [ { "@value": "Bart" } ]
},
"@id": "http://json-ld.org/test-suite/tests/expand-0078-in.jsonld#lisa",
"http://example.com/vocab#name": [ { "@value": "Lisa" } ]
],
"http://example.com/vocab#owner": [
"@id": "http://json-ld.org/test-suite/tests/expand-0078-in.jsonld#snowball-ii",
"http://example.com/vocab#name": [ { "@value": "Snowball II" } ]
},
"@id": "http://json-ld.org/test-suite/tests/expand-0078-in.jsonld#santas-little-helper",
"http://example.com/vocab#name": [ { "@value": "Santa's Little Helper" } ]
},
"http://example.com/vocab#name": [ { "@value": "Homer" } ]
}]
Test 0001:
drop free-floating nodes
Flattening drops unreferenced nodes having only @id
Example 387
: drop free-floating nodes Input
{"@id": "http://example.org/test#example"}
Example 388
: drop free-floating nodes Result
[ ]
Test 0002:
basic
Flattening terms with different types of values
Example 389
: basic Input
"@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]
Example 390
: basic Result
"@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
Test 0003:
drop null and unmapped properties
Verifies that null values and unmapped properties are removed from expanded output
Example 391
: drop null and unmapped properties Input
"@id": "http://example.org/id",
"http://example.org/property": null,
"regularJson": {
"nonJsonLd": "property",
"deep": [{
"foo": "bar"
}, {
"bar": "foo"
}]
Example 392
: drop null and unmapped properties Result
[ ]
Test 0004:
optimize @set, keep empty arrays
Uses of @set are removed in expansion; values of @set, or just plain values which are empty arrays are retained
Example 393
: optimize @set, keep empty arrays Input
"@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" }
Example 394
: optimize @set, keep empty arrays Result
"@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"
Test 0005:
do not expand aliased @id/@type
If a keyword is aliased, it is not used when flattening
Example 395
: do not expand aliased @id/@type Input
"@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"
Example 396
: do not expand aliased @id/@type Result
"@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"
Test 0006:
alias keywords
Aliased keywords expand in resulting document
Example 397
: alias keywords Input
"@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"
Example 398
: alias keywords Result
"@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"
Test 0007:
date type-coercion
Expand strings to expanded value with @type: xsd:dateTime
Example 399
: date type-coercion Input
"@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"
Example 400
: date type-coercion Result
"@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"
Test 0008:
@value with @language
Keep expanded values with @language, drop non-conforming value objects containing just @language
Example 401
: @value with @language Input
"@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" }
Example 402
: @value with @language Result
"@id": "http://example.org/test",
"http://example.org/vocab#keep-full-value": [
"@value": "only value"
],
"http://example.org/vocab#test": [
"@language": "en",
"@value": "test"
Test 0009:
@graph with terms
Use of @graph to contain multiple nodes within array
Example 403
: @graph with terms Input
"@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"
Example 404
: @graph with terms Result
"@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"
Test 0010:
native types
Flattening native scalar retains native scalar within expanded value
Example 405
: native types Input
"@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
Example 406
: native types Result
"@id": "http://example.org/test",
"http://example.org/vocab#bool": [
"@value": true
],
"http://example.org/vocab#int": [
"@value": 123
Test 0011:
coerced @id
A value of a property with @type: @id coercion expands to a node reference
Example 407
: coerced @id Input
"@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"
Example 408
: coerced @id Result
"@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"
Test 0012:
@graph with embed
Flattening objects containing chained objects flattens all objects
Example 409
: @graph with embed Input
"@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"
Example 410
: @graph with embed Result
"@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"
Test 0013:
flatten already expanded
Flattening an expanded/flattened document maintains input document
Example 411
: flatten already expanded Input
[{
"@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]
}]
Example 412
: flatten already expanded Result
"@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
Test 0014:
@set of @value objects with keyword aliases
Flattening aliased @set and @value
Example 413
: @set of @value objects with keyword aliases Input
"@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"
Example 414
: @set of @value objects with keyword aliases Result
"@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"
Test 0015:
collapse set of sets, keep empty lists
An array of multiple @set nodes are collapsed into a single array
Example 415
: collapse set of sets, keep empty lists Input
"@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" ] } ]
Example 416
: collapse set of sets, keep empty lists Result
"@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"
Test 0016:
context reset
Setting @context to null within an embedded object resets back to initial context state
Example 417
: context reset Input
"@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 ] ]
Example 418
: context reset Result
"@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"
Test 0017:
@graph and @id aliased
Flattening with @graph and @id aliases
Example 419
: @graph and @id aliased Input
"@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"
Example 420
: @graph and @id aliased Result
"@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"
Test 0018:
override default @language
override default @language in terms; only language-tag strings
Example 421
: override default @language Input
"@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
Example 422
: override default @language Result
"@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
Test 0019:
remove @value = null
Flattening a value of null removes the value
Example 423
: remove @value = null Input
"@context": {
"myproperty": "http://example.com/myproperty"
},
"myproperty": { "@value" : null }
Example 424
: remove @value = null Result
[ ]
Test 0020:
do not remove @graph if not at top-level
@graph used under a node is retained
Example 425
: do not remove @graph if not at top-level Input
"@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"
Example 426
: do not remove @graph if not at top-level Result
"@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"
Test 0021:
do not remove @graph at top-level if not only property
@graph used at the top level is retained if there are other properties
Example 427
: do not remove @graph at top-level if not only property Input
"@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"
Example 428
: do not remove @graph at top-level if not only property Result
"@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"
Test 0022:
flatten value with default language
Flattening with a default language applies that language to string values
Example 429
: flatten value with default language Input
"@context": {
"term": "http://example.com/term",
"@language": "en"
},
"term": "v"
Example 430
: flatten value with default language Result
"@id": "_:b0",
"http://example.com/term": [
"@value": "v",
"@language": "en"
Test 0023:
Flattening list/set with coercion
Flattening lists and sets with properties having coercion coerces list/set values
Example 431
: Flattening list/set with coercion Input
"@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"]}
Example 432
: Flattening list/set with coercion Result
"@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"
Test 0024:
Multiple contexts
Tests that contexts in an array are merged
Example 433
: Multiple contexts Input
"@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"
Example 434
: Multiple contexts Result
"@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"
Test 0025:
Problematic IRI flattening tests
Flattening different kinds of terms and Compact IRIs
Example 435
: Problematic IRI flattening tests Input
"@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", "_"]
Example 436
: Problematic IRI flattening tests Result
"@id": "_:b0",
"@type": [
"http://example.com/foo/",
"http://example.com/bar",
"http://example.com/underscore/"
Test 0026:
Term definition with @id: @type
Flattening term mapping to @type uses @type syntax
Example 437
: Term definition with @id: @type Input
"@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"
Example 438
: Term definition with @id: @type Result
"@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"
Test 0027:
Duplicate values in @list and @set
Duplicate values in @list and @set are not merged
Example 439
: Duplicate values in @list and @set Input
"@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]
Example 440
: Duplicate values in @list and @set Result
"@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
Test 0028:
Use @vocab in properties and @type but not in @id
@vocab is used to compact properties and @type, but is not used for @id
Example 441
: Use @vocab in properties and @type but not in @id Input
"@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" }
Example 442
: Use @vocab in properties and @type but not in @id Result
"@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"
Test 0029:
Relative IRIs
@base is used to compact @id; test with different relative IRIs
Example 443
: Relative IRIs Input
"@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"
Example 444
: Relative IRIs Result
"@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"
Test 0030:
Language maps
Language Maps expand values to include @language
Example 445
: Language maps Input
"@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" ]
Example 446
: Language maps Result
"@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"
Test 0031:
type-coercion of native types
Flattening native types with type coercion adds the coerced type to an expanded value representation and retains the native value representation
Example 447
: type-coercion of native types Input
"@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
Example 448
: type-coercion of native types Result
"@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"
Test 0032:
Null term and @vocab
Mapping a term to null decouples it from @vocab
Example 449
: Null term and @vocab Input
"@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"
Example 450
: Null term and @vocab Result
"@id": "http://me.markus-lanthaler.com/",
"http://xmlns.com/foaf/0.1/name": [
"@value": "Markus Lanthaler"
Test 0033:
Using @vocab with with type-coercion
Verifies that terms can be defined using @vocab
Example 451
: Using @vocab with with type-coercion Input
"@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"
Example 452
: Using @vocab with with type-coercion Result
"@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"
Test 0034:
Multiple properties expanding to the same IRI
Verifies multiple values from separate terms are deterministically made multiple values of the IRI associated with the terms
Example 453
: Multiple properties expanding to the same IRI Input
"@context": {
"@vocab": "http://example.com/vocab/",
"colliding": "http://example.com/vocab/collidingTerm"
},
"@id": "http://example.com/IriCollissions",
"colliding": [
"value 1",
],
"collidingTerm": [
3,
"four"
],
"http://example.com/vocab/collidingTerm": 5
Example 454
: Multiple properties expanding to the same IRI Result
"@id": "http://example.com/IriCollissions",
"http://example.com/vocab/collidingTerm": [
"@value": "value 1"
},
"@value": 2
},
"@value": 3
},
"@value": "four"
},
"@value": 5
Test 0035:
Language maps with @vocab, default language, and colliding property
Pathological tests of language maps
Example 455
: Language maps with @vocab, default language, and colliding property Input
"@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" }
Example 456
: Language maps with @vocab, default language, and colliding property Result
"@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"
Test 0036:
Flattening @index
Flattening index maps for terms defined with @container: @index
Example 457
: Flattening @index Input
"@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"
Example 458
: Flattening @index Result
"@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"
Test 0037:
Flattening reverse properties
Flattening @reverse keeps @reverse
Example 459
: Flattening reverse properties Input
"@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" } ]
Example 460
: Flattening reverse properties Result
"@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" } ]
Test 0038:
Flattening blank node labels
Blank nodes are not relabeled during expansion
Example 461
: Flattening blank node labels Input
"@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"
Example 462
: Flattening blank node labels Result
"@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"
Test 0039:
Using terms in a reverse-maps
Terms within @reverse are expanded
Example 463
: Using terms in a reverse-maps Input
"@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" } ]
Example 464
: Using terms in a reverse-maps Result
"@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" } ]
Test 0040:
language and index expansion on non-objects
Only invoke language and index map expansion if the value is a JSON object
Example 465
: language and index expansion on non-objects Input
"@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" }
Example 466
: language and index expansion on non-objects Result
"@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"
Test 0041:
Free-floating sets and lists
Free-floating values in sets are removed, free-floating lists are removed completely
Example 467
: Free-floating sets and lists Input
"@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"
Example 468
: Free-floating sets and lists Result
"@id": "http://example.com/node",
"http://example.com/property": [
"@value": "nodes with properties are not removed"
Test 0042:
List objects not equivalent
Lists objects are implicit unlabeled blank nodes and thus never equivalent
Example 469
: List objects not equivalent Input
"@context": {
"test": "http://example.com/list"
},
"@id": "list-equivalence-test",
"test": [
{ "@list": [ "1", "2" ] },
{ "@list": [ "1", "2" ] }
Example 470
: List objects not equivalent Result
"@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" } ]
Test 0043:
Sample test manifest extract
Flatten a test manifest
Example 471
: Sample test manifest extract Input
"@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"}
]}
Example 472
: Sample test manifest extract Result
"@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"}
Test 0044:
compactArrays option
Setting compactArrays to false causes single element arrays to be retained
Example 473
: compactArrays option Input
[{
"@id": "http://example/foo",
"http://example/term": [{"@value": "value"}]
}]
Example 474
: compactArrays option Result
"@context": {
"term": "http://example/term"
},
"@graph": [{
"@id": "http://example/foo",
"term": ["value"]
}]
Test 0045:
Blank nodes with reverse properties
Proper (re-)labeling of blank nodes if used with reverse properties.
Example 475
: Blank nodes with reverse properties Input
"@context": {
"foo": "http://example.org/foo",
"bar": { "@reverse": "http://example.org/bar", "@type": "@id" }
},
"foo": "Foo",
"bar": [ "http://example.org/origin", "_:b0" ]
Example 476
: Blank nodes with reverse properties Result
"@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" } ]
Test 0046:
Empty string as identifier
Usage of empty strings in identifiers needs special care when constructing the node map.
Example 477
: Empty string as identifier Input
"@context": {
"@base": null
},
"@id": "",
"http://example.com/foo": "bar",
"@graph": [
"@id": "",
"http://example.com/baz": "bam"
},
"@id": "0",
"http://example.com/baaaaaz": "baaaam"
Example 478
: Empty string as identifier Result
"@id": "",
"http://example.com/foo": [ { "@value": "bar" } ],
"@graph": [
"@id": "",
"http://example.com/baz": [ { "@value": "bam" } ]
},
"@id": "0",
"http://example.com/baaaaaz": [ { "@value": "baaaam" } ]
Test 0001:
load JSON-LD document
Document loader loads a JSON-LD document.
Example 479
: load JSON-LD document Input
"@context": {
"@vocab": "http://example/vocab#"
},
"@id": "",
"term": "object"
Example 480
: load JSON-LD document Result
[{
"@id": "http://json-ld.org/test-suite/tests/remote-doc-0001-in.jsonld",
"http://example/vocab#term": [{"@value": "object"}]
}]
Test 0002:
load JSON document
Document loader loads a JSON document.
Example 481
: load JSON document Input
"@context": {
"@vocab": "http://example/vocab#"
},
"@id": "",
"term": "object"
Example 482
: load JSON document Result
[{
"@id": "http://json-ld.org/test-suite/tests/remote-doc-0002-in.json",
"http://example/vocab#term": [{"@value": "object"}]
}]
Test 0003:
load JSON document with extension-type
Document loader loads a JSON document having an extension mime-subtype.
Example 483
: load JSON document with extension-type Input
"@context": {
"@vocab": "http://example/vocab#"
},
"@id": "",
"term": "object"
Example 484
: load JSON document with extension-type Result
[{
"@id": "http://json-ld.org/test-suite/tests/remote-doc-0003-in.jldt",
"http://example/vocab#term": [{"@value": "object"}]
}]
Test 0004:
loading an unknown type raises loading document failed
Loading a document with a non-JSON mime type raises loading document failed
Example 485
: loading an unknown type raises loading document failed Input
Example 486
: loading an unknown type raises loading document failed Result
Test 0005:
Load JSON-LD through 301 redirect
Loading a document with a redirect should use the redirected URL as document base
Example 487
: Load JSON-LD through 301 redirect Input
"@context": {
"@vocab": "http://example/vocab#"
},
"@id": "",
"term": "object"
Example 488
: Load JSON-LD through 301 redirect Result
[{
"@id": "http://json-ld.org/test-suite/tests/remote-doc-0001-in.jsonld",
"http://example/vocab#term": [{"@value": "object"}]
}]
Test 0006:
Load JSON-LD through 303 redirect
Loading a document with a redirect should use the redirected URL as document base
Example 489
: Load JSON-LD through 303 redirect Input
"@context": {
"@vocab": "http://example/vocab#"
},
"@id": "",
"term": "object"
Example 490
: Load JSON-LD through 303 redirect Result
[{
"@id": "http://json-ld.org/test-suite/tests/remote-doc-0001-in.jsonld",
"http://example/vocab#term": [{"@value": "object"}]
}]
Test 0007:
Load JSON-LD through 307 redirect
Loading a document with a redirect should use the redirected URL as document base
Example 491
: Load JSON-LD through 307 redirect Input
"@context": {
"@vocab": "http://example/vocab#"
},
"@id": "",
"term": "object"
Example 492
: Load JSON-LD through 307 redirect Result
[{
"@id": "http://json-ld.org/test-suite/tests/remote-doc-0001-in.jsonld",
"http://example/vocab#term": [{"@value": "object"}]
}]
Test 0008:
Non-existant file (404)
Loading a non-existant file raises loading document failed error
Example 493
: Non-existant file (404) Input
Example 494
: Non-existant file (404) Result
Test 0009:
load JSON-LD document with link
If a context is specified in a link header, it is not used for JSON-LD.
Example 495
: load JSON-LD document with link Input
[{
"@id": "",
"http://example/0009/term": "value1",
"term": "value2"
}]
Example 496
: load JSON-LD document with link Result
[{
"@id": "http://json-ld.org/test-suite/tests/remote-doc-0009-in.jsonld",
"http://example/0009/term": [{"@value": "value1"}]
}]
Test 0010:
load JSON document with link
If a context is specified in a link header, it is used for JSON.
Example 497
: load JSON document with link Input
[{
"@id": "",
"term": "value"
}]
Example 498
: load JSON document with link Result
[{
"@id": "http://json-ld.org/test-suite/tests/remote-doc-0010-in.json",
"http://example/vocab#term": [{"@value": "value"}]
}]
Test 0011:
load JSON document with extension-type with link
If a context is specified in a link header, it is used for a JSON extension type.
Example 499
: load JSON document with extension-type with link Input
[{
"@id": "",
"term": "value"
}]
Example 500
: load JSON document with extension-type with link Result
[{
"@id": "http://json-ld.org/test-suite/tests/remote-doc-0011-in.jldt",
"http://example/vocab#term": [{"@value": "value"}]
}]
Test 0012:
Multiple context link headers
Loading a file when multiple link headers are returned is an error
Example 501
: Multiple context link headers Input
[{
"@id": "",
"term": "value"
}]
Example 502
: Multiple context link headers Result
Test 0001:
Plain literal with URIs
Tests generation of a triple using full URIs and a plain literal.
Example 503
: Plain literal with URIs Input
"@id": "http://greggkellogg.net/foaf#me",
"http://xmlns.com/foaf/0.1/name": "Gregg Kellogg"
Example 504
: Plain literal with URIs Result
"Gregg Kellogg" .
Test 0002:
Plain literal with CURIE from default context
Tests generation of a triple using a CURIE defined in the default context.
Example 505
: Plain literal with CURIE from default context Input
"@context": {"foaf": "http://xmlns.com/foaf/0.1/"},
"@id": "http://greggkellogg.net/foaf#me",
"foaf:name": "Gregg Kellogg"
Example 506
: Plain literal with CURIE from default context Result
"Gregg Kellogg" .
Test 0003:
Default subject is BNode
Tests that a BNode is created if no explicit subject is set.
Example 507
: Default subject is BNode Input
"@context": {"foaf": "http://xmlns.com/foaf/0.1/"},
"@type": "foaf:Person"
Example 508
: Default subject is BNode Result
_:b0 .
Test 0004:
Literal with language tag
Tests that a plain literal is created with a language tag.
Example 509
: Literal with language tag Input
"http://www.w3.org/2000/01/rdf-schema#label": {
"@value": "A plain literal with a lang tag.",
"@language": "en-us"
Example 510
: Literal with language tag Result
_:b0 "A plain literal with a lang tag."@en-us .
Test 0005:
Extended character set literal
Tests that a literal may be created using extended characters.
Example 511
: Extended character set literal Input
"@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"}
Example 512
: Extended character set literal Result
_:b0 .
_:b0 "Herman Iván"@hu .
Test 0006:
Typed literal
Tests creation of a literal with a datatype.
Example 513
: Typed literal Input
"@id": "http://greggkellogg.net/foaf#me",
"http://purl.org/dc/terms/created": {
"@value": "1957-02-27",
"@type": "http://www.w3.org/2001/XMLSchema#date"
Example 514
: Typed literal Result
"1957-02-27"^^ .
Test 0007:
Tests 'a' generates rdf:type and object is implicit IRI
Verify that 'a' is an alias for rdf:type, and the object is created as an IRI.
Example 515
: Tests 'a' generates rdf:type and object is implicit IRI Input
"@id": "http://greggkellogg.net/foaf#me",
"@type": "http://xmlns.com/foaf/0.1/Person"
Example 516
: Tests 'a' generates rdf:type and object is implicit IRI Result
.
Test 0008:
Test prefix defined in @context
Generate an IRI using a prefix defined within an @context.
Example 517
: Test prefix defined in @context Input
"@context": {"d": "http://example.com/default#"},
"d:foo": "bar"
Example 518
: Test prefix defined in @context Result
_:b0 "bar" .
Test 0009:
Test using an empty suffix
An empty suffix may be used.
Example 519
: Test using an empty suffix Input
"@context": {"foo": "http://example.com/default#"},
"foo:": "bar"
Example 520
: Test using an empty suffix Result
_:b0 "bar" .
Test 0010:
Test object processing defines object
A property referencing an associative array gets object from subject of array.
Example 521
: Test object processing defines object Input
"@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"
Example 522
: Test object processing defines object Result
.
"Manu Sporny" .
Test 0011:
Test object processing defines object with implicit BNode
If no @ is specified, a BNode is created, and will be used as the object of an enclosing property.
Example 523
: Test object processing defines object with implicit BNode Input
"@context": {
"foaf": "http://xmlns.com/foaf/0.1/"
},
"@id": "http://greggkellogg.net/foaf#me",
"foaf:knows": {
"foaf:name": "Dave Longley"
Example 524
: Test object processing defines object with implicit BNode Result
_:b0 .
_:b0 "Dave Longley" .
Test 0012:
Multiple Objects for a Single Property
Tests that Multiple Objects are for a Single Property using array syntax.
Example 525
: Multiple Objects for a Single Property Input
"@context": {
"foaf": "http://xmlns.com/foaf/0.1/"
},
"@id": "http://greggkellogg.net/foaf#me",
"foaf:knows": ["Manu Sporny", "Dave Longley"]
Example 526
: Multiple Objects for a Single Property Result
"Dave Longley" .
"Manu Sporny" .
Test 0013:
Creation of an empty list
Tests that @list: [] generates an empty list.
Example 527
: Creation of an empty list Input
"@context": {
"foaf": "http://xmlns.com/foaf/0.1/"
},
"@id": "http://greggkellogg.net/foaf#me",
"foaf:knows": {"@list": []}
Example 528
: Creation of an empty list Result
.
Test 0014:
Creation of a list with single element
Tests that @list generates a list.
Example 529
: Creation of a list with single element Input
"@context": {
"foaf": "http://xmlns.com/foaf/0.1/"
},
"@id": "http://greggkellogg.net/foaf#me",
"foaf:knows": {"@list": ["Manu Sporny"]}
Example 530
: Creation of a list with single element Result
_:b0 .
_:b0 "Manu Sporny" .
_:b0 .
Test 0015:
Creation of a list with multiple elements
Tests that list with multiple elements.
Example 531
: Creation of a list with multiple elements Input
"@context": {
"foaf": "http://xmlns.com/foaf/0.1/"
},
"@id": "http://greggkellogg.net/foaf#me",
"foaf:knows": {"@list": ["Manu Sporny", "Dave Longley"]}
Example 532
: Creation of a list with multiple elements Result
_:b0 .
_:b0 "Manu Sporny" .
_:b0 _:b1 .
_:b1 "Dave Longley" .
_:b1 .
Test 0016:
Empty IRI expands to resource location
Expanding an empty IRI uses the test file location.
Example 533
: Empty IRI expands to resource location Input
"@id": "",
"@type": "http://www.w3.org/2000/01/rdf-schema#Resource"
Example 534
: Empty IRI expands to resource location Result
.
Test 0017:
Relative IRI expands relative resource location
Expanding a relative IRI uses the test file location.
Example 535
: Relative IRI expands relative resource location Input
"@id": "a/b",
"@type": "http://www.w3.org/2000/01/rdf-schema#Resource"
Example 536
: Relative IRI expands relative resource location Result
.
Test 0018:
Frag ID expands relative resource location
Expanding a fragment uses the test file location.
Example 537
: Frag ID expands relative resource location Input
"@id": "#frag",
"@type": "http://www.w3.org/2000/01/rdf-schema#Resource"
Example 538
: Frag ID expands relative resource location Result
.
Test 0019:
Test type coercion to anyURI
Tests coercion of object to anyURI when specified.
Example 539
: Test type coercion to anyURI Input
"@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"
Example 540
: Test type coercion to anyURI Result
.
Test 0020:
Test type coercion to typed literal
Tests coercion of object to a typed literal when specified.
Example 541
: Test type coercion to typed literal Input
"@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"
Example 542
: Test type coercion to typed literal Result
"1957-02-27"^^ .
Test 0022:
Test coercion of double value
Tests that a decimal value generates a xsd:double typed literal;.
Example 543
: Test coercion of double value Input
"@context": { "measure": "http://example/measure#"},
"measure:cups": 5.3
Example 544
: Test coercion of double value Result
_:b0 "5.3E0"^^ .
Test 0023:
Test coercion of integer value
Tests that a decimal value generates a xsd:integer typed literal.
Example 545
: Test coercion of integer value Input
"@context": { "chem": "http://example/chem#"},
"chem:protons": 12
Example 546
: Test coercion of integer value Result
_:b0 "12"^^ .
Test 0024:
Test coercion of boolean value
Tests that a decimal value generates a xsd:boolean typed literal.
Example 547
: Test coercion of boolean value Input
"@context": { "sensor": "http://example/sensor#"},
"sensor:active": true
Example 548
: Test coercion of boolean value Result
_:b0 "true"^^ .
Test 0025:
Test list coercion with single element
Tests that an array with a single element on a property with @list coercion creates an RDF Collection.
Example 549
: Test list coercion with single element Input
"@context": {
"knows": {"@id": "http://xmlns.com/foaf/0.1/knows", "@container": "@list"}
},
"@id": "http://greggkellogg.net/foaf#me",
"knows": ["Manu Sporny"]
Example 550
: Test list coercion with single element Result
_:b0 .
_:b0 "Manu Sporny" .
_:b0 .
Test 0026:
Test creation of multiple types
Tests that @type with an array of types creates multiple types.
Example 551
: Test creation of multiple types Input
"@context": {"rdfs": "http://www.w3.org/2000/01/rdf-schema#"},
"@type": ["rdfs:Resource", "rdfs:Class"]
Example 552
: Test creation of multiple types Result
_:b0 .
_:b0 .
Test 0027:
Simple named graph (Wikidata)
Using @graph with other keys places triples in a named graph.
Example 553
: Simple named graph (Wikidata) Input
"@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/"
Example 554
: Simple named graph (Wikidata) Result
.
.
.
.
.
.
"7000000"^^ .
.
Test 0028:
Simple named graph
Signing a graph.
Example 555
: Simple named graph Input
"@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!"
Example 556
: Simple named graph Result
"Hello World!" .
"2011-09-23T20:21:34Z"^^ .
"OGQzNGVkMzVm4NTIyZTkZDYMmMzQzNmExMgoYzI43Q3ODIyOWM32NjI=" .
.
.
.
Test 0029:
named graph with embedded named graph
Tests that named graphs containing named graphs flatten to single level of graph naming.
Example 557
: named graph with embedded named graph Input
"@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/"
Example 558
: named graph with embedded named graph Result
.
"http://www.statistik-berlin-brandenburg.de/" .
.
"3499879"^^ .
Test 0030:
top-level graph with string subject reference
Tests graphs containing subject references as strings.
Example 559
: top-level graph with string subject reference Input
"@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/"
Example 560
: top-level graph with string subject reference Result
"2012-04-09"^^ .
.
"http://manu.sporny.org/i/public" .
"Gregg Kellogg" .
.
"http://greggkellogg.net/foaf#me" .
"Manu Sporny" .
Test 0031:
Reverse property
Tests conversion of reverse properties.
Example 561
: Reverse property Input
"@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"
Example 562
: Reverse property Result
.
"A property" .
"My vocabulary" .
Test 0032:
@context reordering
Tests that generated triples do not depend on order of @context.
Example 563
: @context reordering Input
"@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" }
Example 564
: @context reordering Result
.
.
"Node 2" .
Test 0033:
@id reordering
Tests that generated triples do not depend on order of @id.
Example 565
: @id reordering Input
"@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"
Example 566
: @id reordering Result
.
.
"Node 2" .
Test 0034:
context properties reordering
Tests that generated triples do not depend on order of properties inside @context.
Example 567
: context properties reordering Input
"@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"
Example 568
: context properties reordering Result
.
.
"Node 2" .
Test 0035:
non-fractional numbers converted to xsd:double
xsd:double's canonical lexical is used when converting numbers without fraction that are coerced to xsd:double
Example 569
: non-fractional numbers converted to xsd:double Input
"@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 ]
Example 570
: non-fractional numbers converted to xsd:double Result
_:b0 "1.0E0"^^ .
_:b0 "2.2E0"^^ .
_:b0 "8"^^ .
_:b0 "9.9E0"^^ .
Test 0036:
Use nodeMapGeneration bnode labels
The toRDF algorithm does not relabel blank nodes; it reuses the counter from the nodeMapGeneration to generate new ones
Example 571
: Use nodeMapGeneration bnode labels Input
"@id": "http://example.com/",
"ex:prop1": {
"@list": [ { "@id": "_:x1" }, { "@id": "_:x2" } ]
},
"ex:prop2": { "@id": "_:x3" }
Example 572
: Use nodeMapGeneration bnode labels Result
_:b3 .
_:b2 .
_:b3 _:b0 .
_:b3 _:b4 .
_:b4 _:b1 .
_:b4 .
Test 0041:
drop free-floating nodes
Free-floating nodes do not generate RDF triples
Example 573
: drop free-floating nodes Input
{"@id": "http://example.org/test#example"}
Example 574
: drop free-floating nodes Result
Test 0042:
basic
Basic RDF conversion
Example 575
: basic Input
"@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]
Example 576
: basic Result
"v1" .
"v2"^^ .
"v3"@en .
"4"^^ .
"50"^^ .
"51"^^ .
.
Test 0043:
drop null and unmapped properties
Properties mapped to null or which are never mapped are dropped
Example 577
: drop null and unmapped properties Input
"@id": "http://example.org/id",
"http://example.org/property": null,
"regularJson": {
"nonJsonLd": "property",
"deep": [{
"foo": "bar"
}, {
"bar": "foo"
}]
Example 578
: drop null and unmapped properties Result
Test 0044:
optimize @set, keep empty arrays
RDF version of expand-0004
Example 579
: optimize @set, keep empty arrays Input
"@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" }
Example 580
: optimize @set, keep empty arrays Result
.
_:b0 .
"v1" .
.
.
_:b1 .
"one item" .
_:b0 "one item" .
_:b0 .
_:b1 "one item" .
_:b1 .
Test 0045:
do not expand aliased @id/@type
RDF version of expand-0005
Example 581
: do not expand aliased @id/@type Input
"@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"
Example 582
: do not expand aliased @id/@type Result
.
"Alice" .
.
"Bob" .
.
.
Test 0046:
alias keywords
RDF version of expand-0006
Example 583
: alias keywords Input
"@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"
Example 584
: alias keywords Result
.
.
.
"foo" .
Test 0047:
date type-coercion
Type-coerced dates generate typed literals
Example 585
: date type-coercion Input
"@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"
Example 586
: date type-coercion Result
"2011-01-25T00:00:00Z"^^ .
.
.
Test 0048:
@value with @language
RDF version of expand-0008
Example 587
: @value with @language Input
"@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" }
Example 588
: @value with @language Result
"only value" .
"test"@en .
Test 0049:
@graph with terms
RDF version of expand-0009
Example 589
: @graph with terms Input
"@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"
Example 590
: @graph with terms Result
.
"Writer" .
"My Book" .
"Fun" .
"Chapter One" .
.
"Jane" .
"John" .
.
Test 0050:
native types
Native types generate typed literals
Example 591
: native types Input
"@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
Example 592
: native types Result
"true"^^ .
"123"^^ .
Test 0051:
coerced @id
RDF version of expand-0011
Example 593
: coerced @id Input
"@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"
Example 594
: coerced @id Result
.
"Title" .
Test 0052:
@graph with embed
RDF version of expand-0012
Example 595
: @graph with embed Input
"@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"
Example 596
: @graph with embed Result
.
"Writer" .
"My Book" .
"Fun" .
"Chapter One" .
.
"Jane" .
"John" .
.
Test 0053:
expand already expanded
RDF version of expand-0013
Example 597
: expand already expanded Input
[{
"@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]
}]
Example 598
: expand already expanded Result
"v1" .
"v2"^^ .
"v3"@en .
"4"^^ .
"50"^^ .
"51"^^ .
.
Test 0054:
@set of @value objects with keyword aliases
RDF version of expand-0014
Example 599
: @set of @value objects with keyword aliases Input
"@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"
Example 600
: @set of @value objects with keyword aliases Result
.
.
.
.
"foo" .
"2012-03-31"^^ .
Test 0055:
collapse set of sets, keep empty lists
RDF version of expand-0015
Example 601
: collapse set of sets, keep empty lists Input
"@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" ] } ]
Example 602
: collapse set of sets, keep empty lists Result
.
"be" .
"collapsed" .
"hello" .
"this" .
"will" .
Test 0056:
context reset
RDF version of expand-0016
Example 603
: context reset Input
"@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 ] ]
Example 604
: context reset Result
_:b0 .
.
_:b1 .
.
"ok" .
_:b1 "2"^^ .
_:b1 _:b2 .
_:b2 "hi" .
_:b2 .
Test 0057:
@graph and @id aliased
RDF version of expand-0017
Example 605
: @graph and @id aliased Input
"@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"
Example 606
: @graph and @id aliased Result
.
"Writer" .
"My Book" .
"Fun" .
"Chapter One" .
.
"Jane" .
"John" .
.
Test 0058:
override default @language
RDF version of expand-0018
Example 607
: override default @language Input
"@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
Example 608
: override default @language Result
"2"^^ .
"hallo"@de .
"true"^^ .
"3"^^ .
"false"^^ .
"no language" .
"1"^^ .
"hello"@en .
"true"^^ .
Test 0059:
remove @value = null
RDF version of expand-0019
Example 609
: remove @value = null Input
"@context": {
"myproperty": "http://example.com/myproperty"
},
"myproperty": { "@value" : null }
Example 610
: remove @value = null Result
Test 0060:
do not remove @graph if not at top-level
Embedded @graph without @id creates BNode-labeled named graph
Example 611
: do not remove @graph if not at top-level Input
"@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"
Example 612
: do not remove @graph if not at top-level Result
.
"Writer" .
"My Book" .
"Fun" _:b0 .
"Chapter One" _:b0 .
"More fun" _:b0 .
"Chapter Two" _:b0 .
_:b0 .
"Jane" .
"John" .
.
Test 0061:
do not remove @graph at top-level if not only property
RDF version of expand-0021
Example 613
: do not remove @graph at top-level if not only property Input
"@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"
Example 614
: do not remove @graph at top-level if not only property Result
_:b0 .
"Writer" _:b0 .
"My Book" _:b0 .
"Fun" _:b1 .
"Chapter One" _:b1 .
"More fun" _:b1 .
"Chapter Two" _:b1 .
"Chapter Three" _:b1 .
_:b1 _:b0 .
"Jane" _:b0 .
"John" _:b0 .
_:b0 .
_:b0 "My first graph" .
Test 0062:
expand value with default language
RDF version of expand-0022
Example 615
: expand value with default language Input
"@context": {
"term": "http://example.com/term",
"@language": "en"
},
"term": "v"
Example 616
: expand value with default language Result
_:b0 "v"@en .
Test 0063:
Lists and sets of properties with list/set coercion
RDF version of expand-0023
Example 617
: Lists and sets of properties with list/set coercion Input
"@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"]}
Example 618
: Lists and sets of properties with list/set coercion Result
_:b0 _:b1 .
_:b0 "2012-04-12"^^ .
_:b0 _:b2 .
_:b0 "2012-04-12"^^ .
_:b0 _:b3 .
_:b0 .
_:b0 _:b4 .
_:b0 .
_:b1 "2012-04-12"^^ .
_:b1 .
_:b2 "2012-04-12"^^ .
_:b2 .
_:b3 .
_:b3 .
_:b4 .
_:b4 .
Test 0064:
Multiple contexts
RDF version of expand-0024
Example 619
: Multiple contexts Input
"@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"
Example 620
: Multiple contexts Result
"Lyon Convention Centre, Lyon, France" .
"Alice Talk" .
.
"Alice" .
Test 0065:
Problematic IRI expansion tests
RDF version of expand-0025
Example 621
: Problematic IRI expansion tests Input
"@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", "_" ]
Example 622
: Problematic IRI expansion tests Result
_:b0 .
_:b0 .
_:b0 .
Test 0066:
Expanding term mapping to @type uses @type syntax
RDF version of expand-0026
Example 623
: Expanding term mapping to @type uses @type syntax Input
"@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"
Example 624
: Expanding term mapping to @type uses @type syntax Result
.
.
.
.
Test 0067:
Keep duplicate values in @list and @set
RDF version of expand-0027
Example 625
: Keep duplicate values in @list and @set Input
"@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]
Example 626
: Keep duplicate values in @list and @set Result
_:b0 .
"1"^^ .
"2"^^ .
"3"^^ .
_:b0 "1"^^ .
_:b0 _:b1 .
_:b1 "2"^^ .
_:b1 _:b2 .
_:b2 "2"^^ .
_:b2 _:b3 .
_:b3 "3"^^ .
_:b3 .
Test 0068:
Use @vocab in properties and @type but not in @id
RDF version of expand-0028
Example 627
: Use @vocab in properties and @type but not in @id Input
"@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" }
Example 628
: Use @vocab in properties and @type but not in @id Result
"2011-01-25T00:00:00Z"^^ .
.
.
"2012-08-01T00:00:00Z"^^ .
Test 0069:
Relative IRIs
RDF version of expand-0029
Example 629
: Relative IRIs Input
"@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"
Example 630
: Relative IRIs Result
_:b0 .
.
.
.
.
.
.
.
.
.
.
.
_:b0 .
_:b0 _:b1 .
_:b1 .
_:b1 _:b2 .
_:b10 .
_:b10 .
_:b2 .
_:b2 _:b3 .
_:b3 .
_:b3 _:b4 .
_:b4 .
_:b4 _:b5 .
_:b5 .
_:b5 _:b6 .
_:b6 .
_:b6 _:b7 .
_:b7 .
_:b7 _:b8 .
_:b8 .
_:b8 _:b9 .
_:b9 .
_:b9 _:b10 .
Test 0070:
Language maps
RDF version of expand-0030
Example 631
: Language maps Input
"@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" ]
Example 632
: Language maps Result
"Die Königin"@de .
"Ihre Majestät"@de .
"The Queen"@en .
Test 0071:
type-coercion of native types
RDF version of expand-0031
Example 633
: type-coercion of native types Input
"@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
Example 634
: type-coercion of native types Result
"true"^^ .
"1.2345E2"^^ .
"1"^^ .
Test 0072:
Mapping a term to null decouples it from @vocab
RDF version of expand-0032
Example 635
: Mapping a term to null decouples it from @vocab Input
"@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"
Example 636
: Mapping a term to null decouples it from @vocab Result
"Markus Lanthaler" .
Test 0073:
Using @vocab with with type-coercion
RDF version of expand-0033
Example 637
: Using @vocab with with type-coercion Input
"@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"
Example 638
: Using @vocab with with type-coercion Result
_:b0 "2012-10-28"^^ .
_:b0 .
_:b0 "Markus Lanthaler" .
Test 0074:
Multiple properties expanding to the same IRI
RDF version of expand-0034
Example 639
: Multiple properties expanding to the same IRI Input
"@context": {
"@vocab": "http://example.com/vocab/",
"colliding": "http://example.com/vocab/collidingTerm"
},
"@id": "http://example.com/IriCollissions",
"colliding": [
"value 1",
],
"collidingTerm": [
3,
"four"
],
"http://example.com/vocab/collidingTerm": 5
Example 640
: Multiple properties expanding to the same IRI Result
"2"^^ .
"3"^^ .
"5"^^ .
"four" .
"value 1" .
Test 0075:
Language maps with @vocab, default language, and colliding property
RDF version of expand-0035
Example 641
: Language maps with @vocab, default language, and colliding property Input
"@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" }
Example 642
: Language maps with @vocab, default language, and colliding property Result
"Die Königin"@de .
"Ihre Majestät"@de .
"Il re"@it .
"The Queen"@en .
"The king"@en .
Test 0076:
Expanding @index
RDF version of expand-0036
Example 643
: Expanding @index Input
"@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"
Example 644
: Expanding @index Result
"1"^^ .
"3"^^ .
"false"^^ .
"false"^^ .
"language-tagged string A"@en .
"language-tagged string C"@en .
"simple string A" .
"simple string B" .
"simple string C" .
"true"^^ .
"true"^^ .
"typed literal A"^^ .
"typed literal C"^^ .
.
.
.
.
"3"^^ .
"false"^^ .
"language-tagged string Prop"@en .
"simple string no index" .
"true"^^ .
"typed literal Prop"^^ .
.
.
Test 0077:
Expanding @reverse
RDF version of expand-0037
Example 645
: Expanding @reverse Input
"@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"
Example 646
: Expanding @reverse Result
.
"Dave Longley" .
"Markus Lanthaler" .
Test 0078:
Drop blank node predicates by default
Triples with blank node predicates are dropped by default.
Example 647
: Drop blank node predicates by default Input
"@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"
Example 648
: Drop blank node predicates by default Result
_:b0 _:b0 .
Test 0079:
Using terms in a reverse-maps
RDF version of expand-0039
Example 649
: Using terms in a reverse-maps Input
"@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"
Example 650
: Using terms in a reverse-maps Result
.
"Dave Longley" .
"Markus Lanthaler" .
Test 0080:
language and index expansion on non-objects
RDF version of expand-0040
Example 651
: language and index expansion on non-objects Input
"@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" }
Example 652
: language and index expansion on non-objects Result
"No" .
"indexes" .
.
"The Queen" .
Test 0081:
Reset the default language
RDF version of expand-0041
Example 653
: Reset the default language Input
"@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"
Example 654
: Reset the default language Result
_:b0 _:b1 .
_:b0 "this is English"@en .
_:b1 "and this is a plain string" .
Test 0082:
Expanding reverse properties
RDF version of expand-0042
Example 655
: Expanding reverse properties Input
"@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"
Example 656
: Expanding reverse properties Result
.
"Dave Longley" .
"Markus Lanthaler" .
Test 0083:
Using reverse properties inside a @reverse-container
RDF version of expand-0043
Example 657
: Using reverse properties inside a @reverse-container Input
"@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"
Example 658
: Using reverse properties inside a @reverse-container Result
"Dave Longley" .
"Gregg Kellogg" .
.
.
"Markus Lanthaler" .
Test 0084:
Ensure index maps use language mapping
RDF version of expand-0044
Example 659
: Ensure index maps use language mapping Input
"@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"
Example 660
: Ensure index maps use language mapping Result
"einfacher String"@de .
.
"simple string"@en .
Test 0085:
Top-level value objects are removed
RDF version of expand-0045
Example 661
: Top-level value objects are removed Input
"@value": "free-floating value"
Example 662
: Top-level value objects are removed Result
Test 0086:
Free-floating nodes are removed
RDF version of expand-0046
Example 663
: Free-floating nodes are removed Input
"@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
Example 664
: Free-floating nodes are removed Result
Test 0087:
Remove free-floating set values and lists
RDF version of expand-0047
Example 665
: Remove free-floating set values and lists Input
"@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"
Example 666
: Remove free-floating set values and lists Result
"nodes with properties are not removed" .
Test 0088:
Terms are ignored in @id
RDF version of expand-0048
Example 667
: Terms are ignored in @id Input
"@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"
Example 668
: Terms are ignored in @id Result
"@id supports the following values: relative, absolute, and compact IRIs" .
"relative IRIs get resolved against the document's base IRI" .
.
.
Test 0089:
Using strings as value of a reverse property
RDF version of expand-0049
Example 669
: Using strings as value of a reverse property Input
"@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"
Example 670
: Using strings as value of a reverse property Result
.
.
"Markus Lanthaler" .
Test 0090:
Term definitions with prefix separate from prefix definitions
RDF version of expand-0050
Example 671
: Term definitions with prefix separate from prefix definitions Input
"@context": {
"issue": { "@id": "http://example.com/issue/", "@type": "@id" },
"issue:raisedBy": { "@container": "@set" }
},
"issue": "/issue/1",
"issue:raisedBy": "Markus"
Example 672
: Term definitions with prefix separate from prefix definitions Result
_:b0 .
_:b0 "Markus" .
Test 0091:
Expansion of keyword aliases in term definitions
RDF version of expand-0051
Example 673
: Expansion of keyword aliases in term definitions Input
"@context": [
{ "id": "@id" },
{ "url": "id" }
],
"url": "/issue/1",
"http://example.com/property": "ok"
Example 674
: Expansion of keyword aliases in term definitions Result
"ok" .
Test 0092:
@vocab-relative IRIs in term definitions
RDF version of expand-0052
Example 675
: @vocab-relative IRIs in term definitions Input
"@context": {
"@vocab": "http://example.org/",
"property": "vocabRelativeProperty"
},
"property": "must expand to http://example.org/vocabRelativeProperty",
"http://example.org/property": "ok"
Example 676
: @vocab-relative IRIs in term definitions Result
_:b0 "ok" .
_:b0 "must expand to http://example.org/vocabRelativeProperty" .
Test 0093:
Expand absolute IRI with @type: @vocab
RDF version of expand-0053
Example 677
: Expand absolute IRI with @type: @vocab Input
"@context": {
"term": {"@id": "http://example.org/term", "@type": "@vocab"}
},
"term": "http://example.org/enum"
Example 678
: Expand absolute IRI with @type: @vocab Result
_:b0 .
Test 0094:
Expand term with @type: @vocab
RDF version of expand-0054
Example 679
: Expand term with @type: @vocab Input
"@context": {
"term": {"@id": "http://example.org/term", "@type": "@vocab"},
"enum": {"@id": "http://example.org/enum"}
},
"term": "enum"
Example 680
: Expand term with @type: @vocab Result
_:b0 .
Test 0095:
Expand @vocab-relative term with @type: @vocab
RDF version of expand-0055
Example 681
: Expand @vocab-relative term with @type: @vocab Input
"@context": {
"@vocab": "http://example.org/",
"term": {"@id": "http://example.org/term", "@type": "@vocab"}
},
"term": "enum"
Example 682
: Expand @vocab-relative term with @type: @vocab Result
_:b0 .
Test 0096:
Use terms with @type: @vocab but not with @type: @id
RDF version of expand-0056
Example 683
: Use terms with @type: @vocab but not with @type: @id Input
"@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"
Example 684
: Use terms with @type: @vocab but not with @type: @id Result
.
.
"Markus Lanthaler" .
Test 0097:
Expand relative IRI with @type: @vocab
RDF version of expand-0057
Example 685
: Expand relative IRI with @type: @vocab Input
"@context": {
"term": { "@id": "http://example.org/term", "@type": "@vocab" }
},
"term": "not-a-term-thus-a-relative-IRI"
Example 686
: Expand relative IRI with @type: @vocab Result
_:b0 .
Test 0098:
Expand compact IRI with @type: @vocab
RDF version of expand-0058
Example 687
: Expand compact IRI with @type: @vocab Input
"@context": {
"term": { "@id": "http://example.org/term", "@type": "@vocab" },
"prefix": "http://example.com/vocab#"
},
"term": "prefix:suffix"
Example 688
: Expand compact IRI with @type: @vocab Result
_:b0 .
Test 0099:
Reset @vocab by setting it to null
RDF version of expand-0059
Example 689
: Reset @vocab by setting it to null Input
"@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"
Example 690
: Reset @vocab by setting it to null Result
.
.
"property expanded using @vocab" .
.
Test 0100:
Overwrite document base with @base and reset it again
RDF version of expand-0060
Example 691
: Overwrite document base with @base and reset it again Input
"@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"
Example 692
: Overwrite document base with @base and reset it again Result
.
.
.
.
Test 0101:
Coercing native types to arbitrary datatypes
RDF version of expand-0061
Example 693
: Coercing native types to arbitrary datatypes Input
"@context": {
"property": {
"@id": "http://example.com/property",
"@type": "http://example.com/datatype"
},
"property": [ 1, true, false, 5.1 ]
Example 694
: Coercing native types to arbitrary datatypes Result
_:b0 "1"^^ .
_:b0 "5.1E0"^^ .
_:b0 "false"^^ .
_:b0 "true"^^ .
Test 0102:
Various relative IRIs with with @base
RDF version of expand-0062
Example 695
: Various relative IRIs with with @base Input
"@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"
Example 696
: Various relative IRIs with with @base Result
_:b0 .
.
.
.
.
.
.
.
.
.
.
.
_:b0 .
_:b0 _:b1 .
_:b1 .
_:b1 _:b2 .
_:b10 .
_:b10 _:b11 .
_:b11 .
_:b11 _:b12 .
_:b12 .
_:b12 .
_:b2 .
_:b2 _:b3 .
_:b3 .
_:b3 _:b4 .
_:b4 .
_:b4 _:b5 .
_:b5 .
_:b5 _:b6 .
_:b6 .
_:b6 _:b7 .
_:b7 .
_:b7 _:b8 .
_:b8 .
_:b8 _:b9 .
_:b9 .
_:b9 _:b10 .
Test 0103:
Expand a reverse property with an index-container
RDF version of expand-0063
Example 697
: Expand a reverse property with an index-container Input
"@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"
Example 698
: Expand a reverse property with an index-container Result
.
"Dave Longley" .
.
"Gregg Kellogg" .
"Markus Lanthaler" .
Test 0104:
Expand reverse property whose values are unlabeled blank nodes
RDF version of expand-0064
Example 699
: Expand reverse property whose values are unlabeled blank nodes Input
"@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"
Example 700
: Expand reverse property whose values are unlabeled blank nodes Result
"Markus Lanthaler" .
_:b0 .
_:b0 "Dave Longley" .
_:b1 .
_:b1 "Gregg Kellogg" .
Test 0105:
Keys that are not mapped to an IRI in a reverse-map are dropped
RDF version of expand-0065
Example 701
: Keys that are not mapped to an IRI in a reverse-map are dropped Input
"@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"
Example 702
: Keys that are not mapped to an IRI in a reverse-map are dropped Result
.
"Dave Longley" .
"Markus Lanthaler" .
Test 0106:
Use @vocab to expand keys in reverse-maps
RDF version of expand-0066
Example 703
: Use @vocab to expand keys in reverse-maps Input
"@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"
Example 704
: Use @vocab to expand keys in reverse-maps Result
.
"Dave Longley" .
"Markus Lanthaler" .
.
"Compact keys using @vocab" .
Test 0107:
prefix:://sufffix not a compact IRI
RDF version of expand-0067
Example 705
: prefix:://sufffix not a compact IRI Input
"@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"
Example 706
: prefix:://sufffix not a compact IRI Result
"all these IRIs remain unchanged because they are interpreted as absolute IRIs" .
.
Test 0108:
_::sufffix not a compact IRI
RDF version of expand-0068
Example 707
: _::sufffix not a compact IRI Input
"@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"
Example 708
: _::sufffix not a compact IRI Result
_:b1 _:b0 .
Test 0109:
Compact IRI as term with type mapping
RDF version of expand-0069
Example 709
: Compact IRI as term with type mapping Input
"@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"
Example 710
: Compact IRI as term with type mapping Result
.
.
Test 0110:
Redefine compact IRI with itself
RDF version of expand-0070
Example 711
: Redefine compact IRI with itself Input
"@context": {
"prefix": "http://www.example.org/vocab#",
"prefix:foo": "prefix:foo"
},
"@id": "http://example.com/vocab#id",
"@type": "prefix:Class",
"prefix:foo": "bar"
Example 712
: Redefine compact IRI with itself Result
"bar" .
.
Test 0111:
Redefine terms looking like compact IRIs
RDF version of expand-0071
Example 713
: Redefine terms looking like compact IRIs Input
"@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"
Example 714
: Redefine terms looking like compact IRIs Result
_:b0 "value of v:term" .
_:b0 "value of v:termId" .
Test 0112:
Redefine term using @vocab, not itself
RDF version of expand-0072
Example 715
: Redefine term using @vocab, not itself Input
"@context": [
"v": "http://example.com/vocab#",
"term": "v:somethingElse"
},
"@vocab": "http://example.com/anotherVocab#",
"term": "term"
],
"term": "value of term"
Example 716
: Redefine term using @vocab, not itself Result
_:b0 "value of term" .
Test 0113:
Dataset with a IRI named graph
Basic use of creating a named graph using an IRI name
Example 717
: Dataset with a IRI named graph Input
"@id": "http://example/g",
"@graph": {
"@id": "http://example/s",
"http://example/p": {"@id": "http://example/o"}
Example 718
: Dataset with a IRI named graph Result
.
Test 0114:
Dataset with a IRI named graph
Basic use of creating a named graph using a BNode name
Example 719
: Dataset with a IRI named graph Input
"@id": "_:g",
"@graph": {
"@id": "http://example/s",
"http://example/p": {"@id": "http://example/o"}
Example 720
: Dataset with a IRI named graph Result
_:b0 .
Test 0115:
Dataset with a default and two named graphs
Dataset with a default and two named graphs (IRI and BNode)
Example 721
: Dataset with a default and two named graphs Input
"@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"}
}]
Example 722
: Dataset with a default and two named graphs Result
.
.
_:b0 .
Test 0116:
Dataset from node with embedded named graph
Embedding @graph in a node creates a named graph
Example 723
: Dataset from node with embedded named graph Input
"@id": "http://example/s0",
"http://example/p0": {"@id": "http://example/o0"},
"@graph": {
"@id": "http://example/s1",
"http://example/p1": {"@id": "http://example/o1"}
Example 724
: Dataset from node with embedded named graph Result
.
.
Test 0117:
Dataset from node with embedded named graph (bnode)
Embedding @graph in a node creates a named graph. Graph name is created if there is no subject
Example 725
: Dataset from node with embedded named graph (bnode) Input
"http://example/p0": {"@id": "http://example/o0"},
"@graph": {
"@id": "http://example/s1",
"http://example/p1": {"@id": "http://example/o1"}
Example 726
: Dataset from node with embedded named graph (bnode) Result
_:b0 .
_:b0 .
Test 0118:
produce generalized RDF flag
Triples with blank node predicates are not dropped if the produce generalized RDF flag is true.
Example 727
: produce generalized RDF flag Input
"@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"
Example 728
: produce generalized RDF flag Result
_:b0 _:b0 .
_:b0 _:b0 "plain value" .
_:b0 _:b0 .
_:b0 _:b0 _:b0 .
_:b0 _:b0 _:b1 .
_:b0 _:b0 _:b2 .
_:b0 _:b0 _:b3 .
_:b1 _:b0 "term" .
_:b2 _:b0 "termId" .
Test 0119:
Blank nodes with reverse properties
Proper (re-)labeling of blank nodes if used with reverse properties.
Example 729
: Blank nodes with reverse properties Input
"@context": {
"foo": "http://example.org/foo",
"bar": { "@reverse": "http://example.org/bar", "@type": "@id" }
},
"foo": "Foo",
"bar": [ "http://example.org/origin", "_:b0" ]
Example 730
: Blank nodes with reverse properties Result
_:b0 .
_:b0 "Foo" .
_:b1 _:b0 .
Test 0001:
Object Lists
Tests generation using different types of objects.
Example 731
: Object Lists Input
.
.
"Plain" .
"2012-05-12"^^ .
"English"@en .
Example 732
: Object Lists Result
"@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"}
Test 0002:
Native Types
Do not use native datatypes for xsd:boolean, xsd:integer, and xsd:double by default.
Example 733
: Native Types Input
"true"^^ .
"false"^^ .
"1"^^ .
"1.1"^^ .
"1.1E-1"^^ .
Example 734
: Native Types Result
"@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"
Test 0003:
BNodes and references
BNode name generation and references between resources.
Example 735
: BNodes and references Input
.
_:a .
_:a .
.
.
.
Example 736
: BNodes and references Result
"@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"}]
Test 0004:
Lists
Multiple lists with different types of element.
Example 737
: Lists Input
.
_:a "apple" .
_:a _:b .
_:b "bananna" .
_:b .
_:a .
.
_:c .
_:c .
_:c .
Example 738
: Lists Result
"@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"}]
}]
Test 0005:
Document with list
Uses a named graph containing a list.
Example 739
: Document with list Input
.
.
_:a "a" .
_:a _:b .
_:b "b" .
_:b .
_:a .
.
"Graph" .
Example 740
: Document with list Result
"@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"}]
Test 0006:
Two graphs having same subject but different values
Ensure that properties and list elements aren't confused between graphs.
Example 741
: Two graphs having same subject but different values Input
.
.
_:a .
_:a "a" .
_:a _:b .
_:b "b" .
_:b .
.
.
_:c .
_:c "c" .
_:c _:d .
_:d "d" .
_:d .
Example 742
: Two graphs having same subject but different values Result
"@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"}
}]
Test 0007:
Graph with multiple named graphs
Testing @graph recursion.
Example 743
: Graph with multiple named graphs Input
.
"http://gregkellogg.net/foaf#me" .
.
"http://www.statistik-berlin-brandenburg.de/" .
"3499879"^^ .
Example 744
: Graph with multiple named graphs Result
"@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"
}]
Test 0008:
List conversion
Conversion of lists of lists (the triples in the input are only partially ordered on purpose
Example 745
: List conversion Input
_:outerlist .
_:outerlist _:lista .
_:outerlist _:b0 .
_:lista "a1" .
_:lista _:a2 .
_:a2 "a2" .
_:a2 _:a3 .
_:a3 "a3" .
_:a3 .
_:c0 _:c1 .
_:c0 .
_:c1 "c1" .
_:c1 _:c2 .
_:c2 "c2" .
_:c2 _:c3 .
_:c3 "c3" .
_:c3 .
_:b0 _:b1 .
_:b0 _:c0 .
_:b1 "b1" .
_:b1 _:b2 .
_:b2 "b2" .
_:b2 _:b3 .
_:b3 "b3" .
_:b3 .
Example 746
: List conversion Result
"@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" }
Test 0009:
List conversion with IRI nodes
Preserve IRI list nodes (i.e., not blank nodes) when converting to @list
Example 747
: List conversion with IRI nodes Input
.
"a" .
_:b .
_:b "b" .
_:b _:c .
_:c "c" .
_:c .
Example 748
: List conversion with IRI nodes Result
"@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" }
Test 0010:
List pattern without rdf:nil
Do not convert lists that are not terminated by rdf:nil to @list.
Example 749
: List pattern without rdf:nil Input
_:a .
_:a "a" .
_:a _:b .
_:b "b" .
_:b _:c .
_:c "c" .
Example 750
: List pattern without rdf:nil Result
"@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" } ]
Test 0011:
List pattern with extra properties
If additional properties are associated to a list node, the list is only partially converted to @list.
Example 751
: List pattern with extra properties Input
_:a .
_:a "a" .
_:a _:b .
_:b "b" .
_:b "This list node has also properties other than rdf:first and rdf:rest" .
_:b _:c .
_:c "c" .
_:c .
Example 752
: List pattern with extra properties Result
"@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" } ]
Test 0012:
List pattern with cycles
Detect lists containing cycles and do not convert them to @list.
Example 753
: List pattern with cycles Input
_:a .
_:a "a" .
_:a _:b .
_:b "b" .
_:b _:c .
_:c "c" .
_:c _:b .
Example 754
: List pattern with cycles Result
"@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" } ]
Test 0013:
List pattern with multiple values of rdf:first
Do not convert list nodes to @list if nodes contain more than one value for rdf:first.
Example 755
: List pattern with multiple values of rdf:first Input
_:a .
_:a "a" .
_:a _:b .
_:b "b1" .
_:b "b2" .
_:b _:c .
_:c "c" .
_:c .
Example 756
: List pattern with multiple values of rdf:first Result
"@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" } ]
Test 0014:
List pattern with multiple values of rdf:rest
Do not convert list nodes to @list if nodes contain more than one value for rdf:rest.
Example 757
: List pattern with multiple values of rdf:rest Input
_:a .
_:a "a" .
_:a _:b .
_:b "b" .
_:b _:c .
_:b _:d .
_:c "c" .
_:c .
_:d "d" .
_:d .
Example 758
: List pattern with multiple values of rdf:rest Result
"@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" } ]
Test 0015:
List pattern with IRI rdf:rest
Do not convert lists to @list if a list node's rdf:rest is an IRI.
Example 759
: List pattern with IRI rdf:rest Input
_:a .
_:a "a" .
_:a "b" .
Example 760
: List pattern with IRI rdf:rest Result
"@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" } ]
Test 0016:
List pattern with type rdf:List
List nodes may have a rdf:type rdf:List.
Example 761
: List pattern with type rdf:List Input
_:b0 .
_:b0 .
_:b0 "A" .
_:b0 _:b1 .
_:b1 "B" .
_:b1 _:b2 .
_:b1 .
_:b1 .
_:b1 .
_:b2 "C" .
_:b2 .
Example 762
: List pattern with type rdf:List Result
"@id": "http://example.com/",
"http://example.com/list": [
"@list": [
"@value": "A"
},
"@value": "B"
},
"@value": "C"
Test 0017:
Remove duplicate triples
Equivalent triples are used only once
Example 763
: Remove duplicate triples Input
"1" .
"1" .
"2"^^ .
"2"^^ .
.
.
.
.
.
Example 764
: Remove duplicate triples Result
"@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" ]
Test 0018:
use native types flag set to true
Literals with datatype xsd:boolean, xsd:integer, and xsd:double are serialized using native scalar values
Example 765
: use native types flag set to true Input
"true"^^ .
"false"^^ .
"1"^^ .
"1.1"^^ .
"1.1E-1"^^ .
Example 766
: use native types flag set to true Result
"@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 }
Test 0019:
use rdf:type flag set to false
Setting useRdfType to true causes an rdf:type predicate to be treated like a normal property, not @type
Example 767
: use rdf:type flag set to false Input
.
.
"Plain" .
"2012-05-12"^^ .
"English"@en .
Example 768
: use rdf:type flag set to false Result
"@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"}
Test 0020:
list with node shared across graphs
An otherwise conformant list with a node shared across different lists does not serialize using @list
Example 769
: list with node shared across graphs Input
_:z0 .
_:z0 "cell-A" .
_:z0 _:z1 .
_:z1 "cell-B" .
_:z1 .
_:z1 .
Example 770
: list with node shared across graphs Result
"@id": "http://www.example.com/G",
"@graph": [
"@id": "_:z0",
"http://www.w3.org/1999/02/22-rdf-syntax-ns#first": [ { "@value": "cell-A" } ],
"http://www.w3.org/1999/02/22-rdf-syntax-ns#rest": [ { "@id": "_:z1" } ]
},
"@id": "_:z1",
"http://www.w3.org/1999/02/22-rdf-syntax-ns#first": [ { "@value": "cell-B" } ],
"http://www.w3.org/1999/02/22-rdf-syntax-ns#rest": [ { "@list": [] } ]
},
"@id": "http://www.example.com/z",
"http://www.example.com/q": [ { "@id": "_:z0" } ]
},
"@id": "http://www.example.com/G1",
"@graph": [
"@id": "http://www.example.com/x",
"http://www.example.com/p": [ { "@id": "_:z1" } ]
Test 0021:
list with node shared across graphs (same triple in different graphs)
If a list node is used in different graphs, it isn't removed and converted to @list
Example 771
: list with node shared across graphs (same triple in different graphs) Input
_:z0 .
_:z0 "cell-A" .
_:z0 _:z1 .
_:z1 "cell-B" .
_:z1 .
_:z0 .
Example 772
: list with node shared across graphs (same triple in different graphs) Result
"@id": "http://www.example.com/G",
"@graph": [
"@id": "_:z0",
"http://www.w3.org/1999/02/22-rdf-syntax-ns#first": [ { "@value": "cell-A" } ],
"http://www.w3.org/1999/02/22-rdf-syntax-ns#rest": [
"@list": [
{ "@value": "cell-B" }
},
"@id": "http://www.example.com/z",
"http://www.example.com/q": [ { "@id": "_:z0" } ]
},
"@id": "http://www.example.com/G1",
"@graph": [
"@id": "http://www.example.com/z",
"http://www.example.com/q": [ { "@id": "_:z0" } ]
Test 0022:
list from duplicate triples
Duplicate triples for a list node will not prevent @list from being properly generated
Example 773
: list from duplicate triples Input
_:z0 .
_:z0 "cell-A" .
_:z0 _:z1 .
_:z1 "cell-B" .
_:z1 .
_:z0 .
Example 774
: list from duplicate triples Result
"@id": "http://www.example.com/G",
"@graph": [
"@id": "http://www.example.com/z",
"http://www.example.com/q": [
"@list": [
"@value": "cell-A"
},
"@value": "cell-B"
D.
Report Generation Software
This report generated by
earl-report
version
0.3.4
an
Unlicensed
Ruby
application. More information is available at
This software is provided by
Gregg Kellogg
in hopes that it might make the lives of conformance testers easier.
E.
References
E.1
Informative references
[DOAP]
Ed Dumbill.
Turtle: Terse RDF Triple Language.
Community Specification. URL:
[EARL10-SCHEMA]
Shadi Abou-Zahra.
Evaluation and Report Language (EARL) 1.0 Schema
. 10 May 2011. W3C Last Call Working Draft. URL:
[FOAF]
Dan Brickley; Libby Miller.
FOAF Vocabulary Specification 0.99 (Paddington Edition)
. 14 January 2014. URL:
[JSON-LD-API]
Markus Lanthaler, Gregg Kellogg, Manu Sporny, Editors.
JSON-LD 1.0 Processing Algorithms and API
W3C Editor's Draft (work in progress). URL: