2012-02-09 13 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>. 
} 

ありがとうございます。

EDIT:

私だけでもエレガントではない方法であれば、それを解決してきました。それを行うための適切な方法は以下のようになりSPARQL 1.1 specificationに基づいて

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

答えて

20

より良い解決策は、SPARQL 1.1

にプロパティパス式を使用することですこれは、のように書き換えることでしょう

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

プロパティパスがサポートされていないと、表示されません任意の長さのクラス階層をシングします。

+2

トリプルストアによっては、動作しない場合があります。すべてのトリプルストアがプロパティパス式を実装しているわけではありません。 –

+0

ありがとう、それは働いた! – auino

+0

@msalvadores最新のトリプルストアがあるかもしれないが、プロパティパスはそれをSPARQL 1.1にしたので、現在の標準をサポートするトリプルストアはすべてプロパティパスをサポートする。 –

3

SELECT ?entity 
WHERE { 
    { ?entity rdf:type :C } 
    UNION { ?entity rdf:type :SubClass1 } 
    UNION { ?entity rdf:type :SubClass2 } 
    UNION { ?entity rdf:type :SubClass3 } 
} 
関連する問題