根据 URI 前缀从 DBpedia SPARQL 查询中排除结果

2024-04-29

使用时如何排除一组概念DBpedia SPARQL 端点 http://dbpedia.org/sparql?我使用以下基本查询来获取概念列表:

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

这给了我 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

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

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

Update:

此查询与regex似乎可以解决问题,但它真的非常非常慢而且丑陋。我真的很期待有更好的选择。

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

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

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

另一种选择是找到一个顶级 YAGO 类,并排除那些概念rdfs:subClassOf那个顶级班级。从长远来看,这可能是一个更好的解决方案(因为它不需要转换为字符串,并且它基于图形结构)。不幸的是,它看起来并不在那里is单个顶级 YAGO 类可与owl:Thing。我刚刚下载了 YAGO 类型层次结构DBpedia 的下载页面 http://wiki.dbpedia.org/Downloads39#yago-type-hierarchy并运行此查询,该查询要求没有超类的类:

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 个概念,不包括那些将这 9 个结果之一作为超类的概念:

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

我不确定哪个最终会更快。第一个需要转换为字符串,并且strstarts,如果以幼稚的方式实现,则必须消耗http://dbpedia.org/class/在每个概念之前,某些东西是不匹配的。第二个需要九次比较,如果 IRI 被保留,那么这些比较只是对象身份检查。这是一个值得进一步研究的有趣问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

根据 URI 前缀从 DBpedia SPARQL 查询中排除结果 的相关文章

随机推荐