上記のように独自の URI を作成するか、空白ノードを使用できます。どちらのアプローチにも長所と短所があります。
URI には外部 ID があるため、将来のクエリで概念を明示的に参照できます。これにより、一部のクエリがより簡単になります。ただし、それらは外部 ID を持っているため、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/> .
@prefix doc: <http://yourdomain.com/doc-path/> .
_:1 rdf:type proc:ProcessRun ;
proc:parser prg:tagger ;
proc:バージョン「1.0.2」;
proc:time "2010-07-03 20:35:45"^^<xsd:タイムスタンプ> ;
proc:host prg:処理ノードのホスト名 ;
proc:file doc:some-doc#line=1,;md5=md5_sum_goes_here,mime-charset_goes_here ;
_:2 rdf:type foaf:Person ;
foaf:name "ジョン・スミス"@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 text/plain フラグメント識別子を使用して、処理中のファイルを一意に識別することに注意してください。これにより、個々の実行をどのように識別したいかについて柔軟性が得られます。別の方法は、ドキュメント ルートの URI でこれらすべてをキャプチャするか、出所を完全に放棄することです。
@prefix : <http://yourdomain.com/ProcessRun/parser=tagger/version=1.0.2/time=2010-07-03+20:35:45/host=処理ノードのホスト名/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 doc: <http://yourdomain.com/doc-path/some-doc#> .
:1 rdf:type proc:ProcessRun ;
proc:parser prg:tagger ;
proc:バージョン「1.0.2」;
proc:time "2010-07-03 20:35:45"^^<xsd:タイムスタンプ> ;
proc:host prg:処理ノードのホスト名 ;
proc:file doc:some-doc#line=1,;md5=md5_sum_goes_here,mime-charset_goes_here ;
:2 rdf:タイプ foaf:人;
foaf:name "ジョン・スミス"@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 を使用することもできます。
blank-node と URI に関する最後の考慮事項は、使用するすべてのデータストアが、使用するすべての URI を最終的に格納する必要があることです。これは、非常に大きなデータセットを使用している場合、パフォーマンスに影響を与える可能性があります。
最終的に、最終的に統合されたエンティティとともにグラフ内の来歴情報を公開する場合は、空白のノードを使用して、最終的にエンティティを統合する概念に URI を割り当てる傾向があります。
ただし、推論の出所を追跡するつもりはなく、これが最終的に中間結果を破棄するパイプライン内の多くのパスの 1 つにすぎない場合、何らかのドキュメント ハッシュ、タイムスタンプ、および ID を使用して URI を作成するだけです。そしてそれで終わります。
@prefix : <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 .