2013-06-27 10 views
5

Рассмотрим следующий экземпляр SomeClass:Убедитесь, что несколько предметов указывают на тот же список пустых узлов

instances:some_thing1 
       a semapi:SomeClass ; 
       semapi:hasChainTo (
         [ ... ] [ ... ] [ ... ] 
       ) . 

Мне нужно каждый экземпляр (some_thing2, some_thing3 и т.д.), чтобы иметь свою точку hasChainTo собственности на тот же список пустых узлов (как в нем есть только одна его копия). Мне нужно сохранить список синтаксиса пустых узлов, потому что цепи становятся очень глубокими, и этот синтаксис является очень текучим для записи каждой цепочки (для , SomeClass3 и т. Д.).

Если я просто делаю из него базовый класс и subClassOf, то свойство hasChainTo наследует, но не объект, на который он указывает. Это интуитивно имеет смысл, но мне нужно другое поведение.

Как это можно сделать?

ответ

5

Если вы хотите обратиться к одной и той же вещи из нескольких узлов на графике, вы должны указать URI. Он не должен быть полный http: URI - вы можете использовать UUID:

instances:some_thing_1 
    semapi:hasChainTo <urn:uuid:12345>. 
instances:some_thing_2 
    semapi:hasChainTo <urn:uuid:12345>. 
instances:some_thing_3 
    semapi:hasChainTo <urn:uuid:12345>. 

<urn:uuid:12345> 
    semapi:chain (
    [ .. ] [ .. ] [ .. ] 
). 

Не путайте RDFS/OWL подклассы с наследованием состояния и поведения в объектно-ориентированных языках. Иерархия классов в RDFS предназначена для , классифицируя узлов, т. Е. Назначая их классу, где класс представляет собой некоторый набор ресурсов. Нет прямого эквивалента повторного использования кода, которое вы получаете от наследования на таких языках, как Java.

+2

Если OWL на картинке (который он, вероятно, не является, так как используются списки RDF), когда есть способ, чтобы обратиться к списку, хотя, вы можете указать, что 'SomeClass SubClassOf semapi: hasChainTo value ', что означает, что каждый экземпляр' SomeClass' на самом деле 'semapi: hasChainTo ' (и «каждый экземпляр» включает экземпляры подклассов). –

+3

Да, это правда, что вы можете это сделать. Вы бы избавились от необходимости использования OWL-аргументатора против необходимости утверждать одну дополнительную тройку каждый раз, когда создается экземпляр. Поскольку парламент уже отметил, что обновление производительности вызывает беспокойство, я не уверен, что сделаю компромисс в пользу рассудка. Но это решение полностью зависит от полной детализации контекста проекта. –

2

Возможно, вы работаете в RDF (S), а не в OWL, но если у вас есть возможность использовать инструменты на основе OWL и ради тех, кто находит этот вопрос и может использовать инструменты на основе OWL, вот ответ на OWL.

Если вы хотите, чтобы каждый экземпляр класса (включая экземпляры его подклассов) имел некоторое значение свойства, вы можете использовать Individual Value Restriction. В синтаксисе Манчестера, вы можете сказать, что случаи SomeClass все имеют значение sharedIndividual для Собствености hasValue аксиома:

SomeClass SubClassOf hasValue value sharedIndividual 

Тогда каждый экземпляр SomeClass имеет тип hasValue value sharedIndividual, что означает, что экземпляр имеет sharedIndividual, как значение для объекта hasValue.

Вот сериализация N3 онтологии с классом SomeClass и двумя подклассами SomeSubClass и AnotherSubClass. Каждый из трех классов имеет объявленного человека. Тип hasValue value sharedIndividual является суперклассом SomeClass.

@prefix :  <http://www.example.com/valueClassExample#> . 
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . 
@prefix owl:  <http://www.w3.org/2002/07/owl#> . 
@prefix xsd:  <http://www.w3.org/2001/XMLSchema#> . 
@prefix rdf:  <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . 

<http://www.example.com/valueClassExample> 
     a  owl:Ontology . 

:hasValue 
     a  owl:ObjectProperty . 

:sharedValue 
     a  owl:Thing , owl:NamedIndividual . 

:SomeClass 
     a  owl:Class ; 
     rdfs:subClassOf 
       [ a  owl:Restriction ; 
       owl:hasValue :sharedValue ; 
       owl:onProperty :hasValue 
       ] . 

:SomeSubClass 
     a  owl:Class ; 
     rdfs:subClassOf :SomeClass . 

:AnotherSubClass 
     a  owl:Class ; 
     rdfs:subClassOf :SomeClass . 

:SomeClassInstance 
     a  :SomeClass , owl:NamedIndividual . 

:SomeSubClassInstance 
     a  owl:NamedIndividual , :SomeSubClass . 

:AnotherSubClassInstance 
     a  owl:NamedIndividual , :AnotherSubClass . 

С помощью этой онтологии, загруженной в Protégé и Pellet прилагается для рассуждений, с просьбой которого люди имеют sharedValue в качестве значения hasValue собственности показывает все физическое лицо.

result of <code>hasValue value sharedProperty</code> DL query

+2

Благодарим за отзыв. Для других стоит отметить, что это поддерживается в профилях OWL 2 EL и RL, но не QL через ограничение ObjectHasValue. http://www.w3.org/TR/owl2-profiles/ – parliament

+1

@parliament Очень хорошее наблюдение! Я почти всегда работаю в OWL DL, поэтому я не изучил все возможности различных профилей, но это может быть очень важно для кого-то, кто должен оставаться в одном из них! –