我试图理解给定的url是否是一个本体。(试着把它读给耶拿听)
通常情况下,不可解析页(404、HTML等)抛出各种异常和有效的RDF被Jena解析。但是一些(无效的)文件需要5-10分钟才能解析!没有高的CPU或内存使用量,什么都没有!model.read()永远不会结束。(一旦我等了一个小时!)
try {
Model model = ModelFactory.createOntologyModel();
model.read("http://dbpedia.org/page/Pizza_Deliverance"); // <- THIS LINE NEVER FINISHES!
// It is an ontology.
} catch (Exception e) {
// Jena can't parse it
}另一个挂起的代码示例:(这次Model.read由输入流提供)
// In is an InputStream that holds http://dbpedia.org/page/Pizza_Deliverance
Model model;
try {
model = ModelFactory.createOntologyModel();
model.read(in, baseUri); // <- THIS LINE NEVER ENDS.
} catch (Exception e) {
Logger.error("Error parsing file as ontology: " + baseUri, e);
return null;
}
return model;这是堆栈跟踪(如果我等待得到的话)
java.lang.NullPointerException: null
at com.hp.hpl.jena.rdf.arp.impl.XMLHandler.endElement(XMLHandler.java:133) ~[jena-core-2.10.0.jar:2.10.0]
at org.apache.xerces.parsers.AbstractSAXParser.endElement(AbstractSAXParser.java:598) ~[xercesImpl-2.11.0.jar:na]
at org.apache.xerces.impl.XMLNamespaceBinder.handleEndElement(XMLNamespaceBinder.java:835) ~[xercesImpl-2.11.0.jar:na]
at org.apache.xerces.impl.XMLNamespaceBinder.endElement(XMLNamespaceBinder.java:599) ~[xercesImpl-2.11.0.jar:na]
at org.apache.xerces.impl.dtd.XMLDTDValidator.endNamespaceScope(XMLDTDValidator.java:2099) ~[xercesImpl-2.11.0.jar:na]
at org.apache.xerces.impl.dtd.XMLDTDValidator.handleEndElement(XMLDTDValidator.java:2050) ~[xercesImpl-2.11.0.jar:na]我的问题:
编辑:解决了这个问题,方法是在另一个线程中执行解析工作,如果解析耗时太长,则终止线程。但这不是真正的解决办法。
编辑2:
我查看了源文件和堆栈跟踪的长期运行代码。如果这对您有任何意义,那么问题就在org.apache.xerces.parsers.DTDConfiguration.parse(boolean)中。
发布于 2013-04-10 20:51:34
您正在尝试将HTML页面读取到Jena模型。换句话说,您使用application/rdf+xml媒体类型为此URI发送HTTP请求。(有关链接数据中内容协商的更多信息,请参见http://wifo5-03.informatik.uni-mannheim.de/bizer/pub/LinkedDataTutorial/#Terminology )网络上的链接数据资源有重定向机制。可能,DBpedia重定向会在那里产生一个问题,例如无限重定向循环,或者可能是基于DBpedia的虚拟RDF存储存在问题。你应该问这个问题到dbpedia邮件列表,他们可以帮助你。
作为一个建议,如果您需要检查给定的URI是否返回一个链接的数据资源描述,您可以为几种不同的媒体类型(如application/rdf+xml、application/text+n3等)发送简单的HTTP,如果在指定的时间内得到任何响应,则可以使用Jena解析检索到的响应。下面是一个例子:
HttpGet get = new HttpGet();
get.setURI(URI.create("http://dbpedia.org/resource/Pizza_Deliverance"));
get.setHeader("Accept", "text/n3");
HttpClient client = new DefaultHttpClient();
HttpResponse response = client.execute(get);
HttpEntity entity = response.getEntity();
System.out.println(EntityUtils.toString(entity));此代码返回描述资源的N3文档。如果您使用"application/rdf+xml“媒体类型为您的解救 URI尝试这段代码,您将得到一个HTTP406异常。这个错误可能意味着您需要了解URI的类型。
发布于 2014-02-06 17:58:21
我对http://bio2rdf.org也有同样的问题。当我用curl请求它时,我看到它只返回HTML,就像在您的例子中一样。因此,我认为耶拿应该返回某种不可解析的异常,一旦它看到它不能理解格式。
在您的例子中,修复应该是使用正确的dbpedia资源,它是http://dbpedia.org/resource/Pizza_Deliverance而不是http://dbpedia.org/page/Pizza_Deliverance (差异是resource与page),因为http://dbpedia.org/page/Pizza_Deliverance只是在浏览器中读取它的HTML表示。
作为一个更一般的解决方法,我编写了下面的readModel-method,您可以在这里找到它:https://gist.github.com/white-gecko/8849251。如果它得到一个不被接受的数据类型的答案,它只返回null。
发布于 2013-04-10 18:42:50
几年前,我使用http://www.mindswap.org/2003/pellet/demo.shtml检查了我的本体或本体URI。也许你可以先用小球检查你的url。此页面还向您的本体复杂性提供了建议。
https://stackoverflow.com/questions/15926195
复制相似问题