Измените ПРЕФИКС в SPARQL

Я создал онтологию с разными префиксами (rdf:, rdfs:, owl:, example:, car:, bike:, ...). Я использую их для обозначения различных областей и примеров.

Небольшой отрывок:

car:Software rdf:type demo:CyberObject.
car:Hardware rdf:type spdm:PhysicalObject.
car:Software car:hasMaturity "ten".
car:Hardware demo:isProducedIn loc:NorthPole.

Есть ли способ изменить PREFIX "car:" на, например, "plane:" и сохранить отношения:

plane:Software rdf:type demo:CyberObject.
plane:Hardware rdf:type spdm:PhysicalObject.
plane:Software plane:hasMaturity "ten".
plane:Hardware demo:isProducedIn loc:NorthPole.

Мне все еще нужны все отношения. Объекты с PREFIX "car:" заменять не нужно; достаточно было бы создать новые с новым PREFIX и оставить старый объект в базе данных ..

Спасибо за любой совет!


person Grapheneer    schedule 21.12.2017    source источник
comment
SPARQL 1.1 Обновление запроса не работает? заменить старый URI новым URI, или в чем именно проблема?   -  person UninformedUser    schedule 21.12.2017
comment
Онтология уже существует в редакторе онтологий / хранилище троек. Я просто хочу изменить префиксы существующих узлов @AKSW   -  person Grapheneer    schedule 21.12.2017
comment
Я знаю, что ты хотел сделать. Но я не вижу, что вы пробовали до сих пор ... но знаю, что это не имеет значения, посмотрите идеальный ответ @StanislavKralin ниже (и примите его)   -  person UninformedUser    schedule 21.12.2017
comment
Вы создали данные экземпляра, а не онтологию. Онтология - это структура классов и атрибутов, которая используется для описания сущностей. Ваши данные описывают сущности.   -  person TallTed    schedule 21.12.2017


Ответы (1)


Последовательно заменяйте префиксы в субъектах, предикатах и ​​объектах.

prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
prefix car: <http://example.com/car/>
prefix demo: <http://example.com/demo/>
prefix spdm: <http://example.com/spdm/>
prefix loc: <http://example.com/loc/>
prefix plane: <http://example.com/plane/>

DELETE {?s ?p1 ?o} INSERT {?s ?p2 ?o} WHERE
{
?s ?p1 ?o .
FILTER (strstarts(str(?p1), str(car:)))
BIND (IRI(replace(str(?p1), str(car:), str(plane:)))  AS ?p2)
} ;

DELETE {?s1 ?p ?o} INSERT {?s2 ?p ?o} WHERE
{
?s1 ?p ?o .
FILTER (strstarts(str(?s1), str(car:)))
BIND (IRI(replace(str(?s1), str(car:), str(plane:)))  AS ?s2)
} ; 

DELETE {?s ?p ?o1} INSERT {?s ?p ?o2} WHERE
{
?s ?p ?o1 .
FILTER (strstarts(str(?o1), str(car:)) && isIRI(?o1))
BIND (IRI(replace(str(?o1), str(car:), str(plane:)))  AS ?o2)
} ;

Не тестировался в Allegrograph, и, возможно, существуют специальные решения для Allegrograph.

Обновить

Мне по-прежнему нужны все отношения, объекты с ПРЕФИКСОМ "автомобиль" заменять не надо…

Тогда не заменяйте префиксы в объектах. Однако имейте в виду, что объект в одной тройке может быть субъектом в другой тройке.

… Достаточно было бы создать новые с новым ПРЕФИКСОМ и сохранить старый объект в базе данных.

«Автономные» URI не хранятся в тройном хранилище.

person Stanislav Kralin    schedule 21.12.2017