在关系数据库中存储RDF

来源:互联网 发布:如何办培训机构 知乎 编辑:程序博客网 时间:2024/05/09 14:52

本文分类应该在XML大类下,但CSDN目光短浅,只在网站制作技术和.NET下有XML分类。RDF与M$无任何关系,所以姑且放在网站制作技术-XML之下。

 

hax 译自 http://www-db.stanford.edu/~melnik/rdf/db.html

版权开放,欢迎转载 copyleft 2003, hax<hax@sjtu.edu.cn>.

========================
术语译名:

RDF model      RDF模型
RDF statement  RDF语句
literal        文字常量
namespace      命名空间

table          表
field          字段
========================


本页概述了当前在关系数据库里存储RDF的几种方法,
*THIS IS A REQUEST FOR COMMENTS*,请将您的想法投稿
到 (www-rdf-interest@w3.org)!


动机(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<bwm@hplb.hpl.hp.com>

日期: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