2013-04-10 28 views
2

我想了解一个给定的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. 我错过了什么吗? Misusage等
  2. 如果给定的页面(或字符串)可以解析为本体,是否有任何替代方法检查?

编辑: 我工作围绕这一问题,在另一个线程做分析工作,并杀死线程,如果解析时间过长。但这不是一个真正的解决方案。

编辑2:

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

回答

0

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

尝试使用

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

代替

Model model = ModelFactory.createOntologyModel();

你可以找到关于OntModelSpec类型here更多信息。

+0

它没有做任何改变。我只是看着源代码和堆栈追踪长时间运行的代码。问题出现在'org.apache.xerces.parsers.DTDConfiguration.parse(boolean)'中(但这并不能告诉我什么) – 2013-04-10 19:20:55

0

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

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

即数据看起来是腐败。

+0

是的,数据已损坏。但是,** 5分钟**后我得到了这个异常。这不应该是正常的。 – 2013-04-10 19:24:52

2

您正在尝试读取Jena模型的HTML页面。换句话说,您使用application/rdf + xml媒体类型发送此URI的HTTP请求。 (有关链接数据中内容协商的更多信息,请参阅http://wifo5-03.informatik.uni-mannheim.de/bizer/pub/LinkedDataTutorial/#Terminology)Web上存在链接数据资源的重定向机制。 DBpedia重定向可能会在那里造成问题,例如,无限的重定向循环,或者DBpedia底层的虚拟RDF存储有问题。你应该问这个问题到dbpedia邮件列表,他们可以帮助你。作为一个建议,如果你需要检查给定的URI是否返回链接的数据资源描述,你可以发送简单的HTTP获取几种不同的媒体类型,比如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的类型。

+0

实际上,'org.apache.xerces.parsers.DTDConfiguration.parse(boolean)'异常在读取检索文档的DTD文件时指出错误。 Jena的accept头文件“application/rdf + xml,application/xml; q = 0.8,text/xml; q = 0.7,application/rss + xml; q = 0.3,*/*; q = 0.2”返回HTML文档用RDFa注释。我可以下载手动指向该文档的DTD。该文件中的任何错误(http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd)? @andys – tayfunhalac 2013-04-10 21:21:09

+0

我试图解析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); \t HttpEntity entity = response.getEntity(); new DTDConfiguration()。parse(new XMLInputSource(“ - // W3C // DTD XHTML + RDFa 1.0 // EN”,null,EntityUtils.toString(entity)));'但是,得到了错误。 '在java.net.URL的线程“主”java.net.MalformedURLException中出现异常。 (URL.java:601)... at org.apache.xerces.parsers.DTDConfiguration.parse(Unknown Source)' – tayfunhalac 2013-04-10 22:16:15

+0

我改变了自己的'Accept'标头来请求高优先级的rdf以及从各种来源获得的有效本体急剧增加!感谢您指出了这一点。但是,这并没有解决我的问题。我使用'ning-async-http-library' _(我的框架提供它)将URL下载到'InputStream'中,并提供了带输入流和基本uri的Jena'model.read()。仍解析挂起。 – 2013-04-11 13:32:49

0

您必须将base参数放入您的读取方法中。

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

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

干杯

+0

实际上,我自己下载文件,并在我的开发中提供'model.read'输入流和'基础uri'。 _(我简化了代码的问题,但提供的示例也存在问题。)_因此提供基本参数并不能解决我的问题。但是,如果您提供的代码有效,您的环境是什么?你使用哪个Java版本?你在使用哪个虚拟机?你在哪个操作系统上工作? Jena使用哪个版本?你使用哪个耶拿版本?你能提供他们吗? – 2013-04-11 13:25:06

+0

行家依赖 org.apache.jena Apache的耶拿 2.7.4 POM 操作系统:Linux ubunu 12.04 JAVA 1.7 我只是想强调的是,当我试图执行你的代码我有这样的问题,就像你描述的那样。 – speedingdeer 2013-04-11 13:29:38

+1

我会调查它。谢谢你的亮点。 – 2013-04-11 13:39:52

1

我有同样的问题与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

+0

我刚刚更新了它现在应该工作的代码,至少如果它找不到任何可用的东西,它会返回'null'。 – 2014-02-07 12:29:24