DB2 10 for Linux, UNIX, and Windows 中的资源描述框架应用程序开发,第 1 部分: RDF 存储的创建与维护

资源描述框架 (Resource Description Framework, RDF) 是一系列 W3 规范标准,主要支持数据和元数据的交换。凭借 IBM® DB2® 10 for Linux®, UNIX®, and Windows® Enterprise Server Edition,应用程序可以存储和查询 RDF 数据。本教程将引导您完成构建和维护样例 RDF 应用程序的所有步骤。在此过程中,您将通过实际操作学习如何结合 RDF 技术使用 DB2 软件。

Mario Briggs, 资深软件工程师, IBM China

Mario  Briggs 的照片Mario Briggs 负责 IBM DB2 和 IBM Informix 的开源服务,包括 PHP、Ruby/Rails、Python/Django/SqlAlchemy、Perl 和 Java 数据访问框架。Mario 有 11 年的软件开发经验,其中有多年主要专注于数据访问、关系引擎和应用程序数据库性能领域。



Priya Ranjan Sahoo, 高级软件工程师, IBM China

Priya SahooPriya Ranjan Sahoo 致力于 DB2 中的 RDF 支持。他有 6 年软件开发经验,主要集中在 Java 应用程序开发和数据库领域。



Gayathri Raghavendra, 助理软件工程师, IBM China

Gayathri RaghavendraGayathri Raghavendra 任职 IBM ISL 的 QA 工程师。Gayathri 曾从事于 z/OS 和 Linux、UNIX and Windows 平台上若干个 IBM DB2 Universal JDBC and SQLJ Driver 版本的 FVT 和回归测试。她也曾参与在 DB2 中的 RDF 支持测试。Gayathri 还处理 DB2 的 OCR 报告工具的 FVT。



Rajendran Appavu, 顾问软件工程师, IBM China

Rajendran AppavuRajendran Appavu 致力于 DB2 中的 RDF 支持。他拥有约 19 年的软件设计和开发经验。他也一直从事于网络、网络管理、配置、CORBA 和数据管理软件产品。



Farzana Anwar, DB2 信息开发, IBM China

Farzana Anwar 是位于安大略省万锦市 IBM 加拿大实验室中 DB2 for Linux, UNIX, and Windows 团队的一名成员。自 2004 年以来,她在 IBM 担任过各种职位,其中包括应用程序开发、系统验证测试、技术支持和信息开发等领域。她拥有阿卡迪亚大学计算机科学专业的学士学位,以及阿萨巴斯卡大学信息系统专业中计算机科学方向的硕士学位。Farzana 目前担任 DB2 for Linux, UNIX, and Windows 技术作家的职位,主要专注于使 DB2 产品更易于用户使用。她还对 developerWorks 上的 DB2 技术白皮书出版物进行协调。



2012 年 8 月 06 日

开始之前

免费下载:IBM® DB2® Express-C 10.1 免费版 或者 DB2® 10.1 for Linux®, UNIX®, and Windows® 试用版
下载更多的 IBM 软件试用版,并加入 IBM 软件下载与技术交流群组,参与在线交流。

关于本教程和本系列

本教程是由三部分组成的系列文章的第一部分,让您在实际操作中体验 DB2 for Linux, UNIX, and Windows 软件和资源描述框架 (RDF) 技术的使用。本教程介绍一个 RDF 应用程序的示范用例,并引导您完成构建和维护这个应用程序的以下步骤:

  • 创建一个 RDF 存储
  • 在其中插入数据
  • 查询数据
  • 更新数据
  • 维护存储,以确保良好的查询性能所需的统计数字是最新的

本教程还包括迁移到 DB2 软件的说明。

第 2 部分将介绍更多高级主题,如访问控制和优化存储。第 3 部分将介绍如何使用特定 SPARQL 的特性,如 DESCRIBECONSTRUCT 等各种查询表单,以及图表的联合。


示例应用程序开发用例

本教程使用一个虚构示例,其中有名为 XYZ 的公司,该公司拥有多个组织。分支机构地点跨多个地区,因此该公司必须遵从每个地区的法规。每个组织本身运行几个项目,每个项目都需要熟练的技术人员和各种资源。所有 XYZ 员工均由单个 HR 系统管理。根据业务需要和员工的兴趣,员工可以在一个组织内跨项目调动,甚至调动到另一个组织。每个组织独立管理其项目和财政。

XYZ 所面临的重大挑战是,遵从法律法规和为即将开展的项目配置专门技能的人才。对于大部分这些新项目来说,XYZ 中都有可用资源,但难以获得所有必要数据,因为数据位于多个系统。今天,各系统必须遵循一种模式:登录到一个系统收集一些信息,然后登录到另一个系统使用来自第一个系统的信息,并获得下一条信息。为了更有效地收集信息,XYZ 决定建立一个新的系统:Staffing System。假设您的工作就是要构建这一系统。

新的 Staffing System 的需求

Staffing System 必须与以下其他系统交互,以满足对信息的要求:

  • Org System:该系统维护有关该公司组织的所有详细信息。这些详细信息包括组织的名称、组织负责人的姓名、组织中的员工人数,以及财务信息。该系统生成惟一的组织 ID,供其他系统引用。
  • Projects System:该系统维护有关该公司已完成或正在执行的每个项目的详细信息。这些详细信息包括参加项目的员工的姓名、项目经理的姓名、计费详细信息,以及项目归属的组织的名称。该系统生成惟一的项目 ID,供其他系统引用。
  • HR System:该系统维护公司员工的详细信息。这些详细信息包括员工的姓名、员工的地址、员工参加的项目,以及任何工作许可证的引用。该系统生成惟一的员工 ID,供其他系统引用。
  • Legal System:该系统维护公司必须获得的法律批文。它也维护由政府机构颁发的文档 ID 的引用。

新的系统必须能够满足公司的以下需求:

  • 当一个新的项目启动时,项目经理必须能够为新项目找到具备所需技能的可用工作人员。
  • 根据项目的位置、工作人员和软件等其他资源,系统必须能够找到项目的法律批文。
  • 项目经理必须能够考虑员工在特定技术领域中工作的兴趣,以及是否具备合资格的技能。
  • 今天,Staffing System 必须集成的只是前面所指定的四个系统,但该公司预计,Staffing System 在未来必须与其他系统集成。新系统的添加应该是无缝的,不得影响现有系统。
  • 每个现有系统必须能够独立地执行其他修订、数据架构的变更或接口变更,而不需要考虑与新的 Staffing System 的兼容性。同样,Staffing System 不应该受到对这些现有系统的内部变更的影响。

现有的四个系统彼此隔离,但所维护的信息是互联的。每个系统所生成的惟一标识符用于标识一些实体,但它们与其他系统中的其他实体之间的关系不能在同一个地方都可用。这导致了在这些现有系统之间的多个跃点。该公司希望利用 Staffing System 简单而有效地导航在不同系统中的各实体之间的关系。

为了解决这个问题,您需要一个数据存储,用于存储在每个系统中生成的标识符,并存储有关它们的关系的信息。因为在未来可能需要与其他系统的接口,该数据存储的性质必须是通用的。RDF 提供了一个可以满足这些要求的理想数据存储。RDF 数据存储并没有固定的架构。您不必了解数据架构就可以使用 SPARQL 查询语言来查询数据。这就是通常被称为链接数据 的架构。新的 Staffing System 系统将采用这种架构。

下表描述了每个系统将用于惟一地标识其实体的 URI 结构。

表 1. URI 结构
<http://xyz.com> 指 XYZ 公司
<http://xyz.com/org/hr> 指 XYZ 公司中的 HR 组织
<http://xyz.com/employee> XYZ 公司的员工
<http://xyz.com/manager> XYZ 公司的经理
<http://xyz.com/project> 一个 XYZ 项目
<http://xyz.com/product> 一个 XYZ 产品
<http://xyz.com/project/lead> 项目负责人
<http://xyz.com/project/member> 团队成员
<http://xyz.com/project/QA> 项目的 QA
<http://xyz.com/project/ID> XYZ 公司中一个项目的信息开发人员
<http://xyz.com/org/legal/approvals/OS98765> 使用某软件的批文 ID
<http://xyz.com/org/legal/gov/approvals/WP76543> 员工等的政府法律批文

新的 Staffing System 概述

现有的四个系统内,每当数据被插入或修改时,这些系统必须生成相关的 RDF 数据,然后 Staffing System 将该数据加载到它的 RDF 存储。然后,用户可以在 Staffing System 上运行 SPARQL 查询。

每个现有系统都需要访问其他系统所生成的惟一 ID(如 URI)。例如,当 Projects System 引用某个特定项目的成员时,它必须使用 HR System 为员工所生成的惟一 ID。现有系统可以通过查询新的 Staffing System 获得一个惟一的 URI。

Org、Projects、HR 和 Legal 系统中的现有信息必须在 RDF 中生成。然后,这些数据必须被加载到新的 Staffing System。为了使本教程的应用程序保持简单,假设每个现有系统用这些数据生成一个 N-triple 格式的文件,然后将其加载到 Staffing System。因此,该文件在磁盘上可用。同样,为了简单起见,假定每当现有系统中发生数据插入或更新时,现有系统都生成一个 N-triple 格式的文件,并且 Staffing System 可以在磁盘上访问这个文件。(在现实中,更新将通过一个在线的 RESTful 服务流过系统。)

本教程提供的样例

本教程提供一个名称为 DB2RDFTutorial.zip 的文件。它包含一个样例 Java™ Eclipse 项目,其中包括了 Java 程序。将它下载到本地磁盘并解压压缩文件。

在本教程中,假定您将使用 db2admin 授权 ID 执行所有 DB2 任务,db2admin 具有所必要的管理权限。如果您使用不同的授权 ID,首先要确保它具有所需的权限。


RDF 存储入门

DB2 数据库服务器中的 RDF 存储类型

DB2 支持两种 RDF 存储类型的创建:

  1. 默认的 RDF 存储:如果您不需要有关正在加载的 RDF 数据的信息,或没有适当的样例可用,您应该创建一个默认的 RDF 存储。使用 createrdfstore RDF 命令来创建这种类型的存储。
  2. 优化的 RDF 存储:如果有 RDF 数据集的代表性样例数据,您可以创建一个优化的存储。根据您所提供的输入 RDF 数据集,优化的存储会提供一个最佳架构。在第 2 部分将介绍如何创建优化的存储。

在 DB2 数据库中,一个 RDF 存储保留一个 RDF 数据集的数据。在同一时间,任何插入、更新或查询操作都只可以在一个 RDF 数据集或存储上执行。

对于 Staffing System,将使用一个默认的 RDF 存储。

创建 RDF 存储

现在已拥有关于 Staffing System 的详细信息,让我们开始使用 DB2 软件中的 RDF 支持来构建它。首先必须创建一个存储,用于保存 Staffing System 的 RDF 数据。

创建 RDF 存储的先决条件

创建 RDF 存储的先决条件:

  • 数据库的页面大小必须为 32-KB。
  • 将 LOGFILSIZ 配置参数设置为大于 20000。
  • 应该存在 SYSTOOLSPACE 表空间。
  • 必须打开 DB2 管理任务调度程序。
  • Runstats 应该是 ON。
  • 创建 RDF 存储的授权 ID 应该有权限创建外部例程。
  • 创建 RDF 存储的授权 ID 应该更新 SYSTOOLS.ADMINTASKSTATUS 表上的权限。
  • 将缓冲池设置为自动使用合适的默认值。

如果 SYSTOOLSPACE 表空间不存在,您可以在 DB2 命令提示符处使用以下命令创建它:

CREATE TABLESPACE SYSTOOLSPACE IN IBMCATGROUP MANAGED BY AUTOMATIC STORAGE EXTENTSIZE 4

在本教程中,您必须创建一个名称为 RDFSAMPL 的数据库,其页面大小为 32 KB。创建数据库,并满足前面提到的先决条件:

  1. 使用以下命令打开管理任务调度程序:db2set DB2_ATS_ENABLE=YES"
  2. 在 DB2 命令提示符处,利用系统管理员授权运行 setup.sql 脚本:db2 -f c:\db2rdftutorial\resources\setup.sql

现在已经为创建 RDF 存储做好准备。

设置运行 DB2 RDF 命令的环境

假设您在本地 Windows 操作系统上已安装了 DB2 for Linux, UNIX, and Windows。您也可以在 Linux 或 UNIX 操作系统上执行本节中的步骤;惟一的区别是,您必须执行 shell 文件,而不是 .bat 文件。

DB2 安装在 install_path/sqllib/rdf 文件夹中提供 RDF 支持。RDF 文件夹在 bin 文件夹中包含了命令行实用工具,并在 lib 文件夹中包含了 DB2 RDF JAR 文件。

设置环境以使用 DB2 RDF 支持:

  1. 将 JENA 2.6.3 包和 ARQ 2.8.5 包下载到 sqllib/rdf/lib 文件夹。
  2. 从 Apache Commons 项目中,将 commons-logging-1-0-3.jar 文件下载到 sqllib/rdf/lib 文件夹。图 1 显示了在完成前两个步骤后的 sqllib/rdf/lib 文件夹。
    图 1. 在 sqllib/rdf/lib 文件夹中的 JAR 
    图片显示一个 JAR 文件列表
  3. 打开命令提示符并导航至 sqllib/rdf/bin 文件夹:cd "\Program Files\IBM\SQLLIB\rdf\bin"
  4. 添加 DB2 JCC 驱动程序(db2jcc4.jar 文件),将 classpath 定位到 /sqllib/java 目录:set classpath=c:\progra~1\ibm\sqllib\java\db2jcc4.jar;%classpath%

在必须执行 DB2 RDF 命令时,本教程的其余部分将前面提到的命令提示符称为 DB2 RDF 命令提示符。

现在已经准备好执行 DB2 RDF 命令。

创建一个 RDF 存储

每个 RDF 存储都有一个惟一的名称。该名称必须遵循 DB2 数据库对象的命名约定。对于 Staffing System,您将使用以下存储名称:staffing。

要创建 staffing 存储,在 DB2 RDF 命令提示符处发出以下命令:

createrdfstore staffing -db RDFSAMPL -user \
db2admin -password db2admin -objectnames \
unzip_directory\resources\staffingstore_names.props

其中:

  • -user 指定用于建立连接的授权名称(在本例中是 db2admin)。
  • -password 指定用于建立连接的密码(在本例中是 db2admin)。
  • –db 指定数据库名称(在本例中是 RDFSAMPL)。
  • –objectnames 指定一个文件,其中包含要创建的表和表空间。在本例中,文件名是 staffingstore_names.props。该文件在 unzip_directory 资源文件夹中提供,DB2RDFTutorial.zip 文件将被解压到该目录。

该文件的内容将 STAFFING_DPH 指定为 direct_primary_hash 表的名称,并指定 UserSpace1 作为该表的表空间。其他表的名称也遵循同样的格式。通过指定表空间名称,可以更有效地管理存储。对于 –objectnames 选项,如果在文件中没有为表指定表空间名称,则使用默认表空间。如果指定了表空间,其容量必须足以保存 direct_primary_hash 和 reverse_primary_hash 表的记录长度;对于默认的存储,页面大小为 32 KB。

如果指定 -objectnames 选项,该文件必须至少包含所有表的名称。如果没有指定 -objectnames 选项,表使用系统生成的名称,并使用默认表空间。系统生成的表名称,一般遵循 STORENAME_DPH/DS 的模式。

您必须为 staffing 存储的表建立适当的表级别权限。

假设 DB2 服务器是在本地计算机上,并在默认的 Windows 端口 50000 上运行。因此,您不必指定 -host-port 选项。此外,假定您正在用 db2admin 授权名称创建默认架构的存储。因此,您不必指定 -schema 选项。

现在可以继续在 Org、HR、Legal 和 Projects 系统中插入为现有信息生成的 RDF 数据。为了完成这些任务,必须使用 DB2 软件通过 Eclipse IDE 支持的 JENA API。JENA API 以 Java 语言为基础。

设置 RDF 应用程序开发环境

在本教程中,使用 IBM Data Studio 产品,它基于 Eclipse,并提供配合数据库工作的许多特性。不过,也可以使用本教程的 Eclipse。请确保您的系统上安装了 JRE 1.6 或更高版本。

设置 RDF 应用程序开发环境:

  1. 将 DB2RDFTutorial 项目导入 IBM Data Studio:
    1. 单击 File > Import
    2. 在弹出窗口中,选择 General > Existing Projects into Workspace
    3. 在 DB2RDFTutorial.zip 文件解压的目的位置,选择文件夹。
    4. 选中 DB2RDFTutorial 项目,并单击 Finish
    图 2. 将 DB2RDFTutorial 导入 IBM Data Studio
    图片显示导入窗口
  2. 将所有必需的 JAR 文件添加到 classpath:
    1. 右键单击项目,并选择 Properties
    2. 在弹出窗口中,选择 Java build path
  3. 将 install_path/sqllib/rdf/lib 文件夹中所有 JAR 文件添加到项目构建路径,单击 Add External Jars 并选中 install_path/sqllib/rdf/lib 文件夹中的所有 JAR 文件。
  4. 通过与上一步相同的方式,将 install_path/sqllib/java 文件夹中的 db2jcc4.jar 文件添加到构建路径。

最终的工作区结构应该如图 3 所示。

图 3. 本教程中的 JAR 的 Package Explorer 视图
图片显示 JAR 的列表

将数据加载到 RDF 应用程序

四个原有的系统生成您可以加载到 Staffing System 中的文件。在安装 Staffing System 时,它要求四个原有的系统创建 N-triple 格式的数据。对于本教程,样例 N-triple 文件位于 resources 文件夹下。

现在让我们看看如何将这些数据插入到 Staffing System 中。

插入图表

如果您有一个完整的图表要插入到存储中,并且在该存储中不存在该图表,您可以使用批量插入选项,而不是手动插入数据。在本例中,使用批处理操作,图表中的所有三元组都被插入到存储中。

为了将四个系统的初始数据插入 RDF 存储,使用 InsertGraph.java 样例程序。该程序执行以下步骤:

  1. 它创建一个连接。为了在 DB2 数据库服务器运行任何 RDF 程序,您必须创建一个连接,并将它作为一个参数传递。
    清单 1. 创建一个连接
    	Connection conn = null;
    	Store store = null;
    	String storeName = "staffing";
    	String schema = "prsahoo";
    	
    	try {
    	Class.forName("com.ibm.db2.jcc.DB2Driver");
    	conn = DriverManager.getConnection(
    	"jdbc:db2://localhost:50000/REPOSDB", "prsahoo", "Ranjan60");
    	conn.setAutoCommit(false);
    	
    	} catch (ClassNotFoundException e1) {
    	e1.printStackTrace();
    	}
  2. 它使用以下连接来连接到存储:
    清单 2. 连接到存储
    // Connect to the store
    store = StoreManager.connectStore(conn, schema, storeName);

    每次要使用存储时,您必须创建一个连接,并连接到存储。在本教程的所有样例程序中,这些操作都是必须的,但在随后的样例程序说明中将略过。

  3. 它为每个 N-triple 文件创建一个内存中模型。JENARiotLoader.read 方法用于读取 N-triple 文件。
    清单 3. 创建一个内存模型
    	private static Model createInMemoryModel(String inputFileName) {
    	Model memModel = null;
    	
    	//Input the file using the FileManager
    	InputStream in = FileManager.get().open(inputFileName);
    	if (in == null) {
    	   throw new IllegalArgumentException(
    	           "File: " + inputFileName + " not found");
    	}
    	
    	// Read the RDF/XML file
    	Data setGraph dsg = Data setGraphFactory.createMem();
    	// Because n-triples is nothing but n-quad without graph, this will
    	// just go to defaultgraph
    	RiotLoader.read(in, dsg, Lang.NQUADS, "");
    	memModel = ModelFactory.createModelForGraph(dsg.getDefaultGraph());
    	try {
    	in.close();
    	} catch (IOException e) {
    	e.printStackTrace();
    	}
    	return memModel;
  4. 它通过使用 Model.union() 操作将所有四个模型合并成单个模型。
    清单 4. 创建一个连接
    	// Merge all the four in-memory models into a single graph
    	Model merged = mHr.union(mProj);
    	merged = merged.union(mOrg);
    	merged= merged.union(mLegal);
  5. 它将这个合并后的模型添加到 staffing 存储中的默认图表(模型)。此操作必须被包装在一个 DB2 事务中。
    清单 5. 将合并后的模型添加到默认图表
    // Connect to the defaultModel in the staffing store
    Model staffingDefaultModel = RdfStoreFactory.connectDefaultModel(store, conn);
    	
    // Begin a transaction, add the merged in-memory model to \
    the staffing store's default model and commit the transaction
    staffingDefaultModel.begin();
    staffingDefaultModel.add(merged);
    staffingDefaultModel.commit();

    要将数据添加到指定的图表,而不是默认图表,请使用 RdfStoreFactory.connectNamedModel() 方法获得指定图表的引用。

  6. 它通过将数据转储到控制台,验证数据是否被正确添加到 DB2 数据库:
    清单 6. 将数据发送到控制台
    //Verify that the data is stored in DB2 by dumping out the data from DB2.
    RiotWriter.writeNQuads(System.out, ds.asData setGraph());

输出如下:

清单 7. 来自 DB2 的数据
<http://xyz.com/project/robotX> \
<http://xyz.com/project/member> \
<http://xyz.com/employee#000001> .
<http://xyz.com/project/robotX> \
<http://xyz.com/project/member> \
<http://xyz.com/employee#000002> .
<http://xyz.com/project/robotX> \
<http://xyz.com/project/member> \
<http://xyz.com/employee#000003> .
<http://xyz.com/project/robotX> \
<http://xyz.com/project/member> \
<http://xyz.com/employee#000004> .
<http://xyz.com/project/robotX> \
<http://xyz.com/project/member> <http://xyz.com/employee#000005> .
<http://xyz.com/employee#000004> \
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://xmlns.com/foaf/0.1/Person> .
<http://xyz.com/employee#000004> \
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://xyz.com/employee> .
<http://xyz.com/employee#000002> \
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://xmlns.com/foaf/0.1/Person> .
<http://xyz.com/employee#000002> \
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://xyz.com/employee> .
<http://xyz.com/employee#000005> \
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://xmlns.com/foaf/0.1/Person> .
<http://xyz.com/employee#000005> \
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://xyz.com/employee> .
<http://xyz.com/employee#000003> \
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://xmlns.com/foaf/0.1/Person> .
<http://xyz.com/employee#000003> \
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://xyz.com/employee> .
<http://xyz.com/employee#000001> \
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://xmlns.com/foaf/0.1/Person> .
<http://xyz.com/employee#000001> \
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://xyz.com/employee> .
_:BX2D4c66b0d5X3A1362f5f6ca0X3AX2D7ffc \
<http://xmlns.com/foaf/0.1/name> "Iti Rawat" .
<http://xyz.com/employee#000003> \
<http://xmlns.com/foaf/0.1/name> "Priya Ranjan Sahoo" .
<http://xyz.com/project/robotX> \
<http://xmlns.com/foaf/0.1/document> 
<http://xyz.com/org/legal/approvals/OS98765> .
<http://xyz.com/project/robotX> \
<http://xyz.com/project/lead> <http://xyz.com/employee#000002> .
<http://xyz.com/project/robotX> \
<http://xyz.com/project/id> <http://xyz.com/employee#000005> .
<http://xyz.com/org/hr> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://xmlns.com/foaf/0.1/Organization> .
<http://xyz.com/org/robotics> \
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://xmlns.com/foaf/0.1/Organization> .
<http://xyz.com/employee#000005> \
<http://xmlns.com/foaf/0.1/name> "Farzana Anwar" .
<http://xyz.com/employee#000005> \
<http://xmlns.com/foaf/0.1/knows> _:BX2D4c66b0d5X3A1362f5f6ca0X3AX2D7ffb .
_:BX2D4c66b0d5X3A1362f5f6ca0X3AX2D7ffb \
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://xmlns.com/foaf/0.1/Person> .
_:BX2D4c66b0d5X3A1362f5f6ca0X3AX2D7ffc \
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://xmlns.com/foaf/0.1/Person> .
_:BX2D4c66b0d5X3A1362f5f6ca0X3AX2D7ffd \
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://xmlns.com/foaf/0.1/Person> .
_:BX2D4c66b0d5X3A1362f5f6ca0X3AX2D7ffe \
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://xmlns.com/foaf/0.1/Person> .
<http://xyz.com/employee#000001> \
<http://xmlns.com/foaf/0.1/knows> _:BX2D4c66b0d5X3A1362f5f6ca0X3AX2D7fff .
_:BX2D4c66b0d5X3A1362f5f6ca0X3AX2D7ffd \
<http://xmlns.com/foaf/0.1/name> "Robert" .
<http://xyz.com/employee#000002> \
<http://xmlns.com/foaf/0.1/knows> <http://xyz.com/employee#000001> .
<http://xyz.com/project/robotX> \
<http://xyz.com/project/manager> <http://xyz.com/employee#000001> .
<http://xyz.com/org/legal/approvals/WP76543> \
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://xyz.com/org/legal/workpermit/approval> .
_:BX2D4c66b0d5X3A1362f5f6ca0X3AX2D7fff \
<http://xmlns.com/foaf/0.1/name> "Varuna Subramaniam" .
<http://xyz.com/employee#000001> \
<http://xmlns.com/foaf/0.1/name> "Rajesh K Arora" .
<http://xyz.com/project/robotX> \
<http://xyz.com/project/qa> <http://xyz.com/employee#000004> .
<http://xyz.com/employee#000004> \
<http://xmlns.com/foaf/0.1/name> "Gayathri Raghavendra" .
_:BX2D4c66b0d5X3A1362f5f6ca0X3AX2D7ffb \
<http://xmlns.com/foaf/0.1/name> "Alan Ng" .
<http://xyz.com/employee#000003> \
<http://xmlns.com/foaf/0.1/knows> _:BX2D4c66b0d5X3A1362f5f6ca0X3AX2D7ffd .
<http://xyz.com/employee#000004> \
<http://xmlns.com/foaf/0.1/knows> _:BX2D4c66b0d5X3A1362f5f6ca0X3AX2D7ffc .
<http://xyz.com/employee#000002> \
<http://xmlns.com/foaf/0.1/name> "Mario Ds Briggs" .
<http://xyz.com/org/legal/approvals/OS98765> \
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
<http://xyz.com/org/legal/software/approval> .

在这里,来自这四个 N-triple 文件的三元组都被加载进 Staffing System 中的默认图表。


在 Staffing System 应用程序中使用 SPARQL 查询

现在 Staffing System 已填充了数据,可以查询它,并很容易地找到跨越多个原始系统的信息。让我们为样例场景构建一个 SPARQL 查询,并使用 JENA API 对 DB2 数据库服务器执行 SPARQL 查询,以显示结果。

本节稍后将说明如何可以使用 JOSEKI 项目,通过 HTTP 对 DB2 数据库服务器运行 SPARQL 查询。SPARQL Protocol [5] 描述一种手段,将 SPARQL 查询和更新传递到 SPARQL 处理服务,并通过 HTTP 将结果返回给请求它们的实体。

样例 SPARQL 查询

假设您正在为与现有项目 RobotX 非常相似的一个新项目配置工作人员。从 RobotX 项目成员的所有朋友开始,这是一个好主意,因为朋友也有可能掌握类似的技能。关于朋友的这些信息分散在现有的 HR 和 Projects 系统中。在过去,要获得这些信息将需要一个 API 或某种系统之间的集成。不过,利用新的 Staffing System,您可以使用一个简单的 SPARQL 查询来获取该信息。

为了找到项目 RobotX 的所有成员,您需要 SPARQL 中的一个三元组模式。指定主语为 projectRobotX 的 IRI,并使用 http://xyz.com/project/member 作为谓词,如下:

清单 8. 在 SPARQL 中找到三元组模式
select ?member where {
    <http://xyz.com/project/robotX> <http://xyz.com/project/member> ?memberId .
    ?memberId <http://xmlns.com/foaf/0.1/name> ?member .
}

现在,为了找到这些项目成员的所有朋友,您可以将之前的查询修改如下:

select ?member ?friendname where {
	<http://xyz.com/project/robotX> <http://xyz.com/project/member> ?memberId .
	?memberId <http://xmlns.com/foaf/0.1/name> ?member .
	?memberId <http://xmlns.com/foaf/0.1/knows>?friendId.
	?friendId      <http://xmlns.com/foaf/0.1/name>  ?friendname .
	}

使用 JENA API 执行 SPARQL 查询

在 QueryExecutor.java 样例文件中实施以下代码。

清单 9. QueryExecutor.java
// Create a 'Query' object by passing in the SPARQL  query string \
to the 'create' method of the RdfStoreQueryFactory class
Query q=RdfStoreQueryFactory.create(query);
	
// Use the connectData set method RdfStoreFactory class to get a \
Data set interface to the store
Data set ds = RdfStoreFactory.connectData set(store, conn);

// Use the connectData set method RdfStoreFactory class to get a \
Data set interface to the store
QueryExecution qe = RdfStoreQueryExecutionFactory.create(q, ds);

// Call the 'execSelect' method on the QueryExecution object to get a back a resultset
ResultSet rs=qe.execSelect();

遍历结果集和访问每个结果集​​的方式有许多。下面是一个简单的方式,通过使用 hasNext 方法遍历结果集,并通过使用 next 方法检索每一个解决方案。

清单 10. 遍历结果集
while (rs.hasNext()) {
    QuerySolution qs = rs.next();
    System.out.println(qs);
    System.out.println();
}

该 SPARQL 查询的输出如下所示。

清单 11. 来自 SPARQL 查询的输出
( ?member = "Rajesh K Arora" ) ( ?friendname = "Varuna Subramaniam" )
( ?member = "Mario Ds Briggs" ) ( ?friendname = "Rajesh K Arora" )
( ?member = "Priya Ranjan Sahoo" ) ( ?friendname = "Robert" )
( ?member = "Gayathri Raghavendra" ) ( ?friendname = "Iti Rawat" )
( ?member = "Farzana Anwar" ) ( ?friendname = "Alan Ng" )

通过 HTTP 执行 SPARQL 查询

对于通过 HTTP 执行 RDF 操作,W3C 已经有一套规范草案。Graph Store HTTP Protocol 描述在 Graph Store 中更新 RDF 图表内容,以及通过 HTTP 从 Graph Store 获取 REST 样式的 RDF 图表内容。

支持 Joseki HTTP 引擎通过 HTTP 对 DB2 数据库执行 SPARQL 查询(不是更新)。

设置 Joseki

在系统上设置 Joseki:

  1. 将 Joseki 下载并解压缩到本地系统上(见 参考资料)。
  2. 打开命令提示符并将文件夹修改为解压 Joseki 的位置。
  3. 将 JOSEKIROOT 变量设置为当前文件夹。
  4. 运行 bin/rdfserver.bat 文件。
  5. 启动浏览器,并使它指向 URL localhost:2020。您应该会看到 Joseki 主页,如下:
    图 4. Joseki Web 应用程序
    载屏截图显示 SPARQLer
  6. 修改 Joseki,以访问 DB2 数据库服务器。在解压 Joseki 文件的根文件夹中,您将找到一个 joseki-config.ttl 文件。在该文件中,为 DB2 数据库添加一个服务,如下面示例所示。
    清单 12. 为 DB2 将一个服务添加到 joseki-config.ttl 文件
    # Service for DB2
    # General-purpose SPARQL processor for DB2 RDF store, 
    # The store name and how to connect to it are specified in the 'processor' definition
    # The data set should be skipped in the service definition
    	
    # Service for DB2 - SPARQL processor for a DB2 RDF store
    @prefix db2rdf: <http://rdfstore.ibm.com/IM/joseki/configuration#> .
    <#serviceDB2>
    rdf:type   joseki:Service ;
       rdfs:label          "SPARQL against DB2 RDF store" ;
       joseki:serviceRef   "db2" ;   # web.xml must route this name to Joseki
       # data set part
       #joseki:data set      <#sample> ; NOTE RDF store does not take in data set
       # Service part.
       # This processor does not allow either the protocol,
       # or the query, to specify the data set.
       joseki:processor    joseki:ProcessorDB2SPARQL ;
       .
    	
    ## Processors
    # DB2 processor support using FROM/FROM NAMED in the request
    # It does not support specify the data set in the protocol request).
    	
    joseki:ProcessorDB2SPARQL
       rdfs:label "DB2 RDF General SPARQL processor" ;
       rdf:type joseki:Processor ;
       module:implementation joseki:DB2ImplSPARQL ;
       # Parameters - this processor processes FROM/FROM NAMED automatically
        # RDF store parameters: Database details. Specify either \
    specify a jdbcConnectString
    with username and password or specify a jndiDataSource
    	db2rdf:jdbcConnectString   "jdbc:db2://localhost:50000/RDFSAMPL" ;
    	db2rdf:userName        "db2admin" ;
    	db2rdf:password "db2admin";
    	#db2rdf:jndiDataSource       "testDS" ;
    	# RDF data set details : storeName and schema in which the store exists
    	db2rdf:storeName       "staffing" ;
    	#db2rdf:schema       "db2admin" ;
    	.
    	
    joseki:DB2ImplSPARQL
       rdf:type   joseki:ServiceImpl ;
       module:className
      <java:com.ibm.rdf.store.jena.joseki.SPARQLProcessor> .
  7. 在解压 Joseki 文件位置下的 lib 文件夹中,添加 rdfstore.jar、wala.jar、ANTLR3.3 java.jar、commons-logging-1-0-3.jar 和 db2jcc4.jar 文件。
  8. 在解压 Joseki 文件位置下的 lib 文件夹中,添加 rdfstore-joseki.jar 文件。rdfstore-joseki.jar 文件在 DB2RDFTutorial.zip\lib 文件夹中。
  9. 在 webapps\joseki\WEB-INF\web.xml 文件中,将 /db2 添加为服务名称项,如以下示例所示。本教程使用 /db2,因为 db2 是在 joseki-config.ttl 文件中注册的服务名称。这需要被添加到与其他 <servlet-mapping> 项所在的同一个位置。
    清单 13. Servlet-mapping 项
    	<servlet-mapping>
    	   <servlet-name>SPARQL service processor</servlet-name>
    	   <url-pattern>/db2</url-pattern>
    	</servlet-mapping>
  10. 在 webapps\joseki\sparql.html 文件中,将表单元素的 action 属性的值从 SPARQL 修改为 DB2 database server,如下面的示例所示。本教程使用 db2,因为 db2 是在 joseki-config.ttl 文件中注册的服务名称。
    清单 14. 修改 sparql.html
    	<div class="moreindent">
    	     <form action="db2" method="get">
    	       <p>General SPARQL query : input query, \
    set any options and press "Get Results"</p>
  11. 重新启动 Joseki。样例输出如下所示:
    清单 15. 样例输出
    	C:\Joseki-3.4.4>bin\rdfserver.bat
    	15:24:54 INFO  Configuration        :: ==== Configuration ====
    	15:24:54 INFO  Configuration        :: Loading : <joseki-config.ttl>
    	15:24:55 INFO  ServiceInitSimple    :: Init: Example initializer
    	15:24:55 INFO  Configuration        :: ==== Datasets ====
    	15:24:55 INFO  Configuration        :: New dataset: Books
    	15:24:55 INFO  Configuration        ::   Default graph : books.ttl
    	15:24:55 INFO  Configuration        :: New dataset: MEM
    	15:24:55 INFO  Configuration        ::   Default graph : <<blank node>>
    	15:24:55 INFO  Configuration        :: ==== Services ====
    	15:24:55 INFO  Configuration        :: Service reference: "books"
    	15:24:55 INFO  Configuration        ::   Class name: org.joseki.processors.SPARQL
    	15:24:55 INFO  SPARQL               :: SPARQL processor
    	15:24:55 INFO  SPARQL               :: Locking policy: \
    multiple reader, single writer
    	15:24:55 INFO  SPARQL               :: Dataset description: \
    false // Web loading: false
    	15:24:55 INFO  Configuration        :: Dataset: Books
    	15:24:55 INFO  Configuration        :: Service reference: "db2"
    	15:24:55 INFO  Configuration        ::   Class name: \
    com.ibm.rdf.store.jena.joseki.SPARQLProcessor
    	15:24:57 INFO  Configuration        :: Service reference: "sparql"
    	15:24:57 INFO  Configuration        ::   Class name: org.joseki.processors.SPARQL
    	15:24:57 INFO  SPARQL               :: SPARQL processor
    	15:24:57 INFO  SPARQL               :: Locking policy: none
    	15:24:57 INFO  SPARQL               :: Dataset description: \
    true // Web loading: true
    	15:24:57 INFO  Configuration        :: ==== Bind services to the server ====
    	15:24:57 INFO  Configuration        :: Service: <db2>
    	15:24:57 INFO  Configuration        :: Service: <sparql>
    	15:24:57 INFO  Configuration        :: Service: <books>
    	15:24:57 INFO  Configuration        :: ==== Initialize datasets ====
    	15:24:58 INFO  Configuration        :: ==== End Configuration ====
    	15:24:58 INFO  Dispatcher           :: Loaded data source \
    configuration: joseki-config.ttl
    	15:24:58 INFO  log                  :: Logging to \
    org.slf4j.impl.Log4jLoggerAdapter(org.mortbay.log) via org.mortbay.log.Slf4jLog
    	15:24:58 INFO  log                  :: jetty-6.1.25
    	15:24:58 INFO  log                  :: NO JSP Support for /
    , did not find org.apache.jasper.servlet.JspServlet
    	15:24:58 INFO  log                  :: Started \
    BlockingChannelConnector@0.0.0.0:2020
  12. 将浏览器指向 http://localhost:2020/sparql.html,输入您的 SPARQL 查询,并单击 Get Results,如下所示:
    图 5. 在 Web 浏览器中的 SPARQL 查询视图
    截屏截图显示 SPARQL 查询

浏览器现在将显示以下输出。

图 6. Get Results 操作的输出
图片显示查询结果

在 Staffing System 应用程序中更新数据

在 Staffing System 上线并运行后,该公司必须不时地在原来的四个系统中分别更新数据。例如,该公司在新员工入职、项目完成,以及将工作人员调动到其他项目之后都必须进行更新。让我们来看看如何通过使用 DB2 数据库服务器,在新的 Staffing System 中反映这些更新。

将新的三元组插入现有图表

假设一个新员工加入组织,并且 HR 系统以 N-triples 格式文件发送将要添加到 Staffing System 的新员工信息。在本教程中,新员工信息在位于 resources 文件夹中的 newdata.nt 文件中。要了添加新的信息,请执行以下操作:

  1. 运行示例 InsertTriple.java 程序。节录如下。
    清单 16. InsertTriple.java
    // Get the new triples to add
    StmtIterator it = getNewTriplesToAdd("./resources/newdata.nt");
    	
    // Connect to the defaultModel in the store
    Model storeDefModel = RdfStoreFactory.connectDefaultModel(store, conn);
    	
    // Begin a DB2 transaction, and add each new triple to the store
    storeDefModel.begin();
    while (it.hasNext()) {
       storeDefModel.add(it.next());
    }
    storeDefModel.commit();

    如上所示,程序执行以下步骤:
    1. 使用 getNewTriplesToAdd 方法,读取 newdata.nt 文件并返回在该文件中的三元组列表。
    2. 连接到存储中的默认模型。
    3. 将三元组逐个添加到 staffing 存储。必须在 DB2 事务边界内完成该工作。
  2. 要验证新数据是否已插入,请计算在 staffing 存储中的员工数量。之前,有五个,现在应该有七个。您可以使用以下 SPARQL 查询获得员工数量。
    清单 17. 员工数量的 SPARQL 查询
    select (count(?emp)AS?employeeCount)where{ 
     ?emp <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> 
         <http://xyz.com/employee>
    }

    此查询的结果如下:

    图 7. 新的员工数量
    图片显示数量

删除三元组

如果要从存储中的图表删除一个或一套三元组,可以使用下列方式之一。这些例子中显示的代码是位于 DeleteTriples.java 文件中。

使用模型接口。该方式可以用 removeEmployeeInformationUsingModelInterface 方法说明。

清单 18. removeEmployeeInformationUsingModelInterface 方法
//Connect to the default model
Model defModel = RdfStoreFactory.connectDefaultModel(store, conn);
	
//List the statements for the particular subject
Resource employee = new ResourceImpl("http://xyz.com/employee#"+eid);
StmtIterator stmtIterator = defModel.listStatements(employee,null,(RDFNode)null);
defModel.begin();
	
//Remove the statements for the particular subject
defModel.remove(stmtIterator);
defModel.commit();

如上所示,该方法执行以下步骤:

  1. 它连接到模型。
  2. 它为主语、宾语和谓词的任意特定组合列出所有语句。在本例中,列出了所有主语为特定员工 ID 的语句。
  3. 通过将迭代器传递给 model.remove 方法,逐个删除语句。您还可以使用 defModel.removeAll() 方法(没有显示)删除所有语句。

使用图表接口模型。该方式可以用 removeEmployeeInformationUsingGraphInterface 方法说明。

清单 19. removeEmployeeInformationUsingGraphInterface 方法
//Connect to the default graph
Graph defGraph = RdfStoreFactory.connectDefaultGraph(store, conn);
	
//Create a triple with the particular subject and any predicate or value
Node s = Node.createURI("http://xyz.com/employee#"+eid);
Triple triple = new Triple(s, Node.ANY, Node.ANY);
	
//Search for the all the matching triples
ExtendedIterator<Triple> matchedTripleIterator = defGraph.find(triple);

//Delete all the matching triples
defGraph.getTransactionHandler().begin();
while(matchedTripleIterator.hasNext())
{
Triple matchedTriple = matchedTripleIterator.next();
defGraph.delete(matchedTriple);
}
defGraph.getTransactionHandler().commit();

如上所示,该方法执行以下步骤:

  1. 它使用 Graph.find 方法查找要删除的三元组。该方法需要以三元组作为其参数。主语和谓词都被设置为一个特定的员工 ID,它们的值被设置为 Node.ANY。主语为特定员工 ID 的所有三元组都被选中。您可以使用三元组的其他变体。find 方法会返回一个三元组迭代器。
  2. 它通过在一个循环中使用迭代器,从图表中删除所有必需的三元组。

删除图表

要从存储中删除一个完整的图表,需要使用 removeGraph 方法,如样例 DeleteGraph.java 文件中所示,指定图表的名称。

清单 20. 删除图表
Data setGraph dsg = RdfStoreFactory.connectData set(store, conn).asData setGraph();
dsg.removeGraph(Node.createURI(graphName));

您不能从数据集中删除默认图表。但是,您可以使用 removeAll 方法从默认图表中删除所有三元组。

清单 21. removeAll 方法
Model defaultmodel = RdfStoreFactory.connectDefaultModel(store, conn);
defaultmodel.removeAll();

更新三元组

更新一个三元组的值:

  1. 使用 graph.find 方法查找三元组。
  2. 删除该三元组。
  3. 添加一个带有新值的新三元组。

管理和迁移

管理 RDF 存储

在 RDF 存储中的统计

DB2 RDF 存储使用两套分布统计,以改善 SPAQL 查询的性能。

  • DB2 表统计:DB2 数据库服务器收集 RDF 存储表的这些统计信息。DB2 数据库的 RUNSTATS 实用程序配置文件的设置在存储创建的过程中自动完成。DB2 软件使用这些统计信息来优化 SQL 查询的访问计划。
  • RDF 存储统计。 使用 RDF 存储收集这些统计信息,这些信息有助于优化 SPARQL 查询。

收集以下统计信息:

  • 按每个主语、宾语或图表统计的三元组的平均数量
  • 在存储主语、宾语或图表中的三元组总数,三元组的选择性较差

设置自动的统计信息收集

您可以以频繁的时间间隔调度统计信息的收集。以下是一个使用 DB2 管理任务调度程序的示例。

  1. 打开 Administrative Task Scheduler。发出以下命令:db2set DB2_ATS_ENABLE=YES
  2. 激活数据库。
  3. 确保创建存储的用户已更新了在 SYSTOOLS.ADMIN_TASKS 和 SYSTOOLS.ADMIN_TASK_STATUS 表上的权限。

只有以下的附加条件得到满足时,才会更新所有 RDF 存储中的数据:

  • 存储中的三元组数量超过 1 千万个。
  • 自上一次收集统计数字以来,三元组数量增加或减少了 25%。

若要调度统计数据的收集,要使用 setstatsschedule 命令的 schedule 参数。例如,要在每小时的第 15 分钟触发调度程序收集存储统计,请发出以下命令。

清单 22. 调度统计数据的收集
setstatsschedule staffing -db RDFSAMPL -user db2admin -password db2admin 
-schedule "15 * * * *"

参考 DB2 for Linux, UNIX, and Windows 信息中心,了解有关 setstatsschedule 命令参数的更多详细信息。

设置手动的统计信息收集

若要手动地收集 RDF 存储的统计信息,请发出 updaterdfstorestats 命令:updaterdfstorestats staffing -db RDFSAMPL -user db2admin -password db2admin

参考 DB2 for Linux, UNIX, and Windows 信息中心,了解有关 updaterdfstorestats 命令参数的更多详细信息。

从其他 RDF 存储引擎迁移到 DB2 数据库服务器

DB2 数据库服务器提供压缩、可扩展性、并行执行、安全性、备份和恢复,以及成熟的管理实践等好处。如果您使用的 RDF 技术带有不同的 RDF 存储引擎,请考虑将您的 RDF 数据迁移到 DB2 数据库服务器。本节通过一个示例说明如何使用 createrdfstoreandloader 命令将您的 RDF 数据从其他 RDF 存储(开源或者专用)迁移到 DB2 数据库服务器。

从现有 RDF 存储引擎导出数据

首先,将整个 RDF 数据集从当前 RDF 存储引擎导出到一个 N-quad 格式的文件。大部分 RDF 存储引擎会提供 API 或命令以将 RDF 数据集导出到 N-quad 或 N-triple 文件。将该文件保存到磁盘,如 c:\exported.nq。

填充新的 RDF 存储

createrdfstoreandloader 命令将 RDF 批量数据加载到 DB2 数据库服务器。该命令解析 N-quad 或 N-triple 输入文件,生成 DB2 加载文件,并创建所需的 RDF 存储表。然后,您可以使用加载文件来填充一个新的 DB2 RDF 存储。

填充新的 RDF 存储:

  1. 在 DB2 RDF 命令提示符处,发出 createrdfstoreandloader 命令,如下面的示例所示。在该示例中,将包含迁移 RDF 数据的新存储称为 migratedStore。
    清单 23. createrdfstoreandloader 命令
    createrdfstoreandloader migratedstore -db RDFSAMPL -user db2admin -password 
    db2admin -rdfdata c:\exported.nq -storeloadfile c:\loadfolder\migratedstore.sql 
    -storeschemafile c:\loadfolder\migratestoreddl.sql

    其中:

    • -db 指定要在其中创建存储的数据库(在本例中是 RDFSAMPL)。
    • -user 指定用于建立连接的授权名称(在本例中是 dbadmin)。
    • -password 指定用于建立连接的密码(在本例中是 db2admin)。
    • -rdfdata 指定要加载到 DB2 数据库服务器上的 nquad 或 ntriple 输入文件(在本例中是 c:\exported.nq)。
    • -storeloadfile 指定一个要被生成的 SQL 文件,该文件将包含 DB2 加载命令。如果您没有指定创建文件的路径,文件会被创建在当前文件夹中。在本例中,现有文件夹 c:\loadfolder 被指定为路径。
    • -storeschemafile(可选参数)创建一个 SQL 文件,包含存储创建中要使用的 DDL 语句。若必须部署 RDF 数据的多个实例,则需要提供该参数。不需要多次运行 createrdfstoreandloader 命令,为了实现更快的性能,您可以指定 -storeschemafile 参数,后面跟随一个 .sql 文件名。请确保已保存文件及从属的加载文件。

    假设 DB2 服务器在本地系统上,并运行在默认的 Windows 端口 50000 上。您不必指定 -host-port 参数。另外,假设您正在使用默认架构。因此,您也不必指定 -schema 参数。因为您没有指定 objectnames 参数(它控制表及其表空间的名称),所以要使用系统生成的表名称和默认表空间。

    重要事项:在 Windows 上,createrdfstoreandloader 命令要求使用 Cygwin。该命令还要求使用 Gawk 实用工具 V4.0 以及 Core 实用工具 V8.14 及更高版本。在安装了 Cygwin 之后,将 <CgyWin_install_directory>/bin 添加到 PATH 环境变量。如果您没有 Cygwin,当您运行 createrdfstoreandloader 命令时会显示以下错误消息:'Cannot run program "sh": CreateProcess error=2, The system cannot find the file specified.'

    在 Windows 上,可以从 Cygwin 命令提示符或默认命令提示符调用 createrdfStoreAndLoader 命令。当使用 Cygwin 命令提示符时,请注意所有文件路径(-rdfdata、-storeloadfile、-storeschemafile 和 -objectnames)都不应该包括 'cygdrive' 前缀。而应该使用正常的 Windows 路径,如 'C:\....'

    如果文件夹或文件的名称中包含空格,则整个字符串应该被放在双引号中。

  2. 打开一个 DB2 命令提示符,并将目录修改为包含 DB2 加载命令的文件所在的位置。在本例中,该文件夹是 c:\loadfolder。
  3. 连接到您创建的数据库,在本例中是 RDFSAMPL:db2 connect to RDFSAMPL user db2admin
  4. 运行包含 DB2 命令的文件,在本例中是 migratedstore.sql 文件:db2 –f migratedstore.sql

    :在运行 SQL 脚本时不要使用 -t 参数,因为在生成它时以换行符作为命令分隔符。

在本例中,DB2 数据库现在包含一个名称为 migratedstore 的 RDF 存储,该存储包含来自您之前使用的 RDF 存储中的所有 RDF 数据。现在,您可以更新和查询 migratedstore。


结束语

本教程演示了一个样例 RDF 应用程序场景,并引导您完成使用 DB2 RDF 特性构建该应用程序的步骤。您将了解如何创建一个默认的 RDF 存储,并在其中插入图表。接下来,您将了解如何使用 JENA API 执行 SPARQL 查询,以及通过使用 Joseki 在 HTTP 上执行 SPARQL 查询。然后,您将了解如何在 RDF 存储中更新图表。

此外,您还将了解如何维护 RDF 存储的统计信息,使查询可以有效地执行。最后,您学习从其他 RDF 存储引擎迁移到 DB2 数据库服务器的过程。

在第 2 部分中,我们介绍高级的主题,如创建优化的 RDF 存储,以及针对 RDF 使用访问控制。


下载

描述名字大小
样例程序脚本DB2RDFjavadoc.zip87KB

参考资料

学习

获得产品和技术

  • 下载 Joseki
  • 使用 IBM 产品评估试用版软件 构建您的下一个开发项目,这些软件可直接从 developerWorks 下载获得。
  • 现在可以免费使用 DB2。下载 IBM 软件下载:IBM DB2 Express-C 10.1,这是为社区提供的 DB2 Express Edition 免费版本,它提供了与 DB2 Express Edition 相同的核心数据特性,并为构建和部署应用程序奠定了坚实的基础。

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Information Management
ArticleID=829351
ArticleTitle=DB2 10 for Linux, UNIX, and Windows 中的资源描述框架应用程序开发,第 1 部分: RDF 存储的创建与维护
publish-date=08062012