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源码分析之Event事件分析
Jun 07 Javascript
js中生成map对象的方法
Jan 09 Javascript
js实现对ajax请求面向对象的封装
Jan 08 Javascript
js实现获取两个日期之间所有日期的方法
Jun 17 Javascript
javascript的几种写法总结
Sep 30 Javascript
JavaScript实现QQ列表展开收缩扩展功能
Oct 30 Javascript
jQuery中库的引用方法
Jan 06 jQuery
Vue实现远程获取路由与页面刷新导致404错误的解决
Jan 31 Javascript
jQuery实现动态添加和删除input框代码实例
Mar 29 jQuery
JS数组的高级使用方法示例小结
Mar 14 Javascript
uin-app+mockjs实现本地数据模拟
Aug 26 Javascript
vue全局使用axios的操作
Sep 08 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
单位速度在实战中的运用
2020/03/04 星际争霸
php 文件夹删除、php清除缓存程序
2009/08/25 PHP
PHP 实现页面静态化的几种方法
2017/07/23 PHP
lib.utf.js
2007/08/21 Javascript
jQuery网页选项卡插件rTabs用法实例分析
2015/08/26 Javascript
jQuery图片轮播滚动切换代码分享
2020/04/20 Javascript
基于jquery实现ajax无刷新评论
2020/08/19 Javascript
利用node.js搭建简单web服务器的方法教程
2017/02/20 Javascript
原生js实现放大镜
2017/02/20 Javascript
原生JavaScript实现精美的淘宝轮播图效果示例【附demo源码下载】
2017/05/27 Javascript
微信小程序实现图片预览功能
2018/01/31 Javascript
vue template中slot-scope/scope的使用方法
2018/09/06 Javascript
js实现橱窗展示效果
2020/01/11 Javascript
OpenLayers3加载常用控件使用方法详解
2020/09/25 Javascript
使用C语言来扩展Python程序和Zope服务器的教程
2015/04/14 Python
python 多线程实现检测服务器在线情况
2015/11/25 Python
解决Python requests 报错方法集锦
2017/03/19 Python
Python基于回溯法子集树模板解决找零问题示例
2017/09/11 Python
Python设计模式之中介模式简单示例
2018/01/09 Python
Python操作Excel插入删除行的方法
2018/12/10 Python
django中使用Celery 布式任务队列过程详解
2019/07/29 Python
关于阿里云oss获取sts凭证 app直传 python的实例
2019/08/20 Python
python无序链表删除重复项的方法
2020/01/17 Python
Django使用Celery加redis执行异步任务的实例内容
2020/02/20 Python
Python开发企业微信机器人每天定时发消息实例
2020/03/17 Python
Numpy 多维数据数组的实现
2020/06/18 Python
使用Python提取文本中含有特定字符串的方法示例
2020/12/09 Python
美国美食礼品篮网站:Gourmet Gift Baskets
2019/12/15 全球购物
简单英文演讲稿
2014/01/01 职场文书
创先争优承诺书范文
2014/03/31 职场文书
田径运动会通讯稿
2014/09/13 职场文书
2014卖家双十一活动策划书
2014/09/29 职场文书
施工员岗位职责
2015/02/10 职场文书
初中语文教学反思范文
2016/03/03 职场文书
2016年乡镇综治宣传月活动总结
2016/03/16 职场文书
GitHub上77.9K的Axios项目有哪些值得借鉴的地方详析
2021/06/15 Javascript