2015-02-16 3 views
0

В следующем примере классов введите код здесь: Class3 и: Class4 выводятся по OWL мыслителю (например, окатыши) в качестве типов личности: ind1:Как получить подмножество свойств индивида из выведенного класса

@prefix : <http://www.semanticweb.org/test/2015/1/ontology#> . 
@prefix owl: <http://www.w3.org/2002/07/owl#> . 
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . 
@prefix xml: <http://www.w3.org/XML/1998/namespace> . 
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> . 
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . 
@base <http://www.semanticweb.org/test/2015/1/ontology> . 

<http://www.semanticweb.org/test/2015/1/ontology> rdf:type owl:Ontology . 

:Prop1 rdf:type owl:DatatypeProperty . 
:Prop2 rdf:type owl:DatatypeProperty . 
:Prop3 rdf:type owl:DatatypeProperty . 

:Class1 rdf:type owl:Class ; 
     owl:equivalentClass [ rdf:type owl:Restriction ; 
           owl:onProperty :Prop1 ; 
           owl:someValuesFrom xsd:string 
          ] . 

:Class2 rdf:type owl:Class ; 
     owl:equivalentClass [ rdf:type owl:Restriction ; 
           owl:onProperty :Prop2 ; 
           owl:someValuesFrom xsd:string 
          ] . 

:Class3 rdf:type owl:Class ; 
     owl:equivalentClass [ rdf:type owl:Restriction ; 
           owl:onProperty :Prop3 ; 
           owl:someValuesFrom xsd:string 
          ] . 

:Class4 rdf:type owl:Class ; 
     owl:equivalentClass [ rdf:type owl:Class ; 
           owl:intersectionOf (:Class1 
                :Class2 
               ) 
          ] . 

:Class5 rdf:type owl:Class ; 
     owl:equivalentClass [ rdf:type owl:Class ; 
           owl:unionOf (:Class3 
              :Class4 
             ) 
          ] . 

:Ind1 rdf:type owl:NamedIndividual ; 
     :Prop2 "prop2" ; 
     :Prop1 "prop1" ; 
     :Prop3 "prop3" . 

: Класс 4, например выведено рассудителем на основе свойств: Prop1 и: Prop2 of: Ind1.

мне нужно построить индивидуальный типа: Class4 от: ind1, что-то вроде этого:

:Ind_Class4 rdf:type :Class4 
:Ind_Class4 :Prop1 "Prop1" 
:Ind_Class4 :Prop2 "Prop2" 

Я ищу, как выбрать свойства: prop1 и: prop2 из: ind1 как свойства класса: Class4.

Я попробовал запрос SPARQL

select * where { 
    ?s rdf:type :Class4 . 
    ?s ?p ?o . 
} 

но он возвращает все свойства: ind1 -: prop1,: prop2 и: Prop3:

:Ind1 :Prop1 "Prop1" 
:Ind1 :Prop2 "Prop2" 
:Ind1 :Prop3 "Prop3" 

Если изменить онтологию, как предложено в Ответ1:

:Prop1 rdf:type owl:DatatypeProperty ; 
    rdfs:domain :Class1 . 

:Prop2 rdf:type owl:DatatypeProperty ; 
    rdfs:domain :Class2 . 

:Prop3 rdf:type owl:DatatypeProperty ; 
    rdfs:domain :Class3 . 

:Class1 rdf:type owl:Class . 
:Class2 rdf:type owl:Class . 
:Class3 rdf:type owl:Class . 

:Class4 rdf:type owl:Class ; 
    owl:equivalentClass [ rdf:type owl:Class ; 
          owl:intersectionOf (:Class1 
               :Class2 
              ) 
         ] . 

:Class5 rdf:type owl:Class ; 
    owl:equivalentClass [ rdf:type owl:Class ; 
          owl:unionOf (:Class3 
             :Class4 
            ) 
         ] . 

:Ind1 rdf:type owl:NamedIndividual ; 
    :Prop1 "Prop1" ; 
    :Prop3 "Prop3" ; 
    :Prop2 "Prop2" . 

затем предложил SPARQL запрос

select * where { 
    ?p rdfs:domain :Class4 . 
    ?s ?p ?o . 
} 

возвращает пустой результирующий набор.

Спасибо.

ответ

2

Непонятно, что вы спрашиваете, поскольку свойства не относятся к классам в OWL. Вместо этого свойства могут иметь домены; когда свойство P имеет домен D, это означает, что в любой момент есть тройка x P y, вы можете вывести что x rdf: type D. Теперь вы можете запросить свойства и значения для индивидуума, где доменом свойства является определенный класс. То есть, вы могли бы сделать что-то вроде:

select ?property ?value where { 
    ?property rdfs:domain :Class4 . 
    :individual ?property ?value . 
} 

Однако, отметим один нюанс: свойства не имеют одного домена в , и если вы используете умозаключение, они часто имеют много , Помните, что «домен p - это D» означает (в OWL), что «x p y означает x rdf: type D.» Предположим, что у вас есть класс A и его подкласс B. Предположим, что область свойства P является B. Это означает, что всякий раз, когда x p y, мы имеем x rdf: тип B. Но поскольку B является подклассом A, это означает, что это также имеет место, что x rdf: type A. Это означает, что x p y также подразумевает, что x rdf: тип A. Это, в свою очередь, означает, что A также является областью P. Я указываю на это, потому что это означает, что, когда вы спросите

select ?property ?value where { 
    ?property rdfs:domain :Class4 . 
    :individual ?property ?value . 
} 

вы также будете получать какие-либо свойства, которые имеют объявленный домен, который является подкласс из Class4.

+0

Класс Class1, например. должен определить класс лиц, которые предоставляют свойство Prop1.Класс Class4 должен определить класс лиц, которые предоставляют свойство Prop1 из класса Class1, а также Prop2 из класса Class2. –

+0

@ igor.br Я не уверен, что вы пытаетесь сказать. Вы можете определить класс вещей, имеющих какое-то значение для свойства, произнеся что-то вроде «PetOwner equalClass (hasPet some Thing)», но я не уверен, что это то, что вы пытаетесь сказать. –

+0

Отображение аргумента в Protege класса 4 как тип индивидуума Ind1, который предоставляет свойства Prop1 и Prop2. Мне нужно выяснить, как я могу получить эту информацию либо из модели/графика (я использую Jena), либо с помощью SPARQL. Изменение определения классов Class1 и Class2 от ограничений свойств до доменов свойств не приносит успеха. Предлагаемый SPARQL не возвращает никаких результатов. –

Смежные вопросы