2016-07-21 38 views
0

Ich habe ein Problem und auch nach Stunden der Suche konnte ich keine geeignete Lösung finden. Ich möchte ein riesiges RDF-Dokument in Turtle-Syntax (~ 8GB) analysieren. Aus diesem Grund habe ich einen Stream-Ansatz gewählt, der von jena Riot angeboten wird, nämlich RDFDataMgr. Die Datei, die ich verarbeite, verwendet ungültige URIs, die Whitespaces enthalten. Dies löst eine schwerwiegende Ausnahme aus und das Parsing wird beendet. Ich möchte diese ungültigen URI für handhand erkennen und die ganze Aussage überspringen, da es sowieso keinen Nutzen hat. Ich habe die vorgeschlagene Lösung aus dem apache email archive versucht, aber wie die Ausnahme erhöht, bevor das Triple emittiert wird, funktioniert es nicht wie erwartet. Weiß jemand wo ich mich irre oder muss ich eine andere Lösung finden? Sehen Sie hier das Beispiel-Code Ich verwende:Stream Parsing von Turtle Syntax mit jena

import org.apache.jena.atlas.lib.Sink; 
import org.apache.jena.graph.Triple; 
import org.apache.jena.riot.system.StreamRDF; 
import org.apache.jena.riot.system.StreamRDFLib; 
import org.apache.jena.riot.system.StreamRDFWrapper; 
import org.apache.jena.riot.system.SyntaxLabels; 
import org.apache.jena.sparql.core.Quad; 
import org.apache.jena.riot.RDFDataMgr; 
import org.apache.jena.riot.out.SinkQuadOutput; 

import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.OutputStream; 

public class JenaStreamWrapper extends StreamRDFWrapper { 

    public static void main(String... argv) throws FileNotFoundException { 
     String filename = "file.ttl"; 
     OutputStream outputStream = new FileOutputStream(new File("file.nq")); 
     StreamRDF filtered = new JenaStreamWrapper(StreamRDFLib.writer(outputStream)); 
     RDFDataMgr.parse(filtered, filename); 
    } 

    public JenaStreamWrapper(StreamRDF other) { 
     super(other); 
    } 

    @Override 
    public void triple(Triple triple) { 
     if ((triple.getSubject().isURI() && triple.getSubject().getURI().contains(" ")) 
       || (triple.getObject().isURI() && triple.getObject().getURI().contains(" "))) 
      System.out.println(triple.getSubject().getURI()); 
     else 
      other.triple(triple); 
    } 
} 

Und hier einige Beispiel Aussagen aus dem Datensatz extrahiert:

@prefix gndo: <http://d-nb.info/standards/elementset/gnd#> . 
@prefix owl: <http://www.w3.org/2002/07/owl#> . 
@prefix dnbt: <http://d-nb.info/standards/elementset/dnb/> . 

<http://d-nb.info/gnd/117177040> a gndo:DifferentiatedPerson ; 
     owl:sameAs <http://viaf.org/viaf/64153583> ; 
     gndo:gndIdentifier "117177040" ; 
     gndo:oldAuthorityNumber "(DE-588a)117177040" , "(DE-588a)117177040670 BnF" ; 
     owl:sameAs <http://d-nb.info/gnd/117177040670 BnF> ; 
     dnbt:deprecatedUri "http://d-nb.info/gnd/117177040670 BnF" ; 
     gndo:oldAuthorityNumber "(DE-588)117177040670 BnF" ; 
     gndo:variantNameForThePerson "Jourdan, Camille" ; 
     gndo:variantNameEntityForThePerson _:node1aj1cbug9x62759112 . 

Wenn der Ausführung des Codes ich die folgende Meldung:

Exception in thread "main" org.apache.jena.riot.RiotException: [line: 9, col: 55] Bad character in IRI (space): <http://d-nb.info/gnd/117177040670[space]...> 
    at org.apache.jena.riot.system.ErrorHandlerFactory$ErrorHandlerStd.fatal(ErrorHandlerFactory.java:136) 
    at org.apache.jena.riot.lang.LangEngine.raiseException(LangEngine.java:165) 
    at org.apache.jena.riot.lang.LangEngine.nextToken(LangEngine.java:108) 
    at org.apache.jena.riot.lang.LangTurtleBase.predicateObjectItem(LangTurtleBase.java:286) 
    at org.apache.jena.riot.lang.LangTurtleBase.predicateObjectList(LangTurtleBase.java:280) 
    at org.apache.jena.riot.lang.LangTurtleBase.triples(LangTurtleBase.java:249) 
    at org.apache.jena.riot.lang.LangTurtleBase.triplesSameSubject(LangTurtleBase.java:190) 
    at org.apache.jena.riot.lang.LangTurtle.oneTopLevelElement(LangTurtle.java:46) 
    at org.apache.jena.riot.lang.LangTurtleBase.runParser(LangTurtleBase.java:89) 
    at org.apache.jena.riot.lang.LangBase.parse(LangBase.java:42) 
    at org.apache.jena.riot.RDFParserRegistry$ReaderRIOTLang.read(RDFParserRegistry.java:179) 
    at org.apache.jena.riot.RDFDataMgr.process(RDFDataMgr.java:861) 
    at org.apache.jena.riot.RDFDataMgr.parse(RDFDataMgr.java:667) 
    at org.apache.jena.riot.RDFDataMgr.parse(RDFDataMgr.java:637) 
    at org.apache.jena.riot.RDFDataMgr.parse(RDFDataMgr.java:626) 
    at org.apache.jena.riot.RDFDataMgr.parse(RDFDataMgr.java:617) 
    at zbw.tbl.schemex.additions.JenaStreamWrapper.main(JenaStreamWrapper.java:27) 

Ich bin dankbar für jeden anderen nützlichen Input.

+0

Da die Fehlermeldung sagt: Ihr IRI ein Leerzeichen enthält, die eine nicht erlaubte Zeichen ist. '' sollte '' –

+0

Danke für die Antwort, aber ich war sich dessen bewusst (siehe 4. Satz meiner Frage). Es ist jedoch in einem allgemeinen Anwendungsfall nicht möglich, alle Fehler vor dem Parsen zu überprüfen ... – Baume

Antwort

0

Ich hatte auch das gleiche Problem, aber bekam nur Warnungen und nicht tödliche Ausnahmen. Meine Jena Version ist 3.2.0. Um diese Warnungen zu stoppen, musste ich den Jena-Code ein wenig verändern. Ich überschrieb die org.apache.jena.riot.tokens.TokenizerText Klasse und verändert den Wert der privaten statischen Variablen AllowSpacesInIRI von false zu true

+0

Bitte schreiben Sie Schlüsselwörter wie 'private static' im Codestil. Lesen Sie https://stackoverflow.com/help/how-to-ask das hilft sehr und macht Ihre Fragen und Antworten lesbarer. – guenhter