Multi-pass @context (ISSUE #41)

Manu and I discussed this a bit after the call today. Note that I had already created issue #41 to address this [1]. From the issue text:

> The spec describes defining an @context in terms of having an "active context". This allows terms and prefixes to be used within a @context definition, if they are defined earlier.
> 
> Update the spec to ensure that this is clear, and to allow both from contexts defined in a higher object, and those that precede within an array of contexts.

The problem comes to play when an author wants to create a context both defining terms and using them in @datatype. For example:

@context: {
  "xsd": "http://www.w3.org/2001/XMLSchema#",
  "date": {"@iri": "http://purl.org/dc/terms/date", "@datatype": "xsd:date"}
}

This requires two passes over @context, first to resolve prefixes, and second to use those prefixes in @datatype declarations. Note that before, when @coerce was a separate object, this processing was in effect; it was lost when we folded in datatypes with prefix definitions.

As a related issue, we could consdier the following:

@context: {
  "xsd": "http://www.w3.org/2001/XMLSchema#",
  "dc": "http://purl.org/dc/terms/",
  "date": {"@iri": "dc:date", "@datatype": "xsd:date"}
}

This adds another layer of complication, as it may require more than two passes to resolve the use of CURIEs in @iri definitions, so I would not go this far, although the use of a CURIE should be allowed, if it is defined in an outer context.

I believe that we should adopt the first form, as it is a natural way to create a context for authors, and there is a reasonable possibility that there will be errors if authors do not separate prefix definitions from the usage in datatypes.

I propose that we formally say that context object traversal is a two-pass operation, where first IRIs for defined terms are identified and then @datatype and @list processing occurs, so that prefixes defined within a context can be used for @datatype definitions.

As an alternative, we could define a set of terms that are defined in a global "default" context, similar to RDFa's default context. There we could define mappings for xsd, rdf, dc, foaf, schema and others. This would eliminate most need for doing two-pass processing of contexts.

Gregg

[1] https://github.com/json-ld/json-ld.org/issues/41

Received on Tuesday, 29 November 2011 19:04:43 UTC