JsonLdParser.Load 中未加载上下文前缀

Context prefixes not loading in JsonLdParser.Load

我正在尝试加载一些基本的 json-ld 内容作为字符串,但我看不到应该包含的命名空间前缀。

给出以下 json-ld:

{
  "@context": {
    "name": "http://schema.org/name",
    "image": {
      "@id": "http://schema.org/image",
      "@type": "@id"
    },
    "foaf": "http://xmlns.com/foaf/0.1/"
  },
  "name": "Manu Sporny",
  "foaf:homepage": "http://manu.sporny.org/",
  "image": "http://manu.sporny.org/images/manu.png"
}

我运行这个针对dotnetrdf库:

void Main()
{   
    var targetPath = @"C:\Users\me\MinContext.json";
    var jsonStr = File.ReadAllText(targetPath);

    var parser = new JsonLdParser();
    var store = new TripleStore();
    parser.Load(store, new StringReader(jsonStr));
    
    var g = store.Graphs.FirstOrDefault();
    IUriNode rdfType = g.CreateUriNode("rdf:type");
    IUriNode home = g.CreateUriNode("foaf:homepage");
}

在最后一行我收到这条 RdfException 消息:

The Namespace URI for the given Prefix 'foaf' is not known by the in-scope NamespaceMapper. Did you forget to define a namespace for this prefix?

...如果您检查图形名称空间 (g.NamespaceMap.Prefixes),您会发现它只包含三个:rdf、rdfs 和 xsd.

那么问题来了:如何正确加载 foaf 前缀和命名空间?

这是基于使用 NuGet 包版本 2.6.1

前缀不是任何 RDF 图的固有部分,它们只是约定和快捷方式,因此您不必键入完整的 IRI。一个特定的数据库 software/implementation 可以有配置选项 namespaces/prefixes,但它们只是为了演示。

在这种情况下,JsonLdParser 不会将源数据中的任何前缀导入到图中。这是一个完全有效的行为,我不知道它是否可以更改。 Load 也可以使用 IRdfHandler 这似乎可以用前缀做一些事情,但是创建一个实现很可能比简单地自己定义命名空间更困难:

g.NamespaceMap.AddNamespace("foaf", new Uri("http://xmlns.com/foaf/0.1/"));

我认为这实际上是更正确的选择。源文档可以指定 foaf: 绝对是任何东西,但你想要 this foaf: (资源名称的完整含义来自其前缀的 IRI,不是来自前缀名称本身)。

替代方法是 g.CreateUriNode(new Uri("http://xmlns.com/foaf/0.1/homepage")),它创建一个完全等效的节点。当然,添加命名空间比每次都输入完整的 IRI 更简单——这就是命名空间的作用。