用于检索个人的 SPARQL 查询

SPARQL query for retrieving individuals

请帮助我进行 SPARQL 查询。 我有一个 ontology,其中 class 'Building' 作为 owl:Thing 的子 class。 'Building' 有自己的子 class,例如:教堂、医疗、商店。 这些子 classes 中的每一个都有自己的标签 (seeAlso)。例如:Shop 有 supermarket、bakery、market 等标签。Church 有 Chapel、Cathedral 等标签。

个人长这样:

我需要做一个 SPARQL 查询,它将根据标签检索个人。 因此,假设我想要获取具有类型 seeAlso "bakery" 标签的子 class 的所有个体。在这种情况下,我希望得到 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 的行,我只会得到个人和 classes,但不会像他们应该的那样相互关联。 Protege 只是 returns 我所有可能的联系 Class - 个人

我认为您正在寻找的是 class :Building 及其子 class 的所有实例。另请注意,如果 ?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 的 classic 反模式。尽可能使用基本的图形模式,所以这是一个更正确的查询:

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 作为实例标签。相反,我建议为每种商店等创建一个单独的实例,并使用 rdfs:label 来表示实例的标签。

最后,如果您需要进行不精确匹配,可以使用 regex。例如,要不分大小写查找 "bakery",请使用以下内容:

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

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

因此,在 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
}