您可以如上所述创建自己的 URI,也可以使用空白节点。两种方法各有利弊:
URI 具有外部标识,因此您可以在以后的查询中明确引用您的概念,这可以使某些查询更加简单;但是,你他们有一个外部身份,所以你用来构造 URI 的算法成为你的基础设施的关键部分,你必须保证它们既稳定又独特。起初这可能是微不足道的,但是当您开始处理在不同时间重新处理的多个文档时,通常是并行的,并且在分布式系统上,它很快就不再是直截了当的。
空白节点被专门用来解决这个问题,它们的唯一性由它们的作用域来保证;但是,如果您需要在查询中明确引用空白节点,您将需要使用非标准扩展,或者找到某种方式来表征节点。
在这两种情况下,但特别是如果您使用空白节点,您应该包括出处声明来表征它。
@nathan 的例子是一个很好的例子。
因此,使用空白节点的示例可能是:
@prefix my: <http://yourdomain.com/2010/07/20/conceptmap#> 。
@prefix proc: <http://yourdomain.com/2010/07/20/processing#> 。
@prefix prg: <http://yourdomain.com/processors#> 。
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 。
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> 。
@prefix xsd: <http://www.example.org/> 。
@prefix dcterms: <http://purl.org/dc/terms/> 。
@prefix foaf: <http://xmlns.com/foaf/0.1/> 。
@前缀文档: <http://yourdomain.com/doc-path/> 。
_:1 rdf:type proc:ProcessRun ;
proc:parser prg:tagger ;
过程:版本“1.0.2”;
proc:time "2010-07-03 20:35:45"^^<xsd:Timestamp> ;
proc:host prg:hostname-of-processing-node ;
proc:file doc:some-doc#line=1,;md5=md5_sum_goes_here,mime-charset_goes_here ;
_:2 rdf:type foaf:Person ;
foaf:name "John Smith"@en ;
proc:identifiedBy _:1 ;
proc:atLocation doc:some-doc#char=0,9 。
_:3 rdf:type owl:Thing ;
foaf:name "华盛顿"@en ;
proc:identifiedBy _:1 ;
proc:atLocation doc:some-doc#char=24,33 。
<http://yourdomain.com/some-doc#this> rdf:type foaf:Document ;
dcterms:references _:2, _:3 。
请注意使用 rfc5147 文本/纯片段标识符来唯一标识正在处理的文件,这为您提供了如何识别单个运行的灵活性。另一种方法是在文档根的 URI 中捕获所有这些,或者完全放弃出处。
@prefix : <http://yourdomain.com/ProcessRun/parser=tagger/version=1.0.2/time=2010-07-03+20:35:45/host=hostname-of-processing-node/file= http%3A%2F%2Fyourdomain.com%2Fdoc-path%2Fsome-doc%23line%3D1%2C%3Bmd5%3Dmd5_sum_goes_here%2Cmime-charset_goes_here/$gt; .
@prefix my: <http://yourdomain.com/2010/07/20/conceptmap#> 。
@prefix proc: <http://yourdomain.com/2010/07/20/processing#> 。
@prefix prg: <http://yourdomain.com/processors#> 。
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 。
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> 。
@prefix xsd: <http://www.example.org/> 。
@prefix dcterms: <http://purl.org/dc/terms/> 。
@prefix foaf: <http://xmlns.com/foaf/0.1/> 。
@prefix 文档: <http://yourdomain.com/doc-path/some-doc#> 。
:1 rdf:type proc:ProcessRun ;
proc:parser prg:tagger ;
过程:版本“1.0.2”;
proc:time "2010-07-03 20:35:45"^^<xsd:Timestamp> ;
proc:host prg:hostname-of-processing-node ;
proc:file doc:some-doc#line=1,;md5=md5_sum_goes_here,mime-charset_goes_here ;
:2 rdf:type foaf:Person ;
foaf:name "John Smith"@en ;
proc:identifiedBy :1 ;
proc:atLocation doc:some-doc#char=0,9 。
:3 rdf:type owl:Thing ;
foaf:name "华盛顿"@en ;
proc:identifiedBy :1 ;
proc:atLocation doc:some-doc#char=24,33 。
<http://yourdomain.com/some-doc#this> rdf:type foaf:Document ;
dcterms:references :2, :3 。
你会注意到 foaf:name 有一个 owl:Thing 的范围,所以它可以应用于任何东西。另一种可能是使用 skos:Concept 和 rdfs:label 作为专有名词。
空白节点与 URI 的最后一个考虑因素是,您使用的任何数据存储最终都必须存储您使用的任何 URI,如果您使用非常大的数据集,这可能会对性能产生影响。
最终,如果我要在图表中发布出处信息以及最终的统一实体,我会倾向于使用空白节点并将 URI 分配给我最终统一实体的概念。
但是,如果我不打算跟踪推论的出处,而这只是管道中许多最终将丢弃中间结果的传递,我只会使用某种文档哈希、时间戳和 id 来创建 URI并完成它。
@前缀: <http://yourdomain.com/entities#> 。
@prefix my: <http://yourdomain.com/2010/07/20/conceptmap#> 。
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 。
@prefix dcterms: <http://purl.org/dc/terms/> 。
@prefix foaf: <http://xmlns.com/foaf/0.1/> 。
:filename_timestamp_1 rdf:type foaf:Person ;
foaf:name "John Smith"@en 。
:filename_timestamp_2 rdf:type owl:Thing ;
foaf:name "华盛顿"@en 。
<http://yourdomain.com/some-doc#this> rdf:type foaf:Document ;
dcterms:references :2, :3 。