2016-04-28 77 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