我试图了解给定的 url 是否是本体。(通过尝试将其读入耶拿)
通常,不可解析的页面(404、HTML 等)会引发各种异常,并且 Jena 会解析有效的 RDF。但是一些(无效的)文件需要 5-10 分钟才能解析!没有高 CPU 或 RAM 使用率,什么都没有!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)
如果这对您来说意味着什么。