json-ld.org icon indicating copy to clipboard operation
json-ld.org copied to clipboard

@base treats trailing hash ('#') different from slash '/'

Open simontaurus opened this issue 2 years ago • 3 comments

{
  "@context": {
    "@version": 1.1,
    "@base":"http://example.com/vocab/",
    "name": {"@id": "http://example.com/vocab#test", "@type": "@id"}
  },
  "@id": "http://example.org/places#BrewEats",
  "@type": "Restaurant",
  "name": "Restaurant"
}

expands to

[
  {
    "@id": "http://example.org/places#BrewEats",
    "@type": [
      "http://example.com/vocab/Restaurant"
    ],
    "http://example.com/vocab#test": [
      {
        "@id": "http://example.com/vocab/Restaurant"
      }
    ]
  }
]

(playground) while

{
  "@context": {
    "@version": 1.1,
    "@base":"http://example.com/vocab#",
    "name": {"@id": "http://example.com/vocab#test", "@type": "@id"}
  },
  "@id": "http://example.org/places#BrewEats",
  "@type": "Restaurant",
  "name": "Restaurant"
}

ignores the hash and falls back to the last slash

[
  {
    "@id": "http://example.org/places#BrewEats",
    "@type": [
      "http://example.com/Restaurant"
    ],
    "http://example.com/vocab#test": [
      {
        "@id": "http://example.com/Restaurant"
      }
    ]
  }
]

(playground)

Is this behaviour intended? I did not found any hint in the spec

simontaurus avatar Jul 02 '23 20:07 simontaurus

This follows RFC3987 resolution of IRI references, which does not have special provision for IRIs ending with #. See the IRI Expansion Algorithm step 8.

Otherwise, if document relative is true set value to the result of resolving value against the base IRI from active context. Only the basic algorithm in section 5.2 of [RFC3986] is used; neither Syntax-Based Normalization nor Scheme-Based Normalization are performed. ...

gkellogg avatar Jul 10 '23 17:07 gkellogg

Thank you for the clarification. So there is no way to use a vocabulary that uses # as part of its IRIs as a @base, e. g. to expand

{"type": "string"}

to

{"type": "http://www.w3.org/2001/XMLSchema#string"}

?

simontaurus avatar Jul 16 '23 16:07 simontaurus

Certainly, you can use @vocab for thins like @type IRI expansion. @type is special as it can expand either relative to the vocabulary or document base. Vocabulary expansion, also used for keys, uses string concatenation, rather than IRI resolution, for this purpose.

@base is used to override the document location, for entities described within that document.

gkellogg avatar Jul 16 '23 17:07 gkellogg