Javascript实现关联数据(Linked Data)查询及注意细节


Posted in Javascript onFebruary 22, 2013

前言
自由百科全书不仅仅应当可以自由编写,而更应该可以自由获得。
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(); // <script> 
} 
}(this, function(){ 
'use strict' 
function SPARQLWrapper(endpoint){ 
this.endpoint = endpoint; 
this.queryPart = ""; 
this.type = "json"; 
} 
SPARQLWrapper.prototype = { 
constructor: SPARQLWrapper, 
setQuery: function(query){ 
this.queryPart = "query=" + encodeURI(query); 
}, 
setType: function(type){ 
this.type = type.toLowerCase(); 
}, 
query: function(type, callback){ 
callback = callback === undefined ? type : this.setType(type) || callback; 
var xhr = new XMLHttpRequest(); 
xhr.open('POST', this.endpoint, true); 
xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); 
switch(this.type){ 
case "json": 
type = "application/sparql-results+json"; 
break; 
case "xml": 
type = "text/xml"; 
break; 
case "html": 
type = "text/html"; 
break; 
default: 
type = "application/sparql-results+json"; 
break; 
} 
xhr.setRequestHeader("Accept", type); 
xhr.onreadystatechange = function(){ 
if(xhr.readyState == 4){ 
var sta = xhr.status; 
if(sta == 200 || sta == 304){ 
callback(xhr.responseText); 
}else{ 
console && console.error("Sparql query error: " + xhr.status + " " + xhr.responseText); 
} 
window.setTimeout(function(){ 
xhr.onreadystatechange= new Function(); 
xhr = null; 
},0); 
} 
} 
xhr.send(this.queryPart); 
} 
} 
return SPARQLWrapper; 
}));

使用方法,例如需要查询:
select distinct ?Concept where {[] a ?Concept} LIMIT 100
则该页面为:
<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> 
<script src="SPARQLWrapper.js" type="text/javascript"></script> 
</head> 
<body> 
<script> 
var sparql = new SPARQLWrapper("http://dbpedia.org/sparql"); 
sparql.setQuery('select distinct ?Concept where {[] a ?Concept} LIMIT 100'); 
sparql.query(function(json){ 
console.log(eval('(' + json + ')'); 
}); 
</script> 
</body> 
</html>

小例子:下载
Javascript 相关文章推荐
tagName的使用,留一笔
Jun 26 Javascript
jquery HotKeys轻松搞定键盘事件代码
Aug 30 Javascript
原生javascript获取元素样式属性值的方法
Dec 25 Javascript
js中事件的处理与浏览器对象示例介绍
Nov 29 Javascript
jQuery 无限级菜单的简单实例
Feb 21 Javascript
jQuery实现的自定义弹出层效果实例详解
Sep 04 Javascript
解决JS外部文件中文注释出现乱码问题
Jul 09 Javascript
Angular使用Md5加密的解决方法
Sep 16 Javascript
JS复杂判断的更优雅写法代码详解
Nov 07 Javascript
JavaScript实现的级联算法示例【省市二级联动功能】
Dec 25 Javascript
JS实现移动端在线签协议功能
Aug 22 Javascript
js实现数据导出为EXCEL(支持大量数据导出)
Mar 31 Javascript
JS中不为人知的五种声明Number的方式简要概述
Feb 22 #Javascript
JS中令人发指的valueOf方法介绍
Feb 22 #Javascript
网页右键ie不支持event.preventDefault和event.returnValue (需要加window)
Feb 22 #Javascript
javascript 日期时间 转换的方法
Feb 21 #Javascript
JS关键字变色实现思路及代码
Feb 21 #Javascript
js数组Array sort方法使用深入分析
Feb 21 #Javascript
js自定义方法通过隐藏iframe实现文件下载
Feb 21 #Javascript
You might like
PHP导入Excel到MySQL的方法
2011/04/23 PHP
php图片加中文水印实现代码分享
2012/10/31 PHP
php设计模式之单例模式使用示例
2014/01/20 PHP
用PHP代码在网页上生成图片
2015/07/01 PHP
php的PDO事务处理机制实例分析
2017/02/16 PHP
ThinkPHP5.1+Ajax实现的无刷新分页功能示例
2020/02/10 PHP
PHP类的自动加载与命名空间用法实例分析
2020/06/05 PHP
jquery text()要注意啦
2009/10/30 Javascript
JQuery设置时间段下拉选择实例
2014/12/30 Javascript
jQuery中contents()方法用法实例
2015/01/08 Javascript
JavaScript Split()方法
2015/12/18 Javascript
基于JQuery实现分隔条的功能
2016/06/17 Javascript
jQuery操作css样式
2017/05/15 jQuery
详解vue文件中使用echarts.js的两种方式
2018/10/18 Javascript
React 使用recharts实现散点地图的示例代码
2018/12/07 Javascript
layui使用button按钮 点击出现弹层 弹层中加载表单的实例
2019/09/04 Javascript
[01:08:32]DOTA2-DPC中国联赛 正赛 DLG vs PHOENIX BO3 第二场 1月18日
2021/03/11 DOTA
详解Python3.6的py文件打包生成exe
2018/07/13 Python
python实现生成字符串大小写字母和数字的各种组合
2019/01/01 Python
如何利用python生成MD5并去重
2020/12/07 Python
python空元组在all中返回结果详解
2020/12/15 Python
python爬虫智能翻页批量下载文件的实例详解
2021/02/02 Python
ASP.NET Core中的配置详解
2021/02/05 Python
EM Cosmetics官网:由彩妆大神Michelle Phan创办的独立品牌
2020/04/27 全球购物
教育科学研究生自荐信
2013/10/09 职场文书
小学校园活动策划
2014/01/30 职场文书
幼儿园大班教学反思
2014/02/10 职场文书
理发店策划方案
2014/06/05 职场文书
个人委托书范本
2014/09/13 职场文书
教师党员自我剖析材料
2014/09/29 职场文书
领导欢迎词致辞
2015/01/23 职场文书
教师继续教育反思周记
2015/06/25 职场文书
师德师风培训感言
2015/08/03 职场文书
pytorch finetuning 自己的图片进行训练操作
2021/06/05 Python
nginx安装以及配置的详细过程记录
2021/09/15 Servers
《进击的巨人》新联动CM 兵长强势出击兽巨人
2022/04/05 日漫