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

6

由于它是一个正则表达式,您应该能够按如下方式限制搜索:

FILTER (regex(?template, '^Infobox_artist$')) .
  • ^是字符串的开头
  • $是字符串的结尾

在正则表达式中。

注意:我没有使用过 sparql,所以这可能行不通。

于 2012-09-10T14:33:43.190 回答
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 回答