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 相关文章推荐
JScript中使用ADODB.Stream判断文件编码的代码
Jun 09 Javascript
关于js new Date() 出现NaN 的分析
Oct 23 Javascript
如何在一个页面显示多个百度地图
Apr 07 Javascript
关于JS中的闭包浅谈
Aug 23 Javascript
php+js实现倒计时功能
Jun 02 Javascript
js 实现的可折叠留言板(附源码下载)
Jul 01 Javascript
vue实现裁切图片同时实现放大、缩小、旋转功能
Mar 02 Javascript
解决Layui数据表格中checkbox位置不居中的方法
Aug 15 Javascript
vue权限管理系统的实现代码
Jan 17 Javascript
简单了解JavaScript中常见的反模式
Jun 21 Javascript
微信小程序如何利用getCurrentPages进行页面传值
Jul 01 Javascript
JS array数组检测方式解析
May 19 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
跟我学Laravel之快速入门
2014/10/15 PHP
在Debian系统下配置LNMP的教程
2015/07/09 PHP
PHP设计模式之装饰器模式定义与用法详解
2018/04/02 PHP
JQuery FlexiGrid的asp.net完美解决方案 dotNetFlexGrid-.Net原生的异步表格控件
2010/09/12 Javascript
IE6弹出“已终止操作”的解决办法
2010/11/27 Javascript
jquery异步请求实例代码
2011/06/21 Javascript
jsTree 基于JQuery的排序节点 Bug
2011/07/26 Javascript
Javacript实现颜色梯度变化和渐变的效果代码
2013/05/31 Javascript
jquery引用方法时传递参数原理分析
2014/10/13 Javascript
jQuery基于ajax操作json数据简单示例
2017/01/05 Javascript
详解使用nvm管理多版本node的方法
2017/08/30 Javascript
jQuery实现获取当前鼠标位置并输出功能示例
2019/01/05 jQuery
vue 地图可视化 maptalks 篇实例代码详解
2019/05/21 Javascript
解决微信授权成功后点击按返回键出现空白页和报错的问题
2020/06/08 Javascript
PHP 502bad gateway原因及解决方案
2020/11/13 Javascript
Python实现将绝对URL替换成相对URL的方法
2015/06/28 Python
Python使用当前时间、随机数产生一个唯一数字的方法
2017/09/18 Python
Python实现识别手写数字 简易图片存储管理系统
2018/01/29 Python
Python实现二维曲线拟合的方法
2018/12/29 Python
Python3.5装饰器典型案例分析
2019/04/30 Python
python实现图片中文字分割效果
2019/07/22 Python
numpy.meshgrid()理解(小结)
2019/08/01 Python
Selenium使用Chrome模拟手机浏览器方法解析
2020/04/10 Python
Django rest framework分页接口实现原理解析
2020/08/21 Python
加拿大便宜的隐形眼镜商店:Clearly
2016/09/15 全球购物
圣诞树世界:Christmas Tree World
2019/12/10 全球购物
历史学专业大学生找工作的自我评价
2013/10/16 职场文书
阳光体育活动方案
2014/02/16 职场文书
房产代理公证处委托书
2014/04/04 职场文书
社区工作者演讲稿
2014/05/23 职场文书
销售团队口号大全
2014/06/06 职场文书
关爱留守儿童标语
2014/06/18 职场文书
美术专业自荐信
2014/07/07 职场文书
纪委书记群众路线整改措施思想汇报
2014/10/09 职场文书
党组织领导班子整改方案
2014/10/25 职场文书
kubernetes集群搭建Zabbix监控平台的详细过程
2022/07/07 Servers