2016-09-21 62 views
0

我試圖從JavaScript如何通過資源URI從JavaScript查詢DBPedia?

 var subject = document.getElementById("inputUri").value; 
     var property = "?p"; 
     var object = "?o"; 
     var query = "\ 
     PREFIX dbpedia2: <http://dbpedia.org/property/>\ 
     PREFIX foaf: <http://xmlns.com/foaf/0.1/>\ 
     PREFIX : <http://dbpedia.org/resource/>\ 
     SELECT * \ 
     WHERE {\ 
      "+ subject + property + object +".\ 
     }LIMIT 10"; 

使這個查詢我收到的變量?的從輸入形式,但是當我寫的另一個變量名,這是行不通的。 對結果的代碼如下:

$.ajax({ 
      dataType: "jsonp", 
      url: queryUrl, 
      success: function(_data) { 
       var results = _data.results.bindings; 
       var subject = document.getElementById("inputUri").value; 
       for (var i in results) { 
        var subjectResult = results[i].s.value; 
        var objectResult = results[i].o.value; 
        var propertyResult = results[i].p.value; 
       } 
      } 
     }); 

var subjectResult = results[i].s.value; 

是錯誤的,但我不知道從我的輸入文本到subjectResult分配獲得的價值。


我所定義,其接收來自輸入文本的任何變量名,由這樣的變量:

var str = subject; 
var res = str.replace("?", ""); 

然後在for循環:

var subjectResult = results[i][res].value; 
+0

像往常一樣複製和粘貼錯誤。您從某個地方接受查詢並從別處獲取代碼而不理解它。您的主題不是變量'?s',而是綁定到特定的資源URI - 因爲您的問題標題也意味着。 – AKSW

回答

1

沒有所謂的可變?s在您的查詢,所以它是有道理的,你不能檢索它的價值。

根據您的代碼的結構,你應該能夠使用直接subject變量:

var subjectResult = subject; 
var objectResult = results[i].o.value; 
var propertyResult = results[i].p.value; 

另一種選擇是在查詢中創建變量,使用BIND

"SELECT *\ 
WHERE {\ 
    BIND(" + subject + " AS ?s)\ 
    ?s ?p ?o .\ 
} LIMIT 10" 

不知道您使用的是哪種SPARQL服務器,但是當我在Virtuoso上嘗試此操作時,它失敗並出現一個令人困惑的錯誤,儘管我相信它是有效的SPARQL。

另請注意,從用戶輸入構建類似這樣的查詢會導致您打開注入式攻擊。