使用Jena Library从Java中的RDF网页中提取URI

时间:2012-09-22 13:21:02

标签: java xml-parsing web-crawler rdf jena

我编写了以下代码,用于从链接数据应用程序的内容类型为application/rdf-xml的网页中提取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

我在输出中要求该页面上的所有URI为RDF页面构建Web爬网程序。 我需要输出中的所有以下链接:

       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

2 个答案:

答案 0 :(得分: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看到的ex:editor输出。

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

答案 1 :(得分:1)

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

RDF充满了网址,因此您可能认为提供抓取工具非常理想,但遗憾的是,RDF文档中的网址并非用于检索其他文档。例子:

这可能是巧合吗?我不这么认为。事实上,RDF旨在描述现实世界,并且它可以以XML格式序列化,但XML不是the only available serialization

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

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

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

我不知道你为什么要构建你的爬虫以及它应该做什么,但当然RDF并不是你需要做的工作。