json-ld / json-ld.org

JSON for Linked Data's documentation and playground site
https://json-ld.org/
Other
852 stars 151 forks source link

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

Open simontaurus opened 1 year ago

simontaurus commented 1 year ago
{
  "@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

gkellogg commented 12 months ago

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. ...

simontaurus commented 11 months ago

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"}

?

gkellogg commented 11 months ago

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.