2015-12-15 6 views
1

У меня есть трипстер с кунжутом с импортированной им онтологией.Проверка SPARQL UPDATE

Я знаю, что могу выполнять операции обновления SPARQL, вставляя экземпляры, удаляя экземпляры и обновляя вещи и прочее.

Но что делать, если эти операции используются неверно, например, вставить недействительную тройку, которая не имеет логики и не учитывает правила онтологии. Тройная как:

foo:Anna foo:likesToEat foo:arsenic. 

И онтология выглядит следующим образом:

@prefix foo: <http://www.foo.org/ontologies/example#>. 

foo:Anna rdf:type foo:Person. 
foo:Anna rdf:type owl:NamedIndividual. 
foo:Food rdf:type owl:Class. 
foo:Metal rdf:type owl:Class. 
foo:Person rdf:type owl:Class. 
foo:arsenic rdf:type foo:Metal. 
foo:arsenic rdf:type owl:NamedIndividual. 
foo:likesToEat rdf:type owl:ObjectProperty. 
foo:likesToEat rdfs:domain foo:Person. 
foo:likesToEat rdfs:range foo:Food. 
foo:pizza rdf:type foo:Food. 
foo:pizza rdf:type owl:NamedIndividual. 

Как вы можете видеть тройную "Foo: Anna Foo: likesToEat Foo: мышьяк" является недействительным, поскольку в диапазоне OBJECTPROPERTY не соблюдается.

Мои вопросы:

Есть ли способ проверки такого рода обновлений, так что операция обновления будет выполняться только в том случае онтология соблюдается? Есть ли способ установить трёхмерное хранилище для проверки этих вещей или это нужно сделать вручную?

ответ

2

Как вы можете видеть, тройной «foo: Anna foo: likesToEat foo: мышьяк» недействителен, потому что диапазон objectProperty не соблюдается.

Это не то, как работают онтологии (RDF (S)). С точки зрения онтологии эта тройка совершенно верна. Тот факт, что диапазон foo:likesToEat определен как класс foo:Food, означает, что мы можем заключить, что foo:arsenic имеет тип foo:Food. В вашей онтологии нет ничего, что сделало бы это неправильным или непоследовательным: ведь вы нигде не сказали, что что-то не может быть и Продовольствие и металл.

В более общем плане: утверждения домена/диапазона в схеме RDF не касаются «закрытия» того, что может использоваться для свойства. Семантика RDF работает наоборот: ограничение домена/диапазон на свойстве Pуказывает, что если определенный индивид X использует свойство P, мы можем сделать вывод, что X принадлежит к классу домена/дальности P.

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

Однако, если вы действительно этого хотели, вы могли бы, конечно, реализовать что-то, что отклоняет или предупреждает, когда вставляется тройка, которую вы считаете недействительной (по какой-либо причине). В зависимости от вашего случая использования у вас есть несколько вариантов:

  1. осуществлению такого Sail(Connection)Wrapper или Repository(Connection)Wrapper для перехвата операций вставки и сделать необходимые проверки.
  2. реализует RDFHandler (например, подкласс RDFInserter), который выполняет валидацию и использует этот обработчик для добавления/проверки данных (вместо использования стандартных методов RepositoryConnection.add).

Любого подход позволяет проверять каждый входящий тройным, сделать быстрый поиск в базе данных для его предиката, проверьте, есть ли ограничение домена/диапазон на нем, и если тройка «нарушает», что ограничение выдаст ошибку , Второй подход, вероятно, проще всего сделать, а также наиболее гибким: вы можете использовать эту проверку в некоторых случаях использования в своем коде и можете пропустить ее полностью в тех местах, где вы знаете, что это не обязательно (потому что, очевидно, такая проверка придет с штрафом за исполнение).

2

В этом случае работает Jeen, описывая, как работает RDFS или OWL.

Как уже упоминалось, для выполнения валидации требуется закрытый мир, который не является тем, что вы обычно получаете с семантикой RDFS или OWL.

С учетом сказанного, желая подтвердить ваши данные, это вполне разумная вещь, которую вы хотите сделать! W3C пытается определить что-то в этом area, но он еще не стандартизирован. iirc, у TopBraid есть определенная поддержка, но это может быть немного движущаяся цель, поскольку рабочая группа развивает стандарт. Я не знаю, есть ли для этого API-интерфейс Sesame, я думал, что TopBraid использует Jena, но, вероятно, стоит посмотреть.

Stardog поставляется с Integrity Constraint Validation (учебник доступен here), который является другим взять на себя проверку данных с использованием OWL, SPARQL, или правила, как синтаксис для определения ограничений. Отказ от ответственности заключается в том, что я работаю над этим, но он уместен, потому что: a) он выполняет валидацию точно так же, как и то, что вы ищете, и b) он поставляется с поддержкой API Sesame.