W3C home > Mailing lists > Public > public-linked-json@w3.org > October 2017

Re: JSON-LD and JSON-Schema linkage

From: Henry Andrews <henry@cloudflare.com>
Date: Fri, 27 Oct 2017 13:55:54 -0700
Message-ID: <CANp5f1N+xSeNuBOnLEZpR3M_WeXJji21UFjgKKW2+=oDTZjdbg@mail.gmail.com>
To: TJ Koury <tjkoury@gmail.com>
Cc: Linked JSON <public-linked-json@w3.org>
TJ,
  I'm a little confused- I thought the concern was how to identify the
schema from within the instance?  I don't see how this identifies its
schema.  Am I missing something?

thanks,
-henry


On Fri, Oct 27, 2017 at 8:07 AM, TJ Koury <tjkoury@gmail.com> wrote:

>
> Henry,
>
> Having looked at the offical JSON-LD schema (jsonld-schema.json), I'm
> changing my approach.
> Maybe this is obvious and I'm the last one to the party here, but here's
> an example of what I'm working with now that works with both json-ld and
> json-schema validators:
>
> #Sample Schema for a person with a birthday
>
> {
>   "$schema": "http://json-schema.org/draft-04/schema#",
>   "additionalProperties": false,
>   "properties": {
>       "@context":{
>           "description": "Used to define the short-hand names that are
> used throughout a JSON-LD document.",
>           "type": ["object", "string", "array", "null"]
>         },
>         "@type":{
>             "description": "Used to set the data type of a node or typed
> value.",
>             "type": "string"
>         },
>         "nc:PersonBirthDate": {
>             "description": "A date a person was born.",
>             "$ref": "#/definitions/nc:DateTime",
>             "type": "string"
>         }
>   },
>   "definitions": {
>       "nc:DateTime": {
>           "description": "A full date and time.",
>           "type": "string"
>       }
>   }
> }
>
>
> #Sample JSON-LD compliant message generated by webservice
>
> {
>   "@context": {
>       "nc": "http://release.niem.gov/niem/niem-core/3.0/#"
>   },
>   "@type": "https://release.niem.gov/niem/niem-core/3.0/type/PersonType",
>   "nc:PersonBirthDate": "1979-05-23T20:00"
> }
>
> -TJ
>
> On Wed, Oct 25, 2017 at 1:32 PM, TJ Koury <tjkoury@gmail.com> wrote:
>
>> Henry,
>>
>> I do appreciate the context and thought you (and others) have put into
>> the review of the current standard.
>>
>> I'm going to go with using $schema, and I'll post a link to the demo site
>> once I'm done so the list can see what I'm talking about in action.
>>
>> Keep up the good work and I'll be looking to post some comments on the
>> new draft!
>>
>> -TJ
>>
>> On Wed, Oct 25, 2017 at 12:03 AM, Henry Andrews <henry@cloudflare.com>
>> wrote:
>>
>>> Techinically "$schema" is for use in schemas referencing meta-schemas
>>> (meaning that a meta-schema references itself that way).  However, I have
>>> seen other users put "$schema" in instance JSON for this purpose.  It is
>>> definitely allowable as JSON Schema avoids constraining the JSON structure
>>> as a pre-condition for use.
>>>
>>> Regarding Swagger (and I know this is drifting off-topic, we can take
>>> this offlist if folks prefer), OpenAPI 3.x is *almost* compatible with JSON
>>> Schema validation (the draft-04 / draft-05 versions, which are effectively
>>> the same).  For some reason they insisted on refusing to support things
>>> like:
>>>
>>> "type": ["integer", "null"]
>>>
>>> and instead only allow single-value types and added an incompatible
>>> boolean flag, "nullable".  I and a few others are trying to convince them
>>> to support two-element type arrays where one element is "null" for
>>> compatibility purposes, even if they don't want to fully support type
>>> arrays (which is fine- they're rarely used aside from the type-plus-null
>>> use case anyway).  It would be really great to get that one remaining
>>> conflict out so that everything that is supported in OpenAPI with JSON
>>> Schema uses the JSON Schema syntax.
>>>
>>> Hyper-schema is really a complementary technology emphasizing
>>> hypermedia, links, and HATEOAS, where Swagger is a static API description
>>> format emphasizing .  exact request/response syntax regardless of HTTP
>>> semantics.  That's far too long and tangential a topic for this mailing
>>> list but I do get into the difference a bit in hyper-schema draft-07.
>>>
>>> thanks,
>>> -henry
>>>
>>>
>>> On Tue, Oct 24, 2017 at 8:14 PM, TJ Koury <tjkoury@gmail.com> wrote:
>>>
>>>> Henry,
>>>>
>>>> I most definitely agree with your thoughts, and I think allowing
>>>> document fragments or a $schema property to be interpreted as JSON Schema
>>>> is a huge step in the right direction.
>>>>
>>>> Honestly I haven't used the validation or hyper schemas due to the lack
>>>> of documented interop with Swagger et al, glad to see you think that is an
>>>> issue as well.
>>>>
>>>> For now I'll just use the $schema property, but I will try to engage
>>>> going forward and provide code examples too.
>>>>
>>>> -TJ
>>>>
>>>> On Oct 24, 2017 10:44 PM, "Henry Andrews" <henry@cloudflare.com> wrote:
>>>>
>>>> TJ,
>>>>
>>>> The HTTP header stuff (either the Link header, or using a media type
>>>> parameter in Accept on a request, and getting one back in Content-Type on
>>>> the response, or sending one in Content-Type on a request) is really
>>>> designed for a simple instance document + schemas paradigm (1-to-many, as
>>>> you can have multiple links or multiple schema URIs in the media type
>>>> paramter).
>>>>
>>>> What it really does not address well is the case where JSON Schema is
>>>> applied to *part* of a document, or where *part* of a document is JSON
>>>> Schema, but the entire document is not (at least as we define JSON Schema
>>>> right now).  These are problems that I want to focus on for draft-08, which
>>>> will have re-use as its theme (although I am intentionally not filing
>>>> further issues on them yet to keep folks focused on the draft-07
>>>> discussion).
>>>>
>>>> I am trying to build a case for JSON Schema as a media type supporting
>>>> many vocabularies.  The terms in the vocabularies are either assertions,
>>>> annotations, or both (these terms are defined in the draft-07 Validation
>>>> document- they were not called out before).  This is sort of true now:
>>>> Validation and Hyper-Schema are both described as "vocabularies", although
>>>> their relationship with each other and the core specification is somewhat
>>>> muddled.  This lack of clarity makes it hard to define extended,
>>>> restricted, or orthogonal vocabularies.
>>>>
>>>> In particular, an extended or restricted vocabulary can only be
>>>> indicated by a single "$schema" URI, which makes it impossible to detect
>>>> the underlying vocabulary even if an implementation would be able to make
>>>> use of that portion of the document.  This would enable graceful
>>>> degradation.  For example, a validator can still use a hyper-schema, it
>>>> just ignores the "base" and "links" keywords and everything works just
>>>> fine.  However, this only "works" because implementations hardcode that
>>>> hyper-schemas are also usable as validation.  It would not work with a
>>>> custom extension to validation, which I would like to fix (I am getting
>>>> pushback on this, so if anyone would like this flexibility, I could use
>>>> your support).
>>>>
>>>> I want this sort of flexibility because a major use case for JSON
>>>> Schema is not whole documents but partial documents, on both the schema and
>>>> instance side.
>>>>
>>>> API description formats like OpenAPI (a.k.a. Swagger) use JSON Schema
>>>> (or a subset of it) in parts of a JSON or YAML file.  It would be great to
>>>> be able to consider such a file to itself be a JSON Schema, mostly with a
>>>> custom vocabulary, but one that includes a standard vocabulary in certain
>>>> spots so that JSON Schema tools could recognize and work with the whole
>>>> thing in an interoperable mannter.
>>>>
>>>> Even more relevant to JSON-LD, the W3C's "Web of Things" group's Thing
>>>> Description format is a mostly-JSON-LD-based document that uses JSON Schema
>>>> in a few spots for structure descriptions.  This sort of mixture seems
>>>> useful and desirable.
>>>>
>>>> And now as you mention, there may be data that we want to describe with
>>>> JSON Schema (either as its own document or part of something larger)
>>>> embedded within documents that we do not wish to fully describe, such as
>>>> JSON-LD within an HTML document.  I had not previously considered this
>>>> case, but it fits well with the overall direction I want to consider in
>>>> draft-08.
>>>>
>>>> Basically, I want to make all of these things first-class use cases for
>>>> JSON Schema, such that tools that support "JSON Schema" (whatever that ends
>>>> up formally meaning) can work with such situations.
>>>>
>>>> Those of us who work with hyper-schema, web UI annotation, code
>>>> generation, document generation, and other non-validation uses tend to
>>>> support modular re-usability as I have sketched it out above.  Some of
>>>> those who focus on validation only have opposed it (in at least one
>>>> prominent case, vehemently).  So I am hoping to build support for a
>>>> flexible definition of JSON Schema, as opposed to the "JSON Schema is
>>>> validation with incidental other stuff hanging off of it" viewpoint.
>>>>
>>>> This debate will probably kick off towards the end of this month,
>>>> although of course folks are welcome to file issues and/or comment before
>>>> then.  This is the issue that is primarily tracking being able to detect
>>>> the base vocabulary of an extended system:
>>>> https://github.com/json-schema-org/json-schema-spec/issues/314  The
>>>> other things do not have issues yet (I'll file them when draft-07 is out
>>>> the door later this month)
>>>>
>>>> thanks,
>>>> -henry
>>>>
>>>> PS: For those interested in the road map (which is not endorsed by
>>>> anyone but me right now):
>>>>
>>>> draft-07 was about hypermedia (including a top-to-bottom rewrite of
>>>> JSON Hyper-Schema)
>>>> draft-08 will be about re-use
>>>> draft-09 will *probably* be about whether "$data" and similar concepts
>>>> should be added
>>>> after that, I hope we can get JSON Schema, at least core and
>>>> validation, adopted by an IETF working group or otherwise start bringing
>>>> the process to some sort of resolution.
>>>>
>>>>
>>>> On Tue, Oct 24, 2017 at 6:25 PM, TJ Koury <tjkoury@gmail.com> wrote:
>>>>
>>>>> Henry,
>>>>>
>>>>> Thanks for the quick reply.  If you're looking for inputs, and I can
>>>>> submit something formal if I'm not too off base here, I'd like to see
>>>>> something along the lines of providing an schema property as a child of a
>>>>> context node.
>>>>>
>>>>> The goal would be the ability to make a one to many relationship with
>>>>> a linked json being able to be associated with multiple schemas; in my
>>>>> case, a NIEM entity instance being described for multiple persistence
>>>>> engines.
>>>>>
>>>>> I'm of the opinion that using HTTP headers for schema references is
>>>>> not a great option for several reasons, such as not being able to
>>>>> accurately describe an HTML document with an embedded JSON-LD tag, and also
>>>>> forcing a consumer to persist data pertaining to the  model outside of the
>>>>> standard.  In my specific use case, I'd like the schemas to be canonical
>>>>> when referencing authoritative data sources, and not be an implemention
>>>>> detail at time of data request.
>>>>>
>>>>>
>>>>> On Oct 24, 2017 8:41 PM, "Henry Andrews" <henry@cloudflare.com> wrote:
>>>>>
>>>>> Hi TJ,
>>>>>   I'm currently the most active editor of the JSON Schema
>>>>> specification, and this has been a recent topic of discussion for the
>>>>> forthcoming (no later than Nov. 20th, barring unexpected problems) draft-07.
>>>>>
>>>>>   I see you are using draft-04 for this.  In that draft (and up
>>>>> through draft-06) the recommendations were:
>>>>>
>>>>> * Use HTTP link headers if relevant:  "profile" as an identifier,
>>>>> "describedBy" as a locator (most of the time they would be the same)
>>>>> * Use "profile" as a media type parameter
>>>>>
>>>>> However, per the author of the "profile" RFC this usage was never
>>>>> quite right (JSON-LD use it correctly, though).  And application/json does
>>>>> not support a profile media type parameter anyway.
>>>>>
>>>>>   In draft-07, we are (probably) proposing replacing "profile" with a
>>>>> newly proposed "schema" link relation type and/or media type parameter.
>>>>> JSON-LD could opt to support the media type parameter with
>>>>> application/ld+json, or just use a "schema" link.  Whether this is correct,
>>>>> or sufficient, or if there is a better approach, is something we really
>>>>> hope to get feedback on with draft-07.  It is the main unresolved concern
>>>>> with the core spec, as far as I know.  And I still find the
>>>>> "describedBy"-as-locator part a bit odd, personally.
>>>>>
>>>>>   If anyone wants to see a preview of draft-07, you can find it here:
>>>>> http://json-schema.org/work-in-progress
>>>>>
>>>>> thanks,
>>>>> -henry
>>>>>
>>>>>
>>>>> On Tue, Oct 24, 2017 at 3:55 PM, TJ Koury <tjkoury@gmail.com> wrote:
>>>>>
>>>>>>
>>>>>>
>>>>>> ALCON,
>>>>>>
>>>>>> This has been asked before several times, but the answers always seem
>>>>>> to get muddled down and lost in semantics (which is what we’re doing here,
>>>>>> so I get it….).
>>>>>>
>>>>>> For reference:
>>>>>>
>>>>>> https://github.com/json-ld/json-ld.org/commit/019de59e296c39
>>>>>> d7b5c0298d49d95b99fceb294a
>>>>>>
>>>>>> So there is a JSON-Schema document to validate ANY JSON-LD document
>>>>>> against to make sure that it’s a valid JSON-LD document.  Awesome!
>>>>>>
>>>>>> Now, if I have a http://schema.org/Person, and an associated
>>>>>> JSON-Schema document that defines the fields associated with Person, how do
>>>>>> I add a URL to the associated JSON-LD document to reference that schema?
>>>>>>
>>>>>> My specific use case is to generate JSON-LD documents from NIEM
>>>>>> instances, then create JSON-Schema documents for each persistence engine
>>>>>> (database, file system, etc) that will store the instances, and embed
>>>>>> within the JSON-Schema documents themselves the metadata required to create
>>>>>> the tables.  Basically an Schema->SQL engine (another ORM!), but entirely
>>>>>> based on the JSON-LD and JSON-Schema specs.
>>>>>>
>>>>>> -TJ
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>> --
>>>>>
>>>>>    -
>>>>>
>>>>>    *Henry Andrews*  |  Systems Engineer
>>>>>    henry@cloudflare.com
>>>>>    <https://www.cloudflare.com/>
>>>>>
>>>>>    1 888 99 FLARE  |  www.cloudflare.com
>>>>>    -
>>>>>
>>>>>
>>>>>
>>>>>
>>>>
>>>>
>>>> --
>>>>
>>>>    -
>>>>
>>>>    *Henry Andrews*  |  Systems Engineer
>>>>    henry@cloudflare.com
>>>>    <https://www.cloudflare.com/>
>>>>
>>>>    1 888 99 FLARE  |  www.cloudflare.com
>>>>    -
>>>>
>>>>
>>>>
>>>
>>>
>>> --
>>>
>>>    -
>>>
>>>    *Henry Andrews*  |  Systems Engineer
>>>    henry@cloudflare.com
>>>    <https://www.cloudflare.com/>
>>>
>>>    1 888 99 FLARE  |  www.cloudflare.com
>>>    -
>>>
>>>
>>
>


-- 

   -

   *Henry Andrews*  |  Systems Engineer
   henry@cloudflare.com
   <https://www.cloudflare.com/>

   1 888 99 FLARE  |  www.cloudflare.com
   -
Received on Friday, 27 October 2017 20:56:42 UTC

This archive was generated by hypermail 2.4.0 : Friday, 17 January 2020 16:18:50 UTC