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

时间:2019-05-21 23:59:31

标签: sparql

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

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

我想找到win7的超类,但忽略了“软件”类之上的所有超类:

Software
       |__ Windows
                 |__ Win7

这是我做的第一件事:

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

但是只有一个:软件,我想过滤掉所有其他超类

1 个答案:

答案 0 :(得分:2)

最直接的方法是使用专有路径和FILTER NOT EXISTS来排除:Software上方的所有内容,例如:

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