【问题标题】:sparql exact match regexsparql 完全匹配正则表达式
【发布时间】:2012-09-10 14:14:21
【问题描述】:

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

【问题讨论】:

    标签: regex sparql


    【解决方案1】:

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

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

    在正则表达式中。

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

    【讨论】:

    • 这给 SPARQL 端点带来了(恕我直言)不必要的负担。下面建议的替代方法。
    【解决方案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 工具包具有类似的功能)

    【讨论】:

      【解决方案3】:

      如果您只想直接比较字符串,那么您不需要正则表达式!这更简单、更快捷:

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

      【讨论】:

      • 我一开始就使用了这个查询,但是因为我有很多信息框要查询,所以我使用了正则表达式,所以我可以更改信息框的名称。谢谢!
      • @Funmatica,坏主意。对不起,但确实如此。即使您希望能够针对不同的信息框重复使用您的查询,也不应该使用正则表达式。而是使用完整的 infoxbox 模板 URI:FILTER(?template = &lt;http://dbpedia.org/resource/Template:Infobox_artist&gt; )。效率更高,对您查询的端点的负担更小,通常是更好的做法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多