【问题标题】:SPARQL query to find all sub classes and a super class of a given classSPARQL 查询以查找给定类的所有子类和超类
【发布时间】:2011-09-27 00:48:58
【问题描述】:

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

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

同样,如果用户输入“Wave”,我想获取“Wave”的所有子类(即“AcousticWave”、“GravityWave”、“InternalWave”和 Tide)。

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

【问题讨论】:

    标签: rdf sparql rdfs


    【解决方案1】:

    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 . }
    

    对于子类...

    SELECT ?subClass WHERE { ?subClass rdfs:subClassOf ns:Wave . }
    

    如果您想检索ns:Wave 的每个子类的标签,您可以执行类似...

    SELECT ?subClass ?label WHERE { 
            ?subClass rdfs:subClassOf ns:Wave . 
            ?subClass rdfs:label ?label . 
    }
    

    如果您需要子/超类的传递闭包,那么您有两种选择:

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

    【讨论】:

    • 我应该在上面的文件中为类 Wave 使用哪个命名空间?
    • 这真的取决于数据。我放了一个示例命名空间,因为我不知道我什么时候在这里回答问题。
    • 有一种 SPARQL 方法可以在谓词上使用运算符 * 或 + 进行传递查询,请参阅 W3C 的 Property Path 部分。对于 owl:thing 的所有传递子类:SELECT ?subClass WHERE { ?subClass rdfs:subClassOf* owl:thing .} 它应该回答:ns:Wave, ns:Tide... 另见this question
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-14
    • 2014-05-30
    • 1970-01-01
    相关资源
    最近更新 更多