查询 DBPedia 时出现 dotNetRDF Http 错误
dotNetRDF Http Error when querying DBPedia
我是 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());
}
如有任何帮助,我们将不胜感激。提前致谢 ;)
这似乎主要是因为没有正确使用 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 版本问题。
正如 属性 的 documentation 所说:
Can be used to workaround buggy endpoints which don't like the broad
Accept Header that dotNetRDF sends by default
我是 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());
}
如有任何帮助,我们将不胜感激。提前致谢 ;)
这似乎主要是因为没有正确使用 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 版本问题。
正如 属性 的 documentation 所说:
Can be used to workaround buggy endpoints which don't like the broad Accept Header that dotNetRDF sends by default