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.
Da die Fehlermeldung sagt: Ihr IRI ein Leerzeichen enthält, die eine nicht erlaubte Zeichen ist. '' sollte '' –
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