2

任何人都可以向我展示如何加载使用jQuery 的 getJSON查询Sesame SPARQL端点产生的 .srj 文件的示例吗?我已经尝试设置 Accept 标头和其他技巧,但我仍然看到 200 代码并且显然没有错误,但是没有加载文件的内容。

$.getJSON("http://localhost:8090/openrdf-sesame/repositories/myrepo?queryLn=SPARQL&query=QUERY&limit=none&infer=true&Accept=application%2Fsparql-results%2Bjson",
{
},
function(data) {
   alert('data = ', data);
});

我已经尝试过类似的方法和无数其他变体,但它仍然不起作用。我不得不提到我测试了这两种情况:

  1. Tomcat 未安装在 Apache 中,在这种情况下我们有一个跨域请求 - 我尝试在浏览器中设置所需的所有内容;
  2. Tomcat 安装在 Apache 中 - 据我所知,它不需要任何其他工作,但仍然没有成功。

这是请求标头

Accept:application/json, text/javascript, */*; q=0.01
Accept-Encoding:gzip, deflate
Accept-Language:en-us,en;q=0.5
Connection:keep-aliveHost:localhost:8090
Origin:http://localhost
Referer:http://localhost/d3v280/examples/ablodvis/localtest.html
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0

这是响应标头

Content-Disposition:attachment; filename=query-result.srj
Content-Language:en-US
Content-Type:application/sparql-results+json;charset=UTF-8
Date:Mon, 28 May 2012 14:06:06 GMT
Server:Apache-Coyote/1.1
Transfer-Encoding:chunked

如您所见,我确实在 query-result.srj 文件中得到了结果,但我不知道如何访问它。我非常喜欢第一个版本的工作,但显然我错过了一些东西。所有类似的 getJSON 请求都有效。

这是几乎可行的请求:

 $.ajax({

        beforeSend: function(xhrObj){
                      xhrObj.setRequestHeader("Accept","application/sparql-results+json");
                },

        dataType: 'jsonp',
        url: queryUrl,
        success: function(data) {
          // callback code here
          console.log("source: " + data.length)
          alert('success!');
        }
      });

但是,它在 Firefox 中引发“无效标签错误”,而在 Chrome 中则不会引发任何错误,但正如我在query-results.srj文件的第二行中看到的那样,它显示Uncaught SyntaxError: Unexpected token :。以下是响应的第一行的样子:

{
"head": {
    "vars": [ "s", "p", "o", "r" ]
}, 
"results": {
    "bindings": [ ...

这次我能够看到请求成功完成并在我的浏览器中看到它(至少在 Chrome 和 Firefox 的调试模式下)。我应该明白 jsonp 技巧不适用于 Sesame 吗?如果我从 Sesame 得到答案,将其复制到一个文件中,将其重命名为file.js并使用 $.getJSON 加载它就可以了……我不想为这个应用程序提供任何服务器端代码,只是为了直接处理 SPARQL 查询的结果。我已经通过 $.getJSON 或 $.ajax 轻松设置了其他来源(WorldBank、DBPedia 等)。

此致!

4

1 回答 1

4

我刚刚编写了自己的简单 JQuery 脚本来测试它,它似乎都按预期工作。我花了一段时间才让它工作,但这主要是因为我的脚本没有与 Sesame 在同一台服务器上运行。

更新以回答您关于 jsonp 的问题:自 2.7.0 版以来,Sesame 确实支持 JSONP 回调(请参阅SES-1019)。

但是如果 JQuery 脚本与芝麻服务器在同一主机上运行,​​则以下脚本会将查询结果输出为表格。我还没有完全弄清楚我在做什么与你不同,我并没有声称这是处理 reuslt 最有效的方法,但至少这是有效的,所以我希望这会有用。

脚本:

      $(document).ready(function() {
      $.ajax({
                url: 'http://localhost:8080/openrdf-sesame/repositories/test',
                dataType: 'json', 
                data: { 
                    queryLn: 'SPARQL',
                    query: "SELECT * WHERE { ?s ?p ?o }", 
                    limit: 'none',
                    infer: 'true',
                    Accept: 'application/sparql-results+json'
                },
                success: displayData, 
                error: displayError
        });
    });

    function displayError(xhr, textStatus, errorThrown) {
        alert(textStatus);
        alert(errorThrown);
    }

    function displayData(data) {
        var header = $('#result thead').append('<tr/>');
        $.each(data.head.vars, function(key,value) {
            header.append("<th>" + value + "</th>");
        });


        $.each(data.results.bindings, function(index, bs) {
        var row = $('<tr/>');
        $.each(data.head.vars, function(key, varname) {
            row.append("<td>" + bs[varname].value + "</td>"); 
            });
        $("#result tbody").after(row);
        });
    }

HTML 正文包含一个空表:

  <table id="result" border=1>
  <thead/>
     <tbody/>
  </table>
于 2012-05-29T23:43:44.270 回答