这可能看起来有点尴尬,但是您关于强制转换为字符串并进行一些基于字符串的检查的评论可能是正确的。您可以使用 SPARQL 1.1 函数更有效地执行此操作strstarts
:
SELECT DISTINCT ?concept
WHERE {
?x a ?concept
FILTER ( !strstarts(str(?concept), "http://dbpedia.org/class/yago/") )
}
LIMIT 100
SPARQL 结果
另一种选择是找到一个顶级 YAGO 类,并排除那些属于rdfs:subClassOf
该顶级类的概念。从长远来看,这可能是一个更好的解决方案(因为它不需要转换为字符串,而且它基于图形结构)。不幸的是,看起来没有一个顶级 YAGO 类可与owl:Thing
. 我刚刚从DBpedia 的下载页面下载了 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 结果
我不确定哪个最终会更快。第一个需要转换为字符串,strstarts
如果以幼稚的方式实现,则必须http://dbpedia.org/class/
在每个概念中使用,然后才会出现不匹配。第二个需要九个比较,如果 IRI 被实习,则只是对象身份检查。这是一个有趣的问题,有待进一步研究。