SPARQL-如何从链接的个人获取个人数据属性 [英] SPARQL - how to get individual data property from linked individual

查看:83
本文介绍了SPARQL-如何从链接的个人获取个人数据属性的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我以专业的方式建立了这种本体.我有这个类型为RoomhasRoom only {rm001}rm001的个人ev001,其数据属性为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 .
}

任何建议都值得赞赏,非常感谢

解决方案

通常,您似乎只需要:

 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的房间为rm03005

位于您的数据中,或者至少可以从中推断出.不幸的是,这并不是真正的含义.当您说单个 X 具有类型

        p仅D

这表示如果 X 具有属性 p 的任何值,则该值必须是 D .同样,本体中的内容表明 if 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 .
}
 

I build this ontology in protege. I have this individual ev001 that has these types Room,hasRoom only {rm001} and rm001 has data property roomName "room 1"^^xsd:string.

Right now I have a SPARQL query that returns

Event     Room     RoomName
ev001     {rm001}  

My question is, how to get the room name from there, here is my query so far

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

Any advice is appreciated, thank you very much

解决方案

In general, it looks like you'd just need:

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

You don't need to be retrieving all the axiom stuff with owl:onProperty, etc. However, in your case, the ontology is structured a bit strangely. E.g., you have content like:

<!-- 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>

In the Manchester syntax, that says that pi00314001 has the type:

        hasRoom only { rm03005 }

Based on your question, it sounds like you expect the

        pi00314001 hasRoom rm03005

is in your data, or at least inferable from it. Unfortunately, that's not what it actually means. When you say that an individual X has the type

        p only D

it means it if X has any value for the property p, then that value must be an instance of D. Similarly, the content in your ontology says that if pi00314001 has a value for the property hasRoom, then that value must be from the class { rm03005 }. It doesn't say that pi00314001 actually has a value for that property, so you don't actually know whether it has rm03005 as a value for hasRoom or not.

If it's under your control, I think you'd want to add some actual object property assertions to your ontology, so that the query I mentioned above will work. Right now your ontology is telling you more about what's possible than what's actually the case.

That said, if you do want to retrieve the room from the data as it's structured now, you can follow the structure of the data and make that work too. It'd be something like:

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

这篇关于SPARQL-如何从链接的个人获取个人数据属性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆