Re: Using rdf:type instead of @type for node types

Hello Dave

On 19.02.2016 22:41, Dave Longley wrote:
> On 02/19/2016 10:17 AM, Adrian Pohl wrote:
>> Hello,
>>
>> we would like to use what my colleague Jan Schnasse has dubbed "side car
>> approach" of providing JSON-LD. This means providing a label for each
>> node in the data – including RDF types – to enable easy consumption of
>> the data without IRI-lookups for presentation purposes. The following
>> example shows the general pattern:
>>
>> {
>>     "@context":{
>>        "label":"http://www.w3.org/2000/01/rdf-schema#label",
>>        "subject":{
>>           "@id":"http://purl.org/dc/terms/subject",
>>           "@type":"@id"
>>        }
>>     },
>>     "@id":"http://lobid.org/resource/HT018881872",
>>     "@type":[
>>        {
>>           "@id":"http://purl.org/ontology/bibo/Book",
>>           "label":"Buch"
>>        },
>>        {
>>           "@id":"http://purl.org/ontology/bibo/Thesis",
>>           "label":"Abschlussarbeit"
>>        }
>>     ],
>>     "title":[
>>        "Skateboarding"
>>     ],
>>     "otherTitleInformation":[
>>        "Ethnographie einer urbanen Praxis"
>>     ],
>>     "creator":[
>>        {
>>           "@id":"http://d-nb.info/gnd/103058788",
>>           "label":"Peters, Christian"
>>        }
>>     ],
>>     "subject":[
>>        {
>>           "@id":"http://d-nb.info/gnd/4181628-6",
>>           "label":"Skateboardfahren"
>>        },
>>        {
>>           "@id":"http://d-nb.info/gnd/4031483-2",
>>           "label":"Köln"
>>        }
>>     ]
>> }
>>
>> Though this is valid JSON it isn't valid JSON-LD, see [0]. This is
>> because the @type – whether aliased to "type" or not – keyword doesn't
>> allow objects but only takes "an absolute IRI, a relative IRI, a compact
>> IRI (including blank node identifiers), a term defined in the active
>> context expanding into an absolute IRI, or an array of any of these"
>> [1]. See also the section 5.4 Specifying the Type in the JSON-LD spec.
>> [2]
>>
>> We noticed that the "side car" approach works when instead of "@type"
>> another name – e.g. "type" – is used which is mapped to rdf:type in the
>> context. Example:
>>
>> {
>>     "@context":{
>>        "label":"http://www.w3.org/2000/01/rdf-schema#label",
>>        "type":{
>>           "@id":"http://www.w3.org/1999/02/22-rdf-syntax-ns#type",
>>           "@type":"@id"
>>        }
>>     },
>>     "@id":"http://lobid.org/resource/HT018881872",
>>     "type":[
>>        {
>>           "@id":"http://purl.org/ontology/bibo/Book",
>>           "label":"Buch"
>>        },
>>        {
>>           "@id":"http://purl.org/ontology/bibo/Thesis",
>>           "label":"Abschlussarbeit"
>>        }
>>     ]
>> }
>>
>> There is no error in the JSON-LD playground for this and the RDF outcome
>> looks as expected. [3] We are now thinking about using the key "type"
>> mapped to rdf:type for associating a type with a node and only using
>> "@type" in the JSON-LD context and for indicating a value type.
>>
>> In the recent thread on this list about the "@type" keyword and framing
>> [4] it became clear that "@type" is necessary for framing so this is an
>> obvious drawback.
>
> "@type" isn't necessary for framing, it's just one way to frame. Framing
> also supports duck-typing, so you can specify properties that must exist
> in a node in order for it to pass the frame filter instead of using
> "@type" to specify a type it must have to pass the filter.
>
>> As we are building our JSON-LD structure without
>> framing, mapping "type" to rdf:type wouldn't be a problem in this
>> regard. Are there any other reasons from refraining from this or any
>> arguments for another approach?
>
> You also could do this:
>
> {
>    "@context":{
>     "label":"http://www.w3.org/2000/01/rdf-schema#label"
>    },
>    "@graph": [{
>      "@id": "http://lobid.org/resource/HT018881872",
>      "@type": [
>        "http://purl.org/ontology/bibo/Book",
>        "http://purl.org/ontology/bibo/Thesis"
>      ]
>    }, {
>      "@id": "http://purl.org/ontology/bibo/Book",
>      "label": "Buch"
>    }, {
>      "@id": "http://purl.org/ontology/bibo/Thesis",
>      "label": "Abschlussarbeit"
>    }]
> }
>
> That keeps all the data around (no need to fetch anything) and is valid
> JSON-LD. You could preprocess it to generate an ID-based node map or
> whatever else you need to more easily get at the data.

While we are currently offering "@graph" wrapping different resource 
descriptions on one level, we are working on moving away from this flat 
structure towards nested JSON with one root element. Firstly, we believe 
this is easier to work with by web developers and, secondly, it provides 
us with much more possibilities to query this data in elasticsearch.

Thus, the proposed solution is out of question for our use case. Do you 
see a problem with using "type" mapped to rdf:type? Do others have an 
opinion on this?

All the best
Adrian

>
>

-- 
Adrian Pohl
hbz - Hochschulbibliothekszentrum des Landes NRW
Tel: (+49)(0)221 - 400 75 235
http://www.hbz-nrw.de

Received on Monday, 22 February 2016 13:25:55 UTC