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

Aji*_*rni 4 rdf rdfs sparql

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

例如,给定http://139.91.183.30:9090/RDF/VRP/Examples/Phenomenon.rdf RDFS词汇表文件,我想找到'AcousticWave'的超类(即'Wave').

同样,如果用户输入'Wave',我想得到'Wave'的所有子类('AcousticWave','GravityWave','InternalWave'和Tide').

在此输入图像描述

我该如何编写这样的SPARQL查询?

Man*_*res 11

rdfs用于状态子/超类关系的谓词是rdfs:subClassOf.考虑到这一点,您只需要在SPARQL查询中编写三重模式,AcousticWave在您的情况下绑定该谓词以及您要匹配的主题或对象.

我希望以下查询是不言自明的.

对于超级班......

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 . }
Run Code Online (Sandbox Code Playgroud)

对于子类......

SELECT ?subClass WHERE { ?subClass rdfs:subClassOf ns:Wave . }
Run Code Online (Sandbox Code Playgroud)

如果你想检索每个子类的标签,ns:Wave你会做类似......

SELECT ?subClass ?label WHERE { 
        ?subClass rdfs:subClassOf ns:Wave . 
        ?subClass rdfs:label ?label . 
}
Run Code Online (Sandbox Code Playgroud)

如果您需要sub/super类的传递闭包,那么您有两个选择:

  1. 在收集闭包之前,递归迭代这些查询.
  2. 通过RDF/RDFS推理器传递您的RDF数据,以转发所有蕴涵链并在RDF数据库中断言这些数据.

  • 使用operator*或+ over predicate进行传递查询的SPARQL方法请参阅W3C的[Property Path](https://www.w3.org/TR/sparql11-query/#propertypaths)部分.对于owl的所有传递子类:thing:`SELECT?subClass WHERE {?subClass rdfs:subClassOf*owl:thing.}`它应该回答:ns:Wave,ns:Tide ...另见[this question](http:/ /stackoverflow.com/questions/8569810/sparql-querying-transitive). (4认同)