2016-09-21 65 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。

另请注意,从用户输入构建类似这样的查询会导致您打开注入式攻击。