DB2 10 for Linux, UNIX, and Windows 中的资源描述框架应用程序开发,第 2 部分: 在 DB2 中优化您的 RDF 数据存储并提供细粒度访问控制

资源描述框架 (Resource Description Framework, RDF) 是一系列 W3 规范标准,主要支持数据和元数据的交换。凭借 IBM® DB2® 10 for Linux®, UNIX®, and Windows® Enterprise Server Edition,应用程序可以存储和查询 RDF 数据。本教程探究 RDF 数据的特征并描述创建优化存储的流程。此外,还将介绍如何使用 DB2 引擎或该应用程序对 RDF 存储提供细粒度访问控制。本文包含一个样例应用程序。

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 技术白皮书出版物进行协调。



Ganesh Choudhary, 系统软件工程师, IBM China

Ganesh Choudhary 的照片Ganesh Choudhary 是 IBM 印度软件实验室 Open Source 团队的一名系统软件工程师。他目前致力于 Hibernate 应用程序的 pureQuery 自动调优特性。他毕业于班加罗尔国际信息技术学院,获得了信息技术专业硕士学位。



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

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



2012 年 12 月 17 日

开始之前

关于本教程

本教程是由三部分组成的系列文章 “RDB2 10 for Linux, UNIX, and Windows 中的资源描述框架应用程序开发” 的第 2 部分,让您在实际操作中体验 DB2 for Linux, UNIX, and Windows 软件和资源描述框架 (RDF) 技术的使用:

  • 本系列 第 1 部分 介绍了一个 RDF 应用程序的示范用用例,引导您完成构建这个应用程序的步骤,包括创建一个 RDF 存储、使用 SPARQL 查询进行数据查询,以及维护统计数据。第 1 部分提供了将 RDF 存储迁移到 DB2 软件的流程。
  • 第 2 部分涵盖以下高级主题:
    • 提供 RDF 数据特性以及 DB2 软件如何优化 RDF 数据存储的概述。
    • 描述创建优化存储的流程。
    • 将优化存储与您在第 1 部分为样例应用程序创建的默认存储进行比较,以便了解优化存储的优势。
    • 描述如何为 RDF 存储提供更细粒度的访问控制。本教程将引导您使用 DB2 引擎和样例应用程执行访问控制。

在第 2 部分中,我们将在第 1 部分的样例应用程序用例基础上进行构建。如果您尚未构建,查阅 第 1 部分 获取相关内容。

第 3 部分将介绍更多特定于 SPARQL 的特性,比如 DESCRIBECONSTRUCT 查询表单以及指定图表的联合。

默认存储和优化存储

回顾第 1 部分,DB2 软件支持两类 RDF 存储的创建:

  • 默认 RDF 存储— 如果您没有正在加载的 RDF 数据相关信息或者如果没有合适的样例可用时,创建一个默认 RDF 存储。要创建这类存储,使用 createrdfstore RDF 命令。
  • 优化 RDF 存储— 如果 RDF 数据集有代表性样例数据时,创建一个优化存储。优化存储可以根据您提供的 RDF 数据集提供一种优化模式。

本教程主要关注优化存储的创建。


RDF 数据的特征

无模式数据模型

RDF 数据模型是无模式的。不同于关系模型,每个表中列的数量是固定的,RDF 数据集没有固定数量的谓词。一个特定 RDF 主题可以有任意数量的谓词。此外,一个 RDF 数据集可以跨任意数量的域来存储数据,这进一步增强了该模型的 “无模式性”。因此,当将 RDF 数据映射到一个关系模式时,必须使用一种机制来支持 RDF 数据的无模式特性。

当映射 RDF 数据到关系模式时,处理无模式特性的最常见的机制是利用一个包含 3 列的表(三个列分别对应主题、谓词和对象)。使用该方法,每个三 元组位于该表中的一个新行中,因此,可以处理数目不定的谓词。然而,该映射伸缩性不是很好,有点性能问题,因为查询数据需要许多自联接以及无用的关系索引应用。例如,检索一个主题的两个谓词的一个简单查询涉及到一个自联接和两行获取。相比之下,同一数据的传统关系建模一行中有两个谓词,不需要任何联接,使用一个 fetch 语句就可以检索到数据。

无模式特性的处理

查询 RDF 数据时,DB2 软件在表中一行或者很少几行中存储关于一个主题的所有谓词和对象,从而减少了大量自联接需求。因为一个关系表必须有固定数量的列(由页面大小和列长度控制),该机制根据表中谓词分配给列的方式处理可变数量谓词。

DB2 软件使用两个机制来将谓词分配给表中的列:

  • 散列法— 为减少散列冲突,使用一组散列函数而不是一个散列函数。散列法是随机的,尽管使用多个散列函数,仍然很容易出现冲突。如果出现冲突,将在表中创建一个新行。默认存储中使用的是散列机制。
  • 谓词关联— 如果 RDF 数据的一个代表性样例可用,DB2 软件将计算 RDF 数据集中各种资源类型谓词之间的相关性。该软件使用这种相关性来分配谓词到表中的列。这将使我们能够更好地利用表中的空间,以及减少冲突几率。多个关联函数被用于进一步减少冲突几率。优化存储中使用谓词关联机制。

创建优化存储

使用 DB2 创建优化存储有多种方法。第 1 部分中的迁移场景使用 createrdfstoreandloader 命令创建优化存储。该命令将 RDF 数据批量加载到一个 DB2 数据库。在批量加载情况下,可以料到输入数据是谓词跨不同资源类型相关联的范例。但是,您可能会在没有代表性数据来创建优化存储的情况下开始应用程序开发。在本例中,您有两种选择:

  • 首先开始创建默认存储,正如第 1 部分所述,使用默认存储直至生成足够数据(例如在应用程序系统 QA 周期中)。然后,您可以使用 DB2 数据库引擎计算默认存储的谓词相关性,并使用这些相关性信息来创建一个优化存储用于生产。在第 2 部分中我们将引导您完成这一机制。
  • 首先创建一个默认存储,然后使用 REORG 系列 DB2 RDF 命令将该存储重组为一个优化存储。更多信息,参阅 DB2 Information Center 主题 “Converting a default store to an optimized store”(参见 参考资料)。

要使用谓词关联重新创建您在第 1 部分中创建的默认 staffing 存储作为一个优化存储:

  1. 使用现有存储,生成谓词映射。
  2. 使用谓词映射创建优化存储。

谓词映射 是数据集中的谓词和 DB2 RDF 存储(谓词存储在其中)的底层关系表中的列之间的一个映射。谓词映射是根据其中出现的各个 RDF 资源类型之间的谓词相关性决定的。这样做是为了在最少数量的列中包装 RDF 数据。

为现有存储生成谓词映射

com.ibm.rdf.store.cmd.GeneratePredicateMappings Java™ 类为一个默认存储生成谓词映射,并将该映射打印到控制台。该方法的语法如下:

java com.ibm.rdf.store.cmd.GeneratePredicateMappings RDF_store_name
                -db database_name
                -user user_name
                -password user_password
              [ -host host_name ]
              [ -port port_number ]
              [ -schema schema_name ]

本教程的程序资源位于 DB2RDFTutorial-Part2.zip 文件中(参见 下载)。请根据 第 1 部分 “设置 RDF 应用程序开发环境” 小节中介绍的步骤导入 Java 项目 DB2RDFTutorial-Part2。

您可以通过使用 DB2RDFTutorial-Part2.zip 文件(参见 下载)资源文件夹中提供的 genpredicatemappings.bat 文件,在命令提示行中运行 GeneratePredicatesMappings。复制 genpredicatemappings.bat 到 <DB install location>\SQLLIB\rdf\bin 文件夹并通过传递如下所需参数从那里运行。您应该将这些命令直接输出到一个文件:

C:\Program Files\IBM\SQLLIB\rdf\bin>genpredicatemappings.bat staffing -db RDFSAMPL 
-user db2admin -password db2admin > /predicate_mappings.txt

要在 IBM Data Studio 中运行,可以使用 DB2RDFTutorial-Part 2 项目中的 GeneratePredicateMappings.launch 配置文件来调用 com.ibm.rdf.store.cmd.GeneratePredicateMappings 类,为默认 staffing 存储生成谓词映射。输出打印到控制台并写入 staffing_predicate_mappings.txt 文件。输出已被保存,因此您可以在下一步中使用,下一步将创建一个优化存储。

通过使用启动配置生成映射:

  1. 打开 IBM Data Studio。
    图 1. IBM Data Studio 中的启动应用程序
    屏幕截图高亮显示 GeneratePredicateMappings.launch

    可选:右键单击 GeneratePredicateMappings.launch 配置文件并选择 Run As > Run Configurations 来更改输出文件位置。

    图 2. 运行配置视图更改该位置
    屏幕截图显示何处更改输出位置

    单击 Close 关闭该窗口。

  2. 右键单击启动配置并单击 Run As > GeneratePredicateMappings。谓词映射被生成、打印到控制台并写入特定文件。

创建优化存储

要创建一个优化存储:

  1. 发出 createrdfstore 命令,使用 –predicatemappings 参数指定您生成的谓词映射的位置。在本教程中,发出 createrdfstore 命令,如下所示:
    C:\Program Files\IBM\SQLLIB\rdf\bin>createrdfstore 
    staffing_optimized -db RDFSAMPL -user 
    db2admin -password db2admin –predicatemappings \
    staffing_predicate_mappings.txt
  2. 将数据加载到优化存储,可以使用第 1 部分中介绍的 InsertGraph.java 样例程序。由于您在上一步中将存储名指定为 staffing_optimized,所以必须对 InsertGraph.java 程序 44 行进行如下修改:
	String storeName = "staffing_optimized";

InsertGraph.java 程序将三元组成功地插入到优化存储。这表明您构建的任何使用默认存储的应用程序可以使用优化存储进行工作,无需修改任何代码。


优化存储和默认存储之间的结构化差异

优化存储和默认存储在两个表中结构上有所不同:Direct Primary (DP) 表和 Reverse Primary (RP) 表,而其他所有 RDF 存储表对于优化存储和默认存储是一样的。在优化存储中 DP 和 RP 表中的差异有助于加速插入和查询性能。要理解存储结构中的不同,必须理解谓词映射到列以及存储在底层表中的方法。

DP 表

DP 表存储 RDF 三元组以及所属的图,通过主题索引。一个主题的谓词和对象存储在该表的两个列中。一个特定谓词可以出现在 3 列中任何一列。此谓词的对象存储在谓词-对象对的相应对象列中。

与默认存储中的 DP 表相比,优化存储中的 DP 表具有较少列,而且 null 值也比较少。第 1 部分中创建的默认存储中的 DP 表有 128 对谓词和对象列(prop XXX, val XX)。许多列的值都为 null,如图所示。刚刚创建的优化存储中的 DP 表中只有 8 对谓词和对象列,当然,null 值更少。

RP 表

RP 表存储 RDF 三元组及其所属的图,通过对象索引。一个对象的谓词和主题存储在该表的两个列中。该表中特定谓词可以出现在 3 列中任何一列,该谓词的主题位于谓词—主题对的相应主题列中。

图 3. 默认存储和优化存储中直接主表中的数据
屏幕截图显示谓词的许多占位符

比较优化存储和默认存储中的表,结果显示:

  • 在优化存储中,需要更少的列和更少的 null 值。
  • 有更快的插入操作和改良的查询性能。

如果对您创建的默认存储和优化存储中的 RP 表进行比较,就会发现在优化存储中相同模式的列更少,利用率更高,如下所示。

图 4. 默认存储和优化存储中 Reverse Primary 表中的数据
屏幕截图显示优化存储中谓词的 5 个占位符和默认存储中的 33 个占位符

优化存储和新谓词

优化存储可以处理您添加到存储中的新谓词(在谓词关联性计算过程中谓词是不可用的)。

如果您添加谓词,优化存储自动且透明地使用散列函数确定新谓词的列位置。因此,优化存储可以混合使用谓词关联和散列法将谓词分配到主表列中。

优化存储的应用程序开发和维护

在 DB2 数据库和应用程序开发中,从存储维护角度来看,默认存储和优化存储之间没有差异。您没有必要根据是否使用优化存储或默认存储开发不同的应用程序。


RDF 存储访问控制 

作为控制一个 RDF 存储访问的起点,您可以在组成 RDF 存储的表上使用表级权限对该存储设置粗粒度访问控制。您可以使用该机制来限制访问整个存储的人并控制他们的活动,例如,他们是否只能读取或者也可以更新存储。

要支持存储级访问控制,发出以下 SQL 语句:GRANT privilege ON TABLE tablename TO auth_name,其中特权可以是 SELECT, UPDATE, INSERTDELETE

您可以通过为 createrdfstorecreaterdfstoreandloader 命令指定 -objectnames 参数控制组成 RDF 存储的表的名称。然而,如果您不使用 -objectnames 参数,而且想发出 GRANT 语句,通过使用以下 SQL 语句可以很容易地确定 RDF 存储的表的名称:

SELECT DIRECTPRIMARY, REVERSEPRIMARY, DIRECTSECONDARY, REVERSESECONDARY FROM tablename

RDF 图级访问控制

存储级访问控制可能太过于粗粒度。您可能想要使用一个细粒度访问控制机制实现更细粒度级别。在 RDF 存储中,DB2 软件支持图级访问控制。您可以同时使用细粒度图级访问控制和粗粒度存储级访问控制。

要使用图级访问控制:

  • 您必须使用 RDF 的具名图特性。特别是,您必须在一个独立具名图中保存机密三元组,在另一个具名图中保存非机密三元组。此外,每个具名图将存储管理图访问的三元组。
  • SPARQL 查询必须跨具名图查询三元组,而不是在默认图中查询。(为此准备的一个便利机制是 unionDefaultGraph 特性,它创建所有具名图的联合并将其作为默认图处理。)下面介绍的样例应用程序使用示例演示了如何使用该机制。

图级访问控制样例应用程序场景

迄今为止,样例 staffing 应用程序中的数据可用于该应用程序的所有用户,因为数据不是机密的。现在,假设您想要更新 staffing 应用程序来存储员工薪金信息。这种情况下,您必须确保可以查阅某个员工薪金信息的只能是员工本人或者其直接主管。

使用具名图实现访问控制

在我们示例中,要限制员工薪金信息访问,我们需要:

  1. 添加一个独立具名图中包含关于每个员工薪金信息的三元组。
  2. 添加包含关于员工非机密信息的所有三元组,在另一个具名图中保存起来。

每个图都有 2 个三元组存储员工 ID 和经理 ID。这些三元组的谓词是 http://xyz.com/ctx/employeeId 和 http://xyz.com/ctx/managerId。这些三元组管理对该图的访问。

该样例数据存储在资源文件夹中一个名为 accesscontrol.nq 的 nquad 文件中。注意 accesscontrol.nq 文件的以下方面:

  • 对于每个员工来说其薪金信息的三元组包含在一个独立具名图中,薪金信息所用谓词有 http://xyz.com/hr/salaryBandhttp://xyz.com/hr/perksBandhttp://xyz.com/hr/stocksBand
<http://xyz.com/employee#000001>  <http://xyz.com/hr/salaryBand> 
<http://xyz.com/hr/salaryBand/band3>  <http://xyz.com/ns/graph/hr/employee#000001> .
<http://xyz.com/employee#000001>  <http://xyz.com/hr/PerksBand> 
<http://xyz.com/hr/PerksBand/HIGH>  <http://xyz.com/ns/graph/hr/employee#000001> .
<http://xyz.com/employee#000001>  <http://xyz.com/hr/StocksBand> 
<http://xyz.com/hr/StocksBand/HIGH>  <http://xyz.com/ns/graph/hr/employee#000001> .
<http://xyz.com/employee#000002>  <http://xyz.com/hr/salaryBand> 
<http://xyz.com/hr/salaryBand/band3>  <http://xyz.com/ns/graph/hr/employee#000002> .
<http://xyz.com/employee#000002>  <http://xyz.com/hr/PerksBand> 
<http://xyz.com/hr/PerksBand/LOW>   <http://xyz.com/ns/graph/hr/employee#000002> .
<http://xyz.com/employee#000002>  <http://xyz.com/hr/StocksBand> 
<http://xyz.com/hr/StocksBand/HIGH>  <http://xyz.com/ns/graph/hr/employee#000002> .
  • 包含薪金信息的具名图也包含 http://xyz.com/ctx/employeeIdhttp://xyz.com/ctx/managerId 谓词。http://xyz.com/ctx/managerId 谓词值显示 Gayathri 是 4 个员工的经理:Rajesh、Mario、Farzana 和 Ranjan。
<http://xyz.com/employee#000001>  <http://xyz.com/ctx/employeeId> "rajesh" 
<http://xyz.com/ns/graph/hr/employee#000001> .
<http://xyz.com/employee#000002>  <http://xyz.com/ctx/employeeId> "mario"  
<http://xyz.com/ns/graph/hr/employee#000002> .
<http://xyz.com/employee#000003>  <http://xyz.com/ctx/employeeId> "ranjan" 
 <http://xyz.com/ns/graph/hr/employee#000003> .
<http://xyz.com/employee#000004>  <http://xyz.com/ctx/employeeId> "gayathri" 
 <http://xyz.com/ns/graph/hr/employee#000004> .
<http://xyz.com/employee#000005>  <http://xyz.com/ctx/employeeId> "farzana"  
<http://xyz.com/ns/graph/hr/employee#000005> .
<http://xyz.com/employee#000001>  <http://xyz.com/ctx/managerId> "gayathri"  
<http://xyz.com/ns/graph/hr/employee#000001> .
<http://xyz.com/employee#000002>  <http://xyz.com/ctx/managerId> "gayathri" 
 <http://xyz.com/ns/graph/hr/employee#000002> .
<http://xyz.com/employee#000003>  <http://xyz.com/ctx/managerId> "gayathri"  
<http://xyz.com/ns/graph/hr/employee#000003> .
<http://xyz.com/employee#000004>  <http://xyz.com/ctx/managerId> "gayathri"  
<http://xyz.com/ns/graph/hr/employee#000004> .
<http://xyz.com/employee#000005>  <http://xyz.com/ctx/managerId> "gayathri"  
<http://xyz.com/ns/graph/hr/employee#000005> .
  • 在另外的图中,http://xyz.com/ctx/employeeIdhttp://xyz.com/ctx/managerId 谓词被设置为 PUBLIC
<http://xyz.com/ns/graph/hr> <http://xyz.com/ctx/employeeId> \
"PUBLIC" <http://xyz.com/ns/graph/hr> .
<http://xyz.com/ns/graph/hr> <http://xyz.com/ctx/managerId> \
"PUBLIC" <http://xyz.com/ns/graph/hr> .
<http://xyz.com/ns/graph/legal> <http://xyz.com/ctx/employeeId> \
"PUBLIC" <http://xyz.com/ns/graph/legal> .
<http://xyz.com/ns/graph/legal> <http://xyz.com/ctx/managerId> \
"PUBLIC" <http://xyz.com/ns/graph/legal> .
<http://xyz.com/ns/graph/org> <http://xyz.com/ctx/employeeId> \
"PUBLIC" <http://xyz.com/ns/graph/org> .
<http://xyz.com/ns/graph/org> <http://xyz.com/ctx/managerId> \
"PUBLIC" <http://xyz.com/ns/graph/org> .
<http://xyz.com/ns/graph/project> <http://xyz.com/ctx/employeeId> \
"PUBLIC" <http://xyz.com/ns/graph/project> .
<http://xyz.com/ns/graph/project> <http://xyz.com/ctx/managerId> \
"PUBLIC" <http://xyz.com/ns/graph/project> .

创建一个带有图级访问控制的存储

要创建一个带有图级访问控制的 RDF 存储,必须指定谓词,在数据集中该谓词的值管理 RDF 图的访问。在 staffing 应用程序场景中,这些谓词是 http://xyz.com/ctx/employeeIdhttp://xyz.com/ctx/managerId。创建一个存储时,您需要通过使用 createrdfstoreandloader 命令的 -systempredicates 参数指定这些谓词。

-systempredicates 参数接受一个属性文件,其键是图级访问控制所用的谓词,值是 DB2 列数据类型。目前,只支持 VARCHAR 数据类型。您可以使用冒号(:)或等号(=)作为键值之间的分隔符。如果键或值本身包含分隔符(例如,IRI 包含一个冒号),您需要使用一个反斜杠(\)作为转义字符。更多信息,参阅本教程提供的样例 syspredsfile.props 文件。

要为 staffing 应用程序场景创建一个带有图级访问控制的存储:

  1. 发出 createrdfstoreandloader 命令,指定 syspredsfile.props 文件作为 -systempredicates 参数,accesscontrol.nq file 文件作为 -rdfdata 参数,如下示例所示:
C:\Program Files\IBM\SQLLIB\rdf\bin>createrdfstoreandloader.bat \
STAFFINGSECURE -db RDFSAMPL -user db2admin -password db2admin
	-rdfdata .\accesscontrol.nq -systempredicates .\syspredsfile.props
	-storeloadfile staffingsecureloader.sql

secureStaffingstore RDF 存储被创建。

  1. 在 DB2 命令提示行,通过运行 staffingsecureloader.sql 文件加载带三元组的存储:
	C:\Program Files\IBM\SQLLIB\rdf\bin>db2 –t staffingsecureloader.sql

通过使用 DB2 行和列访问控制执行访问控制

现在,为 RDF 存储建立 DB2 行和列访问控制(RCAC)以便于:

  • 包含一个 http://xyz.com/ctx/employeeId 谓词值为 PUBLIC 的三元组具名图可供所有人访问。
  • 只有当具名图包含一个 http://xyz.com/ctx/employeeId 谓词值与当前用户 loginID 匹配的三元组时,或者具名图包含一个 http://xyz.com/ctx/managerId 谓词值与当前用户登录 ID 匹配的三元组时,与上述条件不匹配的具名图可访问。

要为上述条件设置 DB2 行和列访问控制:

  1. 创建下列 5 个用户及其密码。
表 1. 用户 ID 和密码
用户 ID密码
rajeshrajesh123
mariomario123
ranjanranjan123
farzanafarzana123
gayathrigayathri123

要创建该用户,在 Windows® 命令提示窗口发出以下命令。您必须拥有 Windows 权限才能创建新用户。

net user rajesh rajesh123 /add
net user mario mario123 /add
net user ranjan ranjan123 /add
net user farzana farzana123 /add
net user gayathri gayathri123 /add
  1. 在 DB2 数据库中 RDF 存储表上授予用户权限。您可以将 RDF 存储表上所需权限授予为 PUBLIC,而不是将其分别授予 5 个用户,要授予权限:
    1. 作为 db2admin 用户登录。
    2. 从 DB2 CLP 执行 resource/grantperms.sql 文件,包含授予权限的 SQL 语句:
      C:\Users\IBM_ADMIN>db2 connect to RDFSAMPL user db2admin
      Enter current password for db2admin:
      
         Database Connection Information
      
       Database server        = DB2/NT64 10.1.1
       SQL authorization ID   = DB2ADMIN
       Local database alias   = RDFSAMPL
      
      C:\Users\IBM_ADMIN>db2 -f grantperms.sql
      DB20000I        The SQL command completed successfully.
      DB20000I        The SQL command completed successfully.
      DB20000I        The SQL command completed successfully.
      DB20000I        The SQL command completed successfully.
      DB20000I        The SQL command completed successfully.
      DB20000I        The SQL command completed successfully.
      DB20000I        The SQL command completed successfully.
      DB20000I        The SQL command completed successfully.
      DB20000I        The SQL command completed successfully.
      DB20000I        The SQL command completed successfully.
      
      C:\Users\IBM_ADMIN>
  2. 识别 RDF 存储 DP 和 RP 表上的列名称,该 RDF 存储包含管理该图访问控制的谓词值。要实现这一点,查询 SP 表,如下所示:
    C:\Users\IBM_ADMIN>db2 select colName from \
    staffingsecure_sp where mapName='http://xyz.com/ctx/employeeId'
    
    COLNAME
    --------------------------------
    SYSPRED_1
    
      1 record(s) selected.
    
    
    C:\Users\IBM_ADMIN>db2 select colName from \
    staffingsecure_sp where mapName='http://xyz.com/ctx/managerId'
    	
    COLNAME
    --------------------------------
    SYSPRED_0
    	
     1 record(s) selected.

    上述查询输出显示 SYSPRED_0 是 http://xyz.com/ctx/managerId 谓词值所在列,SYSPRED_1 是 http://xyz.com/ctx/employeeId 谓词值所在列。

  3. 执行一个规则,即查看某一员工薪金信息的只能是员工本人或其直接主管。要执行此规则,在 staffingsecure RDF 存储 DP 和 RP 表的 SYSPRED_0 和 SYSPRED_1 列创建行权限。创建这些权限的 SQL 语句位于 resources/fgacperms.sql 文件中,如下所示:
    CREATE PERMISSION DPHROWACCESS ON DB2ADMIN.STAFFINGSECURE_DPH FOR ROWS WHERE
      ( SYSPRED_0 = 'PUBLIC'  OR ( UCASE(SYSPRED_1) = SESSION_USER OR 
       UCASE(SYSPRED_0) = SESSION_USER) ) ENFORCED FOR ALL ACCESS ENABLE

    从 DB2 CLP 窗口运行该文件,如下所示:

    C:\Users\IBM_ADMIN>db2 -f fgacperms.sql
    
    DB20000I        The SQL command completed successfully.
    DB20000I        The SQL command completed successfully.
    DB20000I        The SQL command completed successfully.
    DB20000I        The SQL command completed successfully.

    要运行上述命令,用户需要拥有 SECADM 权限。SECADM 权限可使用 GRANT SECADM ON DATABASE TO DB2ADMIN 命令授予。

    现在,您已经通过使用 DB2 行和列访问控制为 RDF 存储建立了图级访问控制。要验证行是否按规则行事,以不同用户身份登录运行 SPARQL 查询,选择该员工薪金级别。

    为运行 SPARQL 查询,您需要 queryrdfstore.bat 文件。该文件位于资源文件夹或者 DB2RDFTutorial-Part2.zip 中,将 queryrdfstore.bat 复制到 <DB 安装位置 >\SQLLIB\rdf\bin 文件夹。

    1. 首先,以 db2admin 用户身份登录运行查询。注意没有数据行返回。
      C:\Program Files\IBM\SQLLIB\rdf\bin>queryrdfstore.bat staffingsecure -db RDFSAMP
      L -user db2admin -password db2admin -schema db2admin \
      -uniondefaultgraph true "select 
      ?name ?salband where { ?s <http://xyz.com/hr/salaryBand> ?salband . ?s 
      <http://xmlns.com/foaf/0.1/name> ?name }"
      ------------------
      | name | salband |
      ==================
      ------------------
      Time taken      : 712 ms
    2. 以用户 Mario 身份登录运行同一查询。注意只显示该员工的薪金级别。
      C:\Program Files\IBM\SQLLIB\rdf\bin>queryrdfstore.bat 
      staffingsecure -db RDFSAMPL 
      -user mario -password mario123 -schema db2admin -uniondefaultgraph true "select 
      ?name ?salband where { ?s <http://xyz.com/hr/salaryBand> ?salband . ?s 
      <http://xmlns.com/foaf/0.1/name> ?name }"
      ------------------------------------------------------------
      | name              | salband                              |
      ===============================================
      | "Mario Ds Briggs" | <http://xyz.com/hr/salaryBand/band3> |
      ------------------------------------------------------------
      Time taken      : 830 ms
    3. 现在,以用户 Gayathri 身份登录运行同一查询,Gayathri 是经理。该部门所有员工及其薪金级别均被列出。
      C:\Program Files\IBM\SQLLIB\rdf\bin>queryrdfstore.bat staffingsecure -db RDFSAMP
      L -user gayathri -password gayathri123 -schema db2admin -uniondefaultgraph true 
      "select ?name ?salband where { ?s <http://xyz.com/hr/salaryBand> ?salband . ?s 
      <http://xmlns.com/foaf/0.1/name> ?name }"
      -----------------------------------------------------------------
      | name                   | salband                              |
      ===============================================================
      | "Rajesh K Arora"       | <http://xyz.com/hr/salaryBand/band3> |
      | "Mario Ds Briggs"      | <http://xyz.com/hr/salaryBand/band3> |
      | "Priya Ranjan Sahoo"   | <http://xyz.com/hr/salaryBand/band3> |
      | "Gayathri Raghavendra" | <http://xyz.com/hr/salaryBand/band3> |
      | "Farzana Anwar"        | <http://xyz.com/hr/salaryBand/band3> |
      -----------------------------------------------------------------
      Time taken      : 711 ms

该样例中的行访问权限当前设置允许员工更新其薪金信息,而实际情况并非如此。现实中,必须设置行访问权限以阻止员工修改自己的薪金信息。其余权限供用户独立行使,参考资料部分包含关于 DB2 行和列访问控制高级特性的文章链接,可帮助您完成这一任务。

通过使用 DB2 行和列访问控制特性让 DB2 引擎执行图级访问控制有诸多优势,包括:

  • 表的 ANY 和 ALL SQL 访问使用同一访问控制机制。例如,用户直接对该存储表发出 SQL 命令。
  • 可以根据需要灵活地定义访问控制规则的复杂程度。
  • 可以通过使用 Java API 执行图级访问控制。

参考资料 部分提供 DB2 Information Center 中关于使用 DB2 RDF Java API 执行运行时图级访问控制实现 SPARQL 查询主题的链接。


结束语

我们研究了 RDF 数据的特征及其在 DB2 数据库中的存储方式。逐步引导您完成了创建优化存储的过程,并通过与默认存储相比较回顾了其优势。

您也学习了如何创建一个带有图级访问控制的 RDF 存储。本教程介绍了如何通过使用行和列访问控制特性以及使用 Java API 实现图级访问控制。

在第 3 部分中,我们将介绍 DB2 软件如何将 SPARQL 转换成 SQL。我们将挖掘更多特定于 SPARQL 的特性,比如 DESCRIBECONSTRUCT 查询表单以及具名组联合的创建。


下载

描述名字大小
样例程序DB2RDFTutorial-Part2.zip27KB

参考资料

学习

获得产品和技术

讨论

条评论

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=852089
ArticleTitle=DB2 10 for Linux, UNIX, and Windows 中的资源描述框架应用程序开发,第 2 部分: 在 DB2 中优化您的 RDF 数据存储并提供细粒度访问控制
publish-date=12172012