Убедитесь, что несколько субъектов указывают на один и тот же список пустых узлов
Рассмотрим следующий случай 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
Свойство показывает все лица.
hasValue sharedProperty code> DL>