我正在使用以下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”的信息框?
答案 0 :(得分:5)
由于它是正则表达式,您应该能够按如下方式限制搜索:
FILTER (regex(?template, '^Infobox_artist$')) .
^
是字符串的开头$
是字符串的结尾在正则表达式中。
注意:我没有使用过sparql,所以这可能无法正常工作。
答案 1 :(得分: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的示例,因为我在芝麻开发团队,但毫无疑问其他SPARQL / RDF工具包具有类似的功能)
答案 2 :(得分:1)
如果您只想进行直接字符串比较,那么您就不需要正则表达式!这更简单,更快捷:
SELECT DISTINCT * {
?page dbpedia:wikiPageUsesTemplate
<http://dbpedia.org/resource/Template:Infobox_artist> .
?page rdfs:label ?label .
FILTER (lang(?label) = 'en')
}
LIMIT 100