W3C home > Mailing lists > Public > public-linked-json@w3.org > July 2014

Re: Converting RDF to JSON-LD : shared lists between graphs

From: Andy Seaborne <andy@apache.org>
Date: Tue, 22 Jul 2014 18:11:31 +0100
Message-ID: <53CE9B43.4060108@apache.org>
To: David Booth <david@dbooth.org>, public-linked-json@w3.org
(not cc'ed to rdf-comments)

David,

It's impractical to take a top-to-bottom design position and simply ban 
it.  That couples application and platform.

When developing general purpose code for the grungy bit at the bottom, 
code has to (ideally) cope with what's thrown at it, and that means 
coping with future application choices.

In the example, it's not even as complicated as a two-headed list.  It's 
one list with added elements.

Immutable datastructures so this all the time. Add an element to a list 
and the original list is available and unaltered.  To some people, this 
situation may even seem natural.  It's not about bnodes, it's about lists.

It's about writing code that can cope.

	Andy

[*] RDF-2 - first class lists please, not encoded structures.

On 22/07/14 17:30, David Booth wrote:
> This does not directly address your question, but . . .
>
> Don't do that!  ;)   Seriously, I'm sure you have your reasons for
> wanting to do that, but it violates what I would call "Well Behaved RDF":
> http://dbooth.org/2013/well-behaved-rdf/Booth-well-behaved-rdf.pdf
>
> I would strongly advocate that if you want to create that kind of
> structure in RDF, you should use different predicates for it -- not the
> rdf:first and rdf:last predicates.  Then the problem goes away.
>
> David
>
> On 07/22/2014 05:21 AM, Andy Seaborne wrote:
>> We are encountering an issue when converting RDF Datasets to JSON-LD.
>>
>> The problem is with blank nodes that are shared between graphs and lists.
>>
>> In TriG (yes, this is a synthetic reduced test case that captures a
>> smaller example that might appear for real):
>>
>> ---------------------
>> # Bnode references across graph and lists
>> PREFIX :        <http://www.example.com/>
>> PREFIX rdf:     <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
>>
>> :G {
>>    # Written in short form it would be:
>>    # :z :q ("cell-A" "cell-B")
>>    # but we want to share the tail ("cell-B")
>>
>>    :z :q _:z0 .
>>
>>    _:z0   rdf:first "cell-A" .
>>    _:z0   rdf:rest  _:z1 .
>>
>>    _:z1   rdf:first "cell-B" .
>>    _:z1   rdf:rest rdf:nil .
>> }
>>
>> :G1 {
>>     # This references the tail  ("cell-B")
>>     :x :p _:z1 .
>> }
>> ---------------------
>>
>> The triple in :G1 references into the list in :G.
>>
>> But as we understand the conversion algorithm, section 4 only considers
>> each graph in turn and so does not see the cross graph sharing.
>>
>> Is this a correct reading of the spec text?
>>
>> Part 4 of the conversion algorithm has
>> "For each name and graph object in graph map: "
>>
>> so 4.3.3.* walks back up the list in one graph only.
>>
>> (Conversion generated by jsonld-java : it does not matter if compaction
>> is applied or not):
>> ---------------
>> {
>>    "@graph" : [ {
>>      "@graph" : [ {
>>        "@id" : ":z",
>>        ":q" : {
>>          "@list" : [ "cell-A", "cell-B" ]
>>        }
>>      } ],
>>      "@id" : ":G"
>>    }, {
>>      "@graph" : [ {
>>        "@id" : ":x",
>>        ":p" : {
>>          "@id" : "_:b1"
>>        }
>>      } ],
>>      "@id" : ":G1"
>>    } ],
>>    "@context" : {
>>      "@base" : "http://www.example.com/",
>>      "" : "http://www.example.com/",
>>      "rdf" : "http://www.w3.org/1999/02/22-rdf-syntax-ns#"
>>    }
>> }
>> ---------------
>>
>> There is no _:b1 in :G to refer to because the algorith generated @list
>> and its implicit bNodes don't have labels.
>> This is a different dataset with no shared bNode.
>>
>> If it is all the same graph (s/:G1/:G/), the RDF dataset structure is
>> correctly serialized.
>>
>>          Andy
>>
>>
>>
>>
>
Received on Tuesday, 22 July 2014 17:12:01 UTC

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