2010-05-28 64 views
41

每當我開始使用sql時,我傾向於在數據庫中拋出一些探索性語句來理解什麼是可用的,以及數據採取何種形式。探索性SPARQL查詢?

例如。

show tables 

describe table 

select * from table 

任何人都可以幫助我理解使用SPARQL端點完成類似rdf數據存儲區探索的方法嗎?

謝謝:)

回答

69

好,明顯的第一次啓動是看的類和屬性數據中存在的。

這裏是如何查看正在使用哪些類:

SELECT DISTINCT ?class 
WHERE { 
    ?s a ?class . 
} 
LIMIT 25 
OFFSET 0 

LIMITOFFSET在那裏爲分頁,它的價值已經習慣了這些,特別是如果你在網絡上發送您的查詢我。 「會忽略它們在其他實施例)

a是一個特殊的SPARQL(和Notation3/Turtle)語法來表示rdf:type謂詞 - 此鏈接個別實例owl:Class/rdfs:Class類型(大致相當於SQL RDBMS中的表)。

其次,你想看看屬性。您可以通過使用您搜索的類或僅查找屬性來執行此操作。就讓我們所有屬性走出商店:

SELECT DISTINCT ?property 
WHERE { 
    ?s ?property ?o . 
} 

這將讓所有的屬性,你可能不感興趣,這相當於在SQL中的所有行的列清單,但沒有。桌子上的任何分組。

更有用的是看屬性正由聲明一個特定的類實例的內容:

SELECT DISTINCT ?property 
WHERE { 
    ?s a <http://xmlns.com/foaf/0.1/Person>; 
    ?property ?o . 
} 

這將讓你回來了滿足第一個三對任何情況下使用的屬性 - 即,有http://xmlns.com/foaf/0.1/Personrdf:type。請記住,因爲一個rdf:Resource可以有多個rdf:type屬性 - 類,如果你願意 - 並且因爲RDF的數據模型是可疊加的,所以你沒有鑽石問題。這種類型只是另一種屬性 - 這只是一個有用的社會協議,可以說有些事情是人或狗或基因或橄欖球隊。這並不意味着數據存儲將包含通常與該類型關聯的屬性。該類型不保證任何資源可能具有的屬性。

您需要熟悉數據模型以及使用SPARQL的UNION和OPTIONAL語法。 rdf:type到SQL表的粗略映射就是這樣粗略的。

您可能想知道屬性指向哪種實體。首先,您可能想了解數據類型屬性 - 相當於文字或基元。你知道,字符串,整數等。RDF將這些文字定義爲全部從字符串繼承。我們可以過濾掉只是那些使用SPARQL過濾方法isLiteral文字屬性:

SELECT DISTINCT ?property 
WHERE { 
    ?s a <http://xmlns.com/foaf/0.1/Person>; 
    ?property ?o . 
    FILTER isLiteral(?o) 
} 

我們在這裏只是要得到有他們的對象文字的屬性 - 一個字符串,日期時間,布爾,或其他XSD數據類型之一。

但是非文字對象呢?考慮這個非常簡單的僞Java類定義一個比喻:

public class Person { 
    int age; 
    Person marriedTo; 
} 

使用上面的查詢,我們還是會回到如果年齡屬性綁定,將代表時代的文字。但是,marriedTo不是原始的(即RDF術語中的字面意思) - 它是對另一個對象的引用 - 在RDF/OWL術語中,這是一個對象屬性。但我們不知道這些屬性(謂詞)引用了哪些對象。這個查詢會讓你回到帶有伴隨類型的屬性。

SELECT DISTINCT ?property, ?class 
WHERE { 
    ?s a <http://xmlns.com/foaf/0.1/Person>; 
    ?property ?o . 
    ? a ?class . 
    FILTER(!isLiteral(?o)) 
} 

這應該足以定位您的特定數據集。當然,我也建議你只抽出一些個人資源並檢查它們。你可以這樣做,使用DESCRIBE查詢:

DESCRIBE <http://example.org/resource> 

有一些SPARQL工具 - SNORQL,例如 - 可以讓你在瀏覽器中做到這一點。我鏈接到的SNORQL實例有一個示例查詢,用於探索可能的命名圖,這裏我沒有介紹。

如果您不熟悉SPARQL,說實話,如果您遇到困難,最好的資源是規範。這是一個W3C規範,但卻是一個很好的規範(他們構建了一個體面的測試套件,以便您可以真正瞭解實現是否正確地完成了它),並且如果您能夠克服複雜的語言,那麼這非常有幫助。

+0

全力以赴真棒答案 - 感謝非常多湯姆! – significance 2010-06-12 09:58:37

+0

我知道我不應該發佈簡單的「謝謝!「關於SO的消息,但你剛剛認真幫助了SPARQL noob,所以:」謝謝!「。 – 2017-09-12 11:56:31

6

我發現下面的一組試探性詢問的有用:

見此類:

select distinct ?type ?label 
where { 
    ?s a ?type . 
    OPTIONAL { ?type rdfs:label ?label } 
} 

眼看屬性:

select distinct ?objprop ?label 
where { 
    ?objprop a owl:ObjectProperty . 
    OPTIONAL { ?objprop rdfs:label ?label } 
} 

見此數據屬性:

select distinct ?dataprop ?label 
where { 
    ?dataprop a owl:DatatypeProperty . 
    OPTIONAL { ?dataprop rdfs:label ?label } 
} 

查看哪些屬性實際使用:

select distinct ?p ?label 
where { 
    ?s ?p ?o . 
    OPTIONAL { ?p rdfs:label ?label } 
} 

看到實體斷言什麼:

select distinct ?entity ?elabel ?type ?tlabel 
where { 
    ?entity a ?type . 
    OPTIONAL { ?entity rdfs:label ?elabel } . 
    OPTIONAL { ?type rdfs:label ?tlabel } 
} 

眼看使用不同的圖表:

select distinct ?g where { 
    graph ?g { 
     ?s ?p ?o 
    } 
}