【问题标题】:Jena read from turtle fails耶拿从乌龟读取失败
【发布时间】:2014-02-02 17:05:32
【问题描述】:

我刚刚将 jena 库导入到 eclipse 以在 rdf-s 上工作,这是我的第一次尝试,但我无法读取 turtle (.ttl) 文件。

我是这样尝试的:

import java.io.*;
import java.util.*;
import com.hp.hpl.jena.rdf.model.*;

public class Simpsons {

public static void main(String[] args) throws IOException {
    Model model=ModelFactory.createDefaultModel();
    model.read(new FileInputStream("simpsons.ttl"),null);

}

}

我得到的错误如下:

Exception in thread "main" org.apache.jena.riot.RiotException: [line: 1, col: 1 ] Content is not allowed in prolog.
at org.apache.jena.riot.system.ErrorHandlerFactory$ErrorHandlerStd.fatal(ErrorHandlerFactory.java:136)
at org.apache.jena.riot.lang.LangRDFXML$ErrorHandlerBridge.fatalError(LangRDFXML.java:252)
at com.hp.hpl.jena.rdf.arp.impl.ARPSaxErrorHandler.fatalError(ARPSaxErrorHandler.java:48)
at com.hp.hpl.jena.rdf.arp.impl.XMLHandler.warning(XMLHandler.java:209)
at com.hp.hpl.jena.rdf.arp.impl.XMLHandler.fatalError(XMLHandler.java:239)
at org.apache.xerces.util.ErrorHandlerWrapper.fatalError(Unknown Source)
at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
at org.apache.xerces.impl.XMLScanner.reportFatalError(Unknown Source)
at org.apache.xerces.impl.XMLDocumentScannerImpl$PrologDispatcher.dispatch(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at org.apache.xerces.parsers.DTDConfiguration.parse(Unknown Source)
at org.apache.xerces.parsers.DTDConfiguration.parse(Unknown Source)
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
at com.hp.hpl.jena.rdf.arp.impl.RDFXMLParser.parse(RDFXMLParser.java:151)
at com.hp.hpl.jena.rdf.arp.ARP.load(ARP.java:119)
at org.apache.jena.riot.lang.LangRDFXML.parse(LangRDFXML.java:142)
at org.apache.jena.riot.RDFParserRegistry$ReaderRIOTFactoryImpl$1.read(RDFParserRegistry.java:142)
at org.apache.jena.riot.RDFDataMgr.process(RDFDataMgr.java:859)
at org.apache.jena.riot.RDFDataMgr.read(RDFDataMgr.java:255)
at org.apache.jena.riot.RDFDataMgr.read(RDFDataMgr.java:241)
at org.apache.jena.riot.adapters.RDFReaderRIOT_Web.read(RDFReaderRIOT_Web.java:62)
at com.hp.hpl.jena.rdf.model.impl.ModelCom.read(ModelCom.java:253)
at assignment2.Simpsons.main(Simpsons.java:11)

请帮助我提出一些想法,因为我不知道会出现什么问题,因为这是我第一次尝试 Jena。我还从某个地方得到了一个提示,我应该执行以下操作::

看来Jena不太擅长发现RDF序列化 单独在文件中使用,特别是对于使用 URL 寻址的文件。一种 解决这个问题的方法是制作一个获取文件的方法 通过使用字符串函数扩展文件名并返回 Jena 预定义字符串中的适当 RDF 序列化格式。 然后,您可以使用您的方法来读取输入和写入文件 以正确的序列化格式。

但我真的不明白我应该如何编写该方法。

【问题讨论】:

    标签: java rdf jena turtle-rdf


    【解决方案1】:

    The read method you are using 假定输入格式为RDF/XML

    您需要使用other read methods 之一。

    原来是这样:

    public static void main(String[] args) throws IOException {
        Model model=ModelFactory.createDefaultModel();
        model.read(new FileInputStream("simpsons.ttl"),null,"TTL");
    }
    

    【讨论】:

    • 甚至是当前版本的model.read("simpsons.ttl")。使用 FileInputStream 会丢失有关以“.ttl”结尾的文件名的信息。直接传递,该信息可用。
    • 链接失效,请修复。
    【解决方案2】:

    以下程序将读取并遍历 TTL 文件

    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import org.apache.jena.graph.Triple ;
    import org.apache.jena.riot.RDFDataMgr ;
    import org.apache.jena.riot.lang.PipedRDFIterator;
    import org.apache.jena.riot.lang.PipedRDFStream;
    import org.apache.jena.riot.lang.PipedTriplesStream;
    
    public class ReadingTTL
    {
        public static void main(String... argv) {
            final String filename = "yagoTransitiveType2.ttl";
    
            // Create a PipedRDFStream to accept input and a PipedRDFIterator to
            // consume it
            // You can optionally supply a buffer size here for the
            // PipedRDFIterator, see the documentation for details about recommended
            // buffer sizes
            PipedRDFIterator<Triple> iter = new PipedRDFIterator<>();
            final PipedRDFStream<Triple> inputStream = new PipedTriplesStream(iter);
    
            // PipedRDFStream and PipedRDFIterator need to be on different threads
            ExecutorService executor = Executors.newSingleThreadExecutor();
    
            // Create a runnable for our parser thread
            Runnable parser = new Runnable() {
    
                @Override
                public void run() {
                    // Call the parsing process.
                    RDFDataMgr.parse(inputStream, filename);
                }
            };
    
            // Start the parser on another thread
            executor.submit(parser);
    
            // We will consume the input on the main thread here
    
            // We can now iterate over data as it is parsed, parsing only runs as
            // far ahead of our consumption as the buffer size allows
            while (iter.hasNext()) {
                Triple next = iter.next();
                // Do something with each triple
                System.out.println("Subject:  "+next.getSubject());
                System.out.println("Object:  "+next.getObject());
                System.out.println("Predicate:  "+next.getPredicate());
                System.out.println("\n");
            }
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2016-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 2018-11-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多