Вы можете либо пометить свой собственный URI, как описано выше, либо использовать пустой узел. Существуют плюсы и минусы для обоих подходов:
URI имеют внешнюю идентификационную информацию, поэтому вы можете явно ссылаться на свою концепцию в будущих запросах, которые могут сделать некоторые запросы намного проще; но у вас есть внешняя идентификация, поэтому алгоритм, который вы используете для создания URI, становится важной частью вашей инфраструктуры, и вы должны гарантировать, что они стабильны и уникальны. Сначала это может быть тривиально, но когда вы начинаете работать с несколькими документами, которые перерабатываются в разное время, часто параллельно и в распределенных системах, он довольно быстро перестает быть прямым.
Пустые узлы были включены специально для решения этой проблемы, их уникальность гарантирована их охватом; но, если вам нужно будет явно ссылаться на пустой узел в запросе, вам понадобится использовать нестандартное расширение или найти способ описать узел.
В обоих случаях, но особенно если вы используете пустой узел, вы должны включить утверждения о происхождении, чтобы охарактеризовать его в любом случае.
@ Натан пример хороший, чтобы получить эту идею.
Так пример использования пустых-узлов может быть:
@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:version "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 "Washington"@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 doc: <http://yourdomain.com/doc-path/some-doc#> .
:1 rdf:type proc:ProcessRun ;
proc:parser prg:tagger ;
proc:version "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 "Washington"@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: имя имеет диапазон сову: Вещь, поэтому оно может быть применено к чему-либо. Альтернативой может быть использование скинов: Concept и rdfs: label для собственных существительных.
Одно из последних соображений для пустого узла и URI заключается в том, что в любом хранилище данных, которое вы используете, в конечном итоге придется хранить любой URI, который вы используете, и это может иметь последствия для производительности, если вы используете очень большие наборы данных.
В конечном счете, если бы я собирался опубликовать информацию о происхождении на графике вместе с окончательными унифицированными сущностями, я был бы склонен идти с пустыми узлами и распределять URI с концепциями, которые я в конечном счете унифицирую сущности.
Если, однако, я не собираюсь отслеживать происхождение выводов, и это всего лишь один проход многих в конвейере, который в конечном итоге отбросит промежуточные результаты, я бы просто набрал URI, используя какой-то хэш документа, timestamp и id, и с этим делать.
@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 "Washington"@en .
<http://yourdomain.com/some-doc#this> rdf:type foaf:Document ;
dcterms:references :2, :3 .
И создать пространство имен для каждого слизняк данных? – bmargulies
Я думал об одном пространстве имен для всего вашего набора данных. Тогда уникальные идентификаторы для всего, что вы не знаете, одинаковы. –