Nicolas,

Which version of Jena are you referring to? (the line number for RDFDataMgr does not seem to line up).

And what's the data being serialized? There is some BananaDRF processing applied to the data read in teh example. Could you provide (N-Triples is quite forgiving) the data or a short, standalone program that can produce it?

There is some confusion about relative URIs here.

The RDF data model is defined in terms of absolute URIs. A relative URI should never occur in an RDF graph. They can occur in RDF syntax.

A base URI on writing is used to convert an absolute URI to a relative one in the output syntax. As the base URI is also written out, the whole RDF Graph still has absolute URIs when read back in again.

The report you reference was caused by "" as a subject URI. That's not legal RDF. <> is not "".

Supplying the baseURI on writing only affects the abbreviation of URIs in the data. They must be absolute in the data in the first place.

BananaRDF has some way to use Jena so that it creates the output it wants. I thought BananaRDF achieved this by adding some sort of identifiable maker to URIs as the initial part of the URI.

        Andy

On 09/10/14 00:26, Rouquette, Nicolas F (313D) wrote:
I understand that several folks have had this exception in conjunction
with Fuseki/TDB:
http://jena.markmail.org/search/?q=BadURIException#query:BadURIException+pa
ge:1+mid:fur2joez3ny5ibvw+state:results

I've tracked down this exception in a Scala example from the w3/banana-rdf
project -- specifically:
https://github.com/w3c/banana-rdf/blob/master/examples/src/main/scala/org/w
3/banana/examples/IOExample.scala

This exception happens during the RDF/XML serialization:

Unparser.wObjStar() line: 358   
Unparser.wRDF() line: 345       
Unparser.write() line: 247      
Abbreviated.writeBody(Model, PrintWriter, String, Boolean) line: 142    
BaseXMLWriter.writeXMLBody(Model, PrintWriter, String) line: 492        
BaseXMLWriter.write(Model, Writer, String) line: 464    
Abbreviated.write(Model, Writer, String) line: 127      
BaseXMLWriter.write(Model, OutputStream, String) line: 450      
AdapterRDFWriter.write(OutputStream, Graph, PrefixMap, String, Context)
line: 52        
RDFDataMgr.write$(OutputStream, Graph, RDFFormat) line: 1262    
RDFDataMgr.write(OutputStream, Graph, RDFFormat) line: 1028     
RDFDataMgr.write(OutputStream, Graph, Lang) line: 1018  
JenaRDFWriter$$anon$1$$anonfun$write$1.apply$mcV$sp() line: 20  
JenaRDFWriter$$anon$1$$anonfun$write$1.apply() line: 17 
JenaRDFWriter$$anon$1$$anonfun$write$1.apply() line: 17 
Try$.apply(Function0) line: 191 
JenaRDFWriter$$anon$1.write(Graph, OutputStream, String) line: 17       
JenaRDFWriter$$anon$1.write(Object, OutputStream, String) line: 15      
IOExample$class.main(IOExample, Array[String]) line: 44 
IOExampleWithJena$.main(Array[String]) line: 64 
IOExampleWithJena.main(Array[String]) line: not available       


I believe the problem originates, in part, here:

RDFDataMgr.write$(OutputStream, Graph, RDFFormat) line: 1262


     private static void write$(OutputStream out, Graph graph, RDFFormat
serialization)
     {
         WriterGraphRIOT w = createGraphWriter$(serialization) ;
         w.write(out, graph, RiotLib.prefixMap(graph), null, null) ; //
line 1262
     }

The last 2 null arguments are the values for the "baseURI" and "context"
parameters.
Are all writers able to cope with a null base URI?





It seems that the Turtle writer can but not the RDF/XML writer.
The BadURIException happens during Unparser.wObjStar() when one of the
Resources has a null URI:

BaseXMLWriter.checkURI(String) line: 820        
BaseXMLWriter.relativize(String) line: 797      
Unparser.wURIreference(String) line: 918        
Unparser.wURIreference(Resource) line: 922      
Unparser.wAboutAttr(Resource) line: 913 
Unparser.wIdAboutAttrOpt(Resource) line: 869    
Unparser.wTypedNodeOrDescriptionLong(Unparser$WType, Resource, Resource,
List) line: 830 
Unparser.wTypedNodeOrDescription(Unparser$WType, Resource, Resource) line:
764     
Unparser.wTypedNode(Resource) line: 737 
Unparser.wObj(Resource, Boolean) line: 677      
Unparser.wObjStar() line: 364   

Because the writer has a null baseURI, then BaseXMLWriter.relativize(null)
returns null.
This then fails the URI check; hence the BadURIException.

To avoid this problem, I refactored the call to RDFDataMgr.write(),
originally:

def write(graph: Jena#Graph, os: OutputStream, base: String): Try[Unit] =
Try {
       import org.w3.banana.jena.Jena.ops._
       val relativeGraph : Jena#Graph = graph.relativize(URI(base))
       RDFDataMgr.write(os, relativeGraph, lang)
     }

To the following:

def write(graph: Jena#Graph, os: OutputStream, base: String): Try[Unit] =
Try {
       import org.w3.banana.jena.Jena.ops._
       val relativeGraph : Jena#Graph = graph.relativize(URI(base))
       val serialization: RDFFormat =
RDFWriterRegistry.defaultSerialization(lang)
       val wf: WriterGraphRIOTFactory =
RDFWriterRegistry.getWriterGraphFactory(serialization)
       if ( wf == null )
             throw new RiotException("No graph writer for "+serialization)
;
       val w: WriterGraphRIOT = wf.create(serialization)
       w.write(os, relativeGraph, system.RiotLib.prefixMap(relativeGraph),
base, null)
     }

This is basically a copy/paste adaptation of what the Jena API does anyway
with the difference that I pass the graph's base URI to the writer.

Well, the refactored version of the test works, the original doesn't.

- Nicolas.


Reply via email to