Rdf SPARQL查询以查找给定类的所有子类和超类

Rdf SPARQL查询以查找给定类的所有子类和超类,rdf,sparql,rdfs,Rdf,Sparql,Rdfs,我需要编写SPARQL查询来查找给定类的超类/子类 例如,给定RDFS词汇表文件,我想找到“声波”(即“波”)的超类 类似地,如果用户输入‘Wave’,我想得到‘Wave’的所有子类(即‘声波’、‘重力波’、‘内波’和潮汐) 如何编写这样的SPARQL查询?在状态子类/超类关系的rdfs中使用的谓词是rdfs:subassof。考虑到这一点,您只需要在SPARQL查询中编写三重模式,将谓词与您想要匹配的主语或宾语绑定在一起--声波 我希望以下问题是不言自明的 对于超级班级 PREFIX rdf

我需要编写SPARQL查询来查找给定类的超类/子类

例如,给定RDFS词汇表文件,我想找到“声波”(即“波”)的超类

类似地,如果用户输入‘Wave’,我想得到‘Wave’的所有子类(即‘声波’、‘重力波’、‘内波’和潮汐)


如何编写这样的SPARQL查询?

在状态子类/超类关系的
rdfs
中使用的谓词是
rdfs:subassof
。考虑到这一点,您只需要在SPARQL查询中编写三重模式,将谓词与您想要匹配的主语或宾语绑定在一起--
声波

我希望以下问题是不言自明的

对于超级班级

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX ns: <http://www.domain.com/your/namespace/>

SELECT ?superClass WHERE { ns:AcousticWave rdfs:subClassOf ?superClass . }
SELECT ?subClass WHERE { ?subClass rdfs:subClassOf ns:Wave . }
如果要检索
ns:Wave
的每个子类的标签,可以执行以下操作

SELECT ?subClass ?label WHERE { 
        ?subClass rdfs:subClassOf ns:Wave . 
        ?subClass rdfs:label ?label . 
}
如果需要子类/超类的传递闭包,则有两个选项:

  • 递归地迭代这些查询,直到收集完闭包
  • 通过RDF/RDFS推理器传递RDF数据,以转发所有包含项并在RDF数据库中断言它们

  • 在上面的文件中,我应该为类Wave使用哪个名称空间?它实际上取决于数据。我放置了一个示例名称空间,因为我不知道什么时候回答这个问题。有一种SPARQL方法可以使用运算符*或+over谓词执行传递查询。请参阅W3C中的部分。对于owl:thing的所有可传递子类:
    SELECT?subClass WHERE{?subClass rdfs:subClass*owl:thing.}
    它应该回答:ns:Wave,ns:Tide…另请参见。