亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

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

系統 2532 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元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。。?/p>

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 在线黄色免费 | 亚洲欧美一区二区三区久久 | 亚洲精品视频二区 | 亚洲欧美一区二区三区 | 久夜色精品国产一区二区三区 | 亚洲精品日韩一区二区 | 亚洲精品一区二区三区婷婷月 | 99re8热精品免费视频 | 夜夜夜夜夜操 | 午夜老司机福利 | 五月激激激综合网色播免费 | 黄色毛片免费在线观看 | 99久久免费费视频在线观看 | 国产美女亚洲精品久久久毛片 | 欧美一级精品高清在线观看 | 日本一区二区三区在线观看 | 国产高清在线精品一区a | 精品一区二区视频 | 爆操在线| 蜜桃视频黄色 | 日本高清免费不卡视频 | 9久re热视频这里只有精品 | 黄色影院在线看 | 日本强日本不卡一 | 中文字幕99| 久久久久在线视频 | 国产免费不卡 | 噜噜色噜噜色 | 国产自愉怕一区二区三区 | 免费观看国产一区二区三区 | 国产一级视频播放 | 最新日韩中文字幕 | 日韩一区视频在线 | 国产日韩欧美一区二区 | 国产一区视频在线播放 | 中文字幕 亚洲一区 | 色偷偷91综合久久噜噜 | 国产小视频在线播放 | 欧美爱爱视频网站 | 岛国精品在线观看 | 成人国产一区 |