gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 06:44:47 25 4
gpt4 key购买 nike

使用 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 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 的那些概念。那个顶级类(class)。从长远来看,这可能是一个更好的解决方案(因为它不需要转换为字符串,并且它基于图形结构)。不幸的是,看起来没有一个顶级 YAGO 类可以与 owl:Thing 相媲美。 。我刚刚从 DBpedia's download page 下载了 YAGO 类型层次结构并针对它运行此查询,该查询要求没有父类(super class)的类:

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 个概念,不包括那些将这九个结果之一作为父类(super class)的概念:

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 被保留,那么这些比较只是对象身份检查。这是一个值得进一步研究的有趣问题。

关于sparql - 根据 URI 前缀从 DBpedia SPARQL 查询中排除结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19044871/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com