如何通过资源URI从JavaScript查询DBPedia?

时间:2016-09-21 22:09:31

标签: javascript sparql semantic-web dbpedia

我尝试从JavaScript

进行此查询
        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";

我从输入表单接收变量?s但是当我写另一个变量名时,它不起作用。 结果的代码如下:

$.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;

1 个答案:

答案 0 :(得分: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。

另请注意,从用户输入构建此类查询会让您对注入攻击持开放态度。