使用dotnetRDF查询dbpedia sparql端点 - RDFParseException

时间:2012-11-29 17:18:19

标签: sparql dbpedia dotnetrdf

当我使用(dotnetRDF)VDS.RDF.Query.SparqlRemoteEndpoint.QueryWithResultSet()http://dbpedia.org/sparql上执行以下查询时,一切正常。

SELECT ?film ?p ?o
WHERE {
    ?film <http://purl.org/dc/terms/subject> <http://dbpedia.org/resource/Category:Japanese_films> .
    ?film ?p ?o
}
limit 500

但是当我使用SparqlRemoteEndpoint.QueryWithResultGraph()

尝试此查询时
CONSTRUCT { ?film ?p ?o}
WHERE {
    ?film <http://purl.org/dc/terms/subject> <http://dbpedia.org/resource/Category:Japanese_films> .
    ?film ?p ?o
}
limit 500

我收到带有消息

的RdfParseException
"[Line 456 Column 29] Unexpected Character (Code 8211) – was encountered"

我尝试为ResultsAcceptHeader和RdfAcceptHeader属性设置值,但没有成功。

如果在第二次查询中我将限制从500更改为例如100它工作正常。

你能帮帮我吗?


如果limit的值为456,则抛出异常。 [Line 495 Column 25] Unexpected Character (Code 8211) – was encountered,这是第495行ns19:???_???5555 .。第25栏的值为_

这里有wiki格式http://dbpedia.org/page/Interstella_5555:_The_5tory_of_the_5ecret_5tar_5ystem的数据,正如我想的那样,dbpprop:kanji属性值存在问题(インターステラ5555)

2 个答案:

答案 0 :(得分:3)

DBPedia已知编码问题,可能只是DBPedia正在生成dud数据。

您可以尝试在dotNetRDF中进一步调试此操作,即使用以下内容包装调用查询的代码:

try
{
   Options.HttpDebugging = true;
   Options.HttpFullDebugging = true;

  //Try your query here
}
finally
{
   Options.HttpDebugging = false;
   Options.HttpFullDebugging = false;
}

这将导致解析失败(具有不同的错误),但它会将原始HTTP响应转储到控制台以进行调试。如果您可以编辑您的问题以包含转储第456行附近的内容,那么人们可能会为您提供更多帮助。

修改

因为可疑问题确实是DBPedia产生了dud数据,而不是dotNetRDF本身。

当我下载您提到的Turtle格式的文件并尝试解析它时,我收到了相同的错误消息,它与以下行有关:

ns6:Avalon_–_Spiel_um_dein_Leben ,

乍一看可能看起来有效(因为在前缀名称中允许使用简单的连字符-)问题是它不是连字符,实际上是字符代码8211(作为AndyS提到的hex 2013) )这不在可接受的前缀名称字符范围内。

顺便说一句,我用Jena的Turtle解析器确认了这一点,以确保它确实不是dotNetRDF问题。

所以基本上DBPedia数据被破坏了,您可以尝试通过适当地设置接受标头来强制它将RDF / XML或NTriples发送回去,但不能保证这些格式的数据也不会变坏。我建议您联系DBPedia人员将此报告为错误 - dbpedia-discussion@lists.sf.net

答案 1 :(得分:1)

看到第456行会很有用。尝试使用wget发出请求(它对URL进行编码,curl不会,从命令行中更容易使用)。

Unicode codepoint 8211是EN DASH(hex 2013)。

CONSTRUCT中的LIMIT是图形模式中的行数,而不是CONSTRUCT模板。您可能会获得SELECT ... LIMIT涵盖的更多三元组。在SELECT中尝试更大的LIMIT并查看它是否中断。