Java 用jena对Turtle语法进行流解析

Java 用jena对Turtle语法进行流解析,java,rdf,jena,turtle-rdf,Java,Rdf,Jena,Turtle Rdf,我有一个问题,即使经过几个小时的搜索,我也找不到合适的解决方案。我想用海龟语法(~8GB)解析一个巨大的RDF文档。这就是为什么我选择了jena riot提供的流方法,即。 我正在处理的文件使用了无效的URI,其中包含空格。这将引发一个致命异常,解析将停止。我想承认这些 前面的URI无效,请跳过整个语句,因为它无论如何都没有用处。我已经尝试了从中提出的解决方案,但是由于在发出三元组之前出现了异常,因此它无法按预期工作。有没有人知道我错在哪里,或者我必须找到另一个解决方案?请参见我正在使用的示例代

我有一个问题,即使经过几个小时的搜索,我也找不到合适的解决方案。我想用海龟语法(~8GB)解析一个巨大的RDF文档。这就是为什么我选择了jena riot提供的流方法,即。 我正在处理的文件使用了无效的URI,其中包含空格。这将引发一个致命异常,解析将停止。我想承认这些 前面的URI无效,请跳过整个语句,因为它无论如何都没有用处。我已经尝试了从中提出的解决方案,但是由于在发出三元组之前出现了异常,因此它无法按预期工作。有没有人知道我错在哪里,或者我必须找到另一个解决方案?请参见我正在使用的示例代码:

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 . 
@前缀gndo:。
@前缀owl:。
@前缀dnbt:。
gndo:与众不同的人;
猫头鹰:萨摩亚;
gndo:gndIdentifier“117177040”;
gndo:oldAuthorityNumber“(DE-588a)117177040”和“(DE-588a)117177040670 BnF”;
猫头鹰:萨摩亚;
dnbt:deprecatedUri“http://d-nb.info/gnd/117177040670 BnF”;
gndo:oldAuthorityNumber“(DE-588)117177040670 BnF”;
gndo:variantNameForThePerson“Jourdan,Camille”;
gndo:variantNameEntityForThePerson_uu0;: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)
线程“main”org.apache.jena.riot.RiotException中的异常:[行:9,列:55]IRI中的错误字符(空格):
位于org.apache.jena.riot.system.ErrorHandlerFactory$ErrorHandlerStd.fatal(ErrorHandlerFactory.java:136)
位于org.apache.jena.riot.lang.LangEngine.raiseException(LangEngine.java:165)
位于org.apache.jena.riot.lang.LangEngine.nextToken(LangEngine.java:108)
位于org.apache.jena.riot.lang.LangTurtleBase.predicateObjectItem(LangTurtleBase.java:286)
位于org.apache.jena.riot.lang.LangTurtleBase.PredicateObject列表(LangTurtleBase.java:280)
位于org.apache.jena.riot.lang.LangTurtleBase.triples(LangTurtleBase.java:249)
位于org.apache.jena.riot.lang.LangTurtleBase.triplesSameSubject(LangTurtleBase.java:190)
位于org.apache.jena.riot.lang.LangTurtle.oneTopLevelElement(LangTurtle.java:46)
位于org.apache.jena.riot.lang.LangTurtleBase.runParser(LangTurtleBase.java:89)
位于org.apache.jena.riot.lang.LangBase.parse(LangBase.java:42)
位于org.apache.jena.riot.RDFParserRegistry$ReaderRIOTLang.read(RDFParserRegistry.java:179)
位于org.apache.jena.riot.RDFDataMgr.process(RDFDataMgr.java:861)
位于org.apache.jena.riot.RDFDataMgr.parse(RDFDataMgr.java:667)
位于org.apache.jena.riot.RDFDataMgr.parse(RDFDataMgr.java:637)
位于org.apache.jena.riot.RDFDataMgr.parse(RDFDataMgr.java:626)
位于org.apache.jena.riot.RDFDataMgr.parse(RDFDataMgr.java:617)
位于zbw.tbl.schemex.additions.JenaStreamWrapper.main(JenaStreamWrapper.java:27)

我很感谢你提供的任何有用的意见

我也有同样的问题,但得到的只是警告,而不是致命的异常。我的耶拿版本是3.2.0。为了停止这些警告,我不得不稍微调整Jena代码。我重写了
org.apache.jena.riot.tokens.TokenizerText
类,并将私有静态变量
AllowSpacesInIRI
的值从
false
更改为
true

我也有同样的问题,但只得到警告,没有致命的异常。我的耶拿版本是3.2.0。为了停止这些警告,我不得不稍微调整Jena代码。我重写了
org.apache.jena.riot.tokens.TokenizerText
类,并将私有静态变量
AllowSpacesInIRI
的值从
false
更改为
true

,因为错误消息显示:您的IRI包含一个不允许的空格<代码>应该是
谢谢你的回复,但我知道这一点(见我问题的第四句)。然而,在一般的用例中,在解析之前检查所有错误是不可能的……正如错误消息所说:您的IRI包含一个不允许使用的字符的空格<代码>应该是
谢谢你的回复,但我知道这一点(见我问题的第四句)。但是,在一般用例中,在解析之前检查所有错误是不可能的……请以代码样式编写关键字,如
private static
。阅读这篇文章会有很大帮助,让你的问题和答案更具可读性。请用代码风格写一些关键字,如
private static
。阅读这篇文章会有很大帮助,让你的问题和答案更具可读性。