Вы можете либо чинить свой собственный 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: name имеет диапазон owl: Thing, поэтому его можно применятьни к чему.Альтернативой может быть использование skos: Concept и rdfs: label для правильных существительных.
И последнее замечание для пустого узла и URI заключается в том, что любое хранилище данных, которое вы используете, в конечном итоге должно будет хранить любой используемый вами URI, иэто может повлиять на производительность, если вы используете очень большие наборы данных.
В конечном итоге, если бы я собирался опубликовать информацию о происхождении в графе вместе с окончательными объединенными объектами, я бы склонялся к использованию пустых узлови назначить URI для концепций, с которыми я в конечном итоге объединяю сущности.
Если, однако, я не собираюсь отслеживать происхождение выводов, и это всего лишь один из множества проходов в конвейере, который в конечном итоге отбросит промежуточноеВ результате я просто чеканил бы 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 "Washington"@en .
<http://yourdomain.com/some-doc#this> rdf:type foaf:Document ;
dcterms:references :2, :3 .