当前位置: 首页 > 知识库问答 >
问题:

用jena实现Turtle语法的流解析

顾恺
2023-03-14

我有一个问题,即使经过几个小时的搜索,我也没有找到一个合适的解决方案。我想用turtle语法(~8GB)解析一个巨大的RDF文档。这就是为什么我选择了jena riot提供的流方法,即RDFDATAMGR。我正在处理的文件使用了无效的URI,这些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个答案

宋志学
2023-03-14

我也有同样的问题,但得到的只是警告,而不是致命的例外。我的Jena版本是3.2.0。为了阻止这些警告,我不得不稍微修改一下Jena代码。我覆盖了org.apache.jena.riot.Tokens.TokenizerText类,并将私有静态变量AllowSpaceSiniri的值从False更改为True

 类似资料:
  • 我正在尝试使用斯坦福CoreNLP进行法语文本。词性标记和解析工作得很好,但在我的配置中,输出依赖根本没有意义。 我的命令是

  • 我用一个递归函数尝试过它,它迭代语句,当语句不是文字时,它会跟随对象到达下一个节点。像这样: 但不知怎的,我用这个方法没有什么进展。非常感谢你的每一次洞察。

  • 本文向大家介绍Python 用turtle实现用正方形画圆的例子,包括了Python 用turtle实现用正方形画圆的例子的使用技巧和注意事项,需要的朋友参考一下 最近发现一个很有意思的画图的python库,叫做turtle,这里先说下用turtle这个库来实现用正方形画圆的思路。 每次都用乌龟(turtle)来画出一个正方形,然后通过旋转3°后,继续画一样的正方形,在通过120次循环后就实现了完

  • 我想从BioPortal阅读LNC/LOINC RDF/TURTLE版本的类,可以在http://BioPortal.bioontology.org/ontologies/LOINC/,最新提交。 我的解析代码就像 我不认为有语法错误,因为Protégé可以在没有抱怨的情况下打开文件(在日志中没有什么特别的地方)。我还尝试了缩短版本的文件,因为它是相当大的。使用大约一半的文件是有效的。但是我没有找

  • 问题内容: 我有一个包含以下内容的文本文件: 对于每一个“要素”我总是有,而且,我需要阅读。 如果可能的话,我想使用Java 8流。 是否可以模拟switch语句的行为? 问题答案: 解析此类文件的最佳方法(不使用专用的第三方库)是通过regex API及其前端类。不幸的是,目前缺少通过Stream API实现它的最佳操作。即,并且还不存在。因此,除非我们要等到Java 9,否则我们必须为Java

  • 本文向大家介绍利用Java理解sql的语法(实例讲解),包括了利用Java理解sql的语法(实例讲解)的使用技巧和注意事项,需要的朋友参考一下 select 相当于 for 循环 当执行子查询时,可以理解为 很明显这里一对多了。所以执行不对。报SQL错误 所以在 select中,应该要具体确定某一个值 当且仅当if 条件的值搜索是单个值的时候,是对应上的 那么groupBy呢? 以上这篇利用Jav