我建立这个本体论是为了保护。我有这个ev001
个人Room
,hasRoom only {rm001}
和rm001
的数据属性roomName "room 1"^^xsd:string
。
现在我有一个返回
的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 :(得分:3)
一般来说,看起来你只需要:
SELECT ?event ?room ?roomname
WHERE {
?event base:hasRoom ?room .
?room base:roomName ?roomname.
}
你不需要用owl: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的类型为:
仅限房间{rm03005}
根据您的问题,听起来像是您期望的
pi00314001 hasRoom rm03005
在您的数据中,或者至少可以从中传播。不幸的是,这并不是它实际意味着什么。当您说个人 X 的类型为
时p只有D
这意味着如果 X 具有 p 属性的任何值,那么该值必须是 D <的实例/ strong>即可。同样,本体中的内容表示如果 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 .
}