SPARQL - 如何从链接的个人获取个人数据属性

时间:2016-04-05 17:04:04

标签: sparql owl ontology protege

我建立这个本体论是为了保护。我有这个ev001个人RoomhasRoom 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 .
}

非常感谢任何建议,非常感谢

1 个答案:

答案 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 .
}