【问题标题】:SPARQL query for retrieving individuals用于检索个人的 SPARQL 查询
【发布时间】:2016-10-10 04:15:03
【问题描述】:

请帮助我处理 SPARQL 查询。 我有一个“建筑”类作为owl:Thing 的子类的本体。 “建筑”有自己的子类,如:教堂、医疗、商店。 这些子类中的每一个都有自己的标签(seeAlso)。例如:商店有超市、面包店、市场等标签。教堂有教堂、大教堂等标签。

个体看起来像这样:

我需要做一个 SPARQL 查询,它将根据标签检索个人。 因此,假设我想获取具有seeAlso“面包店”类型标签的该子类的所有个体。在这种情况下,我希望得到 bakery1 和 Supermarket1

我已经试过了,但是这个查询似乎是错误的:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
SELECT ?individual ?class ?label
WHERE { 
    ?individual rdf:type owl:NamedIndividual .
    ?class rdf:type owl:Class .
    FILTER(?label="bakery")
}

如果我删除带有FILTER 的行,我将只得到个人和类,而不是它们应该相互关联。 Protege 只是返回给我所有可能的连接类 - 个人

【问题讨论】:

    标签: sparql ontology protege


    【解决方案1】:

    鉴于答案的 cmets,其目的是构建同义词,而不是单独的实例。有几种方法可以做到这一点,但SKOS 是专门为这种词汇关系设计的。属性skos:prefLabel用于显示标签,同义词可以由skos:altLabel定义。您拥有的层次结构可以保留,只需使用skos:altLabel 而不是'rdf:seeAlso'(通常用于本体的参考链接)。

    因此,Turtle 文本序列化中的数据如下所示:

    :Shop rdfs:subClassOf :Building .
    :Shop skos:prefLabel "Shop"^^xsd:string .
    :Shop skos:altLabel "supermarket"^^xsd:string .
    :Shop skos:altLabel "bakery"^^xsd:string .
    :Shop skos:altLabel "market"^^xsd:string .
    

    对于查询,OP 说通过字符串匹配 - 在这种情况下为 preflabel

    SELECT ?individual ?label
    WHERE {
       ?individual skos:prefLabel "Shop"^^xsd:string .
       ?individual skos:altLabel ?label
    }
    

    【讨论】:

    • 哇,这真的很有帮助!非常感谢!
    • 对不起,我的问题可能看起来很傻,但是:我应该如何使用 skos?它应该是 dataProperty 还是 Annotation 作为 Literal 或任何其他方式?我正在使用 Protege 并尝试安装 Skos 编辑器,但我不知道如何将 skos 属性分配给我的类。
    • 这是 RDF 中的一个词汇表。您应该能够从响应中的 SKOS 链接下载和/或导入它。
    【解决方案2】:

    我认为您正在寻找的是 :Building 类及其子类的所有实例。另请注意,如果未绑定?label,则过滤器将始终失败。因此,您需要执行以下操作:

    PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
    PREFIX owl: <http://www.w3.org/2002/07/owl#>
    PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
    PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>SELECT 
    WHERE {
       ?cls rdfs:subClassOf* :Building .
       ?individual a ?cls .
       ?individual rdfs:seeAlso ?label .
       FILTER (?label = "bakery")
    }
    

    ...这是 SPARQL 的经典反模式。您应该尽可能地使用基本的图形模式,所以这是一个更正确的查询:

    PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
    PREFIX owl: <http://www.w3.org/2002/07/owl#>
    PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
    PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>SELECT 
    WHERE {
       ?cls rdfs:subClassOf* :Building .
       ?individual a ?cls .
       ?individual rdfs:seeAlso "bakery" .
    }
    

    注意第三个三元组模式使用三元组模式中的字面量。另外,我认为您拥有的模型不应该使用rdfs:seeAlso 作为实例的标签。相反,我建议为每种 Shop 等创建一个单独的实例,并使用 rdfs:label 来表示实例的标签。

    最后,如果您需要进行不精确匹配,您可以使用regex。例如,要不分大小写查找“面包店”,请使用以下命令:

    #-- …
    ?individual rdfs:seeAlso ?label .
    FILTER regex(?label, "Bakery", "i")
    

    【讨论】:

    • 谢谢。但我不确定每个实例的分离和使用 rdfs:label。我想要做的是为类 Shop 分配一组假设同义词。这样即使使用了“超市”这个词,程序也会知道商店的意思。
    • 好的,在这种情况下,我建议使用 SKOS 来表示同义词。将创建第二个响应...
    猜你喜欢
    • 1970-01-01
    • 2013-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-25
    • 2018-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多