我有用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请求中使用。也有可能创建链接实体并对其进行限定,但这对于一个很小的实现需求来说是一团糟。有更好的方法吗?
关于语句的声明可以在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 .