sparql - 如何在 SPARQL 中选择谓词及其各自的标签?
问题描述
我正在尝试列出本体(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 实现在不同数据集中重用单个本体的方式。可能有也可能没有这样的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 具有三种不同类型的谓词:对象属性、数据类型属性和注释属性。所以我们基本上查询这三个中的每一个。
有了这些知识,应该可以找出在本体中使用了哪些谓词,以及在本体中声明了哪些谓词。
现在,关于标签。以上所有查询都返回谓词的 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上,而不是前缀缩写形式。例如,以下过滤器仅接受rdfs
URI 中的谓词:
FILTER regex(str(?predicate), 'rdfs', 'i')
但它实际上会拒绝rdfs:label
,rdfs:comment
以及命名空间中的任何其他属性rdfs
,因为它们的完整 URI 的形式为
<http://www.w3.org/2000/01/rdf-schema#label>
所以 URI 实际上不包含 string rdfs
。要记住的事情。
推荐阅读
- android - Cordova - 无法触发 Android 让我选择要上传的图像
- vba - Excel工作表上的实际物理长度与点/像素
- google-chrome - 如何从 chrome 扩展程序调用 Chrome Web Store API 端点?
- c - C 编程:生成一个介于 -2,2 之间的随机数 (x),然后更新 x
- ios - 如何在 Ionic 应用程序中调用上下文菜单以保存图像?
- c++ - C++ Lambda/Closure Confusion - 如何返回一个值,而不是一个闭包
- javascript - node.js 中的相对路径问题
- python-3.x - 使用 selenium 在带有表单控件的框中输入文本
- c# - VSTest 到 NUnit 迁移导致高内存使用
- video.js - 缺少 HLS 播放列表的 VideoJS 事件