Создание графа без основания

Согласно описанию BaseGraph.CreateUriNode:

Обычно мы ожидаем, что будет передан абсолютный URI, в то время как относительные URI разрешены, поведение менее четко определено. Если для графа определен базовый URI, то относительные URI будут автоматически разрешены относительно этой базы, если базовый URI не определен, относительные URI останутся без изменений. В этом случае могут возникнуть проблемы при попытке сериализации данных или когда требуется точный круговой обход.

Кажется, это означает, что если базовый URI не установлен, URI будет храниться как есть. Однако все эти попытки создать его терпят неудачу:

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

Первая попытка не удалась с:

RdfParseException: "Нельзя использовать пустой URI для ссылки на базовый URI документа, так как базовый URI в области видимости отсутствует!"

Последние два просто с:

InvalidOperationException: "Эта операция не поддерживается для относительного URI".

Я знаю, что некоторые методы сериализации могут не поддерживать относительные URI, но, по крайней мере, Turtle поддерживает, и я хочу иметь возможность создавать документы, которые ссылаются на указанную извне базу. Как я могу это сделать?


person IS4    schedule 04.01.2021    source источник


Ответы (1)


Документация устарела и вводит в заблуждение, а относительные URI не поддерживаются (они должны преобразовываться в абсолютный URI, используя BaseUri графа).

Глядя на код, InvalidOperationException вызывается в методе ToString() объекта BaseUriNode, который пытается получить свойство AbosluteUri базового экземпляра Uri. Это имело место в базе кода, по крайней мере, с версии 2.0.

Вы можете попробовать изменить код dotNetRDF, чтобы избежать этого - если вы реализуете BaseUriNode.ToString() в Libraries\dotNetRDF\Core\URINode.cs на что-то вроде:

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

Это предотвратило бы исключение, которое вы видите при создании относительных узлов URI. Я немного опасаюсь делать это в основном проекте dotNetRDF, поскольку кажется, что это будет иметь гораздо более глубокие последствия для остальной части кодовой базы, но в качестве быстрого взлома это может привести вас к сериализации данных, которые вы нужно.

person Kal    schedule 10.01.2021