如何使用dbPedia递归提取子类别中的所有文章?

时间:2017-08-03 15:18:28

标签: sparql wikipedia dbpedia sparqlwrapper

我需要提取有关位于给定类别(例如历史记录)的不同嵌套子类别上的文章(例如,摘要,缩略图)的信息。 如何使用SPARQL查询执行此操作?或者使用一些SPARQL子查询在python上执行此操作的最佳方法是什么?

1 个答案:

答案 0 :(得分:4)

这将获得所有?sc"子类别"递归(或传递)比历史"更窄,直到3的深度。我用Virtuoso理解的{minDepth,maxDepth}符号实现了它。其他三重商店可能不理解它。我还在字符串文字上添加了英语过滤,同时仍保留了?o的IRI三元组。

SELECT ?sc ?lab ?p ?o 
WHERE {
  ?sc skos:broader{1,3} <http://dbpedia.org/resource/Category:History> .
  optional {?sc rdfs:label ?lab  } .
  ?sc ?p ?o 
  filter (lang(?lab) = "en")
  filter ((lang(?o) = "en") || isURI(?o))
} 

此外,该查询报告所有以?sc为主题的三元组。我没有看到任何摘要(使用<http://dbpedia.org/ontology/abstract>作为谓词?)或任何缩略图关系。您可以通过仅投影distinct ?p或甚至计算来确认:

SELECT ?p (count(?p) as ?pcount)
WHERE {
  ?sc skos:broader{1,3} <http://dbpedia.org/resource/Category:History> .
  optional {?sc rdfs:label ?lab  } .
  ?sc ?p ?o 
  filter (lang(?lab) = "en")
  filter ((lang(?o) = "en") || isURI(?o))
} 
group by ?p
order by desc(?pcount)

如果你进行更深入的递归,你会发现一些摘要。但深度递归很慢,我觉得我在概念上遗漏了一些东西。

SELECT *
WHERE {
  ?sc skos:broader{5,7} <http://dbpedia.org/resource/Category:History> .
  ?sc <http://dbpedia.org/ontology/abstract> ?a 
}