1

我想使用一些我几乎不理解的叫做 dbpedia 和 sparql 的东西来提取 rdf:type person 的所有 dpbedia 条目。

我在以下方面取得了大部分成功(改变偏移量)。有没有更好的办法?我想基本上从英语维基百科中获得所有人物的例子。

PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX dc: <http://purl.org/dc/elements/1.1/>
PREFIX : <http://dbpedia.org/resource/>
PREFIX dbpedia2: <http://dbpedia.org/property/>
PREFIX dbpedia: <http://dbpedia.org/>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
PREFIX dbo: <http://dbpedia.org/ontology/>

SELECT ?name ?birth ?description ?person WHERE {
     ?person dbo:birthDate ?birth .
     ?person foaf:name ?name .
     ?person rdfs:comment ?description .
     FILTER (LANG(?description) = 'en') .
}
ORDER BY ?name
OFFSET 100
4

1 回答 1

2

尽管您应该使用 OFFSET和LIMIT 来对结果进行分页,但您正在以大致正确的方式进行操作(当然,要使 OFFSET 和 LIMIT 有用,您需要继续使用 ORDER BY)。不过,您使用的前缀比您需要的多。你只使用三个,所以你只需要声明这三个。最后,你可以特别要求Person类型的东西。其中有 1649645 个。

select (count(*) as ?n) where {
 ?person a dbo:Person 
}

1649645

最后,您应该使用langMatches而不是=检查字符串的语言。您可以交互使用的 Web 服务定义了一些前缀,因此我通常遵循这些前缀。您可能还想只选择英文名称,并且可能按 URI 排序,因为名称并不总是完美的:

select ?person ?name ?birth ?description where {
  ?person a dbo:Person ;
          foaf:name ?name ;
          dbo:birthDate ?birth ;
          dbo:abstract ?description
  filter langMatches(lang(?name),'en')
  filter langMatches(lang(?description),'en')
}
order by ?person
offset 100
limit 50

SPARQL 结果

当然,如果您需要大量数据,您可能只想下载并存储在本地。请参阅DBpedia 2014 下载

于 2015-02-23T13:59:56.017 回答