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 更简单——这就是命名空间的作用。
我正在尝试加载一些基本的 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 更简单——这就是命名空间的作用。