如何编写SPARQL查询以从OWL文件中获取值

时间:2016-04-28 17:23:42

标签: sparql jena owl ontology

我有一个子类为owl:Thing "Objects"的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

谢谢

1 个答案:

答案 0 :(得分:4)

好的,第1步是丢失RDF / XML文本序列化。使用其他任何东西,但是Turtle最接近SPARQL。任何RDF编辑器都可用于转换为Turtle。 Turtle中Door1的等效文本序列化是:

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

这种语法的一部分可能并不明显,每行都是三元组(主语,谓语,对象),;表示使用前一行的主语。此语法的一个优点是可以将RDF资源视为具有属性的对象。

第2步是SPARQL查询变得明显,因为你可以将三重模式与Turtle中指定的三元组对齐:

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