前言
自由百科全书不仅仅应当可以自由编写,而更应该可以自由获得。
dbpedia对wikipedia的数据变成linked data形式,使得机器也能读懂并自由获得这些数据。
本文的主要目的是利用javascript从dbpedia中获取我们想要的数据。
对linked data不太了解的请参考:关联数据入门——rdf。
sparql
trying to use the semantic web without sparql is like trying to use a relational database without sql.
—— tim berners-lee
sparql是semantic web(语义网)的sql,用于数据查询的语言。
sparql endpoint
sparql查询终端,是一种http绑定协议,用于通过http进行sparql查询,并返回相应数据。
dbpedia的sparql endpoint地址是:http://dbpedia.org/sparql
大家可以通过浏览器打开这个页面,进行sparql查询(最好翻墙,没翻墙查询经常失败,不太明白为什么= =)。
不过这种查询最终返回结果是html页面,并不是我们想要的,我们可以通过设置request header的accept属性来指定返回数据类型。
例如如果指定为:text/xml,那么返回的便是rdf格式数据。
那么我们如何输入sparql查询代码呢?
只需通过get或者post方法用参数query,将代码传过去。例如:
如果想查询:select distinct ?concept where {[] a ?concept} limit 100
则可利用该链接得到数据:
http://dbpedia.org/sparql?query=select%20distinct%20?concept%20where%20{[]%20a%20?concept}%20limit%20100
其中空格被转成%20。
实现细节
•跨域
我们可以通过ajax实现这一功能,但是ajax在部分浏览器中无法跨域,然而很显然我们想要的linked data几乎都是跨域的。
实际上,在一些较老版本的浏览器,我们没有不改变其数据形式的方法在前端进行动态跨域异步读取。
不过我们可以通过服务器代理的方法来解决跨域问题。
•get or post
使用get还post呢?
这个可能出于很多方面考虑,但是考虑到get可能被缓存,所以我们使用post来避免数据被缓存。
•以什么形式返回数据
前面我们说到用text/xml可以返回rdf数据,但是rdf在javascript中并不好处理,所以我们使用json方式返回,也就是需要将accept设置成application/sparql-results+json。
实现
接口参考python的sparql wrapper
复制代码 代码如下:
(function(root, factory) {
if(typeof define === function){
define(sparqlwrapper, factory); // amd || cmd
}else{
root.sparqlwrapper = factory(); //
使用方法,例如需要查询:
select distinct ?concept where {[] a ?concept} limit 100
则该页面为:
复制代码 代码如下:
灏
