2015-03-19 237 views
0

我有一個RDF數據庫(AFAIK),用於存儲映射到RDF三元組的Java對象。如何使用SPARQL查詢RDF三元組列表?

我現在想要做的是查詢特定類型的所有對象的列表。

我想是這樣的,在這裏我已經把我的語法的想象:

PREFIX xyz: <http://foo.com/myclassname#> 
SELECT * 
WHERE { 
    xyz:* name ?name 
} 

我想說的是,我想這代表了類型myclassname主題的名稱所有三元組。如何正確執行此操作?

現在我不能給你提供錯誤消息,因爲我沒有運行系統,但是我確信我不太瞭解SPARQL查詢,所以請對此進行說明。

回答

1

SPARQL查詢通常採用?subject ?predicate ?object的形式。因此,您需要運行一個這樣的簡單查詢來了解是否需要將您的限制放在?Predicate的位置,或者您需要爲查詢添加另一個三元組(?object ?x ?y)。更多示例請參考SPARQL for begginers

您的答案簡而言之就是,您可以根據特定類型進行查詢,但您需要知道將此類型限制放在哪裏。

因此,例如在DBpedia中,如果你想獲得的一切的標籤,你可以說:

select distinct * 
where 
    {?s rdfs:label ?o} 
LIMIT 100 

如果你想要這個標籤是一個名字,你需要指定對象的類型:

select distinct * 
where 
    {?s rdfs:label ?o. 
    ?s a dbpedia-owl:Person} 
LIMIT 100 
+0

因爲對於不同類型的對象,謂詞(例如「name」)和對象(例如「Foo」)可以是相等的,所以我肯定需要將限制放在主語中。因此,類型信息只能在主題中找到。 – 2015-03-19 13:33:41

+0

所以你已經知道在哪裏看。只是在你的查詢中,只要求所有不同的主題,然後你就知道你在找什麼類型。 – Artemis 2015-03-19 13:37:51

+0

Artemis:我的問題是關於SPARQL **語法**:我知道我想要什麼,但我不知道如何在SPARQL中表達它。 – 2015-03-19 14:01:41

1

SPARQL查詢的確切語法取決於您的數據在RDF中的建模方式。讓我們假設一類MyClass的對象被表示爲在RDF數據庫如下,他們有一個name屬性my:name

@prefix my: <http://example.org/my/> . 

my:object1 a my:MyClass . 
my:object1 my:name "object 1" . 

查詢找回在這個確切的時裝模型中的所有對象,他們的名字會看像這樣:

PREFIX my: <http://example.org/my/> 

SELECT ?x ?name 
WHERE { 
    ?x rdf:type my:MyClass ; 
     my:name ?name . 
} 

SPARQL查詢工作作爲圖模式匹配器:查詢查找的三元匹配WHERE子句中指定的模式的任意組合:所以我們正在尋找˚F或兩個三元組,其中一個表示rdf:type財產的值爲my:MyClass,另一個表示具有相同主題的另一個三元組應該具有名爲my:name的屬性,其中我們希望返回該值(綁定到變量?name)。

正如您所見,它取決於您的特定RDF模型:在您的數據庫中,類的名稱(my:MyName)和屬性名稱(my:name)可能不同。因此,在編寫可在您的特定情況下工作的查詢之前,您需要了解如何將數據建模爲RDF。

編輯作爲一旁:SPARQL具有用於屬性rdf:type,這是a的簡化符號。所以位?x rdf:type my:MyClass通常寫爲?x a my:MyClass。我想強調一個事實,即您正在查詢三元組/屬性,這就是我使用實際屬性名稱的原因。