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 相关文章推荐
Javascript实例教程(19) 使用HoTMetal(6)
Dec 23 Javascript
给页面渲染时间加速 干掉Dom Level 0 Event
Dec 19 Javascript
jquery弹出框的用法示例(一)
Aug 26 Javascript
基于JQuery实现滚动到页面底端时自动加载更多信息
Jan 31 Javascript
js实现按一下删除键删除整个单词附demo
Sep 05 Javascript
元素绑定click点击事件方法
Jun 08 Javascript
JS判断是否手机或pad访问实现方法
Dec 09 Javascript
JS简单实现获取元素的封装操作示例
Apr 07 Javascript
详解在AngularJS的controller外部直接获取$scope
Jun 02 Javascript
jQuery实现上传图片前预览效果功能
Aug 03 jQuery
Node.js文件编码格式的转换的方法
Apr 27 Javascript
微信小程序实现点击空白隐藏的方法示例
Aug 13 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控制用户的浏览器--ob*函数的使用说明
2007/03/16 PHP
smarty自定义函数htmlcheckboxes用法实例
2015/01/22 PHP
php 使用redis锁限制并发访问类示例
2016/11/02 PHP
基于yaf框架和uploadify插件,做的一个导入excel文件,查看并保存数据的功能
2017/01/24 PHP
PHP编程计算日期间隔天数的方法
2017/04/26 PHP
phpStudy配置多站点多域名方法及遇到的403错误解决方法
2017/10/19 PHP
javascript实现全局匹配并替换的方法
2015/04/27 Javascript
如何利用Promises编写更优雅的JavaScript代码
2016/05/17 Javascript
js实现上下左右弹框划出效果
2017/03/08 Javascript
JavaScript设置名字输入不合法的实现方法
2017/05/23 Javascript
Vue 兄弟组件通信的方法(不使用Vuex)
2017/10/26 Javascript
小程序获取周围IBeacon设备的方法
2018/10/31 Javascript
Vue+elementui 实现复杂表头和动态增加列的二维表格功能
2019/09/23 Javascript
基于纯JS实现多张图片的懒加载Lazy过程解析
2019/10/14 Javascript
微信小程序页面间传递数组对象方法解析
2019/11/06 Javascript
微信小程序淘宝首页双排图片布局排版代码(推荐)
2020/10/29 Javascript
微信小程序实现日历小功能
2020/11/18 Javascript
Vue实现图书管理小案例
2020/12/03 Vue.js
[00:34]TI7不朽珍藏III——地穴编织者不朽展示
2017/07/15 DOTA
python 回调函数和回调方法的实现分析
2016/03/23 Python
python 中的list和array的不同之处及转换问题
2018/03/13 Python
python 对象和json互相转换方法
2018/03/22 Python
Python动态导入模块的方法实例分析
2018/06/28 Python
python实现爬取图书封面
2018/07/05 Python
Python3+django2.0+apache2+ubuntu14部署网站上线的方法
2018/07/07 Python
scikit-learn线性回归,多元回归,多项式回归的实现
2019/08/29 Python
Django视图、传参和forms验证操作
2020/07/15 Python
10 套华丽的CSS3 按钮小结
2012/10/03 HTML / CSS
澳大利亚领先的睡衣品牌:Peter Alexander
2016/08/16 全球购物
巴西在线鞋店:Shoestock
2017/10/28 全球购物
速比涛英国官网:Speedo英国
2019/07/15 全球购物
传播学毕业生求职信
2013/10/11 职场文书
授权收款委托书
2014/09/23 职场文书
初中政治教师教学反思
2016/02/23 职场文书
创新创业项目计划书该怎样写?
2019/08/13 职场文书
七年级之开学家长寄语35句
2019/09/05 职场文书