У меня есть проблема, и даже после нескольких часов поиска я не смог найти подходящего решения. Я хочу проанализировать огромный документ RDF с синтаксисом черепахи (~ 8 ГБ). Вот почему я выбрал потоковый подход, предложенный jena riot, а именно RDFDataMgr. Файл, который я обрабатываю, использует недопустимые URI, которые содержат пробелы. Это вызывает фатальное исключение, и синтаксический анализ останавливается. Я хотел бы заранее распознать эти недопустимые URI и пропустить весь оператор, так как в любом случае он бесполезен. Я попробовал предложенное решение из архив электронной почты apache, но поскольку исключение возникает до того, как будет отправлена тройка, оно не работает должным образом. Кто-нибудь знает, где я ошибаюсь, или мне нужно найти другое решение? См. здесь пример кода, который я использую:
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);
}
}
А вот несколько примеров утверждений, извлеченных из набора данных:
@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 .
При выполнении кода я получаю следующее сообщение:
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)
Я благодарен за любой полезный вклад.
<http://d-nb.info/gnd/117177040670 BnF>
должно быть<http://d-nb.info/gnd/117177040670%20BnF>
- person Marvin Frommhold   schedule 24.02.2017