4

次の sparql クエリを使用して、特定のインフォボックスに一致するページを dbpedia から抽出しています。

PREFIX dbo: <http://dbpedia.org/ontology/>
PREFIX dbpedia: <http://dbpedia.org/property/>
PREFIX res:<http://dbpedia.org/resource/>
SELECT DISTINCT *
WHERE {
?page dbpedia:wikiPageUsesTemplate ?template .
?page rdfs:label ?label .
FILTER (regex(?template, 'Infobox_artist')) .
FILTER (lang(?label) = 'en')
}
LIMIT 100

クエリのこの行で:

FILTER (regex(?template, 'Infobox_artist')) .

アーティストで始まるすべてのインフォボックスを、artist_discography など、必要のないものとして取得します。私の質問は、「infobox_artist」に正確に一致するインフォボックスのみを正規表現で取得するにはどうすればよいですか?

4

3 に答える 3

2

@ beny23 によって提案されたアプローチは機能しますが、実際には非常に非効率的です。本質的に正確な値を一致させるために正規表現を使用すると、(潜在的に) クエリ対象のエンドポイントに不必要な負担がかかります。これは悪い習慣です。

の値?templateは URI であるため、実際には値の比較を使用する必要があります (または @cygri が示すようにインラインでも):

SELECT DISTINCT * {
    ?page dbpedia:wikiPageUsesTemplate ?template .
    ?page rdfs:label ?label .
    FILTER (lang(?label) = 'en')
    FILTER (?template = <http://dbpedia.org/resource/Template:Infobox_artist> )
}
LIMIT 100

このクエリ文字列をコードで簡単に調整して、さまざまなタイプのインフォボックスを操作できます。また、SPARQL クエリの作成と実行に使用するツールキットによっては、クエリの再利用をさらに簡単にするプログラムによる代替手段がいくつかある場合があります。

たとえば、再利用できる「準備済みクエリ」を作成し、実行前に特定の値へのバインディングを設定できます。たとえば、Sesame では次のようなことができます。

String q = "SELECT DISTINCT * { " +
               " ?page dbpedia:wikiPageUsesTemplate ?template . " +
               " ?page rdfs:label ?label . " +
               " FILTER (lang(?label) = 'en') " +
               " } LIMIT 100 ";

TupleQuery query = conn.prepareTupleQuery(SPARQL, q);
URI infoboxArtist = f.createURI(DBPedia.NAMESPACE, "Template:Infobox_artist");
query.setBinding("template", infoboxArtist); 

TupleQueryResult result = query.evaluate();

(余談ですが、私は Sesame 開発チームに所属しているため、Sesame を使用した例を示していますが、他の SPARQL/RDF ツールキットにも同様の機能があることは間違いありません)

于 2012-09-11T00:20:12.993 に答える
1

文字列を直接比較したいだけなら、正規表現は必要ありません。これはより簡単で高速です。

SELECT DISTINCT * {
    ?page dbpedia:wikiPageUsesTemplate
        <http://dbpedia.org/resource/Template:Infobox_artist> .
    ?page rdfs:label ?label .
    FILTER (lang(?label) = 'en')
}
LIMIT 100
于 2012-09-10T16:44:24.020 に答える