0

我是 dotNetRDF 和 SPARQL 的新手,我正在尝试从 DBPedia 检索一些人员数据。我已经编写了这个查询并在http://dbpedia.org/sparql的在线编辑器上成功测试了它:

问题是当我尝试使用下面的代码启动查询时,我得到一个 HTTP 异常 400,无效请求:

SparqlRemoteEndpoint endpoint = new SparqlRemoteEndpoint(new Uri("http://dbpedia.org/sparql"));

        //Make a SELECT query against the Endpoint
        SparqlResultSet results = endpoint.QueryWithResultSet(@" 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>\n
PREFIX type: <http://dbpedia.org/class/yago/>\n
PREFIX prop: <http://dbpedia.org/ontology/>\n
\n
select DISTINCT ?person ?name ?birth ?shortDescription where {\n
?person a dbpedia-owl:Person ;\n
      foaf:name ?name ;\n
      dbpedia-owl:birthDate ?birth ;\n
      dbpprop:shortDescription ?shortDescription .\n
filter langMatches(lang(?name),'en') .\n
filter langMatches(lang(?shortDescription),'en') \n
}\n
LIMIT 10");
        foreach (SparqlResult result in results)
        {
            Console.WriteLine(result.ToString());
        }

任何帮助,将不胜感激。提前致谢 ;)

4

2 回答 2

3

这似乎主要是没有正确使用 c# 逐字字符串文字的问题。通过使用@"...您指示 c# 不要解释转义序列,\n而是逐字逐句地理解它们。同时,这也允许您编写已经包含隐式\n.

因此,您应该删除查询字符串中的 the@或 the \n

另外我建议总是把子句放在()周围,而不是用 a 结束它们:filter.

SparqlResultSet results = endpoint.QueryWithResultSet(@" 
    PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
    PREFIX type: <http://dbpedia.org/class/yago/>
    PREFIX prop: <http://dbpedia.org/ontology/>

    select DISTINCT ?person ?name ?birth ?shortDescription where {
          ?person a dbpedia-owl:Person ;
              foaf:name ?name ;
              dbpedia-owl:birthDate ?birth ;
              dbpprop:shortDescription ?shortDescription .
          filter(langMatches(lang(?name),'en'))
          filter(langMatches(lang(?shortDescription),'en'))
    }
    LIMIT 10");
于 2015-06-08T20:31:54.103 回答
2

对于 XML 版本错误,您可以指示 dotNetRDF 以非 XML 格式请求结果,例如

endpoint.ResultsAcceptHeader = "application/sparql-results+json";

会要求 JSON 而不是 XML,这将避免 XML 版本问题。

正如该属性的文档所述:

可用于解决不喜欢 dotNetRDF 默认发送的广泛接受标头的错误端点

于 2015-06-15T14:46:26.483 回答