用于检索个人的 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
}
请帮助我进行 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
}