使用它们获取所有Wikipedia Infobox模板和所有页面

时间:2011-11-03 18:41:42

标签: mediawiki wikipedia sparql dbpedia

鉴于像Wikipedia: Stack Overflow这样的维基百科页面,通常会有信息框(大部分位于页面顶部的右侧)。屏幕截图示例:

Stackoverflow Infobox at Wikipedia

  1. DBPedia将所有这些属性列为RDF三元组。您可以在DBPedia: Stack Overflow查看示例。在那里,您会看到属性dbpprop:wikiPageUsesTemplate,其值为dbpedia:Template:Infobox_website,这很有趣。我想知道哪些维基百科页面使用此模板。我该怎么做并列出所有使用Infobox_website模板的页面?最好使用SPARQL查询,但我对其他简单的解决方案持开放态度。

  2. 接下来是所有Infobox模板的列表。 Wikipedia: Category Infobox Templates显示了所需维基百科类别的层次结构 - 看起来像我正在寻找的。但我希望所有这些都是机器可读的格式,在一个页面上。也许DBPedia也是正确的吗?在DBPedia: Category Infox TemplatesDBPedia: INFOBOX,我发现的信息非常少。但这些看起来很有希望。如何使用SPARQL查找所有信息框类型,以便我可以为每个信息块重复执行第1步?

  3. 您可以使用它来测试SPARQL查询:http://dbpedia.org/snorql/

    更新1

    我似乎已经解决了问题1:SPARQL: list all pages with Infobox_website

    更新2

    此外,这似乎是对问题2的查询:SPARQL: list all Infoboxes

3 个答案:

答案 0 :(得分:8)

好的,因为我似乎找到了一个解决方案(很可能不是最好的),我想分享它们。

1)此SPARQL查询可用于查找包含特定信息框类型的所有页面:

  

SELECT * WHERE {?page dbpedia2:wikiPageUsesTemplate   < HTTP://dbpedia.org/resource/Template:Infobox_website> 。 ?页   dbpedia2:name?name。 }

Link at SNORQL


2)此SPARQL查询可用于查找所有信息框类型:

  

SELECT DISTINCT?template WHERE {?page   dbpedia2:wikiPageUsesTemplate?模板。 FILTER(正则表达式(?模板,   “信息框”))。 ORDER BY?模板

Link at SNORQL

答案 1 :(得分:2)

之前的答案似乎已经停止了。只需要进行一些小的更改就可以让它们在http://live.dbpedia.org/sparql处的新dbpedia查询端点上工作。

要获取所有页面的列表以及他们使用此模板的模板,请执行以下操作:

SELECT * WHERE {  ?page  dbpprop:wikiPageUsesTemplate ?template . }

See results (limited to 100)

如果您正在寻找特定模板:

SELECT * WHERE {  
   ?page  
   dbpprop:wikiPageUsesTemplate 
   <http://dbpedia.org/resource/Template:Infobox_website> . 
}

See results

对于我的用例,我对Wikipedia URL而不是DBPedia页面感兴趣,所以我正在使用这个查询:

SELECT ?wikipedia_url WHERE {  
   ?page  
   dbpprop:wikiPageUsesTemplate 
   <http://dbpedia.org/resource/Template:Infobox_website> . 
   ?page foaf:isPrimaryTopicOf ?wikipedia_url .
}

See results

我也使用curl将结果拉入脚本:

$ curl -s "http://live.dbpedia.org/sparql?default-graph-uri=http%3A%2F%2Fdbpedia.org&query=SELECT+%3Fwikipedia_url+WHERE+%7B+%0D%0A%09+%3Fpage+%0D%0A%09+dbpprop%3AwikiPageUsesTemplate+%0D%0A%09+%3Chttp%3A%2F%2Fdbpedia.org%2Fresource%2FTemplate%3AInfobox_website%3E+.+%0D%0A+%3Fpage+foaf%3AisPrimaryTopicOf+%3Fwikipedia_url+.%0D%0A%0D%0A%09%7D&format=text%2Ftab-separated-values" \
| tr -d \" | grep -v "^wikipedia_url$" | head
http://en.wikipedia.org/wiki/U.S._News_&_World_Report
http://en.wikipedia.org/wiki/FriendFinder
http://en.wikipedia.org/wiki/Debkafile
http://en.wikipedia.org/wiki/GTPlanet
http://en.wikipedia.org/wiki/Lithuanian_Wikipedia
http://en.wikipedia.org/wiki/Connexions
http://en.wikipedia.org/wiki/Hypno5ive
http://en.wikipedia.org/wiki/Scoop_(website)
http://en.wikipedia.org/wiki/Bhoomi_(software)
http://en.wikipedia.org/wiki/Brainwashed_(website)

我不确定这是否会提供完整的结果集,因为它返回1698结果,而wmflabs.org似乎表明应该有4439。

对于问题的第二部分,只需要对上一个查询进行一些小的更改,即可获得所有模板的列表:

SELECT DISTINCT ?template WHERE { 
    ?page  
    dbpprop:wikiPageUsesTemplate  
    ?template . 
    FILTER (regex(?template, "Infobox")) . 
} ORDER BY ?template

See results

答案 2 :(得分:1)

您还可以使用MediaWiki API的embeddedin查询返回包含给定模板的所有页面的列表。您会想要使用库来访问API,您更喜欢哪种语言?对于Ruby,我建议MediaWiki::Gateway