【问题标题】:Jena, reading a model takes foreverJena,阅读模型需要很长时间
【发布时间】:2013-04-10 12:43:45
【问题描述】:

我试图了解给定的 url 是否是本体。 (通过尝试将其读入 Jena)

通常,不可解析的页面(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) 如果这对你有什么意义的话。

【问题讨论】:

    标签: performance jena xerces


    【解决方案1】:

    您正在尝试将 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 文档。如果您尝试使用此代码为您的 http://dbpedia.org/page/Pizza_Deliverance URI 使用“application/rdf+xml”媒体类型,您将收到 HTTP 406 异常。此错误可能意味着您了解 URI 的类型。

    【讨论】:

    • 实际上,org.apache.xerces.parsers.DTDConfiguration.parse(boolean) 异常在读取检索到的文档的 DTD 文件时指出错误。 Jena 的接受标头 "application/rdf+xml, application/xml; q=0.8, text/xml; q=0.7, application/rss+xml; q=0.3, /; q=0.2" 返回使用 RDFa 注释的 HTML 文档。我可以手动下载该文档中指向的 DTD。该文档 (w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd) 中是否有任何错误? @andys
    • 我尝试解析 DTD 文件。 HttpGet get = new HttpGet(); get.setURI(URI.create("http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd")); HttpClient client = new DefaultHttpClient(); HttpResponse response = client.execute(get); HttpEntity entity = response.getEntity(); new DTDConfiguration().parse(new XMLInputSource("-//W3C//DTD XHTML+RDFa 1.0//EN", null, EntityUtils.toString(entity))); 但是,得到了错误。 Exception in thread "main" java.net.MalformedURLException at java.net.URL.&lt;init&gt;(URL.java:601) ... at org.apache.xerces.parsers.DTDConfiguration.parse(Unknown Source)
    • 我更改了我的Accept 标头以请求具有高优先级的rdf,并且我从各种来源获得的有效本体急剧增加!感谢您指出了这一点。但是,这并没有解决我的问题。我使用ning-async-http-library (我的框架提供它) 将 URL 下载到了 InputStream 中,并为 Jena model.read() 提供了输入流和基本 uri。仍然解析挂起。
    • 我认为,创建InputStream 并不意味着您下载了URI 的内容。 model.read() 方法实际上是从给定的流中检索内容。因此,我认为您只是绕过了内容协商。但是,主要问题似乎是读取检索到的 XHTML 页面中指出的 DTD。
    【解决方案2】:

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

    在您的情况下,修复应该是使用正确的 dbpedia 资源,即 http://dbpedia.org/resource/Pizza_Deliverance 而不是 http://dbpedia.org/page/Pizza_Deliverance(区别是 resourcepage),因为 http://dbpedia.org/page/Pizza_Deliverance 只是 HTML 表示在浏览器中阅读。

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

    【讨论】:

    • 我刚刚更新了它现在应该可以工作的代码,如果找不到任何可用的东西,至少它会返回null
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      你可以解决如下阅读问题;

      尝试使用

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

      而不是

      Model model = ModelFactory.createOntologyModel();

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

      【讨论】:

      • 它没有做任何改变。我只是查看了源代码和堆栈跟踪的长时间运行代码。问题出在org.apache.xerces.parsers.DTDConfiguration.parse(boolean)(但这并没有告诉我任何事情)
      【解决方案5】:

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

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

      即数据似乎已损坏。

      【讨论】:

      • 是的,数据已损坏。但是,我在 5 分钟 后得到了该异常。这不应该是正常的。
      【解决方案6】:

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

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

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

      干杯

      【讨论】:

      • 其实我自己下载文件,在我的开发中提供model.readinput streambase uri(我简化了我的问题代码。但提供的有问题的示例也有问题。) 所以提供基本参数并没有解决我的问题。但是,如果您提供的代码有效,那么您的环境是什么?你用的是哪个java版本?您使用的是哪个虚拟机?您正在使用哪个操作系统? Jena 使用的是哪个 xerces 版本?您使用的是哪个耶拿版本?你能提供吗?
      • maven 依赖 org.apache.jenaapache-jena2.7.4pom OS: linux ubunu 12.04 JAVA 1.7 我只是想强调一下,当我尝试执行你的代码时,我遇到了和你描述的一样的问题。
      • 我会调查的。感谢您的亮点。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-02
      • 1970-01-01
      • 1970-01-01
      • 2017-11-13
      • 2013-09-07
      • 2020-08-26
      相关资源
      最近更新 更多