mirror of
https://github.com/trustgraph-ai/trustgraph.git
synced 2026-04-25 16:36:21 +02:00
416 lines
22 KiB
Markdown
416 lines
22 KiB
Markdown
|
|
---
|
|||
|
|
layout: default
|
|||
|
|
title: "Техническая спецификация контекстов графов"
|
|||
|
|
parent: "Russian (Beta)"
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
# Техническая спецификация контекстов графов
|
|||
|
|
|
|||
|
|
> **Beta Translation:** This document was translated via Machine Learning and as such may not be 100% accurate. All non-English languages are currently classified as Beta.
|
|||
|
|
|
|||
|
|
## Обзор
|
|||
|
|
|
|||
|
|
Эта спецификация описывает изменения основных примитивов графа TrustGraph для
|
|||
|
|
соответствия RDF 1.2 и поддержки полной семантики набора данных RDF. Это
|
|||
|
|
радикальное изменение для серии выпусков 2.x.
|
|||
|
|
|
|||
|
|
### Версионирование
|
|||
|
|
|
|||
|
|
- **2.0**: Ранний выпуск для тестирования. Основные функции доступны, но
|
|||
|
|
возможно, еще не полностью готовы к производственному использованию.
|
|||
|
|
- **2.1 / 2.2**: Промышленный выпуск. Стабильность и полнота проверены.
|
|||
|
|
|
|||
|
|
Гибкость в отношении зрелости намеренна - ранние пользователи могут получить
|
|||
|
|
доступ к новым возможностям, прежде чем все функции будут полностью
|
|||
|
|
проверены.
|
|||
|
|
|
|||
|
|
## Цели
|
|||
|
|
|
|||
|
|
Основные цели этой работы - обеспечить возможность добавления метаданных к
|
|||
|
|
фактам/утверждениям:
|
|||
|
|
|
|||
|
|
- **Временная информация**: Связывание фактов со временными метаданными
|
|||
|
|
- Когда факт считался истинным
|
|||
|
|
- Когда факт стал истинным
|
|||
|
|
- Когда факт был признан ложным
|
|||
|
|
|
|||
|
|
- **Происхождение/Источники**: Отслеживание источников, подтверждающих факт
|
|||
|
|
- "Этот факт подтверждается источником X"
|
|||
|
|
- Связывание фактов с исходными документами
|
|||
|
|
|
|||
|
|
- **Достоверность/Надежность**: Запись утверждений об истинности
|
|||
|
|
- "Пользователь P заявил, что это было правдой"
|
|||
|
|
- "Пользователь Q утверждает, что это неправда"
|
|||
|
|
- Обеспечение оценки надежности и обнаружения конфликтов
|
|||
|
|
|
|||
|
|
**Гипотеза**: Реификация (RDF-star / цитируемые тройки) является ключевым
|
|||
|
|
механизмом для достижения этих результатов, поскольку все они требуют
|
|||
|
|
создания утверждений об утверждениях.
|
|||
|
|
|
|||
|
|
## Предыстория
|
|||
|
|
|
|||
|
|
Чтобы выразить фразу "факт (Алиса знает Боба) был обнаружен 15 января 2024 года"
|
|||
|
|
или "источник X поддерживает утверждение (Y вызывает Z)", необходимо
|
|||
|
|
обращаться к ребру как к чему-то, о чем можно делать утверждения. Стандартные
|
|||
|
|
тройки не поддерживают это.
|
|||
|
|
|
|||
|
|
### Текущие ограничения
|
|||
|
|
|
|||
|
|
Текущий класс `Value` в `trustgraph-base/trustgraph/schema/core/primitives.py`
|
|||
|
|
может представлять:
|
|||
|
|
- URI-узлы (`is_uri=True`)
|
|||
|
|
- Литеральные значения (`is_uri=False`)
|
|||
|
|
|
|||
|
|
Поле `type` существует, но не используется для представления типов данных XSD.
|
|||
|
|
|
|||
|
|
## Технический дизайн
|
|||
|
|
|
|||
|
|
### Функции RDF для поддержки
|
|||
|
|
|
|||
|
|
#### Основные функции (связанные с целями реификации)
|
|||
|
|
|
|||
|
|
Эти функции напрямую связаны с целями временной информации, происхождения и
|
|||
|
|
достоверности:
|
|||
|
|
|
|||
|
|
1. **Цитируемые тройки RDF 1.2 (RDF-star)**
|
|||
|
|
- Ребра, указывающие на другие ребра
|
|||
|
|
- Тройка может быть субъектом или объектом другой тройки
|
|||
|
|
- Позволяет делать утверждения об утверждениях (реификация)
|
|||
|
|
- Основной механизм для аннотирования отдельных фактов
|
|||
|
|
|
|||
|
|
2. **Набор данных RDF / Именованные графы**
|
|||
|
|
- Поддержка нескольких именованных графов внутри набора данных
|
|||
|
|
- Каждый граф идентифицируется IRI
|
|||
|
|
- Переход от троек (s, p, o) к квадам (s, p, o, g)
|
|||
|
|
- Включает граф по умолчанию и ноль или более именованных графов
|
|||
|
|
- IRI графа может быть субъектом в утверждениях, например:
|
|||
|
|
```
|
|||
|
|
<graph-source-A> <discoveredOn> "2024-01-15"
|
|||
|
|
<graph-source-A> <hasVeracity> "high"
|
|||
|
|
```
|
|||
|
|
- Обратите внимание: Именованные графы - это отдельная функция от
|
|||
|
|
реификации. Они имеют другие применения (разделение, контроль доступа,
|
|||
|
|
организация набора данных) и должны рассматриваться как отдельная
|
|||
|
|
возможность.
|
|||
|
|
|
|||
|
|
3. **Анонимные узлы** (Ограниченная поддержка)
|
|||
|
|
- Анонимные узлы без глобального URI
|
|||
|
|
- Поддерживаются для совместимости при загрузке внешних данных RDF
|
|||
|
|
- **Ограниченный статус**: Без гарантий стабильной идентичности после
|
|||
|
|
загрузки
|
|||
|
|
- Находите их с помощью запросов по подстановочным знакам (сопоставляйте по
|
|||
|
|
связям, а не по ID)
|
|||
|
|
- Не являются основной функцией - не полагайтесь на точную обработку
|
|||
|
|
анонимных узлов
|
|||
|
|
|
|||
|
|
#### Временные исправления (радикальное изменение в 2.0)
|
|||
|
|
|
|||
|
|
Эти функции не связаны напрямую с целями реификации, но являются ценными
|
|||
|
|
улучшениями, которые следует включить при внесении радикальных изменений:
|
|||
|
|
|
|||
|
|
4. **Типы литералов**
|
|||
|
|
- Правильное использование поля `type` для типов данных XSD
|
|||
|
|
- Примеры: xsd:string, xsd:integer, xsd:dateTime и т.д.
|
|||
|
|
- Исправляет текущее ограничение: невозможно правильно представлять даты
|
|||
|
|
или целые числа
|
|||
|
|
|
|||
|
|
5. **Языковые теги**
|
|||
|
|
- Поддержка языковых атрибутов для строковых литералов (@en, @fr и т.д.)
|
|||
|
|
- Обратите внимание: у литерала либо языковой тег, ЛИБО тип данных, но не
|
|||
|
|
оба (за исключением rdf:langString)
|
|||
|
|
- Важно для сценариев использования ИИ/многоязычности
|
|||
|
|
|
|||
|
|
### Модели данных
|
|||
|
|
|
|||
|
|
#### Термин (переименование из Value)
|
|||
|
|
|
|||
|
|
Класс `Value` будет переименован в `Term`, чтобы лучше отражать терминологию
|
|||
|
|
RDF. Это переименование имеет две цели:
|
|||
|
|
1. Согласование наименований с концепциями RDF ( "Term" может быть IRI,
|
|||
|
|
литералом, анонимным узлом или цитируемой тройкой - а не просто
|
|||
|
|
"значением")
|
|||
|
|
2. Вызывает проверку кода на интерфейсе радикальных изменений - любой код,
|
|||
|
|
который все еще ссылается на `Value`, явно не работает и требует
|
|||
|
|
обновления
|
|||
|
|
|
|||
|
|
Термин может представлять:
|
|||
|
|
|
|||
|
|
- **IRI/URI** - Именованный узел/ресурс
|
|||
|
|
- **Анонимный узел** - Анонимный узел с локальной областью
|
|||
|
|
- **Литерал** - Значение данных с одним из следующих:
|
|||
|
|
- Тип данных (тип XSD) ИЛИ
|
|||
|
|
- Языковой тег
|
|||
|
|
- **Цитируемая тройка** - Тройка, используемая в качестве термина (RDF 1.2)
|
|||
|
|
|
|||
|
|
##### Выбранный подход: Одиночный класс с дискриминатором типа
|
|||
|
|
|
|||
|
|
Структура определяется требованиями сериализации - в формате передачи данных
|
|||
|
|
необходим дискриминатор типа, независимо от представления на Python.
|
|||
|
|
Одиночный класс с полем типа - это естественный выбор и соответствует
|
|||
|
|
текущему шаблону `Value`.
|
|||
|
|
|
|||
|
|
Односимвольный код типа обеспечивает компактную сериализацию:
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
from dataclasses import dataclass
|
|||
|
|
|
|||
|
|
# Константы типа Term
|
|||
|
|
IRI = "i" # IRI/URI узел
|
|||
|
|
BLANK = "b" # Анонимный узел
|
|||
|
|
LITERAL = "l" # Литеральное значение
|
|||
|
|
TRIPLE = "t" # Цитируемая тройка (RDF 1.2)
|
|||
|
|
|
|||
|
|
@dataclass
|
|||
|
|
class Term:
|
|||
|
|
type: str = "" # Один из: IRI, BLANK, LITERAL, TRIPLE
|
|||
|
|
|
|||
|
|
# Для терминов IRI (type == IRI)
|
|||
|
|
iri: str = ""
|
|||
|
|
|
|||
|
|
# Для анонимных узлов (type == BLANK)
|
|||
|
|
id: str = ""
|
|||
|
|
|
|||
|
|
# Для литералов (type == LITERAL)
|
|||
|
|
value: str = ""
|
|||
|
|
datatype: str = "" # URI типа данных XSD (взаимно исключающееся с language)
|
|||
|
|
language: str = "" # Языковой тег (взаимно исключающееся с datatype)
|
|||
|
|
|
|||
|
|
# Для цитируемых троек (type == TRIPLE)
|
|||
|
|
triple: "Triple | None" = None
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Примеры использования:
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
# Термин IRI
|
|||
|
|
node = Term(type=IRI, iri="http://example.org/Alice")
|
|||
|
|
|
|||
|
|
# Литерал с типом данных
|
|||
|
|
age = Term(type=LITERAL, value="42", datatype="xsd:integer")
|
|||
|
|
|
|||
|
|
# Литерал с языковым тегом
|
|||
|
|
label = Term(type=LITERAL, value="Hello", language="en")
|
|||
|
|
|
|||
|
|
# Анонимный узел
|
|||
|
|
anon = Term(type=BLANK, id="_:b1")
|
|||
|
|
|
|||
|
|
# Цитируемая тройка (утверждение об утверждении)
|
|||
|
|
inner = Triple(
|
|||
|
|
s=Term(type=IRI, iri="http://example.org/Alice"),
|
|||
|
|
p=Term(type=IRI, iri="http://example.org/knows"),
|
|||
|
|
o=Term(type=IRI, iri="http://example.org/Bob"),
|
|||
|
|
)
|
|||
|
|
reified = Term(type=TRIPLE, triple=inner)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
##### Рассмотренные альтернативы
|
|||
|
|
|
|||
|
|
**Вариант B: Объединение специализированных классов** (`Term = IRI | BlankNode | Literal | QuotedTriple`)
|
|||
|
|
- Отклонено: Сериализация все равно потребует дискриминатора типа, что
|
|||
|
|
увеличивает сложность
|
|||
|
|
|
|||
|
|
**Вариант C: Базовый класс с подклассами**
|
|||
|
|
- Отклонено: Та же проблема с сериализацией, а также особенности
|
|||
|
|
наследования dataclass
|
|||
|
|
|
|||
|
|
#### Тройка / Квад
|
|||
|
|
|
|||
|
|
Класс `Triple` получает необязательное поле графа, чтобы стать квадом:
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
@dataclass
|
|||
|
|
class Triple:
|
|||
|
|
s: Term | None = None # Subject
|
|||
|
|
p: Term | None = None # Predicate
|
|||
|
|
o: Term | None = None # Object
|
|||
|
|
g: str | None = None # Имя графа (IRI), None = граф по умолчанию
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Решения в дизайне:
|
|||
|
|
- **Имя поля**: `g` для согласованности с `s`, `p`, `o`
|
|||
|
|
- **Необязательно**: `None` означает граф по умолчанию (неименованный)
|
|||
|
|
- **Тип**: Обычная строка (IRI) вместо Term
|
|||
|
|
- Имена графов всегда являются IRI
|
|||
|
|
- Анонимные узлы в качестве имен графов не допускаются (слишком
|
|||
|
|
путано)
|
|||
|
|
- Нет необходимости в полной машинерии Term
|
|||
|
|
|
|||
|
|
Обратите внимание: Имя класса остается `Triple`, даже если технически это
|
|||
|
|
квад. Это позволяет избежать изменений и "тройка" по-прежнему является
|
|||
|
|
общепринятым термином. Контекст графа является метаданными о том, где
|
|||
|
|
находится тройка.
|
|||
|
|
|
|||
|
|
### Шаблоны запросов
|
|||
|
|
|
|||
|
|
Текущий движок запросов принимает комбинации терминов S, P, O. С цитируемыми
|
|||
|
|
тройками сама тройка может быть допустимым термином в этих позициях. Ниже
|
|||
|
|
приведены примеры шаблонов запросов, поддерживающих исходные цели.
|
|||
|
|
|
|||
|
|
#### Семантика параметров графа
|
|||
|
|
|
|||
|
|
В соответствии с соглашениями SPARQL для обратной совместимости:
|
|||
|
|
|
|||
|
|
- **`g` опущено / None**: Запрос только к графу по умолчанию
|
|||
|
|
- **`g` = конкретный IRI**: Запрос только к этому именованному графу
|
|||
|
|
- **`g` = подстановочный знак / `*`**: Запрос по всем графам (эквивалентно
|
|||
|
|
SPARQL `GRAPH ?g { ... }`)
|
|||
|
|
|
|||
|
|
Это позволяет выполнять простые запросы простыми и делает запросы именованных
|
|||
|
|
графов опциональными.
|
|||
|
|
|
|||
|
|
Запросы между графами (g=подстановочный знак) полностью поддерживаются.
|
|||
|
|
Схема Cassandra включает специализированные таблицы (SPOG, POSG, OSPG), где g
|
|||
|
|
является столбцом кластеризации, а не ключом раздела, что обеспечивает
|
|||
|
|
эффективные запросы по всем графам.
|
|||
|
|
|
|||
|
|
#### Временные запросы
|
|||
|
|
|
|||
|
|
**Найти все факты, обнаруженные после определенной даты:**
|
|||
|
|
```
|
|||
|
|
S: ? # любая цитируемая тройка
|
|||
|
|
P: <discoveredOn>
|
|||
|
|
O: > "2024-01-15"^^xsd:date # сравнение даты
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Найти, когда определенный факт считался истинным:**
|
|||
|
|
```
|
|||
|
|
S: << <Alice> <knows> <Bob> >> # цитируемая тройка как субъект
|
|||
|
|
P: <believedTrueFrom>
|
|||
|
|
O: ? # возвращает дату
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Найти факты, которые были признаны ложными:**
|
|||
|
|
```
|
|||
|
|
S: ? # любая цитируемая тройка
|
|||
|
|
P: <discoveredFalseOn>
|
|||
|
|
O: ? # имеет любое значение (существует)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### Запросы происхождения
|
|||
|
|
|
|||
|
|
**Найти все факты, подтвержденные определенным источником:**
|
|||
|
|
```
|
|||
|
|
S: ? # любая цитируемая тройка
|
|||
|
|
P: <supportedBy>
|
|||
|
|
O: <source:document-123>
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Найти, какие источники подтверждают определенный факт:**
|
|||
|
|
```
|
|||
|
|
S: << <DrugA> <treats> <DiseaseB> >> # цитируемая тройка как субъект
|
|||
|
|
P: <supportedBy>
|
|||
|
|
O: ? # возвращает IRI источника
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### Запросы достоверности
|
|||
|
|
|
|||
|
|
**Найти утверждения, которые пользователь отметил как истинные:**
|
|||
|
|
```
|
|||
|
|
S: ? # любая цитируемая тройка
|
|||
|
|
P: <assertedTrueBy>
|
|||
|
|
O: <person:Alice>
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Найти конфликтующие утверждения (один и тот же факт, разная достоверность):**
|
|||
|
|
```
|
|||
|
|
# Первый запрос: факты, отмеченные как истинные
|
|||
|
|
S: ?
|
|||
|
|
P: <assertedTrueBy>
|
|||
|
|
O: ?
|
|||
|
|
|
|||
|
|
# Второй запрос: факты, отмеченные как ложные
|
|||
|
|
S: ?
|
|||
|
|
P: <assertedFalseBy>
|
|||
|
|
O: ?
|
|||
|
|
|
|||
|
|
# Логика приложения: найти пересечение субъектов
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Найти факты со значением надежности ниже определенного значения:**
|
|||
|
|
- **Vector store impact**
|
|||
|
|
```
|
|||
|
|
S: ?
|
|||
|
|
P: <value>
|
|||
|
|
O: <threshold>
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Граница хранилища векторов
|
|||
|
|
|
|||
|
|
Хранилища векторов всегда ссылаются только на IRI:
|
|||
|
|
- Никогда на ребра (цитируемые тройки)
|
|||
|
|
- Никогда на литеральные значения
|
|||
|
|
- Никогда на анонимные узлы
|
|||
|
|
|
|||
|
|
Это упрощает хранилище векторов - оно обрабатывает семантическое сходство
|
|||
|
|
именованных сущностей. Структура графа обрабатывает отношения,
|
|||
|
|
реификацию и метаданные. Цитируемые тройки и именованные графы не
|
|||
|
|
усложняют операции с векторами.
|
|||
|
|
|
|||
|
|
## Соображения безопасности
|
|||
|
|
|
|||
|
|
Именованные графы не являются функцией безопасности. Пользователи и
|
|||
|
|
коллекции остаются границами безопасности. Именованные графы предназначены
|
|||
|
|
исключительно для организации данных и поддержки реификации.
|
|||
|
|
|
|||
|
|
## Соображения производительности
|
|||
|
|
|
|||
|
|
- Цитируемые тройки добавляют глубину вложенности - могут повлиять на
|
|||
|
|
производительность запросов
|
|||
|
|
- Необходимы стратегии индексирования именованных графов для эффективных
|
|||
|
|
запросов, охватывающих графы
|
|||
|
|
- Проект схемы Cassandra должен учитывать эффективное хранение квадов.
|
|||
|
|
|
|||
|
|
### Vector store boundary
|
|||
|
|
|
|||
|
|
Vector stores always reference IRIs only:
|
|||
|
|
- Never edges (quoted triples)
|
|||
|
|
- Never literal values
|
|||
|
|
- Never blank nodes
|
|||
|
|
|
|||
|
|
This keeps the vector store simple - it handles semantic similarity of named
|
|||
|
|
entities. The graph structure handles relationships, reification, and metadata.
|
|||
|
|
Quoted triples and named graphs don't complicate vector operations.
|
|||
|
|
|
|||
|
|
## Стратегия тестирования
|
|||
|
|
|
|||
|
|
Используйте существующую стратегию тестирования. Поскольку это радикальное
|
|||
|
|
изменение, особое внимание уделяется комплексному набору тестов для
|
|||
|
|
проверки правильности работы новых структур во всех компонентах.
|
|||
|
|
|
|||
|
|
## План миграции
|
|||
|
|
|
|||
|
|
- 2.0 - это радикальное изменение; обратная совместимость не требуется
|
|||
|
|
- Существующие данные могут потребовать миграции на новую схему (будет
|
|||
|
|
определено на основе окончательного проекта)
|
|||
|
|
- Рассмотрите возможность использования инструментов миграции для преобразования
|
|||
|
|
существующих троек
|
|||
|
|
|
|||
|
|
## Открытые вопросы
|
|||
|
|
|
|||
|
|
- **Анонимные узлы**: Подтверждена ограниченная поддержка. Возможно, потребуется
|
|||
|
|
определить стратегию сколемизации (генерировать IRI при загрузке или
|
|||
|
|
сохранять идентификаторы анонимных узлов).
|
|||
|
|
- **Синтаксис запросов**: Какой конкретный синтаксис используется для
|
|||
|
|
указания цитируемых троек в запросах? Необходимо определить API запросов.
|
|||
|
|
- ~~**Словарь предикатов**~~: Решено. Допускаются любые допустимые
|
|||
|
|
предикаты RDF, включая пользовательские. Минимальные предположения о
|
|||
|
|
валидности RDF. Очень мало жестко заданных значений (например,
|
|||
|
|
`rdfs:label` используется в некоторых местах). Стратегия: избегать
|
|||
|
|
фиксирования чего-либо, если это абсолютно необходимо.
|
|||
|
|
- ~~**Влияние на хранилище векторов**~~: Решено. Хранилища векторов
|
|||
|
|
всегда указывают только на IRI - никогда на ребра, литеральные значения или
|
|||
|
|
анонимные узлы. Цитируемые тройки и реификация не влияют на хранилище
|
|||
|
|
векторов.
|
|||
|
|
- ~~**Семантика именованных графов**~~: Решено. Запросы по умолчанию
|
|||
|
|
выполняются к графу по умолчанию (соответствует поведению SPARQL,
|
|||
|
|
обратная совместимость). Требуется явный параметр графа для запросов к
|
|||
|
|
именованным графам или ко всем графам.
|
|||
|
|
|
|||
|
|
## Ссылки
|
|||
|
|
|
|||
|
|
- [Концепции RDF 1.2](https://www.w3.org/TR/rdf12-concepts/)
|
|||
|
|
- [RDF-star и SPARQL-star](https://w3c.github.io/rdf-star/)
|
|||
|
|
- [Набор данных RDF](https://www.w3.org/TR/rdf11-concepts/#section-dataset)
|
|||
|
|
```
|