2012-02-09 5 views
9

Я должен получить все экземпляры класса C и подклассы (прямые или косвенные) C, в SPARQL.SPARQL: получить все сущности подклассов определенного класса

я могу получить все прямые подклассы C таким образом:

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

Но я не могу получить экземпляры косвенного подкласса и ни любой экземпляр C.

Как я знаю (Я предварительно вычислил их) все подклассы (прямые и косвенные от C), и я могу построить динамический запрос, возможно ли построить запрос, например следующий?

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

Спасибо всем.

EDIT:

Я просто решил его, даже если в не элегантно.

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

В зависимости от тройного магазина это может работать или не работать. Не все тройные хранилища реализуют выражения путей свойств. –

+0

Спасибо, это сработало !! – auino

+0

@msalvadores В качестве обновления, в то время как все еще могут быть более старые трехместные магазины, пути свойств превратились в SPARQL 1.1, поэтому любые тройные магазины, поддерживающие текущий стандарт, будут поддерживать пути свойств. –

3

На основе SPARQL 1.1 specification правильный способ сделать это будет:

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

Без поддержки объектов недвижимости нет способа экспорта иерархии классов ssing произвольной длины.

Смежные вопросы