我正在尝试列出本体(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"}
,但我也没有成功!
我在哪里犯错?
答案 0 :(得分:2)
使用的属性与声明的属性:在RDF中,使用谓词和声明谓词之间是有区别的。可以不声明而使用谓词,也可以不使用而声明谓词。
(在一个文件中声明谓词,然后在另一个文件中使用谓词也是可能且很常见的。这就是RDF如何在不同数据集中重用单个本体的原因。链接两个文件的owl:imports
语句。)
要在默认图中列出所有已使用的谓词:
SELECT DISTINCT ?predicate {
?s ?predicate ?o
}
ORDER BY ?predicate
要在默认图中列出所有声明的谓词,我们需要考虑使用哪种架构语言对其进行声明。列出用 RDF架构声明的谓词:
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具有三种不同的谓词类型:对象属性,数据类型属性和注释属性。因此,我们基本上查询了这三者中的每一个。
有了这些知识,应该有可能找出本体中使用了哪些谓词,以及本体中声明了哪些谓词。
现在,关于标签。首先,查询返回谓词的URI(机器可读的标识符)。要同时检索标签,请将?label
添加到SELECT
子句中的变量列表中,并将其添加到WHERE { ... }
块中:
OPTIONAL { ?predicate rdfs:label ?label }
例如:
SELECT ?predicate ?label {
?predicate a rdf:Property
OPTIONAL { ?predicate rdfs:label ?label }
}
ORDER BY ?predicate
我们将检索标签的模式设为可选,因此,如果默认图中未提供标签,则仍返回谓词,但没有?label
变量的值。这样,就可以确定存在谓词(即使用或声明了谓词)但没有提供标签的情况。
如果声明了谓词但未提供标签,则我认为它是一种低质量的本体,在创建时未充分注意。
如果使用谓词但未提供标签,则完全不会感到惊讶。这可能只是意味着声明和标签是在另一个文件中提供的,并且需要查找该文件并将其添加到数据集中以便查询标签。
从URI构造标签::如果问题是本体中缺少标签,并且在其他地方也找不到标签,那么这里有一个版本可以从如果未声明标签,则URI的最后一部分:
OPTIONAL {
?predicate rdfs:label ?tmpl
}
BIND (coalesce(?tmpl, replace(replace(replace(str(?predicate), '.*[#/:]', ''), '_', ' '), '([a-z])([A-Z])', '$1 $2')) AS ?label)
这将获取URI中最后一个哈希,斜杠或冒号之后的所有内容,用空格替换下划线,并以CamelCase表示法在单词之间插入空格。
最后,按URI进行过滤。在此重要的是要注意,过滤只会在“原始” URI上发生,而不是在前缀缩写形式上发生。例如,以下过滤器仅接受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
。注意事项。