从javascript进行插入查询时,Jena Fuseki无法正常工作。没有更新参数错误

时间:2017-01-03 12:55:10

标签: javascript sparql rdf jena

我有这个JavaScript函数,旨在在属于project数据集的命名图中插入关键字。

function insert(keyword) {
    var query = "INSERT DATA {GRAPH <http://test1> {<subj> <pred>'" + keyword + "'. }}";
    var endpoint = "http://localhost:3030/project/update";
    sparqlQueryJson(query, endpoint, showResults, true);
}

我用--update选项执行了Jena Fuseki。 sparqlQueryJson函数如下:

function sparqlQueryJson(queryStr, endpoint, callback, isDebug) {
    var querypart = "query=" + escape(queryStr);

    // Get our HTTP request object.
    var xmlhttp = null;
    if (window.XMLHttpRequest) {
        xmlhttp = new XMLHttpRequest();
    } else if (window.ActiveXObject) {
        // Code for older versions of IE, like IE6 and before.
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    } else {
        alert('Perhaps your browser does not support XMLHttpRequests?');
    }

    // Set up a POST with JSON result format.
    xmlhttp.open('POST', endpoint, true); // GET can have caching probs, so POST
    xmlhttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
    xmlhttp.setRequestHeader("Accept", "application/sparql-results+json");

    // Set up callback to get the response asynchronously.
    xmlhttp.onreadystatechange = function() {
        if (xmlhttp.readyState == 4) {
            if (xmlhttp.status == 200) {
                // Process the results
                callback(xmlhttp.responseText);

            } else {
                // Some kind of error occurred.
                alert("Sparql query error: " + xmlhttp.status + " " + xmlhttp.responseText);
            }
        }
    };
    xmlhttp.send(querypart);
};

在我看来,showResults函数在这里不是很重要,因为它接受查询的结果并以HTML格式显示它们。

我按照herehere进行了讨论,使用http://localhost:3030/project/update执行查询。问题是,如果我使用网络在具有相同端点网址的本地Fuseki服务器上执行相同的查询,它可以工作,但是从JavaScript代码中,它会引发错误: &#34; SPARQL查询错误:400错误400:SPARQL更新:否&#39;更新=&#39;参数&#34 ;. 我使用的是Ubuntu 16.04和Jena Fuseki - 版本2.4.1。

1 个答案:

答案 0 :(得分:2)

要解决此问题,必须将=query参数更改为=update。此外,必须处理具有查询类型的参数,即updatequery

if(type==="update"){
        var querypart = "update=" + escape(queryStr);
    }else if(type === "query"){
        var querypart = "query=" + escape(queryStr);
    }
...
xmlhttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
    if(type==="query"){
        xmlhttp.setRequestHeader("Accept", "application/sparql-results+json");
    }