SPARQL 在查询中,如何在找到特定 class 后过滤掉 superclasses?

SPARQL In a query, how to filter out superclasses after a specific class has been found?

我想找出子class的超级class,但在找到特定的class后过滤掉所有超级class。 例如这棵树(from this question):

Main
   |__ Network
   |         |__ ATM
   |         |__ ARPANET
   |
   |__ Software
              |__ Linux
              |__ Windows
                        |__ XP
                        |__ Win7
                        |__ Win8

我想找到 win7 的超级classes,但遗漏了 "Software" 以上的所有超级classes class:

Software
       |__ Windows
                 |__ Win7

这是我做的第一件事:

SELECT ?superClass 
WHERE {
   :Win7 rdfs:subClassOf ?superClass .
   FILTER (?superClass != :Software)
}

但只遗漏了:软件,我想过滤我们所有其他超级classes

最直接的方法是使用属性路径和 FILTER NOT EXISTS 排除高于 :Software 的所有内容,例如:

select * where { 
    :Win7 rdfs:subClassOf+ ?super .
    filter not exists {
        :Software rdfs:subClassOf+ ?super
    }
}