请帮我解决SPARQL问题。
我有一个本体,将'Building'作为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只返回所有可能的连接类 - Individual
答案 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