jsonld.js
jsonld.js copied to clipboard
Bug in scoped contexts
There is probably a bug in handling scoped contexts. This is the same as https://github.com/json-ld/json-ld.org/issues/734
In the snippet below, začátek
and konec
(beginning and end in Czech) have equivalent contexts. However, when used in data, they behave differently. Namely the context in konec
is ignored, while when začátek
is used, the context is applied. When the začátek
definition is removed from the context, konec
starts working. This can be tested in json-ld playground.
{
"@context": {
"typ": "@type",
"time": "http://www.w3.org/2006/time#",
"Časový interval": {
"@id": "time:ProperInterval",
"@context": {
"začátek": {
"@id": "time:hasBeginning",
"@context": {
"time": "http://www.w3.org/2006/time#",
"xsd": "http://www.w3.org/2001/XMLSchema#",
"časy": "https://slovník.gov.cz/generický/čas/pojem/",
"Časový okamžik": {
"@id": "time:Instant",
"@context": {
"datum": {
"@id": "time:inXSDDate",
"@type": "xsd:date"
},
"datum_a_čas": {
"@id": "time:inXSDDateTimeStamp",
"@type": "xsd:dateTimeStamp"
},
"nespecifikovaný": {
"@id": "časy:je-nespecifikovaný",
"@type": "xsd:boolean"
}
}
}
}
},
"konec": {
"@id": "time:hasEnd",
"@context": {
"time": "http://www.w3.org/2006/time#",
"xsd": "http://www.w3.org/2001/XMLSchema#",
"časy": "https://slovník.gov.cz/generický/čas/pojem/",
"Časový okamžik": {
"@id": "time:Instant",
"@context": {
"datum": {
"@id": "time:inXSDDate",
"@type": "xsd:date"
},
"datum_a_čas": {
"@id": "time:inXSDDateTimeStamp",
"@type": "xsd:dateTimeStamp"
},
"nespecifikovaný": {
"@id": "časy:je-nespecifikovaný",
"@type": "xsd:boolean"
}
}
}
}
}
}
}
},
"typ": "Časový interval",
"konec": {
"typ": "Časový okamžik",
"datum_a_čas": "2019-01-14T09:30:00+02:00"
}
}
I have a similar issue with scoped contexts and IRI expansion using scoped @base
or @vocab
definitions. Only the first scope context is used, the other is ignored. Adding this here, and linking to https://github.com/json-ld/json-ld.org/issues/734 .
To test: two examples. One using @base
and one using @vocab
:
Using @base
{
"@context": {
"@base": "http://example.com/entity/test/",
"@vocab": "http://example.com/schema/test/",
"b": {
"@context": {
"@base": "http://example.com/test/"
},
"@type": "@id"
},
"a": {
"@context": {
"@base": "http://example.com/test/"
},
"@type": "@id"
}
},
"@id": "justATest",
"b": "1234",
"a": "5678"
}
This should give
Subject | Predicate | Object |
---|---|---|
http://example.com/entity/test/justATest | http://example.com/schema/test/b | http://example.com/test/1234 |
http://example.com/entity/test/justATest | http://example.com/schema/test/a | http://example.com/test/5678 |
But instead gives
Subject | Predicate | Object |
---|---|---|
http://example.com/entity/test/justATest | http://example.com/schema/test/b | http://example.com/test/1234 |
http://example.com/entity/test/justATest | http://example.com/schema/test/a | 5678 |
Using @vocab
Different context, now using the @vocab
mechanism... same results:
{
"@context": {
"@base": "http://example.com/entity/test/",
"@vocab": "http://example.com/schema/test/",
"b": {
"@context": {
"@vocab": "http://example.com/test/"
},
"@type": "@vocab"
},
"a": {
"@context": {
"@vocab": "http://example.com/test/"
},
"@type": "@vocab"
}
},
"@id": "justATest",
"b": "1234",
"a": "5678"
}
Results:
Subject | Predicate | Object |
---|---|---|
http://example.com/entity/test/justATest | http://example.com/schema/test/a | 5678 |
http://example.com/entity/test/justATest | http://example.com/schema/test/b | http://example.com/test/1234 |
Change the order in the @context
Just including the example from the @base
method... This context defines a
first, and then b
. Now the effect is the other way around. The value for a
is properly expanded, and the one for b
isn't.
{
"@context": {
"@base": "http://example.com/entity/test/",
"@vocab": "http://example.com/schema/test/",
"a": {
"@context": {
"@base": "http://example.com/test/"
},
"@type": "@id"
},
"b": {
"@context": {
"@base": "http://example.com/test/"
},
"@type": "@id"
}
},
"@id": "justATest",
"b": "1234",
"a": "5678"
}
Results:
Subject | Predicate | Object |
---|---|---|
http://example.com/entity/test/justATest | http://example.com/schema/test/a | http://example.com/test/5678 |
http://example.com/entity/test/justATest | http://example.com/schema/test/b | 1234 |