您最初问题的措辞表明您可能认为“词汇表”、“图表”和“存储库”都是同义词。他们不是!一个“存储库”(也称为数据存储)可能包含一个或多个“图表”,其中一个或多个可能包含一个“词汇表”(或者,在 RDF 用语中,更常见的是一个“本体”),它描述了用于描述某些实体类的术语,有或没有“实例数据”(有时称为“记录”,是对这些类的一些实际实例的实际描述)。
也就是说——RDF-Turtle、RDF-N3 和类似文件中的PREFIX(或@prefix)语句实际上并不是数据的一部分;它们是序列化的一部分。因此,它们不会自动作为前缀或命名空间保存在 Virtuoso 数据存储中。
Virtuoso Conductor 提供了用于定义命名空间的部分(http://{virtuoso-host-fqdn}:{port}/conductor/ → 关联数据 → 命名空间)。我们通常建议通过该界面工作,但专家也可以直接使用相关的 SQL 表,DB.DBA.SYS_XML_PERSISTENT_NS_DECL。当 Virtuoso 以支持 CURIEs(a/k/a Compact URI)的格式生成序列化输出时,以及 Virtuoso 在 SPARQL 查询和其他地方解释 CURIE 时,使用此处定义的命名空间。
您可以通过内置页面http://{virtuoso-host-fqdn}:{port}/sparql?help=nsdecl、seen on DBpedia 或通过任何 SQL 连接(iSQL、ODBC、JDBC 等)查看当前定义的命名空间 --
SELECT NS_PREFIX,
NS_URL
FROM DB.DBA.SYS_XML_PERSISTENT_NS_DECL
ORDER BY LOWER(NS_PREFIX) ;
您也可以使用 Sesame(现在的 RDF4J)方法来获取这些,如来自documentation and sample code we provide 的这个 sn-p --
// test getNamespace
Namespace testns = null;
RepositoryResult<Namespace> namespaces = null;
boolean hasNamespaces = false;
try {
namespaces = con.getNamespaces();
hasNamespaces = namespaces.hasNext();
while (namespaces.hasNext()) {
Namespace ns = namespaces.next();
// LOG("Namespace found: (" + ns.getName() + " " + ns.getPrefix() + ")");
testns = ns;
}
}
catch (Exception e) {
log("Error[" + e + "]");
e.printStackTrace();
ok = false;
}
我们的 Provider 还具有删除和更新已注册命名空间的方法,这些方法在 VirtuosoRepositoryConnection 类中实现,如每个 Provider 的 API 文档中所述(RDF4J、Sesame 4、Sesame 2)。
(ObDisclaimer:OpenLink Software 产生 Virtuoso,并雇用我。)