2012-02-09 94 views
9

我必須在SPARQL中獲取類C的所有實例和C的子類(直接或間接)。SPARQL:獲取某個類的子類的所有實體

我得到C的所有直接子類中這樣說:

SELECT ?entity 
WHERE { 
    ?subclass rdfs:subClassOf :C . 
    ?entity rdf:type ?subclass . 
} 

但我不能得到一個間接子類的實例既不C.

的任何實例據我所知(我已經預先計算了它們)所有子類(C的直接和間接),並且我可以構建一個動態查詢,是否有可能構建如下的查詢?

SELECT ?entity 
WHERE { 
    ?entity rdf:type in <list>. 
} 

感謝大家。

編輯:

我剛剛解決了它,即使在不優雅的方式。

SELECT ?entity 
WHERE { 
    { ?entity rdf:type :C } 
    UNION { ?entity rdf:type :SubClass1 } 
    UNION { ?entity rdf:type :SubClass2 } 
    UNION { ?entity rdf:type :SubClass3 } 
} 

回答

20

更好的解決方案是在SPARQL 1.1

使用屬性路徑表達式這將被改寫爲:

SELECT ?entity 
WHERE { 
    ?entity rdf:type ?type. 
    ?type rdfs:subClassOf* :C. 
} 
+2

根據三重商店,這可能或可能不起作用。並非所有的三重商店都實現屬性路徑表達式 – 2012-02-09 19:40:35

+0

謝謝,它的工作! – auino 2012-02-10 16:19:36

+0

@msalvadores作爲一個更新,儘管仍然可能有較舊的三重存儲,但屬性路徑將其轉換爲SPARQL 1.1,因此任何支持當前標準的三重存儲都將支持屬性路徑。 – 2014-01-13 13:57:01

3

基礎上SPARQL 1.1 specification正確的方式做這將是:

SELECT ?entity 
WHERE { 
    ?entity rdf:type/rdfs:subClassOf* :C 
} 

不支持屬性路徑沒有方法expre選擇任意長度的類層次結構。

相關問題