如何使用SPARQL列出所选枚举的所有元素?

时间:2016-05-10 20:34:35

标签: sparql rdf owl

以下是我上一个问题的一个子问题:available here

如何修改以下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#>

select ?dt ?element ?elementType {
   ?dt a rdfs:Datatype ;
   owl:oneOf/rdf:rest*/rdf:first ?element .
   bind(datatype(?element) as ?elementType)
}

只能获得AC的结果?我想获得{ "a1" "a2" "c1" "c2" }。上面的查询返回本体中的所有枚举值,我的意思是:{ "a1" "a2" "b1" "b2" "c1" "c2" }

我们得到了本体论(A和B是等价的,但以不同的样式语法表示):

变体A)在函数式语法中:

 Prefix(ont:=<http://www/ont.owl#>)
 Prefix(owl:=<http://www.w3.org/2002/07/owl#>)
 Prefix(rdf:=<http://www.w3.org/1999/02/22-rdf-syntax-ns#>)
 Prefix(xsd:=<http://www.w3.org/2001/XMLSchema#>)
 Prefix(rdfs:=<http://www.w3.org/2000/01/rdf-schema#>)

 Ontology(<http://www/ont.owl>
    DatatypeDefinition( ont:A DataOneOf( "a1" "a2" ) ) 
    DatatypeDefinition( ont:B DataOneOf( "b1" "b2" ) ) 
    DatatypeDefinition( ont:C DataOneOf( "c1" "c2" ) )      
 )

Variant B)RDF / XML样式语法:

<?xml version="1.0"?>
<!DOCTYPE rdf:RDF [
<!ENTITY ont "http://www/ont.owl#" >
<!ENTITY owl "http://www.w3.org/2002/07/owl#" >
<!ENTITY xsd "http://www.w3.org/2001/XMLSchema#" >
<!ENTITY xml "http://www.w3.org/XML/1998/namespace" >
<!ENTITY rdfs "http://www.w3.org/2000/01/rdf-schema#" >
<!ENTITY rdf "http://www.w3.org/1999/02/22-rdf-syntax-ns#" >
]>

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



<!-- 
///////////////////////////////////////////////////////////////////////////////////////
//
// Datatypes
//
///////////////////////////////////////////////////////////////////////////////////////
 -->




<!-- http://www/ont.owl#A -->

<rdfs:Datatype rdf:about="&ont;A">
    <owl:equivalentClass>
        <rdfs:Datatype>
            <owl:oneOf>
                <rdf:Description>
                    <rdf:type rdf:resource="&rdf;List"/>
                    <rdf:first>a1</rdf:first>
                    <rdf:rest>
                        <rdf:Description>
                            <rdf:type rdf:resource="&rdf;List"/>
                            <rdf:first>a2</rdf:first>
                            <rdf:rest rdf:resource="&rdf;nil"/>
                        </rdf:Description>
                    </rdf:rest>
                </rdf:Description>
            </owl:oneOf>
        </rdfs:Datatype>
    </owl:equivalentClass>
</rdfs:Datatype>



<!-- http://www/ont.owl#B -->

<rdfs:Datatype rdf:about="&ont;B">
    <owl:equivalentClass>
        <rdfs:Datatype>
            <owl:oneOf>
                <rdf:Description>
                    <rdf:type rdf:resource="&rdf;List"/>
                    <rdf:first>b1</rdf:first>
                    <rdf:rest>
                        <rdf:Description>
                            <rdf:type rdf:resource="&rdf;List"/>
                            <rdf:first>b2</rdf:first>
                            <rdf:rest rdf:resource="&rdf;nil"/>
                        </rdf:Description>
                    </rdf:rest>
                </rdf:Description>
            </owl:oneOf>
        </rdfs:Datatype>
    </owl:equivalentClass>
</rdfs:Datatype>



<!-- http://www/ont.owl#C -->

<rdfs:Datatype rdf:about="&ont;C">
    <owl:equivalentClass>
        <rdfs:Datatype>
            <owl:oneOf>
                <rdf:Description>
                    <rdf:type rdf:resource="&rdf;List"/>
                    <rdf:first>c1</rdf:first>
                    <rdf:rest>
                        <rdf:Description>
                            <rdf:type rdf:resource="&rdf;List"/>
                            <rdf:first>c2</rdf:first>
                            <rdf:rest rdf:resource="&rdf;nil"/>
                        </rdf:Description>
                    </rdf:rest>
                </rdf:Description>
            </owl:oneOf>
        </rdfs:Datatype>
    </owl:equivalentClass>
</rdfs:Datatype>
</rdf:RDF>

<!-- Generated by the OWL API (version 3.4.2) http://owlapi.sourceforge.net -->

1 个答案:

答案 0 :(得分:1)

正如我在前一回答的评论中所说:

  

@Annabelle我的检索方法基于我提供的本体论。如果IRI识别出数据类型,肯定还有其他方法可以选择数据类型。在您的情况下,如果您只想要?dt为A或B,它看起来会是values ?dt {:A :B }

  

在这种情况下,请注意,公理的编码方式是:A是owl:equivalentClass到数据类型类表达式。这是类IRI和表达式之间需要的额外链接。

这给了我们:

select ?dt ?element ?elementType {
  values  ?dt { ont:A ont:B }
  ?dt owl:equivalentClass/a rdfs:Datatype ;
      owl:oneOf/rdf:rest*/rdf:first ?element .
  bind(datatype(?element) as ?elementType)
}

这与之前的答案没什么不同。您只需要添加您要查找的特定值,然后添加equivalentClass链接。