Re: cwm/sparql mystery

OK. In the extremely unlikely event that there is anyone reading this list 
who is as clueless and as at-sea as I am, I will answer my own question as 
search bait:

The clue (after a ridiculous amount of trial and error) was when I finally 
asked cwm to serialize the results of my query as n3 thus:

%cwm --rdf /path/to/rdf/model.rdf --sparql=/path/to/sparql/query.txt --n3

Doing this gave me sensible results, but they took the form of a "quoted" 
graph. In such a graph, the query variables I was searching for are 
expressed like this:

     {
         "Some Literal"     :bound "label" .
         "2008-01-02"^^xsd:date     :bound "start" .
         "2008-01-04"^^xsd:date     :bound "end" .
         Event:case2     :bound "event" .

         }     a :Result .

This means that if the values you're searching for contain a literal, 
those literals are expressed as the SUBJECTS of the resulting triples and 
if you ask for --rdf output, cwm will complain:

"ValueError: Bad subject of statement: Some Literal.
                 RDF/XML cannot serialize a graph in which a subject is a 
literal."

This is apparently the problem also if what you're searching for is a 
datatyped literal like "2008-01-04"^^xsd:date, in which case the somewhat 
less explicit runtime error:

"RuntimeError: ('Unexpected subject', "(21, ('2008-01-04', 
u'http://www.w3.org/2001/XMLSchema#date'))")"

Asking for --n3 output avoids this because, apparently, the "quoted graph" 
style of representing a sparql query result doesn't care if the subjects 
are literals.

The solution, for my purposes at any rate, was to use a CONSTRUCT query, 
instead of a SELECT, thus:

CONSTRUCT {?event ex:hasdate ?date; ex:hasstart ?start; ex:hasend ?end; 
ex:haslabel ?label.}

This way, the literals that are bound to the query variables are forced to 
be objects of triples and can thus be serialized as either rdf/xml or n3:

<rdf:Description rdf:about="http://temp.example.org/terms/Event#case2">
    <hasend 
rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2008-01-04</hasend>
    <haslabel>Some Literal</haslabel>
    <hasstart 
rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2008-01-02</hasstart>
</rdf:Description>

Though it's not exactly to the point, and though much of it is over my 
head, the discussion of design issues at: 
http://www.w3.org/DesignIssues/N3QL.html was helpful in clarifying some of 
the underlying issues for me.

Open question: I still haven't worked out why, with this graph and this 
query, asking cwm to report with --sparqlResults gives me this Import 
Error:

Traceback (most recent call last):
   File "/Applications/RDFapps/cwm-1.2.1/cwm", line 750, in <module>
     doCommand()
   File "/Applications/RDFapps/cwm-1.2.1/cwm", line 698, in doCommand
     from cwm_sparql import outputString, SPARQL_NS
ImportError: No module named cwm_sparql

Another Open question: I still haven't been able to coax the rdflib sparql 
implementation to give me similarly sensible results with this test query; 
but that's another story for another list I suppose.

Best,
Jon

Received on Saturday, 1 November 2008 21:00:40 UTC