Потоковой анализ синтаксиса черепахи с помощью jena

У меня есть проблема, и даже после нескольких часов поиска я не смог найти подходящего решения. Я хочу проанализировать огромный документ 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)

Я благодарен за любой полезный вклад.


person Baume    schedule 21.07.2016    source источник
comment
Как говорится в сообщении об ошибке: ваш IRI содержит пробел, который является запрещенным символом. <http://d-nb.info/gnd/117177040670 BnF> должно быть <http://d-nb.info/gnd/117177040670%20BnF>   -  person Marvin Frommhold    schedule 24.02.2017
comment
Спасибо за ответ, но я знал об этом (см. 4-е предложение моего вопроса). Однако проверка всех ошибок перед синтаксическим анализом в общем случае невозможна...   -  person Baume    schedule 27.02.2017


Ответы (1)


У меня тоже была такая же проблема, но я получал только предупреждения, а не фатальные исключения. Моя версия Jena 3.2.0. Чтобы отключить эти предупреждения, мне пришлось немного изменить код Jena. Я перезаписал класс org.apache.jena.riot.tokens.TokenizerText и изменил значение частной статической переменной AllowSpacesInIRI с false на true.

person ashu.tosh    schedule 17.05.2017
comment
Напишите ключевые слова, такие как private static, в стиле кода. Прочитайте stackoverflow.com/help/how-to-ask, это очень помогает и делает ваши вопросы и ответы более читабельными. . - person guenhter; 17.05.2017