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 相关文章推荐
jquery ajax 调用失败的原因示例介绍
Sep 27 Javascript
了解Javascript的模块化开发
Mar 02 Javascript
jquery实现可关闭的倒计时广告特效代码
Sep 02 Javascript
基于JS实现密码框(password)中显示文字提示功能代码
May 27 Javascript
JavaScript组合模式学习要点
Aug 26 Javascript
jquery根据一个值来选中select下的option实例代码
Aug 29 Javascript
JS 中LocalStorage和SessionStorage的使用
Aug 17 Javascript
JavaScript 中使用 Generator的方法
Dec 29 Javascript
React中使用UEditor百度富文本的方法
Aug 22 Javascript
JS中的函数与对象的创建方式
May 12 Javascript
2020淘宝618理想生活列车自动领喵币js脚本的代码
Jun 02 Javascript
解决vue项目axios每次请求session不一致的问题
Oct 24 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中UNIX时间戳和日期间的转换与计算实例
2014/11/19 PHP
php版微信公众平台入门教程之开发者认证的方法
2016/09/26 PHP
php四种定界符详解
2017/02/16 PHP
PHP魔术方法之__call与__callStatic使用方法
2017/07/23 PHP
Prototype使用指南之hash.js
2007/01/10 Javascript
FormValid0.5版本发布,带ajax自定义验证例子
2007/08/17 Javascript
JS 学习笔记 防止发生命名冲突
2009/07/30 Javascript
Javascript 继承机制实例
2009/08/12 Javascript
jquery与google map api结合使用 控件,监听器
2010/03/04 Javascript
Date对象格式化函数代码
2010/07/17 Javascript
JS实现点击图片在当前页面放大并可关闭的漂亮效果
2013/10/18 Javascript
JavaScript使用setInterval()函数实现简单轮询操作的方法
2015/02/02 Javascript
JavaScript中操作字符串之localeCompare()方法的使用
2015/06/06 Javascript
JavaScript文档碎片操作实例分析
2015/12/12 Javascript
基于jQuery实现照片墙自动播放特效
2017/01/12 Javascript
underscore之Collections_动力节点Java学院整理
2017/07/10 Javascript
深入浅析Vue不同场景下组件间的数据交流
2017/08/15 Javascript
vue.js移动数组位置,同时更新视图的方法
2018/03/08 Javascript
Java设计中的Builder模式的介绍
2018/03/22 Javascript
Node.js笔记之process模块解读
2018/05/31 Javascript
小程序实现留言板
2018/11/02 Javascript
Vue实现table上下移动功能示例
2019/02/21 Javascript
jquery插件懒加载的示例
2020/10/24 jQuery
Ant Design Pro 之 ProTable使用操作
2020/10/31 Javascript
[03:57]2016完美“圣”典风云人物:rOtk专访
2016/12/09 DOTA
[01:06:12]VP vs NIP 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
使用Python绘制图表大全总结
2017/02/11 Python
Python字符串处理实例详解
2017/05/18 Python
利用Python+Java调用Shell脚本时的死锁陷阱详解
2018/01/24 Python
解决Python3 控制台输出InsecureRequestWarning问题
2019/07/15 Python
简单了解django索引的相关知识
2019/07/17 Python
50行Python代码实现视频中物体颜色识别和跟踪(必须以红色为例)
2019/11/20 Python
TensorFlow打印输出tensor的值
2020/04/19 Python
澳大利亚女士时装在线:Rockmans
2018/09/26 全球购物
办理护照介绍信
2014/01/16 职场文书
大学生职业生涯规划范文——找准自我,定位人生
2014/01/23 职场文书