Убедитесь, что несколько субъектов указывают на один и тот же список пустых узлов

Рассмотрим следующий случай SomeClass:

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

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

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

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

2 ответа

Решение

Если вы хотите сослаться на одну и ту же вещь из нескольких узлов в графе, вы должны дать ей 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.

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

Если вы хотите, чтобы у каждого экземпляра класса (включая экземпляры его подклассов) было какое-то общее значение свойства, вы можете использовать ограничение индивидуального значения. В синтаксисе Манчестера вы можете сказать, что случаи 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 Свойство показывает все лица.

результат запроса <code> hasValue sharedProperty </ code> DL hasValue sharedProperty DL>

Другие вопросы по тегам