本文分类应该在XML大类下,但CSDN目光短浅,只在网站制作技术和.NET下有XML分类。RDF与M$无任何关系,所以姑且放在网站制作技术-XML之下。
hax 译自 http://www-db.stanford.edu/~melnik/rdf/db.html
版权开放,欢迎转载 copyleft 2003, hax<[email protected]>.
======================== 术语译名:
RDF model RDF模型 RDF statement RDF语句 literal 文字常量 namespace 命名空间
table 表 field 字段 ========================
本页概述了当前在关系数据库里存储RDF的几种方法, *THIS IS A REQUEST FOR COMMENTS*,请将您的想法投稿 到 ([email protected])!
动机(Motiviation) -------------------
我们需要永久存储和操作(大量的)RDF数据。一个可选的做法是使 用关系数据库技术。这个方法的主要优点是它提供了一个可升级的 通用方案。
准则(Criteria) ----------------
这个不完全的列表指出了数据库模式设计需要考虑的准则(无先后顺序):
* 可伸缩性:我们能存储和查询超过十亿(1B+)的triples吗? * 查询:支持哪一类的查询?它们可以被容易的公式化表述和处理吗? * 效率:查询的耗费多大?交付查询结果的耗费呢? * 优化:我们能如何处理refication? * 组织:怎样在存储数据之上建立关联?我们能对RDF models进行 易分辨的混合并仍能确定triples来自何处吗?
以下的提议方案从不同方面满足上述准则。本页的维护者对可伸缩性 问题尤感兴趣。请将反映你需求的准则提交给我!
出版物(Publications) ----------------------
下面这个论文讨论了以垂直模式存储和查询稀疏的关系表,这与一些 提议方案的精神非常相似:
R. Agrawal, A. Somani, and Y. Xu: Storage and Querying of E-Commerce Data, Proc. VLDB 2001, Roma, Italy, available as http://www.vldb.org/conf/2001/P149.pdf
存储RDF的数据库模式 -------------------
(最近的投稿在前)
清晰的模型(Explicit models) -------------------------------
贡献者:Brian MacBride<[email protected]>
日期:2000/5/11
摘要:本表示法清晰的表现模型并使用了视图
数据库模式(Oracle)和作者的描述:
sql = "CREATE TABLE RDFRESOURCE" + "(" + "Id INTEGER not null primary key," + "NS INTEGER not null," + "RoName varchar(255)" + ")";
资源表保存所有的资源,Id是内部的标识符字段,NS是个指针,指向 namespace表的条目以给出资源的命名空间。RoName应该叫做‘localname’, 是Qname的局部命名部分。
sql = "CREATE TABLE RDFNameSpace" + "(" + "Id INTEGER not null primary key," + "NsName varchar(255)" + ")";
命名空间表。
sql = "CREATE TABLE RDFLiteral" + "(" + "Id INTEGER not null primary key," + "VAL varchar (4000)" + ")";
literals [hax注:可译作文字常量] 表。 4000字符的限制对当前目 标来说足够。[hax注:Oralce的可变字符串的上限是4000字节]
sql = "CREATE TABLE RDFStatement" + "(" + "Id INTEGER not null primary key," + "Subject INTEGER not null," + "Predicate INTEGER not null," + "ObjResource INTEGER not null," + "ObjLiteral INTEGER not null," + "Res CHAR(1) not null" + ")";
Statement [hax注:可译作语句或陈述] 表。最初是单个对象字段, 可以有一个对象或者文字常量的ID。使用一个复杂的JOIN表达式来列 举陈述,但并不如期望的运行。可能是我对SQL经验不足。而这个工 作和感觉更“正确”。Res是一个标志以说明对象是资源还是文字常 量。
sql = "CREATE TABLE RDFModel" + "(" + "ModelId INTEGER not null," + "Statement INTEGER not null," + "Asserted CHAR(1) not null," + "Reified CHAR(1) not null," + "primary key(ModelId, Statement)" + ")";
数据库可以处理多个models [hax注:可译作模型]。这个表保存了每 个模型的语句列表。最初该表由语句表组合,但当执行集合操作时不 能工作。
Asserted标志说明该语句用于给模型作断言。 Reified标志说明该模型用于使模型具体化。 后者是留给未来实现的挂钩(hook)。具体化(Reification)没有 被实现,因此这个方法是未经测试的。
每个模型都是资源,并在资源表里有一个记录。ModelId字段是该资 源的标识符。这样,就可以写关于某个模型的语句。这里有一个模型 的类,这样可以在确认模型有效性时列出需要被加载的模式(schemas)。
sql = "CREATE OR REPLACE VIEW RootModel" + " AS SELECT UNIQUE Id, Subject, Predicate, ObjResource, ObjLiteral, Res, Asserted, Reified" + " FROM RDFModel, RDFStatement" + " WHERE RDFModel.Statement = RDFStatement.Id";
这创建一个人造的模型视图,包含数据库里所有的语句,无论语句在 哪一个“实际的”模型里。
视图被大量使用。每个模型都是一个视图,即一个在其他模型视图或 者RootModel视图之上的查询。因此每次Stanford API 调用一个创建 模型的操作——如某个查询,数据库里就创建一个新的视图。这必然 会导致一些对数据库的查询引擎来说异乎寻常的查询,而我就依靠数 据库的查询优化器来整理之。这里也存在因陈旧失效的视图被留在数 据库里而可能的应用崩溃问题。
sql = "CREATE TABLE RDFKEYS" + "(" + "TableName char(10) not null primary key," + "Key INTEGER not null" + ")"; sql = "INSERT INTO RDFKEYS (TableName, Key) VALUES('Resource', 0)"; sql = "INSERT INTO RDFKEYS (TableName, Key) VALUES('NameSpace', 0)";
一个键发生表。可能可以使用序列器(sequencer) [hax注:Oracle 使用序列产生自动递增或循环的数字],但看起来有点数据库特性相 关,至少不是我一开始想要的,尽管真的只需要一个发生器。
关于模式(schemas)有个问题。当前,模式像模型一样处理,并可以 输入到模式有效性校验器。没有尝试使用模式来定义一个更特殊的数 据库结构。
原贴:http://lists.w3.org/Archives/Public/www-rdf-interest/2000May/0094.html

|