0

LinkedDataapplication/rdf-xmlアプリケーションのコンテンツタイプのWebページから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ページ用のWebクローラーを構築するには、出力にそのページに存在するすべての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
4

2 に答える 2

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

今、私は例外を飲み込まない1000回書く:-)

于 2012-09-22T17:15:26.063 に答える
1

いいえ、RDFが何に使用されているのか理解できません。クローラーは、オンラインコンテンツを取得してインデックスを作成するために設計されたプログラムです。単純なクローラーにHTMLドキュメントをフィードすると、要素のhref属性に記載されているすべてのドキュメントが(おそらく再帰的に)ダウンロードされます。<a>

RDFはURLでいっぱいなので、クローラーにフィードするのは完璧だと思うかもしれませんが、残念ながらRDFドキュメントのURLは他のドキュメントを取得することを目的としていません。例:

それは偶然の一致でしょうか?私はそうは思わない。事実、RDFは現実の世界を記述することを目的としており、XML形式でシリアル化できることもありますが、使用可能なシリアル化はXMLだけではありません。

では、ドキュメントで使用されるURLは何ですか?それらは物に名前を付けるために使用されます。ジョンは何人知っていますか?おそらく数十、そしてまだ数千のジョンが存在します...しかし、example.com私がドメインを所有している場合は、URLhttp://example.com/friends/Johnを使用してジョンという名前の友人を参照できます。RDFを使用して、2つのURLと1つの文字列を使用して、友人のJohnが123、Abcavenueで働いていることを説明できます。

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

これはトリプルと呼ばれ、そこに含まれるURLはポイントすることを意図していないため、TCPソケットとHTTPプロトコルを理解するクライアントを介して取得できるものがあります。友達(ジョン)と述語(で働いている)の両方がURLを介してトリプルで参照されていることに注意してください。しかし、ブラウザでこれらのURLを試してみると、何も得られません。

なぜクローラーを構築しているのか、それが何をするのかはわかりませんが、RDFはあなたが仕事をするために必要なものではありません。

于 2012-09-22T16:32:30.610 に答える