2016-04-05 2 views
1

Я создаю эту онтологию в протеже. У меня есть этот человек ev001, у которых есть эти типы Room, hasRoom only {rm001} и rm001 имеет данные свойства roomName "room 1"^^xsd:string.SPARQL - как получить свойство отдельных данных от связанных пользователей

Сейчас у меня есть запрос SPARQL, возвращающий

Event  Room  RoomName 
ev001  {rm001} 

Мой вопрос, как получить название комнаты оттуда, вот мой запрос до сих пор

SELECT ?event ?room ?roomname 
WHERE { ?x owl:onProperty base:hasRoom . 
     ?event a base:FilmScreening ; 
        a ?x . 
     ?x owl:allValuesFrom ?room . 
} 

Любой совет высоко оценил, спасибо большое

+0

Является ли это ограничение с 'сову: allValuesFrom' и одноэлементно номинальным (он же' сова: oneOf') или 'сова: hasValue'? В первом случае это будет сборник, и вам придется сначала разобрать rdf: списки. Для второго случая это должно быть просто как @JoshuaTaylor показано ниже. – AKSW

+0

Я думаю, что это первый случай, как вы сказали. Итак, как я исхожу оттуда? – ariestikto

ответ

2

В целом, похоже, вам просто нужно:

SELECT ?event ?room ?roomname 
WHERE { 
    ?event base:hasRoom ?room . 
    ?room base:roomName ?roomname. 
} 

Вам не нужно извлекать всю информацию о аксиоме с помощью совы: onProperty и т. Д. Однако в вашем случае онтология структурирована несколько странно. Например, у вас есть контент, например:

<!-- http://www.example.org/ontologies/loncon3#pi00314001 --> 

<owl:NamedIndividual rdf:about="http://www.example.org/ontologies/loncon3#pi00314001"> 
    <!-- ... --> 
    <rdf:type> 
     <owl:Restriction> 
      <owl:onProperty rdf:resource="http://www.example.org/ontologies/loncon3#hasRoom"/> 
      <owl:allValuesFrom> 
       <owl:Class> 
        <owl:oneOf rdf:parseType="Collection"> 
         <rdf:Description rdf:about="http://www.example.org/ontologies/loncon3#rm03005"/> 
        </owl:oneOf> 
       </owl:Class> 
      </owl:allValuesFrom> 
     </owl:Restriction> 
    </rdf:type> 
    <!-- ... --> 
</owl:NamedIndividual> 

В синтаксисе Манчестер, который говорит, что pi00314001 имеет тип:

                hasRoom только {rm03005}

основе ваш вопрос, похоже, вы ожидаете

                pi00314001 hasRoom rm03005

в ваших данных, или, по крайней мере, выводимый из него. К сожалению, это не то, что на самом деле означает. Когда вы говорите, что человек X имеет тип

                р только D

это означает, что она еслиX имеет какое-либо значение для свойства р, то это значение должно быть экземпляром D. Аналогично, содержание в вашей онтологии говорит, что , если pi00314001 имеет значение для свойства hasRoom, тогда это значение должно быть из класса {rm03005}. Это не говорят, что pi00314001 на самом деле имеет значение для этого свойства, поэтому вы действительно не знаете, имеет ли он rm03005 в качестве значения для hasRoom или нет.

Если это под вашим контролем, я думаю, вы захотите добавить некоторые фактические утверждения свойств объекта в свою онтологию, чтобы запрос, о котором я говорил выше, будет работать.Прямо сейчас ваша онтология расскажет вам больше о том, что возможно , чем в действительности.

Это означает, что если вы хотите извлечь комнату из данных, как она теперь структурирована, вы можете следить за структурой данных и делать эту работу тоже. Это было бы что-то вроде:

select ?event ?roomName { 
    ?event a [ owl:onProperty base:hasRoom ; 
      owl:allValuesFrom/owl:oneOf/rdf:rest*/rdf:first ?room ] . 
    ?room base:roomName ?roomName . 
} 
+0

его не работает, вы думаете, что что-то не так с онтологией? 'hasRoom' - свойство объекта, которое имеет домен' Event' и имеет диапазон 'Room', если его помощь – ariestikto

+0

Где я написал? X, это должно быть событие. –

+0

Не видя ваших фактических данных, это будет трудно отладить больше, чем это. –

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