2012-09-22 43 views
0

我已经编写了以下代码,用于从链接数据应用程序的内容类型为application/rdf-xml的网页中提取URI。使用Jena Library从Java中的RDF网页中提取URI

public static void test(String url) { 
    try { 
     Model read = ModelFactory.createDefaultModel().read(url); 
     System.out.println("to go"); 
     StmtIterator si; 
     si = read.listStatements(); 
     System.out.println("to go"); 
     while(si.hasNext()) { 
      Statement s=si.nextStatement(); 
      Resource r=s.getSubject(); 
      Property p=s.getPredicate(); 
      RDFNode o=s.getObject(); 
      System.out.println(r.getURI()); 
      System.out.println(p.getURI()); 
      System.out.println(o.asResource().getURI()); 
     } 
    } 
    catch(JenaException | NoSuchElementException c) {} 
} 

但对于输入

<?xml version="1.0"?> 
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
    xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:ex="http://example.org/stuff/1.0/"> 
    <rdf:Description rdf:about="http://www.w3.org/TR/rdf-syntax-grammar" 
     dc:title="RDF/XML Syntax Specification (Revised)"> 
     <ex:editor> 
      <rdf:Description ex:fullName="Dave Beckett"> 
       <ex:homePage rdf:resource="http://purl.org/net/dajobe/" /> 
      </rdf:Description> 
     </ex:editor> 
    </rdf:Description> 
</rdf:RDF> 

输出是:

Subject URI is http://www.w3.org/TR/rdf-syntax-grammar 
Predicate URI is http://example.org/stuff/1.0/editor 
Object URI is null 
Subject URI is http://www.w3.org/TR/rdf-syntax-grammar 
Predicate URI is http://purl.org/dc/elements/1.1/title 
Website is read 

我需要在输出目前该网页建立RDF页面的网络爬虫上的所有URI。 我需要输出的所有访问以下链接:

 http://www.w3.org/TR/rdf-syntax-grammar 
     http://example.org/stuff/1.0/editor 
     http://purl.org/net/dajobe 
     http://example.org/stuff/1.0/fullName 
     http://www.w3.org/TR/rdf-syntax-grammar 
     http://purl.org/dc/elements/1.1/title 
+0

把XML网上,给我们另外,你不应该在所有的三元手动迭代的URL – Raffaele

+0

。请参阅[这个旧答案](http://stackoverflow.com/a/12236809/315306)简要介绍您应该在Jena中使用的查询语言以从序列化模型中提取信息 – Raffaele

+0

删除这两个无用的评论,并编辑您的问题提供所需的输出,因为我不能完全理解您的问题 – Raffaele

回答

2

小错误:你的意思是application/rdf+xml(注意加号)。

无论如何,你的问题很简单:

catch(JenaException | NoSuchElementException c) {} 

坏!你在这里失踪抛出的错误,并且输出被截断:

System.out.println(o.asResource().getURI()); 

o不是总是一个资源,这将打破对三联

<http://www.w3.org/TR/rdf-syntax-grammar> dc:title "RDF/XML Syntax ..." 

,所以你需要要警惕的是:

if (o.isResource()) System.out.println(o.asResource().getURI()); 

或者更具体地说:

if (o.isURIResource()) System.out.println(o.asResource().getURI()); 

它将跳过您看到的的null输出。

现在写一千倍我不会吞下例外 :-)

+0

是.. ..感谢很多..现在它的作品。 –

1

不,你不明白RDF的用途。抓取工具是一种旨在检索在线内容并将其编入索引的程序。一个简单的爬虫可以用HTML文档提供,它会下载(或者递归地)属性<a>元素中提到的所有文档。

RDF充满了URLs,所以您可能认为它是完美的提供爬虫,但不幸的是,RDF文档中的URL并非用于检索其他文档。实例:

它可以是一个巧合?我不这么认为。事实是,RDF旨在描述真实世界并且恰好它可以以XML形式序列化,但XML不是the only available serialization

那么,文档中使用的URL是什么?他们使用来命名东西。你知道多少约翰?可能有几十个,还有成千上万的约翰存在......但是,如果我拥有域example.com,我可以使用URL http://example.com/friends/John来引用我的朋友John。 RDF可以用来描述你的朋友约翰工作在123,美国广播公司的途径,通过两个URL和一个字符串

"http://me.com/John" "http://me.com/works_at" "123, Abc avenue" 

这被称为三重,以及其中包含的网址并不意味着点所以可以通过TCP套接字和理解HTTP协议的客户端来获取。请注意,您的朋友(约翰)和谓词(工作地点)都通过URL在三元组中引用。但是,如果你在浏览器中尝试这些URL,你什么也得不到。

我不知道你为什么要构建抓取工具以及它应该做什么,但肯定RDF不是你需要做的工作。

+0

hey根据Tim Berner Lee关于链接数据的四个原则(http://www.w3.org/DesignIssues/LinkedData.html)。它应该检索关于URI代表的资源的描述。 –

+0

它*应*。不幸的是它*不会*。如果你不信任,就自己试试。而且,即使在该URL中存在HTML文档,它也会描述例如“http:// ma.com/works_at”谓词,但是以某种完全专有的格式(table?divs?xml?other?)那么你打算如何使用它? – Raffaele

+0

嘿..根据链接数据,关于URI的引用,它应该检索HTML或RDF/XML描述,具体取决于您发送请求的标头。我想检索RDF/XML描述,如果这个RDF/XML描述包含更多的URI,我想抓取这些URI。 –