Unicode转义序列的dotNetRdf问题/ Jena Fuseki无法在URI中加载撇号

时间:2019-04-05 22:08:19

标签: rdf jena dbpedia fuseki dotnetrdf

我正在开发一个Web应用程序,我需要支持将RDF数据从几个数据源(数据库转储/ URI)存储到我的Jena Fuseki服务器上。我遇到了dotNetRdf问题。我正在使用作为NuGet软件包下载的最新版本(2.2.0)。我认为问题可能是由于解析时不幸地处理了Unicode转义序列引起的。

起初,当我在解析时遇到错误时,我试图从dotNetRdf的文档中制作一个示例(部分:读取RDF数据,链接位于下面)。 失败的代码如下:

IGraph g = new Graph();
g.LoadFromUri(new Uri("http://dbpedia.org/resource/Barack_Obama"));

这在功能上应等同于文档(https://github.com/dotnetrdf/dotnetrdf/wiki/UserGuide-Reading-RDF#reading-rdf-from-uris)中的代码示例,我只是在使用扩展方法。

我收到带有消息的VDS.RDF.Parsing.RdfParseException:

[Line 2233 Column 42 to Line 2233 Column 83] 
Unexpected Token <b>'Integer'</b> encountered, expected a Property Value
describing one of the properties of an Object Node

给定的DBpedia资源的2233行应为:

"Barack Hussein Obama II (US /b\u0259\u02C8r\u0251\u02D0k hu\u02D0\u02C8se\u026An o\u028A\u02C8b\u0251\u02D0m\u0259/; born August 4, 1961) is an American politician who is the 44th and current President of the United States. He is the first African American to hold the office and the first president born outside the continental United States. Born in Honolulu, Hawaii, Obama is a graduate of Columbia University and Harvard Law School, where he was president of the Harvard Law Review. He was a community organizer in Chicago before earning his law degree. He worked as a civil rights attorney and taught constitutional law at the University of Chicago Law School between 1992 and 2004. While serving three terms representing the 13th District in the Illinois Senate from 1997 to 2004, he ran unsuccessfully in the Democratic primary for the United States Hou"@en ,

在第42列和第84列之间有一些unicode转义序列,因此我想dotNetRdf不能正确解析它们? (因为有关于意外整数的注释。)

我已经看到一些StackOverflow问题,讨论DBpedia无法提供正确的数据,但是这些问题似乎已经过时了,已经是2019年了。所以我认为DBpedia并不是问题。我只有很少的处理RDF数据的经验,但是在我看来一切正常。


其次,我尝试通过.NET的HttpClient下载并指定一些Accept-Header(在我的情况下为 text / turtle )来下载内容,然后尝试通过调用IGraph.LoadFromString( ...) 方法。没有帮助。同样的问题,不同的例外。

第三-我终于找到了解决方法!我已经将内容加载到字符串变量中(如前所述-通过HttpClient),然后使用了VDS.RDF.Parsing.Notation3Parser类。 这有效,但是... 发生了另一个问题-当我尝试将图保存到我的Jena Fuseki Triplestore中时,我收到了带有内部异常的RdfStorageException(WebException:远程服务器返回了400 Bad Request)

异常消息:

A HTTP error (HTTP 400 Parse error: [line: 10, col: 50] 
The declaration for the entity "ns5" must end with '>'.) 
occurred while saving a Graph to the Store.
Empty response body, see aformentioned status line or the inner exception for further details

那么可能甚至没有正确解析数据?甚至有可能吗?

这是简化的解决方法代码:

string content = /* get content via HttpClient */;

IGraph g = new Graph();
IRdfReader reader = new Notation3Parser();
reader.Load(g, new StringReader(content));

string connectionStr = "...";
var store = new PersistentTripleStore(new FusekiConnector(connectionStr));
...
store.UnderlyingStore.SaveGraph(g); // this call causes the mentioned RdfStorageException

我使用扩展方法将IGraph保存到文件中,以查看IGraph中的内容(文件内容就在这里:https://pastebin.com/nULJtjXu),并再次-当我查找第十行时,这导致了问题,其中有一个Unicode转义序列:

@prefix ns5:    <http://dbpedia.org/resource/Buyer\u0027s_Remorse:> .

(注意:\ u0027是撇号('))

这很奇怪,因为在DBpedia返回的HTTP响应中,有许多Unicode转义序列,并且在第一次出现时解析不会失败。

因此,我的Jena Fuseki更有可能在URI中加撇号的数据加载问题?

对我的问题的任何帮助将不胜感激

1 个答案:

答案 0 :(得分:0)

Fuseki错误很可能是由dotNetRDF的RDF / XML编写器中的错误引起的。

将IGraph写入文件时,看起来就像您使用了Turtle或Notation3编写器。但是,当dotNetRDF与Fuseki对话时,它使用RDF / XML编写器。因此,您的pastebin的内容不是发送给Fuseki的内容。

当发送这样的RDF / XML文件时,我从Fuseki收到了相同类型的错误:

<!DOCTYPE RDF [
  <!ENTITY ns5 'http://dbpedia.org/resource/Buyer's_Remorse:' >
]>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"/>

此文件不包含任何数据,它只是建立XML实体,这在RDF / XML中很常见。该文件无效,因为未声明实体声明中间的撇号。 (这是XML,因此需要将其转义为&apos;。)

您可以通过使用RDF / XML编写器将IGraph写入文件来验证问题。

我已为此提交了a bug report for dotNetRDF