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 相关文章推荐
屏蔽F1~F12的快捷键的js函数
May 06 Javascript
分享14个很酷的jQuery导航菜单插件
Apr 25 Javascript
apply和call方法定义及apply和call方法的区别
Nov 15 Javascript
jquery解析XML及获取XML节点名称的实现代码
May 18 Javascript
Node.js中npm常用命令大全
Jun 09 Javascript
jQuery实现查找链接文字替换属性的方法
Jun 27 Javascript
JS使用正则表达式实现关键字替换加粗功能示例
Aug 03 Javascript
JavaScript中利用构造器函数模拟类的方法
Feb 16 Javascript
详解利用 Express 托管静态文件的方法
Sep 18 Javascript
React Router v4 入坑指南(小结)
Apr 08 Javascript
对vue 键盘回车事件的实例讲解
Aug 25 Javascript
关于Vue中$refs的探索浅析
Nov 05 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 header函数分析详解
2011/08/06 PHP
php引用传值实例详解学习
2013/11/06 PHP
php setcookie函数的参数说明及其用法
2014/04/20 PHP
php+mysqli事务控制实现银行转账实例
2015/01/29 PHP
PHP+shell脚本操作Memcached和Apache Status的实例分享
2016/03/11 PHP
AES加解密在php接口请求过程中的应用示例
2016/10/26 PHP
原生php实现excel文件读写的方法分析
2018/04/25 PHP
javascript写的日历类(基于pj)
2010/12/28 Javascript
JavaScript学习笔记(一) js基本语法
2011/10/25 Javascript
JS JSON对象转为字符串的简单实现方法
2013/11/18 Javascript
jQuery on()方法使用技巧详解
2015/04/16 Javascript
jQuery的position()方法详解
2015/07/19 Javascript
利用jQuery实现漂亮的圆形进度条倒计时插件
2015/09/30 Javascript
angularJS Provider、factory、service详解及实例代码
2016/09/21 Javascript
使用base64对图片的二进制进行编码并用ajax进行显示
2017/01/03 Javascript
微信小程序 开发MAP(地图)实例详解
2017/06/27 Javascript
详谈js模块化规范
2017/07/07 Javascript
如何实现一个简易版的vuex持久化工具
2019/09/11 Javascript
python轻松查到删除自己的微信好友
2016/01/10 Python
Python操作MongoDB数据库的方法示例
2018/01/04 Python
python实现装饰器、描述符
2018/02/28 Python
python selenium 对浏览器标签页进行关闭和切换的方法
2018/05/21 Python
对Django的restful用法详解(自带的增删改查)
2019/08/28 Python
详解Python 字符串相似性的几种度量方法
2019/08/29 Python
使用python代码进行身份证号校验的实现示例
2019/11/21 Python
python中with用法讲解
2020/02/07 Python
Python Tornado之跨域请求与Options请求方式
2020/03/28 Python
Python HTMLTestRunner可视化报告实现过程解析
2020/04/10 Python
Python实现查找数据库最接近的数据
2020/06/08 Python
Django filter动态过滤与排序实现过程解析
2020/11/26 Python
Html5之svg可缩放矢量图形_动力节点Java学院整理
2017/07/17 HTML / CSS
个性发展自我评价
2014/02/11 职场文书
警校毕业生自我评价
2014/04/06 职场文书
遵纪守法演讲稿
2014/05/23 职场文书
本科生自荐信
2014/06/18 职场文书
python用字节处理文件实例讲解
2021/04/13 Python