В целом, похоже, вам просто нужно:
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 .
}
Является ли это ограничение с 'сову: allValuesFrom' и одноэлементно номинальным (он же' сова: oneOf') или 'сова: hasValue'? В первом случае это будет сборник, и вам придется сначала разобрать rdf: списки. Для второго случая это должно быть просто как @JoshuaTaylor показано ниже. – AKSW
Я думаю, что это первый случай, как вы сказали. Итак, как я исхожу оттуда? – ariestikto