【问题标题】:Query dbpedia sparql endpoint using dotnetRDF - RDFParseException使用 dotnetRDF 查询 dbpedia sparql 端点 - RDFParseException
【发布时间】:2012-11-29 17:18:19
【问题描述】:

当我使用 (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)

【问题讨论】:

  • 我已经根据您的附加信息更新了我的答案,问题是来自 DBPedia 的错误数据实际上与汉字脚本无关

标签: sparql dbpedia dotnetrdf


【解决方案1】:

DBPedia 已知存在编码问题,可能只是 DBPedia 产生了无效数据。

您可以尝试在 dotNetRDF 中进一步调试此问题的方法是使用以下代码封装调用查询的代码:

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

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

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

编辑

因此怀疑问题确实出在 DBPedia 产生了无用数据,而不是 dotNetRDF 本身。

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

ns6:Avalon_–_Spiel_um_dein_Leben ,

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

顺便说一句,我也通过 Jena 的 Turtle 解析器确认了这一点,只是为了确保它确实不是 dotNetRDF 问题。

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

【讨论】:

【解决方案2】:

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

Unicode 代码点 8211 是 EN DASH(十六进制 2013)。

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

【讨论】:

  • 如果我将限制更改为不同的值,服务器会返回不同的数据(可能它缓存了一些查询结果)。现在它适用于限制 500、900、1000 或 455,但不适用于限制 456。
猜你喜欢
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多