sparql完全匹配正则表达式

时间:2012-09-10 14:14:22

标签: regex sparql

我正在使用以下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”的信息框?

3 个答案:

答案 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