Я изо всех сил пытался создать онтологию для музыкальных c данных фестиваля. По моим данным у меня есть люди класса Person
. У людей может быть профессия, выраженная свойством has_profession
, которое указывает на класс Profession
с несколькими подклассами, т.е. MusicArtist
, который имеет подкласс Composer
(то есть профессия, а не человек). Также у меня есть экземпляры класса Composition
, которые composed_by
являются экземплярами класса Person
и наоборот composed
Composition
. Как я могу создать свою онтологию таким образом, чтобы семантический c мыслитель мог сделать вывод из существования тройного :x :composed :y
(или :y :composed_by :x
) к (неявному) существованию тройного :x :has_profession :composer
?
Я пытался найти решение, и это то, что я сделал до сих пор. Но, похоже, это не совсем правильно.
@prefix owl: <http://www.w3.org/2002/07/owl#>.
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>.
@prefix dmt: <http://www.donaueschinger-musiktage.de/>.
@prefix foaf: <http://xmlns.com/foaf/0.1/>.
### Classes
foaf:Person a owl:Class.
dmt:Profession a owl:Class.
dmt:MusicArtist a owl:Class;
rdfs:subClassOf dmt:Profession.
dmt:Composer a owl:Class ;
rdfs:subClassOf dmt:MusicArtist;
rdfs:subClassOf
[ a owl:Restriction ;
owl:onProperty :composed ;
owl:allValuesFrom :Person ] .
dmt:Composition a owl:Class.
### Properties
dmt:composed a owl:ObjectProperty;
rdfs:domain foaf:Person;
rdfs:range dmt:Composition;
owl:inverseOf dmt:composed_by.
dmt:has_profession a owl:ObjectProperty;
rdfs:domain foaf:Person;
rdfs:range dmt:Profession;
### Individuals
dmt:A_Little_Song a dmt:Composition.
dmt:John_Doe a foaf:Person;
dmt:composed dmt:A_Little_Song.
### Now I want to infer, that John_Doe ":has_profession :composer"
### because he composed something...
Любые примеры или подсказки из лучших практик были бы очень хороши :) Заранее спасибо! JS