创建无基图

Creating a base-less graph

根据 BaseGraph.CreateUriNode 的描述:

Generally we expect to be passed an absolute URI, while relative URIs are permitted the behaviour is less well defined. If there is a Base URI defined for the Graph then relative URIs will be automatically resolved against that Base, if the Base URI is not defined then relative URIs will be left as is. In this case issues may occur when trying to serialize the data or when accurate round tripping is required.

这似乎意味着当没有设置base URI时,URI将被原样存储。然而,所有这些创建它的尝试都失败了:

var graph = new Graph();
graph.CreateUriNode();
graph.CreateUriNode(new Uri("", UriKind.Relative));
graph.CreateUriNode(new Uri("relative", UriKind.Relative));

第一次尝试失败:

RdfParseException: 'Cannot use an Empty URI to refer to the document Base URI since there is no in-scope Base URI!'

最后两个简单地加上:

InvalidOperationException: 'This operation is not supported for a relative URI.'

我知道有些序列化方法可能不支持相对 URI,但至少 Turtle 支持,我希望能够生成引用外部指定基的文档。我该怎么做?

那里的文档已过时且具有误导性,并且不支持相对 URI(它们必须使用图形的 BaseUri 解析为绝对 URI)。

查看代码,InvalidOperationExceptionBaseUriNodeToString() 方法中被引发,它试图获取 AbosluteUri 属性底层 Uri 实例。至少从 2.0 版本开始,代码库就是这种情况。

您可以尝试更改 dotNetRDF 代码来避免这种情况 - 如果您将 Libraries\dotNetRDF\Core\URINode.cs 中的 BaseUriNode.ToString() 的实现改为:

return _uri.IsAbsoluteUri ? _uri.AbsoluteUri : _uri.ToString();

这将防止您在创建相对 URI 节点时看到的异常。我有点担心在主要的 dotNetRDF 项目中这样做,因为它似乎会对其余的代码库产生更深层次的影响,但作为一个快速的 hack,它可以让你开始序列化你的数据需要。