我尝试从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;
答案 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。
另请注意,从用户输入构建此类查询会让您对注入攻击持开放态度。