【问题标题】:Extracting URIs from RDF web page in Java using Jena Library使用 Jena 库从 Java 中的 RDF 网页中提取 URI
【发布时间】:2012-09-23 01:15:26
【问题描述】:

我编写了以下代码,用于从内容类型为 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 页面构建网络爬虫。 我需要输出中的所有以下链接:

       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

【问题讨论】:

  • 把 XML 放到网上并给我们 URL
  • 另外,您不应该手动遍历所有三元组。请参阅 this old answer 以简要介绍您应该在 Jena 中使用的查询语言,以从序列化模型中提取信息
  • 删除这两个无用的 cmets,并编辑您的问题以提供所需的输出,因为我无法完全理解您的问题
  • 好的。我已经完成了。并在问题本身中进行了编辑
  • 更好,但我仍然不明白您要从 哪个页面 提取 URL。我希望您知道 RDF 中的 URL 不是用于定位,而是用于识别...

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


【解决方案1】:

小错误:你的意思是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());

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

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

【讨论】:

    【解决方案2】:

    不,您不了解 RDF 的用途。爬虫是一种旨在检索在线内容并将其编入索引的程序。一个简单的爬虫可以输入一个 HTML 文档,它会下载(可能是递归的)&lt;a&gt; 元素的 href 属性中提到的所有文档。

    RDF 中充满了 URL,因此您可能认为提供给爬虫是完美的,但不幸的是,RDF 文档中的 URL 并非旨在检索其他文档。例子:

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

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

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

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

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

    【讨论】:

    • 嘿,根据 Tim Berner Lee 的链接数据的四个原则(w3.org/DesignIssues/LinkedData.html)。它应该检索有关 URI 所代表的资源的描述。
    • 它应该。不幸的是,它不会。如果您不信任,请自行尝试。而且,即使该 URL 中存在 HTML 文档,它也会描述,例如,http://ma.com/works_at 谓词,但采用某种完全专有的格式(表格?div?xml?其他?)那么你打算如何使用它?
    • 嘿..根据链接数据,在引用 URI 时,它应该根据您发送请求的标头检索 HTML 或 RDF/XML 描述。我想检索 RDF/XML 描述,如果这个 RDF/XML 描述包含更多 URI,我想抓取这些 URI。
    • 我认为您应该获取一个真正的 RDF 文档并针对它测试您的程序,而不是根据您在某处阅读的内容和列出 4 个三元组的演示 XML 来假设“链接数据”。无论如何,在某些时候你会明白我的意思。祝你的项目好运
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多