2016-04-28 80 views
1

我有一个OWL文件,其子类为owl:Thing "Objects"如何编写SPARQL查询以从OWL文件获取值

<rdf:RDF xmlns="http://www.semanticweb.org/PredefinedOntology#" 
    xml:base="http://www.semanticweb.org/PredefinedOntology" 
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
    xmlns:owl="http://www.w3.org/2002/07/owl#" 
    xmlns:xml="http://www.w3.org/XML/1998/namespace" 
    xmlns:swrlb="http://www.w3.org/2003/11/swrlb#" 
    xmlns:swrl="http://www.w3.org/2003/11/swrl#" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema#" 
    xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"> 
    <owl:Ontology rdf:about="http://www.semanticweb.org/PredefinedOntology"/> 

这个子类有三个人(Door1Coridor1Window1)与DataProperty断言(XY与坐标的值)。其中个人看起来像这样:

<!-- http://www.semanticweb.org/PredefinedOntology#Door1 --> 

    <owl:NamedIndividual rdf:about="http://www.semanticweb.org/PredefinedOntology#Door1"> 
     <rdf:type rdf:resource="http://www.semanticweb.org/PredefinedOntology#Objects"/> 
     <X rdf:datatype="http://www.w3.org/2001/XMLSchema#integer">2</X> 
     <Y rdf:datatype="http://www.w3.org/2001/XMLSchema#integer">20</Y> 
    </owl:NamedIndividual> 

我需要得到个人的值(比方说Door1)。 我怎样才能用SPARQL做到这一点?我试图:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX owl: <http://www.w3.org/2002/07/owl#> 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> 
SELECT ?X ?datatype 
WHERE {?X rdf:datatype ?datatype} 

但它看起来像我的查询是完全错误的。有人请向我解释如何编写(或者甚至更重要的是如何阅读或思考)这个查询,从本体中找到值X=2Y=20

谢谢

回答

3

好的,第1步是丢失RDF/XML文本序列化。使用其他任何东西,但龟最接近SPARQL。任何RDF编辑器都可以用来转换为Turtle。在龟Door1等效文本的序列是:此语法可能不明显的

:Door1 
    rdf:type :Objects ; 
    rdf:type owl:NamedIndividual ; 
    :X 2 ; 
    :Y 20 . 

一个部分是,每一行是一个三元组(主语,谓语,宾语),并且;意味着来自被摄体前一行被使用。这种语法的一个优点是可以将RDF资源视为具有属性的对象。

第二步是SPARQL查询变得很明显,因为你可以排队三重图案与龟指定的三元组:

SELECT ?X ?Y ?inst 
WHERE { 
    ?inst rdf:type owl:NamedIndividual ; 
     :X ?X ; 
     :Y ?Y . 
} 
+0

非常感谢你!这个版本在开始的时候给我带来了一些错误,但是后来我把它调整了一点:PREFIX my: SELECT?objects?X?Y \t WHERE { ?objects rdf:type owl:NamedIndividual ; my:X?X ;我的:Y?Y } 它的工作 – Fabi

+0

我很抱歉有一个愚蠢的问题,但是:在这种情况下,当我修改了一些你已经提供给我的代码,但你的答案仍然是正确的,应该我还按“回答你的问题”并添加修改?对不起,我在stackoverflow网站上并不是很有经验) – Fabi

+1

我认为这是完全可以接受的。 SO的目标是教育,所以如果你有什么东西可以让别人学习,那么它将被认为是一个很好的贡献。 – scotthenninger