SPARQL - 如何从链接的个人获取个人数据 属性
SPARQL - how to get individual data property from linked individual
我在 protege 中构建了这个 ontology。我有这个人 ev001
有这些类型 Room
,hasRoom only {rm001}
和 rm001
有数据 属性 roomName "room 1"^^xsd:string
.
现在我有一个 SPARQL 查询 returns
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 .
}
不胜感激任何建议,非常感谢
一般来说,您似乎只需要:
SELECT ?event ?room ?roomname
WHERE {
?event base:hasRoom ?room .
?room base:roomName ?roomname.
}
您不需要使用 owl:onProperty 等检索所有公理内容。但是,在您的情况下,ontology 的结构有点奇怪。例如,您的内容如下:
<!-- 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
这意味着它 if X 对 属性 p 有任何值],则该值必须是 D 的一个实例。同样,您 ontology 中的内容表示 if pi00314001 具有 属性 hasRoom 的值,那么该值必须来自 class { rm03005}。 不会 说 pi00314001 实际上 有 那个 属性 的值,所以你实际上不知道它是否有 rm03005是否作为 hasRoom 的值。
如果它在您的控制之下,我想您会想要向 ontology 添加一些实际的对象 属性 断言,这样我上面提到的查询就会起作用。现在,您的 ontology 告诉您更多关于 可能 的事情,而不是实际情况。
就是说,如果您确实希望按照现在的结构从数据中检索房间,您可以遵循数据的结构并使之生效。它会是这样的:
select ?event ?roomName {
?event a [ owl:onProperty base:hasRoom ;
owl:allValuesFrom/owl:oneOf/rdf:rest*/rdf:first ?room ] .
?room base:roomName ?roomName .
}
我在 protege 中构建了这个 ontology。我有这个人 ev001
有这些类型 Room
,hasRoom only {rm001}
和 rm001
有数据 属性 roomName "room 1"^^xsd:string
.
现在我有一个 SPARQL 查询 returns
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 .
}
不胜感激任何建议,非常感谢
一般来说,您似乎只需要:
SELECT ?event ?room ?roomname
WHERE {
?event base:hasRoom ?room .
?room base:roomName ?roomname.
}
您不需要使用 owl:onProperty 等检索所有公理内容。但是,在您的情况下,ontology 的结构有点奇怪。例如,您的内容如下:
<!-- 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
这意味着它 if X 对 属性 p 有任何值],则该值必须是 D 的一个实例。同样,您 ontology 中的内容表示 if pi00314001 具有 属性 hasRoom 的值,那么该值必须来自 class { rm03005}。 不会 说 pi00314001 实际上 有 那个 属性 的值,所以你实际上不知道它是否有 rm03005是否作为 hasRoom 的值。
如果它在您的控制之下,我想您会想要向 ontology 添加一些实际的对象 属性 断言,这样我上面提到的查询就会起作用。现在,您的 ontology 告诉您更多关于 可能 的事情,而不是实际情况。
就是说,如果您确实希望按照现在的结构从数据中检索房间,您可以遵循数据的结构并使之生效。它会是这样的:
select ?event ?roomName {
?event a [ owl:onProperty base:hasRoom ;
owl:allValuesFrom/owl:oneOf/rdf:rest*/rdf:first ?room ] .
?room base:roomName ?roomName .
}