Синтаксис потока Черепаха потока с Дженой
У меня проблема, и даже после нескольких часов поиска я не смог найти подходящего решения. Я хочу проанализировать огромный документ 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)
Я благодарен за любой полезный вклад.
1 ответ
У меня тоже была та же проблема, но я получал только предупреждения, а не смертельные исключения. Моя версия Йены 3.2.0. Чтобы прекратить эти предупреждения, мне пришлось немного подправить код Jena. Я переписал org.apache.jena.riot.tokens.TokenizerText
класс и изменил значение приватной статической переменной AllowSpacesInIRI
от false
в true