如何在 SPARQL 中 select 谓词及其各自的标签?
How to select predicates and their respective labels in SPARQL?
我正在尝试列出 ontology (NIF) 的所有谓词及其标签。当不查询标签时,它会产生 80 个结果。因此,我假设其中有 80 个谓词包含术语 'nif'。
然后我将包含 rdfs:label
的行添加到代码中,但没有产生任何结果。所以,我写了下面的代码来首先过滤包含 'nif':
的 URI
SELECT DISTINCT ?p ?label
WHERE{
?s ?p ?o .
FILTER (REGEX(STR(?p), "nif", "i")) .
?p rdfs:label ?label .
}
ORDER BY ?p
但是没有用。我尝试使用 ?p a rdf:Property
而不是 ?s ?p ?o
,但这也不起作用。然后我尝试了 Exist
和 Values ?p {"nif"}
但我对这两个也不成功!
我哪里出错了?
使用与声明的属性: 在 RDF 中,使用 谓词和声明一个谓词。可以在不声明谓词的情况下使用谓词,并且可以在不使用谓词的情况下声明谓词。
(也有可能——也很常见——在一个文件中声明一个谓词,然后在不同的文件中使用它。这就是 RDF 如何在不同的文件中启用单个 ontology 的 re-use数据集。可能有也可能没有链接这两个文件的 owl:imports
语句。)
要列出默认图表中使用的所有谓词:
SELECT DISTINCT ?predicate {
?s ?predicate ?o
}
ORDER BY ?predicate
要列出默认图中声明的所有谓词,我们需要考虑使用哪种模式语言来声明它。列出使用 RDF Schema:
声明的谓词
SELECT ?predicate {
?predicate a rdf:Property
}
ORDER BY ?predicate
列出用OWL声明的谓词:
SELECT ?predicate ?type {
VALUES ?type { owl:ObjectProperty owl:DatatypeProperty owl:AnnotationProperty }
?predicate a ?type
}
ORDER BY ?predicate
上面的查询考虑到 OWL 具有三种不同类型的谓词:对象属性、数据类型属性和注释属性。所以我们基本上查询这三个中的每一个。
有了这些知识,应该可以找出 ontology 中使用了哪些谓词,以及 ontology.
中声明了哪些谓词
现在,关于标签。 查询首先是 return 谓词的 URI——一个 machine-readable 标识符。要同时检索标签,请将 ?label
添加到 SELECT
子句中的变量列表,并将其添加到 WHERE { ... }
块:
OPTIONAL { ?predicate rdfs:label ?label }
例如:
SELECT ?predicate ?label {
?predicate a rdf:Property
OPTIONAL { ?predicate rdfs:label ?label }
}
ORDER BY ?predicate
我们将检索标签的模式设为可选,因此如果默认图中未提供标签,则谓词仍为 returned,但没有 ?label
变量的值。这样,就可以识别存在谓词(即使用或声明)但未提供标签的情况。
如果声明了一个谓词但没有提供标签,那么我会假设它是一个 low-quality ontology 在其创建过程中没有采取足够的措施。
如果使用谓词但没有提供标签,我一点也不会感到惊讶。这可能只是意味着声明和标签在不同的文件中提供,需要找到该文件并将其添加到数据集中才能查询标签。
从 URI 构建标签: 如果问题是 ontology 中缺少标签,并且在其他地方也找不到标签,那么这里有一个在没有声明标签的情况下从 URI 的最后部分构建 best-effort 标签的版本:
OPTIONAL {
?predicate rdfs:label ?tmpl
}
BIND (coalesce(?tmpl, replace(replace(replace(str(?predicate), '.*[#/:]', ''), '_', ' '), '([a-z])([A-Z])', ' ')) AS ?label)
这会获取 URI 中最后一个散列、斜杠或冒号之后的所有内容,将下划线替换为空格,并在 CamelCase 表示法的单词之间插入空格。
最后,按 URI 过滤。 重要的是要注意过滤只会发生在“原始”URI 上,而不是 prefix-abbreviated 形式.例如,以下过滤器仅接受 URI 中带有 rdfs
的谓词:
FILTER regex(str(?predicate), 'rdfs', 'i')
但它实际上会拒绝 rdfs:label
、rdfs:comment
和 rdfs
命名空间中的任何其他属性,因为它们的完整 URI 的形式为
<http://www.w3.org/2000/01/rdf-schema#label>
所以 URI 实际上不包含字符串 rdfs
。要记住的事情。
我正在尝试列出 ontology (NIF) 的所有谓词及其标签。当不查询标签时,它会产生 80 个结果。因此,我假设其中有 80 个谓词包含术语 'nif'。
然后我将包含 rdfs:label
的行添加到代码中,但没有产生任何结果。所以,我写了下面的代码来首先过滤包含 'nif':
SELECT DISTINCT ?p ?label
WHERE{
?s ?p ?o .
FILTER (REGEX(STR(?p), "nif", "i")) .
?p rdfs:label ?label .
}
ORDER BY ?p
但是没有用。我尝试使用 ?p a rdf:Property
而不是 ?s ?p ?o
,但这也不起作用。然后我尝试了 Exist
和 Values ?p {"nif"}
但我对这两个也不成功!
我哪里出错了?
使用与声明的属性: 在 RDF 中,使用 谓词和声明一个谓词。可以在不声明谓词的情况下使用谓词,并且可以在不使用谓词的情况下声明谓词。
(也有可能——也很常见——在一个文件中声明一个谓词,然后在不同的文件中使用它。这就是 RDF 如何在不同的文件中启用单个 ontology 的 re-use数据集。可能有也可能没有链接这两个文件的 owl:imports
语句。)
要列出默认图表中使用的所有谓词:
SELECT DISTINCT ?predicate {
?s ?predicate ?o
}
ORDER BY ?predicate
要列出默认图中声明的所有谓词,我们需要考虑使用哪种模式语言来声明它。列出使用 RDF Schema:
声明的谓词SELECT ?predicate {
?predicate a rdf:Property
}
ORDER BY ?predicate
列出用OWL声明的谓词:
SELECT ?predicate ?type {
VALUES ?type { owl:ObjectProperty owl:DatatypeProperty owl:AnnotationProperty }
?predicate a ?type
}
ORDER BY ?predicate
上面的查询考虑到 OWL 具有三种不同类型的谓词:对象属性、数据类型属性和注释属性。所以我们基本上查询这三个中的每一个。
有了这些知识,应该可以找出 ontology 中使用了哪些谓词,以及 ontology.
中声明了哪些谓词现在,关于标签。 查询首先是 return 谓词的 URI——一个 machine-readable 标识符。要同时检索标签,请将 ?label
添加到 SELECT
子句中的变量列表,并将其添加到 WHERE { ... }
块:
OPTIONAL { ?predicate rdfs:label ?label }
例如:
SELECT ?predicate ?label {
?predicate a rdf:Property
OPTIONAL { ?predicate rdfs:label ?label }
}
ORDER BY ?predicate
我们将检索标签的模式设为可选,因此如果默认图中未提供标签,则谓词仍为 returned,但没有 ?label
变量的值。这样,就可以识别存在谓词(即使用或声明)但未提供标签的情况。
如果声明了一个谓词但没有提供标签,那么我会假设它是一个 low-quality ontology 在其创建过程中没有采取足够的措施。
如果使用谓词但没有提供标签,我一点也不会感到惊讶。这可能只是意味着声明和标签在不同的文件中提供,需要找到该文件并将其添加到数据集中才能查询标签。
从 URI 构建标签: 如果问题是 ontology 中缺少标签,并且在其他地方也找不到标签,那么这里有一个在没有声明标签的情况下从 URI 的最后部分构建 best-effort 标签的版本:
OPTIONAL {
?predicate rdfs:label ?tmpl
}
BIND (coalesce(?tmpl, replace(replace(replace(str(?predicate), '.*[#/:]', ''), '_', ' '), '([a-z])([A-Z])', ' ')) AS ?label)
这会获取 URI 中最后一个散列、斜杠或冒号之后的所有内容,将下划线替换为空格,并在 CamelCase 表示法的单词之间插入空格。
最后,按 URI 过滤。 重要的是要注意过滤只会发生在“原始”URI 上,而不是 prefix-abbreviated 形式.例如,以下过滤器仅接受 URI 中带有 rdfs
的谓词:
FILTER regex(str(?predicate), 'rdfs', 'i')
但它实际上会拒绝 rdfs:label
、rdfs:comment
和 rdfs
命名空间中的任何其他属性,因为它们的完整 URI 的形式为
<http://www.w3.org/2000/01/rdf-schema#label>
所以 URI 实际上不包含字符串 rdfs
。要记住的事情。