日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

Javascript實現關聯數據(Linked Data)查詢

系統 2949 0

前言

自由百科全書不僅僅應當可以自由編寫,而更應該可以自由獲得。

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查詢(最好FQ,沒FQ查詢經常失敗,不太明白為什么= =)。?

不過這種查詢最終返回結果是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 %20 where %20 {[] %20 a %20 ?Concept} %20 LIMIT %20 100

其中空格被轉成%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(
      
      
        json
      
      
        );
});

      
      
        </
      
      
        script
      
      
        >
      
      
        </
      
      
        body
      
      
        >
      
      
        </
      
      
        html
      
      
        >
      
    

?

小例子

http://pan.baidu.com/share/link?shareid=293219&uk=855675565

?

修訂記錄

  • 修正關于跨域的錯誤 2003.2.21

?

Javascript實現關聯數據(Linked Data)查詢


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 上思县| 开封市| 龙井市| 南漳县| 隆安县| 康保县| 新泰市| 呼伦贝尔市| 富源县| 彭阳县| 武鸣县| 阳春市| 古丈县| 通江县| 江西省| 张家川| 东平县| 曲麻莱县| 永安市| 大方县| 贵德县| 徐州市| 安福县| 大渡口区| 三原县| 清新县| 昭平县| 贵州省| 塔河县| 赣州市| 郧西县| 乌兰察布市| 拜泉县| 柏乡县| 陇川县| 葫芦岛市| 新民市| 崇礼县| 荣成市| 江川县| 镇赉县|