Re: JSON a link poor format

Oops- Simon's unbalancing must be contagious - I forgot to define `title`
properly in my last example. Should have referred to `
http://www.w3.org/2000/01/rdf-schema#label`, see below:

{

    "@context": {

        "sampledFeature": {

            "@id": "
http://def.seegrid.csiro.au/isotc211/iso19156/2011/sampling#sampledFeature",

            "@type": "@id"

        },

        "title": {

            "@id": "http://www.w3.org/2000/01/rdf-schema#label"

        }

    },

    "@graph": [

        { "sampledFeature": "http://example.org/featureA" },
…

        {

            "@id": "http://example.org/featureA",

            "title: "test feature A"

        }

    ]
    ...
}



On Mon, 19 Oct 2015 at 09:42 Jeremy Tandy <jeremy.tandy@gmail.com> wrote:

> Hi Simon.
>
> That looks about right.
>
> In JSON-LD, the @id name-value pair exists within a nested object. You can
> add other name-value pairs within that nested object ... I think of these
> as extra RDF triples that are included in the graph.
>
> So the snippet from your example:
>
> {
>
>     "sampledFeature": {
>
>         "@id": "http://example.org/featureA",
>
>         "title": "test feature A"
>
>     },
>     ...
> }
>
> includes the RDF triple
>
> *subject*: <http://example.org/featureA>
> *predicate*: :title
> *object*: "test feature A"
>
> (presumably title is aliased to `dct:title` ... other options include
> `rdfs:label`. Your choice, what ever you want to specify in the @context.
>
> Note that when you include additional name-value pairs like we have done
> above, you can't coerce [1] the property `sampledFeature` to always refer
> to an identifier (@id) because you need a nested object. Of course, you
> could include the target object at the top-level in the graph; e.g.
>
> {
>
>     "@context": {
>
>         "sampledFeature": {
>
>             "@id": "
> http://def.seegrid.csiro.au/isotc211/iso19156/2011/sampling#sampledFeature
> ",
>
>             "@type": "@id"
>
>         },
>
>         "title": {
>
>             "@id": "http://www.w3.org/2000/01/rdf-schema#"
>
>         }
>
>     },
>
>     "@graph": [
>
>         { "sampledFeature": "http://example.org/featureA" },
>
>         {
>
>             "@id": "http://example.org/featureA",
>
>             "title: "test feature A"
>
>         }
>
>     ]
>     ...
> }
>
>
> HTH, Jeremy
>
>
> [1]: http://www.w3.org/TR/json-ld/#type-coercion
>
> On Mon, 19 Oct 2015 at 01:02, <Simon.Cox@csiro.au> wrote:
>
>> Whoops – unbalanced braces. Fixed below.
>>
>>
>>
>> *From:* Simon.Cox@csiro.au [mailto:Simon.Cox@csiro.au]
>> *Sent:* Monday, 19 October 2015 10:10 AM
>> *To:* jeremy.tandy@gmail.com; l.vandenbrink@geonovum.nl;
>> public-sdw-wg@w3.org
>> *Subject:* [ExternalEmail] RE: JSON a link poor format
>>
>>
>>
>> Thanks Jeremy –
>>
>>
>>
>> Indeed – the approach to linking in OM-JSON is probably more a statement
>> of requirements than a fully resolved solution.
>>
>> JSON-LD’s “@id” approach might be preferable, particularly (as you point
>> out) it is the only linking mechanism for JSON which is fully and formally
>> defined.
>>
>>
>>
>> How to mix in the other useful link properties?
>>
>> In JSON-LD the rel|xlink:arcrole function is satisfied by the property
>> itself.
>>
>> So we just need to handle ‘title’.
>>
>> Re-writing the example from the OM-JSON presentation in a more
>> JSON-LD-friendly manner, how does this look?
>>
>>
>>
>> ```
>>
>> {
>>
>>     "name": "spec1",
>>
>>     "sampledFeature": {
>>
>>         "@id": "http://example.org/featureA", "title": "test feature A"
>>
>>     },
>>
>>     "complex": [
>>
>>         { "http://example.org/parent": { "@id": "
>> http://example.org/sample2", "title": "parent sample" }  },
>>
>>         { "http://example.org/child": { "@id": "
>> http://example.org/sample3", "title": "child sample"  }  }
>>
>>     ],
>>
>>     ...
>>
>> }
>>
>> ```
>>
>>
>>
>> Simon
>>
>>
>>
>>
>>
>> *From:* Jeremy Tandy [mailto:jeremy.tandy@gmail.com
>> <jeremy.tandy@gmail.com>]
>> *Sent:* Friday, 16 October 2015 8:01 PM
>> *To:* Linda van den Brink <l.vandenbrink@geonovum.nl>; SDW WG (
>> public-sdw-wg@w3.org) <public-sdw-wg@w3.org>
>> *Subject:* Re: JSON a link poor format
>>
>>
>>
>> Hi
>>
>>
>>
>> Indeed, JSON-LD does resolve the problem of links ...
>>
>>
>>
>> However, there is some concern that formalism of JSON-LD places an
>> additional burden over an above the use of 'plain-old-JSON' (as I call it)
>> ... so there are still folks out there not wanting to adopt JSON-LD.
>>
>>
>>
>> Taking a look at some basic concepts in JSON-LD (from [1]):
>>
>>
>>
>> plain-old JSON =
>>
>>
>>
>> ```
>>
>> {
>>
>>   "name": "Manu Sporny",
>>
>>   "homepage": "http://manu.sporny.org/",
>>
>>   "image": "http://manu.sporny.org/images/manu.png"
>>
>> }
>>
>> ```
>>
>>
>>
>> JSON-LD =
>>
>>
>>
>> ```
>>
>> {
>>
>>   "*http://schema.org/name <http://schema.org/name>*": "Manu Sporny",
>>
>>   "*http://schema.org/url <http://schema.org/url>*": *{ "@id": *"http://manu.sporny.org/" *}*,  ← The '@id' keyword means 'This value is an identifier that is an IRI'
>>
>>   "*http://schema.org/image <http://schema.org/image>*": *{ "@id": *"http://manu.sporny.org/images/manu.png" *}*
>>
>> }
>>
>> ```
>>
>>
>>
>> Looking at the final name-value pair (relating the profile object for
>> 'Manu Sporny' to his chosen picture), there's quite a lot going on here ...
>>
>>
>>
>> 1) in the plain-old JSON, the link is provided as a simple URL that
>> applications can _infer_ means that if they follow it they can find
>> something useful
>>
>> 2) there are no semantics provided for the `image` name ... applications
>> need to know somehow what it means; perhaps because the developer has read
>> the documentation!
>>
>> 3) in the JSON-LD version we see that the target is an object with a
>> name-value pair that has name of `@id`; this mechanism is used to say
>> "here's an identified something" ... it's an explicit link
>>
>> 4) the `image` name is replaced by a fully qualified URL `
>> http://schema.org/image` that, when resolved, provides you with the
>> information about the semantics of that name.
>>
>>
>>
>> If desired, you can also express the Type of the thing being linked to by
>> including a name-value pair with name of `@type` in the object ...
>>
>>
>>
>> One can also use JSON-LDs `@context` (see [2]) to make the resulting JSON
>> look more 'normal':
>>
>>
>>
>> ```
>>
>> {
>>
>>   *"@context":*
>>
>> *  {*
>>
>> *    "name": "http://schema.org/name <http://schema.org/name>",*
>>
>> *    "image": {*
>>
>> *      "@id": "http://schema.org/image <http://schema.org/image>",*
>>
>> *      "@type": "@id"*
>>
>> *    },*
>>
>> *    "homepage": {*
>>
>> *      "@id": "http://schema.org/url <http://schema.org/url>",*
>>
>> *      "@type": "@id"*
>>
>> *    }*
>>
>> *  },*
>>
>>   "name": "Manu Sporny",
>>
>>   "homepage": "http://manu.sporny.org/",
>>
>>   "image": "http://manu.sporny.org/images/manu.png"
>>
>> }
>>
>> ```
>>
>>
>>
>> (the `@context` object can be referenced via HTTP header so the JSON
>> document itself doesn't even need to include it)
>>
>>
>>
>> Here we see that the name `image` has been mapped to `
>> http://schema.org/image` and that the type of that object has been set
>> to `@id` ... meaning that `image` will always refer to a link.
>>
>>
>>
>> So this works for me ... but there is no general agreement how links
>> should be done in 'plain-old' JSON.
>>
>>
>>
>> Looking at Simon Cox's OM-JSON presentation (from the OGC TC meeting in
>> Nottingham) he proposes using names like `href`, `rel` and `title` (etc)
>> which (mostly) map to the properties of XLINKs [3] ... e.g.
>>
>>
>>
>> ```
>>
>> {
>>
>>     "id": "spec1",
>>
>>     "sampledFeature": {
>>
>>         "href": "http://example.org/featureA", "title": "test feature A"
>>
>>     },
>>
>>     "complex": [
>>
>>         { "rel": "http://example.org/parent", "href": "
>> http://example.org/sample2" },
>>
>>         { "rel": "http://example.org/child", "href": "
>> http://example.org/sample3"  }
>>
>>     ],
>>
>>     ...
>>
>> }
>>
>> ```
>>
>>
>>
>> Looking at Link-Objects [4], GeoJSON provides a different mechanism. The
>> spec says:
>>
>>
>>
>> A link object has one required member: "href", and one optional member:
>> "type".
>>
>>
>>
>> for example:
>>
>>
>>
>> ```
>>
>> "crs"*:* {
>>
>>     "type"*:* "link",
>>
>>     "properties"*:* {
>>
>>       "href"*:* "http://example.com/crs/42",
>>
>>       "type"*:* "proj4"
>>
>>       }
>>
>>     }
>>
>> ```
>>
>>
>>
>> Part of the problem is that encodings using 'plain-old' JSON don't often
>> bother explicitly identifying the resource that they are talking about.
>> Looking at GeoJSON [4], for example, all that spec says about identifying
>> this is:
>>
>>
>>
>> ·         If a feature has a commonly used identifier, that identifier
>> should be included as a member of the feature object with the name "id".
>>
>> It doesn't provide any guidance about what that identifier should be (in
>> contrast to the web-architecture and DWBP that say use HTTP URIs to
>> identify things). Usually in JSON, the relationships between things are
>> asserted by the nesting of objects ... which is not always convenient or
>> possible.
>>
>>
>>
>> So ... is JSON a link-poor format? Perhaps the problem is that there are
>> any number of ways to do links but none that work for everyone. The only
>> formalised standard mechanism (that I know of) is provided by JSON-LD.
>> Perhaps this is one of the best practices we should assert?
>>
>>
>>
>> HTH, Jeremy
>>
>>
>>
>> [1]: http://www.w3.org/TR/json-ld/#basic-concepts
>>
>> [2]: http://www.w3.org/TR/json-ld/#the-context
>>
>> [3]: http://www.w3.org/TR/xlink11/
>>
>> [4]: http://geojson.org/geojson-spec.html#link-objects
>>
>> [5]: http://geojson.org/geojson-spec.html#feature-objects
>>
>>
>>
>> On Fri, 16 Oct 2015 at 07:28 Linda van den Brink <
>> l.vandenbrink@geonovum.nl> wrote:
>>
>> Hi all,
>>
>>
>>
>> In the last telecon Jeremy commented on JSON, saying it is a ‘link poor
>> format’. I’m curious as to what he meant. Is JSON-LD not supposed to solve
>> that?
>>
>>
>>
>> @Jeremy could you expand on this?
>>
>>
>>
>> Linda
>>
>>
>>
>>
>>
>>

Received on Monday, 19 October 2015 08:48:09 UTC