doc/LD/RDF_star
2025-10-30 21:53:31 +03:00
..
obj_link.md Update obj_link.md 2025-10-30 21:53:31 +03:00
readme.md Update readme.md 2025-10-03 14:57:58 +03:00

RDF*

info

example

Допустим есть две системы (database), соединенные линком, например, JDBC. Как показать эту связь на "языке знаний" (linked data)?

mermaid
graph TD;
    system1 -- JDBC -->system2;
Необъектная связь
@prefix : <foo/> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .

:system1 :link :system2 .

:system1 rdf:type :system .
:system2 rdf:type :system .
Объектная связь

Связь имеет свой id, свойства и т.п.
Если есть правило: не более одного линка (с учетом направления), то id удобно задавать "source-target", что обеспечит уникальность (drawio: id + label).
Однако в общем случае, между двумя системами может быть множество линков.

link1
@prefix : <foo/> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .

:system1 :link1 :system2 .

:link1
  rdfs:subPropertyOf :link ;
  :id "a1b2c3d4-e5f6-7890-1234-567890accdef" ;
  :protocol :jdbc ;
.

:link a rdf:Property .
:jdbc a :Protocol .

Cпаркл запрос, который вытягивает все встречающиеся протоколы связи:

prefix : <foo/>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>

select distinct ?protocol {
  ?s1 ?p ?s2 .
  ?p
    rdfs:subPropertyOf :link ;
    :protocol ?protocol ;
  .
}

см. также: https://github.com/bpmbpm/doc/blob/main/METAMODEL/object.md

RDF star

@prefix : <https://foo#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .

:system1 :link :system2 
  {| 
    :id "a1b2c3d4-e5f6-7890-1234-567890accdef" ;  
    :protocol :jdbc ;
  |} .
  
:system1 :link :system3 
  {| 
    :id "12334455-6fda-0519-9876-20ea3210b119" ;  
    :protocol :soap ;
  |} .
      
:link a rdf:Property .
:jdbc a :Protocol .
:soap a :Protocol .

mermaid

RDF

AI

Как выразить связь вида :система1 :линк1 :система2 . и задать свойства линк1

В RDF и Turtle обычно свойства (predicate) — это URI, а не объекты с дополнительными свойствами. Но если вы хотите именно так:

:система1 :линк1 :система2 .

где :линк1 — это имя свойства (предиката), а потом отдельно описать свойства этого предиката (например, id и type), то в стандартном RDF это сделать нельзя, потому что предикаты не могут иметь свойства.

Как обойти это ограничение

  1. Использовать reification (реификацию) — описать сам факт триплета как ресурс, которому можно задать свойства.

  2. Использовать RDF (RDF-star)* — расширение RDF, позволяющее вложенные триплеты и свойства к ним.


Пример с RDF* (современный и удобный способ)

@prefix : <https://example.org#> .

:система1 :линк1 :система2 .

<< :система1 :линк1 :система2 >> :id "линк1" ;
                              :type :ТипЛинка .

Здесь << :система1 :линк1 :система2 >> — это вложенный триплет, к которому можно добавить свойства :id и :type.


Пример с классической реификацией

@prefix : <https://example.org#> .

:система1 :линк1 :система2 .

:statement1 a rdf:Statement ;
    rdf:subject :система1 ;
    rdf:predicate :линк1 ;
    rdf:object :система2 ;
    :id "линк1" ;
    :type :ТипЛинка .

Здесь :statement1ресурс, описывающий сам факт связи, которому можно задать свойства.


Итог

  • В RDF предикаты не могут иметь свойства напрямую.
  • Для описания свойств связи используйте реификацию или RDF*.
  • RDF* более современный и удобный, если ваша система его поддерживает.