doc/LD/RDF_star/readme.md
2025-10-03 14:57:58 +03:00

154 lines
5.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## RDF*
### info
- https://www.w3.org/2021/12/rdf-star.html
- https://github.com/semantic-systems/rdf-star-tutorial/blob/main/RDFstar-demo.md?ysclid=mfyb392six637812628
- «a» — сокращение для rdf:type
### example
#### database link
Допустим есть две системы (database), соединенные линком, например, JDBC. Как показать эту связь на "языке знаний" (linked data)?
##### mermaid
```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
- https://github.com/mermaid-js/mermaid
- https://mermaid.js.org/syntax/flowchart.html
- https://habr.com/ru/articles/652867/
#### RDF
- https://www.vvsu.ru/files/71C1ABA2-F84E-40EB-88B1-1D5DE0BA3FB1.pdf
- https://www.w3.org/2007/03/rdf_concepts_ru/Overview.html#ref-rdf-primer
- https://trinidata.ru/tech_properties.htm
### AI
#### Как выразить связь вида `:система1 :линк1 :система2 .` и задать свойства `линк1`
В RDF и Turtle обычно свойства (predicate) — это URI, а не объекты с дополнительными свойствами. Но если вы хотите именно так:
```
:система1 :линк1 :система2 .
```
где `:линк1` — это имя свойства (предиката), а потом отдельно описать свойства этого предиката (например, id и type), то в стандартном RDF это сделать нельзя, потому что предикаты не могут иметь свойства.
#### Как обойти это ограничение
1. **Использовать reification (реификацию)** — описать сам факт триплета как ресурс, которому можно задать свойства.
2. **Использовать RDF* (RDF-star)** — расширение RDF, позволяющее вложенные триплеты и свойства к ним.
---
#### Пример с RDF* (современный и удобный способ)
```turtle
@prefix : <https://example.org#> .
:система1 :линк1 :система2 .
<< :система1 :линк1 :система2 >> :id "линк1" ;
:type :ТипЛинка .
```
Здесь `<< :система1 :линк1 :система2 >>` — это вложенный триплет, к которому можно добавить свойства `:id` и `:type`.
---
#### Пример с классической реификацией
```turtle
@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* более современный и удобный, если ваша система его поддерживает.