【问题标题】:Exclude results from DBpedia SPARQL query based on URI prefix基于 URI 前缀从 DBpedia SPARQL 查询中排除结果
【发布时间】:2013-09-27 07:15:01
【问题描述】:

使用DBpedia SPARQL endpoint时如何排除一组概念?我正在使用以下基本查询来获取概念列表:

SELECT DISTINCT ?concept
WHERE {
    ?x a ?concept
}
LIMIT 100

SPARQL Results

这给了我一个包含 100 个概念的列表。我想排除所有属于 YAGO 类/组的概念(即,其 IRI 以 http://dbpedia.org/class/yago/ 开头)。我可以像这样过滤掉单个概念:

SELECT DISTINCT ?concept
WHERE {
    ?x a ?concept
    FILTER (?concept != <http://dbpedia.org/class/yago/1950sScienceFictionFilms>)
}
LIMIT 100

SPARQL Results

但我似乎无法理解的是如何从我的结果中排除所有 YAGO 子类?我尝试使用这样的*,但这并没有取得任何成果:

FILTER (?concept != <http://dbpedia.org/class/yago/*>)

更新:

这个带有regex 的查询似乎可以解决问题,但它确实非常非常缓慢且丑陋。我真的很期待更好的选择。

SELECT DISTINCT ?type WHERE {
  [] a ?type
  FILTER( regex(str(?type), "^(?!http://dbpedia.org/class/yago/).+"))
}
ORDER BY ASC(?type)
LIMIT 10

【问题讨论】:

    标签: sparql dbpedia


    【解决方案1】:

    这可能看起来有点尴尬,但是您关于强制转换为字符串并进行一些基于字符串的检查的评论可能是正确的。您可以使用 SPARQL 1.1 函数strstarts 更高效地完成它:

    SELECT DISTINCT ?concept
    WHERE {
        ?x a ?concept
        FILTER ( !strstarts(str(?concept), "http://dbpedia.org/class/yago/") )
    }
    LIMIT 100
    

    SPARQL Results

    另一种选择是找到一个顶级 YAGO 类,并排除那些 rdfs:subClassOf 顶级类的概念。从长远来看,这可能是一个更好的解决方案(因为它不需要转换为字符串,而且它基于图形结构)。不幸的是,看起来没有一个顶级 YAGO 类可与owl:Thing 相媲美。我刚刚从DBpedia's download page 下载了 YAGO 类型层次结构并运行了这个查询,它要求没有超类的类:

    prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
    
    select distinct ?root where {
      [] rdfs:subClassOf ?root 
      filter not exists { ?root rdfs:subClassOf ?superRoot }
    }
    

    我得到了这九个结果:

    ----------------------------------------------------------------
    | root                                                         |
    ================================================================
    | <http://dbpedia.org/class/yago/YagoLegalActorGeo>            |
    | <http://dbpedia.org/class/yago/WaterNymph109550125>          |
    | <http://dbpedia.org/class/yago/PhysicalEntity100001930>      |
    | <http://dbpedia.org/class/yago/Abstraction100002137>         |
    | <http://dbpedia.org/class/yago/YagoIdentifier>               |
    | <http://dbpedia.org/class/yago/YagoLiteral>                  |
    | <http://dbpedia.org/class/yago/YagoPermanentlyLocatedEntity> |
    | <http://dbpedia.org/class/yago/Thing104424418>               |
    | <http://dbpedia.org/class/yago/Dryad109551040>               |
    ----------------------------------------------------------------
    

    鉴于 YAGO 概念不像其他一些概念那样结构化,看起来基于字符串的方法在这种情况下可能是最好的。但是,如果您愿意,您可以像这样进行基于非字符串的查询,它要求 100 个概念,不包括那些将这九个结果之一作为超类的概念:

    select distinct ?concept where {
      [] a ?concept .
      filter not exists {
        ?concept rdfs:subClassOf* ?super .
        values ?super { 
          yago:YagoLegalActorGeo
          yago:WaterNymph109550125
          yago:PhysicalEntity100001930
          yago:Abstraction100002137
          yago:YagoIdentifier
          yago:YagoLiteral
          yago:YagoPermanentlyLocatedEntity
          yago:Thing104424418
          yago:Dryad109551040
        }
      }
    }
    limit 100
    

    SPARQL Results

    我不确定哪个最终会更快。第一个需要转换为字符串,而strstarts,如果以幼稚的方式实现,则必须在每个概念中使用http://dbpedia.org/class/,然后才会出现不匹配。第二个需要九个比较,如果 IRI 被实习,则只是对象身份检查。这是一个值得进一步研究的有趣问题。

    【讨论】:

    • 谢谢约书亚。你在一个答案中教会了我两件事:) 最好的问候
    • @MohammadAmir 我实际上想到排除这九个顶级超类并不难,所以我更新了我的答案。如果您有机会进行比较并最终发现性能差异,请报告!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-22
    • 2016-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多