从基于URI前缀的DBpedia SPARQL查询中排除结果
如何在使用DBpedia SPARQL端点时排除一组概念? 我正在使用以下基本查询来获取概念列表:
SELECT DISTINCT ?concept WHERE { ?xa ?concept } LIMIT 100
SPARQL结果
这给了我一个100个概念的清单。 我想排除所有属于YAGO类/组的概念(即,其IRI以http://dbpedia.org/class/yago/
开头)。 我可以过滤出像这样的个人概念:
SELECT DISTINCT ?concept WHERE { ?xa ?concept FILTER (?concept != <http://dbpedia.org/class/yago/1950sScienceFictionFilms>) } LIMIT 100
SPARQL结果
但我似乎无法理解的是如何从我的结果中排除所有YAGO子类? 我尝试使用*
这样的,但这并没有达到什么目的:
FILTER (?concept != <http://dbpedia.org/class/yago/*>)
更新:
这个查询与regex
似乎有诀窍,但它确实,非常缓慢和丑陋。 我真的很期待更好的select。
SELECT DISTINCT ?type WHERE { [] a ?type FILTER( regex(str(?type), "^(?!http://dbpedia.org/class/yago/).+")) } ORDER BY ASC(?type) LIMIT 10
这看起来可能有些尴尬,但是你对铸造string和做一些基于string的检查的评论可能是正确的。 您可以使用SPARQL 1.1函数strstarts
更高效strstarts
:
SELECT DISTINCT ?concept WHERE { ?xa ?concept FILTER ( !strstarts(str(?concept), "http://dbpedia.org/class/yago/") ) } LIMIT 100
SPARQL结果
另一种方法是查找顶级YAGO类,并排除那些rdfs:subClassOf
顶级类的概念。 从长远来看,这可能是一个更好的解决scheme(因为它不需要强制转换为string,而是基于graphics结构)。 不幸的是,它看起来不像有一个顶级的YAGO类可以与owl:Thing
相媲美。 我只是从DBpedia的下载页面下载了YAGOtypes的层次结构,然后运行这个查询,它询问没有超类的类,
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概念不像其他一些概念那样结构化,看起来基于string的方法在这种情况下可能是最好的。 然而,如果你愿意的话,你可以做一个非string的查询,就像这样,它要求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
SPARQL结果
我不确定哪一个会变得更快。 第一个需要转换为string,而strstarts
,如果以一种天真的方式实现的话,必须在每个概念之前消费http://dbpedia.org/class/
。 第二个需要九个比较,如果IRI被拘留,只是对象身份检查。 这是一个有待进一步调查的有趣问题。