gpt4 book ai didi

ruby - 消除 JSON-LD 中具有相同谓词的资源的歧义

转载 作者:数据小太阳 更新时间:2023-10-29 06:59:05 27 4
gpt4 key购买 nike

我无法弄清楚如何预先消除使用相同谓词的资源的歧义。我是 RDF 新手,所以请原谅我的术语:我会尝试用示例来解释我的意思。

我有一个 Interview 资源/模型,其(简化的)上下文如下:

{
"id": {
"@id": "http://purl.org/dc/terms/identifier"
},
"interviewers": {
"@id": "http://purl.org/dc/terms/contributor",
"@type": "@id",
"@container": "@set"
},
"title": {
"@id": "http://purl.org/dc/terms/title"
},
"interviewees": {
"@id": "http://purl.org/dc/terms/contributor",
"@type": "@id",
"@container": "@set"
}
}

我的 InterviewerInterviewee 资源具有如下上下文:

{
"id": {
"@id": "http://purl.org/dc/terms/identifier"
},
"name": {
"@id": "info:repository/ive/name"
}
}

然后我创建一个如下所示的资源:

{
"id": "06bad25f-83c1-4ee5-b055-0cb87d4c06be",
"interviewers": [
{
"id": "b0c262ce-7eb3-47f2-b212-a0e71cca0c92",
"name": "Somebody",
"@context": {
...
},
"@id": "urn:uuid:b0c262ce-7eb3-47f2-b212-a0e71cca0c92",
"@type": [
"http://id.loc.gov/vocabulary/relators/ivr"
]
}
],
"title": "Interview with So and So",
"interviewees": [
{
"id": "bd6bb9ec-f417-4f81-af69-e3d191e3f73b",
"name": "A third person",
"gender": "male",
"@context": {
...
},
"@id": "urn:uuid:bd6bb9ec-f417-4f81-af69-e3d191e3f73b",
"@type": [
"http://id.loc.gov/vocabulary/relators/ive"
]
}
],
"@context": {
...
},
"@id": "urn:uuid:06bad25f-83c1-4ee5-b055-0cb87d4c06be",
"@type": [
"info:repository/interview"
]
}

一切都很好,我可以将这个“对象”存储到我的存储库中(我正在使用 RDF.rb 库)。但是,当我随后尝试提取对象并“重新序列化”它时,问题就出现了。例如(请原谅 Ruby 代码),

query = repository.query(:subject => RDF::URI(uri))
JSON.parse(query.dump(:jsonld, :context => Interview.context))

这些行从存储库中提取相关语句,然后将它们混搭成具有适当上下文的 JSON-LD“资源”。但是,受访者和采访者都被移入了 interviewees 属性。

当然,这很有意义,因为 interviewersinterviewees 都与 interview 资源相关,dc: contributor 谓词(它们只是通过各自的类型来区分)。

我需要让 dump 进程知道相关的资源类型,但我不知道有什么方法可以将该信息添加到采访的上下文中。

根据当前的 JSON-LS 规范,我不知道这是否可行。 This issue看起来它可能是相关的,但我对 RDF/JSON-LD 的了解还不够,无法确定。

我可以为 interviewersinterviewees 使用不同的谓词,但我似乎不必这样做。有什么建议吗?

注意:我也在 answers.semanticweb.com 上问过这个问题.

附加信息

我以这种方式为我的贡献者 关系建模(其中采访者 是类型为http:/的贡献者/id.loc.gov/vocabulary/relators/ivr) 基于推荐的合格 DC 属性的方法之一。例如,可以在资源上表达一个 MESH 主题,如:

<rdf:Description>
<dc:subject>
<dcterms:MESH>
<rdf:value>D08.586.682.075.400</rdf:value>
<rdfs:label>Formate Dehydrogenase</rdfs:label>
</dcterms:MESH>
</dc:subject>
</rdf:Description>

假设我有:

<rdf:Description>
<dc:subject>
<dcterms:MESH>
<rdf:value>D08.586.682.075.400</rdf:value>
<rdfs:label>Formate Dehydrogenase</rdfs:label>
</dcterms:MESH>
</dc:subject>
<dc:subject>
<dcterms:LCSH>
<rdf:value>Formate Dehydrogenase</rdf:value>
</dcterms:LCSH>
</dc:subject>
</rdf:Description>

我希望能够引用一个lcsh_subjects“属性”,其中lcsh_subjects 代表那些与dc:subject< 资源相关的节点 并且类型为 dcterms:LCSH。但是,我意识到我可能以错误的方式思考 JSON-LD 模型。

最佳答案

您可能对用于面试官和受访者的@id 感到困惑。您已经用相同的@id 定义了它们,这意味着它们是相同的谓词。他们被定义为资源的贡献者,但没有什么可以区分他们。您可能会认为您所说的“采访者”是一个谓词,它是 dc:contributor 的子属性,“受访者”也是如此。最好选择一个已经包含采访者和受访者概念的现有词汇表。或者,创建您自己的词汇表来定义您需要的术语,并将其用于创建上下文类型。

您还转义了对象中使用的 URI(例如“http://purl.org/dc/terms/identifier”),这可能不会产生您想要的结果,只需使用常规 URI,例如“http://purl.org/dc/terms/identifier” ".

(此外,您使用了未定义的“info”前缀。而且,没有必要在每个级别都声明@context)。

例如,您可能会考虑创建 http://example.foo/my-vocab# 并在其中定义属性(当然,使用您自己的可解引用 IRI):

{
"@context": {
"dc": "dc:identifier",
"rdf": "URI:http:/www.w3.org/1999/02/22-rdf-syntax-ns#",
"rdfs": "http://www.w3.org/2000/01/rdf-schema#"
},
"@graph": [
{
"@id": "http://example.foo/interviewees",
"@type": "rdf:Property",
"rdfs:comment": "Interviewee",
"rdfs:subPropertyOf": {
"@id": "dc:contributor"
}
},
{
"@id": "http://example.foo/interviewers",
"@type": "rdf:Property",
"rdfs:comment": "Interviewer",
"rdfs:subPropertyOf": {
"@id": "dc:contributor"
}
}
]
}

然后您可以将它与对象的上下文一起使用,如下所示:

{
"@context": {
"id": "http://purl.org/dc/terms/identifier",
"myvocab": "http://example.foo/myvocab#",
"info": "http://example.foo/info#",
"interviewers": {
"@id": "myvocab:interviewers",
"@type": "@id",
"@container": "@set"
},
"title": "http://purl.org/dc/terms/title",
"interviewees": {
"@id": "myvocab:interviewees",
"@type": "@id",
"@container": "@set"
}
},
"id": "06bad25f-83c1-4ee5-b055-0cb87d4c06be",
"interviewers": [
{
"id": "b0c262ce-7eb3-47f2-b212-a0e71cca0c92",
"name": "Somebody",
"@id": "urn:uuid:b0c262ce-7eb3-47f2-b212-a0e71cca0c92",
"@type": [
"http://id.loc.gov/vocabulary/relators/ivr"
]
}
],
"title": "Interview with So and So",
"interviewees": [
{
"id": "bd6bb9ec-f417-4f81-af69-e3d191e3f73b",
"name": "A third person",
"gender": "male",
"@id": "urn:uuid:bd6bb9ec-f417-4f81-af69-e3d191e3f73b",
"@type": [
"http://id.loc.gov/vocabulary/relators/ive"
]
}
],
"@id": "urn:uuid:06bad25f-83c1-4ee5-b055-0cb87d4c06be",
"@type": [
"info:repository/interview"
]
}

(另外,在 JSON-LD playground 上检查一下

如果你把它变成类似 Turtle 的东西(尝试 http://rdf.greggkellogg.net/ ),你会得到以下内容:

@prefix dc: <http://purl.org/dc/terms/> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

<urn:uuid:06bad25f-83c1-4ee5-b055-0cb87d4c06be> a <http://example.foo/info#repository/interview>;
dc:title "Interview with So and So";
<http://example.foo/myvocab#interviewees> <urn:uuid:bd6bb9ec-f417-4f81-af69-e3d191e3f73b>;
<http://example.foo/myvocab#interviewers> <urn:uuid:b0c262ce-7eb3-47f2-b212-a0e71cca0c92>;
dc:identifier "06bad25f-83c1-4ee5-b055-0cb87d4c06be" .

<urn:uuid:b0c262ce-7eb3-47f2-b212-a0e71cca0c92> a <http://id.loc.gov/vocabulary/relators/ivr>;
dc:identifier "b0c262ce-7eb3-47f2-b212-a0e71cca0c92" .

<urn:uuid:bd6bb9ec-f417-4f81-af69-e3d191e3f73b> a <http://id.loc.gov/vocabulary/relators/ive>;
dc:identifier "bd6bb9ec-f417-4f81-af69-e3d191e3f73b" .

关于ruby - 消除 JSON-LD 中具有相同谓词的资源的歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21194090/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com