Javascript實(shí)現(xiàn)關(guān)聯(lián)數(shù)據(jù)(Linked Data)查詢及注意細(xì)節(jié)
自由百科全書不僅僅應(yīng)當(dāng)可以自由編寫,而更應(yīng)該可以自由獲得。
DBpedia對Wikipedia的數(shù)據(jù)變成Linked Data形式,使得機(jī)器也能讀懂并自由獲得這些數(shù)據(jù)。
本文的主要目的是利用Javascript從DBpedia中獲取我們想要的數(shù)據(jù)。
對Linked Data不太了解的請參考:關(guān)聯(lián)數(shù)據(jù)入門——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(語義網(wǎng))的SQL,用于數(shù)據(jù)查詢的語言。
SPARQL Endpoint
SPARQL查詢終端,是一種HTTP綁定協(xié)議,用于通過HTTP進(jìn)行SPARQL查詢,并返回相應(yīng)數(shù)據(jù)。
DBpedia的SPARQL Endpoint地址是:http://dbpedia.org/sparql
大家可以通過瀏覽器打開這個(gè)頁面,進(jìn)行SPARQL查詢(最好翻墻,沒翻墻查詢經(jīng)常失敗,不太明白為什么= =)。
不過這種查詢最終返回結(jié)果是HTML頁面,并不是我們想要的,我們可以通過設(shè)置Request Header的Accept屬性來指定返回?cái)?shù)據(jù)類型。
例如如果指定為:text/xml,那么返回的便是RDF格式數(shù)據(jù)。
那么我們?nèi)绾屋斎隨PARQL查詢代碼呢?
只需通過get或者post方法用參數(shù)query,將代碼傳過去。例如:
如果想查詢:select distinct ?Concept where {[] a ?Concept} LIMIT 100
則可利用該鏈接得到數(shù)據(jù):
http://dbpedia.org/sparql?query=select%20distinct%20?Concept%20where%20{[]%20a%20?Concept}%20LIMIT%20100
其中空格被轉(zhuǎn)成%20。
實(shí)現(xiàn)細(xì)節(jié)
•跨域
我們可以通過AJAX實(shí)現(xiàn)這一功能,但是AJAX在部分瀏覽器中無法跨域,然而很顯然我們想要的Linked Data幾乎都是跨域的。
實(shí)際上,在一些較老版本的瀏覽器,我們沒有不改變其數(shù)據(jù)形式的方法在前端進(jìn)行動態(tài)跨域異步讀取。
不過我們可以通過服務(wù)器代理的方法來解決跨域問題。
•GET or POST
使用GET還POST呢?
這個(gè)可能出于很多方面考慮,但是考慮到GET可能被緩存,所以我們使用POST來避免數(shù)據(jù)被緩存。
•以什么形式返回?cái)?shù)據(jù)
前面我們說到用text/xml可以返回RDF數(shù)據(jù),但是RDF在Javascript中并不好處理,所以我們使用json方式返回,也就是需要將Accept設(shè)置成application/sparql-results+json。
實(shí)現(xiàn)
接口參考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>
小例子:下載
相關(guān)文章
JS正則表達(dá)式驗(yàn)證密碼格式的集中情況總結(jié)
這篇文章主要介紹了JS正則表達(dá)式驗(yàn)證密碼格式的集中情況總結(jié),需要的朋友可以參考下2017-02-02JavaScript股票的動態(tài)買賣規(guī)劃實(shí)例分析上篇
這篇文章主要介紹了JavaScript對于動態(tài)規(guī)劃解決股票問題的真題例舉講解。文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08JavaScript必知必會(十) call apply bind的用法說明
這篇文章主要介紹了JavaScript必知必會(十) call apply bind的用法說明 的相關(guān)資料,非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友可以參考下2016-06-06詳解如何讓InstantClick兼容MathJax、百度統(tǒng)計(jì)等
本篇文章主要介紹了如何讓InstantClick兼容MathJax、百度統(tǒng)計(jì)等,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-09-09layui數(shù)據(jù)表格 table.render 報(bào)錯(cuò)的解決方法
今天小編就為大家分享一篇layui數(shù)據(jù)表格 table.render 報(bào)錯(cuò)的解決方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-09-09js實(shí)現(xiàn)同一頁面多個(gè)運(yùn)動效果的方法
這篇文章主要介紹了js實(shí)現(xiàn)同一頁面多個(gè)運(yùn)動效果的方法,涉及javascript操作頁面元素運(yùn)動效果的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04人人網(wǎng)javascript面試題 可以提前實(shí)現(xiàn)下
JavaScript面試題要求:以下題目必須從一至四題中,選出三道題,使用原生代碼實(shí)現(xiàn),不可使用任何框架,第五題為選作題2012-01-01基于MVC4+EasyUI的Web開發(fā)框架形成之旅之界面控件的使用
一般Web界面包括的界面控件有:單行文本框、多行文本框、密碼文本框、下拉列表Combobox、日期輸入控件、數(shù)值輸入控件、單項(xiàng)選擇、復(fù)選框、表格控件DataGrid、樹形控件、布局控件、彈出式對話框、提示信息、列表控件等,這些界面控件的操作都有哪些不同,下面逐一介紹2015-12-12