2016-05-10 37 views
0

以下是我上一個問題的一個子問題:available here如何使用SPARQL列出所選枚舉的所有元素?

如何修改下面的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" }。上述查詢從本體返回所有枚舉值,我的意思是:​​

我們給出了本體(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"))  
) 

變種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 --> 
+0

我不清楚如何讓等值類關係的文字列表有意義。 – scotthenninger

+0

@scotthenninger這是正確的,這是用於表示OWL2中用戶定義的數據類型的TURTLE樣式語法。 – AKSW

+0

即,數據類型和類是不同的東西。將字符串列表作爲等價類是沒有意義的。 URI的列表是有意義的。 – scotthenninger

回答

1

正如我在以前的答案的評論說:

@Annabelle我是基於我提供的本體的檢索方法。如果IRI確定了數據類型,肯定還有其他方法可供選擇。在你的情況下,它看起來會是values ?dt {:A :B }如果只想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鏈接。

+0

是的,但它不想以某種方式工作。用「值(...)」行打印沒有輸出。沒有行「值(...)「我正在接收這樣的輸出: | dt | element | | | _:b0 |」b1「| xsd:string | | _:b0 |」b2「| xsd:string | | _:b1 |「a1」| xsd:string | | _:b1 |「a2」| xsd:string | | _:b2 |「c1」| xsd:string | | _:b2 |「c2」| xsd:string | – Annabelle

+0

@annabelle它不是「values()」,它是「values?dt {...}」,它帶有變量名和大括號,而不是括號。但是,如果沒有實際的RDF數據,我們無法測試查詢。請問您能提供實際的RDF數據嗎?另外,您如何運行您的查詢? –

+0

對於不精確的情況,我感到抱歉。在上面的評論中,「values(...)」I ment「values?dt { ont:A ont:B}「。我還添加了RDF/XML風格的本體。 – Annabelle

相關問題