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

모두에게 감사드립니다.

편집 :

난 그냥 심지어 우아한없는 방법으로 경우에, 그것을 해결했습니다. 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 
} 

속성 경로를 지원하지 않으면 expre가 없습니다. 임의의 길이의 클래스 계층을 ssing합니다.

+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 } 
}