是否可以将其他信息添加到RDF三元组? [重复]

问题描述 投票:0回答:1

我有用RDF三元组表示的文档,有些用户可以在这些文档之间添加关系。我计划记录这些关系的方式如下:(RDF / XML代码的子集)

<rdf:Description rdf:about="SOURCEDocId">
    <kb:tocMember rdf:resource="TARGETDocId"/>
</rdf:Description>

<rdf:Description rdf:about="TARGETDocId">
    <kb:isInToc rdf:resource="SOURCEDocId"/>
</rdf:Description> 

(关系在目录中建立,因此为tocMember和isInToc名称)。

但是我现在需要存储创建此关系的UserId。一种异端的方式可能是添加属性,如:

<rdf:Description rdf:about="SOURCEDocId">
    <kb:tocMember xml:createdBy="USERId" rdf:resource="TARGETDocId"/>
</rdf:Description>

<rdf:Description rdf:about="TARGETDocId">
    <kb:isInToc xml:createdBy="USERId" rdf:resource="SOURCEDocId"/>
</rdf:Description>

我不确定这将被RDF三重存储接受,并且此信息也不能在SPARQL请求中使用。也有可能创建链接实体并对其进行限定,但这对于一个很小的实现需求来说是一团糟。有更好的方法吗?

sparql rdf
1个回答
1
投票

关于语句的声明可以在RDF中通过以下方式表示:

1)RDF标准化

2)n元关系

3)单例属性

4)命名图

5)使用RDF *

每个选项都有优点和缺点。

这是使用RDF验证来表示您的案件的方式(该示例包含在第一条语句中:]

:SOURCEDocId-tocMember-TARGETDocId
  rdf:type rdf:Statement ;
  :createdBy :USERId ;
  rdf:object :TARGETDocId ;
  rdf:predicate kb:tocMember ;
  rdf:subject :SOURCEDocId .

如所评论,使用Turle使其清晰易读。但是,由于您以RDF / XML给出了示例,因此其验证看起来像这样,以XML进行了序列化:

  <rdf:Statement rdf:ID="SOURCEDocId-tocMember-TARGETDocId">
    <createdBy rdf:resource="#USERId"/>
    <rdf:subject rdf:resource="#SOURCEDocId"/>
    <rdf:predicate rdf:resource="http://example.org/kb/tocMember"/>
    <rdf:object rdf:resource="#TARGETDocId"/>
  </rdf:Statement>

在实践中,通常不给语句提供URI,而将其留为空白节点:

[
  rdf:type rdf:Statement ;
  :createdBy :USERId ;
  rdf:object :TARGETDocId ;
  rdf:predicate kb:tocMember ;
  rdf:subject :SOURCEDocId .
]

这里显示:createdBy是本地创建的,但是如果重用适当词汇中的属性,例如Dublic Core的dc:creator或schema.org的schema:creator,那当然会更好。

使用选项(2),您不会直接将源链接到目标,而是通过一个中间节点,例如:targetEntry1,然后可以将其与值和来源相关联:

:SOURCEDocId kb:tocMember :targetEntry1 . 
:targetEntry1 :value :TARGETDocId ;
     :createdBy :USERId .
© www.soinside.com 2019 - 2024. All rights reserved.