我正在尝试将DBPedia类型映射到Wikipedia Categories,一个简单的例子就是以下SPARQL查询
select distinct ?cat where {
?s a dbpedia-owl:LacrossePlayer; dcterms:subject ?cat . filter(regex(?cat,'players','i') )
} limit 100
SPARQL Result
但这非常低效,因为它必须首先将DBpedia类型映射到DBpedia命名实体(资源),然后提取其相应的Wikipedia类别。我正在尝试为许多其他DBpedia类型执行此映射
是否有直接或更有效的方法来做到这一点?
答案 0 :(得分:1)
作为初步说明,如果您删除或改进过滤器,可能会获得一些加速。当然,你可以删除它,但你也可以使它更有效率,因为你并没有真正使用任何特殊的正则表达式。只是做
filter contains(lcase(str(?cat)),'players')
检查?cat 的URI是否包含字符串 players 。甚至可能更好(我不确定)抓住?cat 的英文 rdfs:label 并检查一下,因为你不会有做案例或字符串转换。
但这是非常低效的,因为它必须首先映射DBpedia 类型到DBpedia命名实体(资源),然后提取他们的 相应的维基百科类别。我正在尝试为此映射 很多其他DBpedia类型。是否有直接或更有效的方式 这样做?
我不确定这究竟是什么效率低下的。 DBpedia类型和类别关联的唯一方式是资源具有类型(通过 rdf:type )并具有类别(通过 dcterms:subject )。如果要查找连接,则需要查找类型的实例及其所属的类别。 可能有可能您可以查看是否有任何特定信息框提供文章类别,并在信息框映射中用于提供DBpedia类型。这是直接获取类别/ DBpedia类型的唯一方法,无需经过我能想到的实例,而且我也不知道当前数据集是否有这种信息。
通常,由于维基百科类别不是一种类型层次结构,因此会有批次类别与任何特定类型的实例相关联。例如,我们可以使用以下查询计算与 Fish 和 LacrossePlayer 类型相关联的类别数量:
select ?type (count(distinct ?category) as ?nCategories) where {
values ?type { dbpedia-owl:Fish dbpedia-owl:LacrossePlayer }
?type ^a/dcterms:subject ?category
}
group by ?type
type nCategories
http://dbpedia.org/ontology/LacrossePlayer 346
http://dbpedia.org/ontology/Fish 2375
该查询响应非常快,您甚至可以非常轻松地获得这些类别:
select distinct ?type ?category where {
values ?type { dbpedia-owl:Fish dbpedia-owl:LacrossePlayer }
?type ^a/dcterms:subject ?category
}
order by ?type
limit 4000
但是,当您开始使用具有更多实例的类型时,这些计数会变大,并且查询需要一段时间才能返回。例如,一种非常常见的类型,如放置:
select ?type (count(distinct ?category) as ?nCategories) where {
values ?type { dbpedia-owl:Place }
?type ^a/dcterms:subject ?category
}
group by ?type
type nCategories
http://dbpedia.org/ontology/Place 191172
我不建议尝试从远程服务器中提取所有数据。如果要提取它,则应在本地加载数据。