首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Jena库从Java中提取RDF网页中的URI

用Jena库从Java中提取RDF网页中的URI
EN

Stack Overflow用户
提问于 2012-09-22 21:21:02
回答 2查看 1K关注 0票数 0

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

代码语言:javascript
复制
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) {}
}

但是对于输入

代码语言:javascript
复制
<?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>

输出为:

代码语言:javascript
复制
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

我需要在输出中的所有URI存在于该页面上,以建立一个RDF页面的网络爬虫。我需要在输出中的所有以下链接:

代码语言:javascript
复制
       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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-23 01:15:26

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

不管怎样,你的问题很简单:

代码语言:javascript
复制
catch(JenaException | NoSuchElementException c) {}

坏的!您遗漏了这里抛出的错误,并且输出被截断:

代码语言:javascript
复制
System.out.println(o.asResource().getURI());

o并不总是一个资源,这将在三元组上中断

代码语言:javascript
复制
<http://www.w3.org/TR/rdf-syntax-grammar> dc:title "RDF/XML Syntax ..."

因此,您需要防范这种情况:

代码语言:javascript
复制
if (o.isResource()) System.out.println(o.asResource().getURI());

或者更具体的是:

代码语言:javascript
复制
if (o.isURIResource()) System.out.println(o.asResource().getURI());

这将跳过您在ex:editor中看到的null输出。

现在写一千遍我不会吞下异常:-)

票数 2
EN

Stack Overflow用户

发布于 2012-09-23 00:32:31

不,您不了解RDF是用来做什么的。爬虫程序是一种用于检索在线内容并对其进行索引的程序。一个简单的爬虫可以提供一个超文本标记语言文档,它将下载(可能是递归地) <a>元素的href属性中提到的所有文档。

RDF充满了URL,因此您可能认为它是提供爬虫的完美工具,但不幸的是,RDF文档中的URL并不是用来检索其他文档的。示例:

  • http://example.org/stuff/1.0/editor 404 not found
  • http://purl.org/net/dajobe 302 Moved Temporarily
  • http://example.org/stuff/1.0/fullName 404 not found
  • http://www.w3.org/TR/rdf-syntax-grammar 301 Moved Permanently
  • http://purl.org/dc/elements/1.1/title 302 Moved Temporarily

这会是巧合吗?我不这样认为。事实是,RDF的目的是描述现实世界,碰巧它可以以XML形式序列化,但XML不是the only available serialization

那么,URL在文档中的用途是什么呢?它们被用来命名为。你认识几个约翰?可能有几十个,还有几千个约翰...但是,如果我拥有域名example.com,我可以使用URL http://example.com/friends/John来引用我的朋友约翰。RDF可以通过两个URLs和一个字符串来描述您的朋友John在Abc大道123号工作。

代码语言:javascript
复制
"http://me.com/John"   "http://me.com/works_at"   "123, Abc avenue"

这被称为三元组,其中包含的URL并不意味着指向可通过TCP套接字和理解HTTP协议的客户端检索的内容。请注意,您的朋友(John) 和谓词(在哪里工作)都通过URL在三元组中被引用。但是如果你在浏览器中尝试这些URL,你将什么也得不到。

我不知道您为什么要构建爬虫,以及它应该做什么,但RDF肯定不是您完成工作所需的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12544134

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档