用于检索个人的SPARQL查询

时间:2016-06-09 13:18:53

标签: sparql ontology protege

请帮我解决SPARQL问题。 我有一个本体,将'Building'作为owl:Thing的子类。 “建筑”有它自己的子类,如:教堂,医疗,商店。 这些子类中的每一个都有自己的标签(seeAlso)。例如:商店有超市,面包店,市场等标签。教堂有像教堂,大教堂等标签。

enter image description here

个人看起来像这样:

enter image description here

我需要执行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只返回所有可能的连接类 - Individual

2 个答案:

答案 0 :(得分:3)

给出答案的评论,目的是建立同义词,而不是单独的实例。有几种方法可以做到这一点,但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
}

答案 1 :(得分:2)

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

?label

...这是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 ?label .
   FILTER (?label = "bakery")
}

注意第三个三重模式使用三重模式中的文字。另外,我不认为您拥有的模型应该使用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。例如,找到&#34;面包店&#34;无论如何,请使用以下内容:

regex