Concretely I’m using this to get the path to root for a specific concept, e.g. 

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>

SELECT DISTINCT ?parent 
WHERE {
  GRAPH ?g { 
    <http://example.com/concept> rdfs:subClassOf+ ?parent .
  }} 

Would return all the (distinct) intermediates 

> On 01 Feb 2016, at 13:49, Andy Seaborne <a...@apache.org> wrote:
> 
> On 01/02/16 12:11, Joël Kuiper wrote:
>> Hey all,
>> 
>> I’m trying to run a query to find the path to the root concept of a graph.
>> The entries are defined as rdfs:subClassOf
>> 
>> Currently I’m using
>> 
>> PREFIX skos: <http://www.w3.org/2004/02/skos/core# 
>> <http://www.w3.org/2004/02/skos/core#>>
>> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema# 
>> <http://www.w3.org/2000/01/rdf-schema#>>
>> PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns# 
>> <http://www.w3.org/1999/02/22-rdf-syntax-ns#>>
>> 
>> SELECT ?parent ?label
>> WHERE {
>>  GRAPH ?g {
>>    ?concept rdfs:subClassOf* ?parent
>>  }}
>> 
>> However on a moderately sized data set < 1M triples, this query sometimes 
>> takes /minutes/.
>> I suspect it has to do with the disk-based TDB (since I hear my HDD spin a 
>> lot), but still.
>> Is there a way to optimise this query, maybe by using a different reasoner? 
>> And if so how would that reasoner be used!
>> 
>> Thanks in advance,
>> 
>> Joël
>> 
> 
> If you are using a reasoner and doing rdfs:subClassOf* then that is doing 
> excessive redundant work.
> 
> (Otherwise, with TDB is materialises more nodes that it needs to.)
> 
> The root is a node without a parent so this might help, without a reasoner:
> 
> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
> 
> SELECT ?top
> WHERE {
>   GRAPH ?g {
>     ?concept rdfs:subClassOf ?top
>     FILTER NOT EXISTS { ?top rdfs:subClassOf ?x }
>  }
> }
> 

Reply via email to