Перейти к основному содержимому

Проект как RDF

Этот документ был подготовлен при помощи ИИ

Текст может содержать неточности, устаревшие данные или технические ошибки. Пожалуйста, проверяйте критически важную информацию перед использованием.

Содержимое проекта доступно в виде RDF: объект становится ресурсом, атрибут и ссылка — триплетом, модель — именованным графом. У проекта есть своя конечная точка SPARQL, а модель можно скачать в Turtle или TriG.

Скачайте модель

Щёлкните правой кнопкой мыши по модели в навигаторе моделей, откройте подменю Скачать и выберите RDF Turtle или RDF TriG.

Триплеты в обоих файлах одинаковы. Turtle записывает их плоско и объявляет префикс для каждой используемой метамодели. TriG помещает их в именованный граф, IRI которого совпадает с URL скачивания модели — тем же, которым модель обозначена в конечной точке SPARQL.

В начале файла стоит заголовок онтологии: модель объявлена как owl:Ontology, а метамодели, от которых она зависит, перечислены через owl:imports.

Как выглядят объекты

Объект — ресурс, названный по своему идентификатору:

urn:uuid:8b1f0d38-6c40-4a1e-9a20-2f8b7d1c5e44

Триплет rdf:type называет конкретный класс объекта. IRI класса состоит из пространства имён метамодели, символа # и имени класса:

http://www.archimatetool.com/archimate#BusinessActor

В IRI свойства добавляется класс, который объявляет признак, точка и имя признака. Имя есть у BusinessActor, но объявлено оно в Nameable:

?actor archimate:Nameable.name "Customer" .

То же со связями: source и target объявлены в ArchimateRelationship независимо от конкретного типа связи.

Атрибут даёт триплет с литералом, ссылка — триплет с IRI целевого объекта. Вложенность записывается ссылками, поэтому дерево папок модели — цепочка триплетов. Триплеты появляются только у заданных признаков: производные и временные не записываются.

Запросы к проекту

У каждого проекта есть конечная точка SPARQL 1.1, работающая по всем его моделям:

curl -X POST https://architeezy.com/api/projects/$PROJECT/sparql \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/sparql-query" \
--data 'SELECT DISTINCT ?g WHERE { GRAPH ?g { ?s ?p ?o } }'

Этот запрос перечисляет графы — по одному на модель. Сохраните их IRI: обновление обязано указывать граф. Запрос без GRAPH читает все модели проекта.

Поддерживаются все четыре формы запроса. Тип ответа зависит от формы: SELECT даёт application/sparql-results+json, ASK — логическое значение в JSON, CONSTRUCT и DESCRIBE — Turtle.

Параметр ?inference=rdfs выполняет запрос над графом с выведенными триплетами, поэтому запрос по надтипу находит и экземпляры подтипов.

Анонимный запрос отклоняется с кодом 401. Недоступный проект отвечает 404 — так же, как несуществующий.

Обновления

Обновления отправляют на отдельный адрес, POST /api/projects/<projectId>/sparql/update с типом содержимого application/sparql-update. Успешное обновление отвечает кодом 204.

Триплеты в INSERT и DELETE должны находиться внутри GRAPH: обновление с триплетами в графе по умолчанию отклоняется с кодом 400.

PREFIX archimate: <http://www.archimatetool.com/archimate#>

DELETE {
GRAPH <https://architeezy.com/api/models/acme/landscape/1.0.0/core/content> {
?actor archimate:Nameable.name ?old .
}
}
INSERT {
GRAPH <https://architeezy.com/api/models/acme/landscape/1.0.0/core/content> {
?actor archimate:Nameable.name "Customer" .
}
}
WHERE {
GRAPH <https://architeezy.com/api/models/acme/landscape/1.0.0/core/content> {
?actor a archimate:BusinessActor ;
archimate:Nameable.name ?old .
FILTER (str(?old) = "Client")
}
}

Модели, графы которых изменились, записываются обратно в репозиторий, и изменение появляется в открытых редакторах. Остальные модели не затрагиваются. Обновление модели без прав на запись отклоняется с кодом 403.

Загрузка RDF

Команда Загрузить модель в меню проекта читает .ttl как Turtle, .trig — как TriG. То же содержимое отправляют через API запросом PUT /api/models/<id>/content?format=ttl.

При загрузке RDF отображается на метамодель, которая уже есть в репозитории: каждый IRI rdf:type разрешается в класс, каждый IRI предиката — в признак объявляющего класса. Новые классы и свойства не создаются, поэтому файл должен соответствовать метамодели, а метамодель — быть доступной проекту. Утверждение с неразрешённым классом или свойством пропускается, объект абстрактного класса не создаётся.

Идентификаторы сохраняются: ресурс urn:uuid:<id> загружается как объект с тем же идентификатором, поэтому выгрузка и загрузка дают исходные объекты, а не их копии.

Метамодель как онтология

Метамодель выгружается в виде онтологии, описывающей данные. Для этого к её адресу добавляют /owl:

GET /api/models/<scope>/<project>/<version>/<model>/owl?format=ttl
GET /api/predefined-metamodels/<id>/owl?format=ttl

Классы становятся ресурсами с rdfs:label и rdfs:subClassOf. Атрибуты и ссылки становятся свойствами с rdfs:domain и rdfs:range; однозначный признак объявляется ещё и owl:FunctionalProperty. Противоположные ссылки связываются через owl:inverseOf, идентифицирующий атрибут — owl:hasKey. Перечисления сохраняют литералы, а тип данных, совпадающий со стандартным типом XML Schema, объявляется его owl:equivalentClass: String соответствует xsd:string.

Дополнительные материалы