[redland-dev] querying using bNodes (blank nodes)
    Chris Mungall 
    cjm at fruitfly.org
       
    Wed May 23 03:14:39 BST 2007
    
    
  
Hi all
I'm writing a simple OWL module for perl
I'm struggling to find the correct syntax to use for querying bNodes  
in either RQL or SPARQL
I'm using RDF::Redland
I first construct a query - in RDQL
	SELECT ?x1,?x2 WHERE  (?x1 rdfs:subClassOf ?x2)
This is over an OWL document so ?x2 is often an owl:Restriction bNode
I can get the bnode ID like this:
	$bnode->blank_identifier
This typically gives me something like this:
	r1179878546r8710r116
But if I feed this back in like this:
	SELECT ?x1, ?x2 WHERE  ('r1179881893r8819r1' rdf:type  
owl:Restriction),('r1179881893r8819r1' owl:someValuesFrom ?x2), 
('r1179881893r8819r1' owl:onProperty ?x1)
I get:
	Redland error: syntax error, unexpected string literal, expecting  
'?' or URI literal or QName literal
I've tried various combinations - excluding quotes, prefixing with  
_:, anon:, using angle brackets...
This *does* seem to work:
	SELECT ?x1, ?x2 WHERE  (?in rdf:type owl:Restriction),(?in  
owl:someValuesFrom ?x2),(?in owl:onProperty ?x1) AND (?in eq  
'r1179882079r8828r5')
However, this query is painfully slow; and it's a bit unnerving not  
knowing why this works and the previous doesn't
I also tried the same thing with SPARQL:
Initial query:
	SELECT ?x1,?x2 WHERE {?x1 rdfs:subClassOf ?x2}
Then I feed the bnodes back in:
	SELECT ?x1, ?x2 WHERE  {'r1179882435r8852r5' rdf:type  
owl:Restriction . 'r1179882435r8852r5' owl:someValuesFrom ?x2 .  
'r1179882435r8852r5' owl:onProperty ?x1}
However, this misses the triples
I also tried this:
	SELECT ?x1, ?x2 WHERE  {_:r1179882435r8852r5 rdf:type  
owl:Restriction . _:r1179882435r8852r5 owl:someValuesFrom ?x2 .  
_:r1179882435r8852r5 owl:onProperty ?x1}
but this returns *all* restrictions, as if _:x is being treated as a  
free variable. This is consistent with the SPARQL spec:
	"Blank nodes in graph patterns act as non-distinguished variables,  
not as references to specific blank nodes in the data being queried"
So it seems that if I want to use SPARQL I can't split my query in  
two - I would have to say
	WHERE { ?x1 rdfs:subClassOf [ rdf:type owl:Restriction ; .... ] }
And avoid explicitly mentioning bnodes altogether. This isn't my  
preferred way of doing things - there are too many combinations of  
axioms and descriptions.
Should I just stick with the slow RQL method? Will this be robust to  
future changes? I'm not as familiar with RQL as I am with SPARQL.  I  
can't find any indication of the correct thing to do here:
http://www.w3.org/Submission/2004/SUBM-RDQL-20040109/
If the RDQL treatment of bNodes evolves more in the direction of  
SPARQL then I'm hosed if I embed the bnodes...
Thanks for any help
Chris
    
    
More information about the redland-dev
mailing list