2

我试图了解给定的 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]

我的问题:

  1. 我错过了什么吗?误用等
  2. 如果给定页面(或字符串)可解析为本体,是否有任何替代方法可以检查?

编辑: 我通过在另一个线程中解析工作并在解析时间过长时终止线程来解决这个问题。但这不是一个真正的解决方案。

编辑2:

我查看了源代码和堆栈跟踪的长时间运行代码。问题在于,org.apache.xerces.parsers.DTDConfiguration.parse(boolean)如果这对您来说意味着什么。

4

6 回答 6

2

您正在尝试将 HTML 页面读取到 Jena 模型中。换句话说,您使用 application/rdf+xml 媒体类型为此 URI 发送 HTTP 请求。(有关链接数据中的内容协商的更多信息,请参见http://wifo5-03.informatik.uni-mannheim.de/bizer/pub/LinkedDataTutorial/#Terminology) 网络上的链接数据资源存在重定向机制。可能,DBpedia 重定向会在那里产生问题,例如无限重定向循环,或者 DBpedia 底层的 virtuoso RDF 存储可能存在问题。你应该向 dbpedia 邮件列表提出这个问题,他们可以帮助你。

作为建议,如果您需要检查给定的 URI 是否返回链接的数据资源描述,您可以为几种不同的媒体类型发送简单的 HTTP get,例如 application/rdf+xml、application/text+n3 等,如果您在指定时间内收到任何响应,则使用 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));

此代码返回描述 Pizza Deliverance 资源的 N3 文档。如果您尝试使用“application/rdf+xml”媒体类型为您的http://dbpedia.org/page/Pizza_Deliverance URI 使用此代码,您将收到 HTTP 406 异常。此错误可能意味着您了解 URI 的类型。

于 2013-04-10T20:51:34.337 回答
1

我有同样的问题http://bio2rdf.org。当我用 curl 请求它时,我看到它只返回 HTML,就像你的情况一样。所以我认为 Jena 应该在看到它无法理解格式时立即返回某种 Unparsable-Exception 。

在您的情况下,修复应该是使用正确的 dbpedia 资源,而http://dbpedia.org/resource/Pizza_Deliverance不是http://dbpedia.org/page/Pizza_Deliverance(difference is resourcevs. page),因为http://dbpedia.org/page/Pizza_Deliverance它只是用于在浏览器中读取它的 HTML 表示。

作为更通用的解决方法,我编写了以下我自己的readModel方法,您应该在这里找到它:https ://gist.github.com/white-gecko/8849251 。如果它得到一个不接受的数据类型的答案,它只会返回null.

于 2014-02-06T17:58:21.120 回答
0

您可以解决以下阅读问题;

尝试使用

Model model = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM_RULE_INF, null);

代替

Model model = ModelFactory.createOntologyModel();

您可以在此处找到有关 OntModelSpec 类型的更多信息。

于 2013-04-10T19:07:12.957 回答
0

几年前,我使用http://www.mindswap.org/2003/pellet/demo.shtml检查了我的本体或本体 URI 。也许你可以先用颗粒检查你的网址。该页面还为您的本体复杂性提供了建议。

于 2013-04-10T18:42:50.810 回答
0

您正在访问http://dbpedia.org/page/Pizza_Deliverance并获得

java.lang.NullPointerException: null
at com.hp.hpl.jena.rdf.arp.impl.XMLHandler.endElement

即数据看起来已损坏。

于 2013-04-10T19:23:15.400 回答
0

您必须将基本参数放在您的读取方法中。

Model model = ModelFactory.createOntologyModel();
model.read("http://dbpedia.org/page/Pizza_Deliverance", "http://www.example.com/base/");

看起来返回的模型 URI 是相关的。我已经检查过了,它正在工作。

干杯

于 2013-04-11T08:29:36.547 回答