耶拿读乌龟失败了

我刚刚导入了jena库来eclipse在rdf-s上工作,这是我的第一次尝试,但我无法读取乌龟(.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序列化格式。 然后,您可以使用您的方法以正确的序列化格式读取输入和写入文件。

但我真的不明白我该怎么写这个方法。

您使用的read方法假定输入格式为RDF/XML

你需要使用其他一种读取方法 。

所以它会是:

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

以下程序将读取并遍历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 iter = new PipedRDFIterator<>(); final PipedRDFStream 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"); } } }