W3C home > Mailing lists > Public > public-rdfa-wg@w3.org > April 2011

Re: Issue on comparing BlankNodes in the RDF API

From: Nathan <nathan@webr3.org>
Date: Thu, 28 Apr 2011 19:31:10 +0100
Message-ID: <4DB9B26E.7060402@webr3.org>
To: Ivan Herman <ivan@w3.org>
CC: benjamin.adrian@dfki.de, RDFa WG <public-rdfa-wg@w3.org>, Manu Sporny <msporny@digitalbazaar.com>
Ivan Herman wrote:
> On Apr 28, 2011, at 17:48 , Benjamin Adrian wrote:
> 
>> Hi,
>>
>> I just want to summarise the problems I had with BlankNodes while
>> implementing the following methods:
>>
>> - BlankNodes.equals(RDFNode)
>> - Graph.import(graph)
>> - Graph.merge(graph)
>>
>> As BlankNodes are only valid within the scope of a single Graph,
>> I felt it hard to implement whether two BlankNodes are the same or not
>> without having any graph scope defined in the RDF API.
>>
>> Ivan proposed to add the following:
>>
>> pass a graph reference in the factory method
>> * BlankNode createBlankNode(graph);
>>
>> add a graph reference in BlankNode.
>> [NoInterfaceObject]
>> interface BlankNode : RDFNode {
>>    readonly attribute Graph graph;
>>    readonly attribute any value;
>> };
>>
>> Now, BlankNode.equals(node) can check for the graph the BlankNode was
>> defined in.
>>
>> The problem with this solution is that we then need to define a
>> Graph.equals(graph) method.
> 
> That I do not really understand, but that may be my Javascript incompetence.
> 
> If I create a Graph in a programming language, it has some sort of a 'handle'. It is not an identifier in the URI sense, it is, shall we say, pointer to an object in the good old C/C++ sense. That is what is stored in the Blank Node as a reference, and if these pointers are identical then, well, the blank node belongs to the same graph (or context, if you want).
> 
> So what is the problem?

I checked my libs (after wondering why this wasn't a problem for me) and 
found that I had implemented as follows:

   this.value = "_:b".concat(++api.BlankNode.NEXTID)

that's inside the blank node constructor, then the equality test just 
checks if the values are equal.

this gaurantees that each blank node in the environment has a unique id, 
and that two blank nodes are equal within that environment if they have 
the same id.

certainly never had any problems with it (and I have used the code 
heavily), and it's also the way tabulator is implemented.

likewise as per Ivan's note on references, two blank nodes are the same 
with a normal == test, since they can only be the same blank node if 
they are references to the same object.

same thing from me then, I see no problem here.

Best,

Nathan
Received on Thursday, 28 April 2011 18:32:05 UTC

This archive was generated by hypermail 2.3.1 : Tuesday, 6 January 2015 21:19:51 UTC