dotNetRDF查询DBPedia时Http错误

本文关键字:Http 错误 DBPedia 查询 dotNetRDF | 更新日期: 2023-09-27 17:54:14

我是新来的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());
        }

任何帮助都会很感激。提前感谢;)

dotNetRDF查询DBPedia时Http错误

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

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

我也建议总是把()放在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");

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

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

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

正如该属性的文档所说:

可用于解决不喜欢宽的有bug的端点默认情况下dotNetRDF发送的Accept报头