2012年12月7日星期五

语义 Web,Linked Data 和 Drupal,第 2 部分: 组合链接的数据集与 Drupal 7 和 SPARQL Views


语义 Web,Linked Data 和 Drupal,第 2 部分: 组合链接的数据集与 Drupal 7 和 SPARQL Views

Stéphane Corlosquet, 软件工程师, MassGeneral Institute for Neurodegenerative Disease (MIND), MGH
Lin Clark, Drupal 开发人员, Digital Enterprise Research Institute, NUI Galway
简介: 本系列的第 1 部分探讨了最近合并到 Drupal 内容管理系统中的一些新概念,比如共享和重用数据现在如何变得更加轻松,因为这些技术淘汰了专用的 API,代之以一种机器可读格式 —— 资源描述框架 (RDF)。在本文中,学习如何利用如今的数据网络中已有的 Linked Data,以及如何使用来自不同端点的数据使 Drupal 7 网站更为充实。一个包含来自独立发布者的数据的真实用例提供了一些实际案例分析。
发布日期: 2012 年 6 月 04 日
级别: 中级 原创语言: 英文
访问情况 : 2875 次浏览
评论: 0 (查看 | 添加评论 - 登录)
平均分 5 星 共 2 个评分 平均分 (2个评分)
为本文评分

在本系列的第 1 部分 “语义 Web,Linked Data 和 Drupal,第 1 部分:使用 PDF 公开您的数据” 中,介绍了合并到 Drupal 7 中的一些新功能。本文将介绍如何如何让 Web 数据更可互操作,让数据共享更加高效。一个示例将展示如何使用 Drupal 7 通过使用 RDF 公开数据来发布 Linked Data。
在本文中,学习如何利用网络上现有的 Linked Data。探索如何使用来自不同端点的数据丰富 Drupal 7,以及了解一个包含来自两个独立发布者的数据的真实用例。
本文中的场景来自一个真实的用例,其中的数据来自两个独立的发布者:DBpedia 和英国政府。
DBpedia 项目在 语义 Web,Linked Data 和 Drupal,第 1 部分:使用 PDF 公开您的数据 中已经介绍过,它从 Wikipedia 获取 infobox 信息并使该内容变得机器可读。作为 Linking Open Data 计划中最早和最大的成就之一,它包含超过 350 万个事物的信息并包含 1,850,000 个图像链接。所有数据通过一个 Creative Commons 属性提供,共享一个许可证,表明在您的 Drupal 网站上可以安全地重用它。
英国政府是最近才加入 Linking Open Data 运动的。依据网络发明者 Tim Berners Lee 先生的建议,该政府启动了一项计划,让政府机构和地方当局在线发布他们的公共数据。该政府非常重视发布越来越多的数据。在编写本文时,已有 5,400 个数据集可用。其中一些数据集可通过 SPARQL 端点以 RDF 形式提供,比如 Research funding 数据集。此数据集包括超过 43,000 条英国各种基金管理机构创立的项目的相关信息,包括:
参考资料 提供关于以下内容的更多信息链接:
  • Linking Open Data 计划
  • 一个查询数据的 SPARQL 端点
  • 来自英国政府的 5,400 个数据集
  • 研究基金数据集
  • 一个典型项目的信息
  • 使用 RDF 将不同的数据集链接在一起
  • 项目名称
  • 项目描述
  • 创立该项目的机构
  • 划拨的资金
  • 项目启动和目标结束日期
  • 授权引用编号
  • 项目状态(仍在运作或已关闭)
Linking Open Data 云是一个社区项目,它在网络上发布开放数据集并使用 RDF 将来自不同数据集的数据链接在一起。DBpedia 和 data.gov.uk Research funding 数据集在 Linking Open Data 云中都是非常重要的节点。在数据集之间建立链接意味着可以像浏览数据库一样浏览数据网络,从不同位置提取数据并将它合并在一起。
data.gov.uk Research funding 数据集包括 DBpedia 中的资源链接,支持将来自两个数据集的数据组合起来。来自 Research funding 数据集的每个项目都链接到其基金管理机构的 DBpedia URI。一个这样的基金管理机构的例子就是工程和自然科学研究委员会(Engineering and Physical Sciences Research Council,EPSRC),它的 DBpedia URI 为http://dbpedia.org/resource/Engineering_and_Physical_Sciences_Research_Council。访问此 HTTP URI 将可以看到 DBpedia 拥有的关于此机构的信息:
  • 机构名称
  • 机构缩写
  • 机构职责描述
  • 地点
  • 主页
在图 1 中,部分 Linked Open Data 云显示了 data.gov.uk Research funding 数据集与 DBpedia 之间的链接。

图 1. Linking Open Data 云,data.gov.uk Research funding 数据集与 DBpedia 之间的链接
其中包含许多圆圈和箭头,但 data.gov.uk Research funding 数据集和 DBpedia 被圈起来并使用红色箭头相链接
现在,数据位于 Internet 上两个独立的页面中(一个页面针对一个代理,另一个页面针对一个具体项目),没有页面会聚合可以同时在这两个页面上找到的大量信息。如果可以构建一个页面来描述该机构,包含来自 DBpedia 的数据和 Research funding 数据集中该机构建立的所有项目的清单呢?在本文余下部分中,将构建这样一个包含 Drupal 7 和 SPARQL Views 的页面。
语义 Web,Linked Data 和 Drupal,第 1 部分:使用 PDF 公开您的数据 介绍了如何安装 LAMP 堆栈和开始使用 Drupal 7。对于本文中的用例,应该从 drupal.org 下载所有包。这些包是在编写本文时的最新版本。(请参阅 参考资料 获取各个链接)。
  • RDF Extensions 7.x-2.0-alpha1
  • SPARQL 7.x-2.0-alpha1
  • Views 7.x-3.0-beta3
  • SPARQL Views 7.x-2.0-alpha2
  • Entity API 7.x-1.0-beta8
  • CTools 7.x-1.0-alpha4
最新的模块版本推出后即可免费使用。可以使用 Drush 的包管理器(相当于 Drupal 的 apt-get 或 yum) 一次下载 Drupal 7 需要的所有包,如清单 1 所示。

清单 1. 使用 Drush 的包管理器下载 Drupal 7 需要的所有包
    
drush pm-download rdfx sparql views sparql_views entity ctools

将所有包下载到 /sites/all/modules 目录之后,启用:
  • SPARQL Views
  • RDF UI
  • Views UI 模块
Drupal 还将安装这些模块的依赖关系。或者使用: drush pm-enable sparql_views rdfui views_ui.
主要的 RDF 包需要 ARC2 库。请参阅 sites/all/modules/rdfx 中的 README.txt,了解更多说明。Drush 可节省时间,为您将 ARC2 下载到正确的位置,这使用以下命令完成: drush rdf-download.
在深入介绍 SPARQL Views 之前,有必要知道它利用了 Views 的强大能力。Views,最流行的 Drupal 模块之一,用于构建各种格式的内容的清单。Views 允许站点管理员决定要显示哪些数据,如何使用灵活的用户界面显示它。
即使不熟悉查询语言的人也可以创建查询,使用过滤器和参数定制其查询,并使用大量包含模板的插件来呈现数据,比如 Google 图表和 jQuery Slideshows。因为该流程的所有部分都是可插入的,存在许多不同模块,扩展 Views 并使其成为了一个选择和呈现数据的强大工具。
视图通常显示某种相关的数据,比如一个组的成员、一个帖子列表、相册等等。以前的 Views 版本只能访问本地 Drupal 数据库中的数据,而 Views 3 可连接任何数据源并从任何地方提取数据:Flickr、Amazon S3、Solr 服务器等。SPARQL Views 添加了使用 Views 查询 SPARQL 端点并显示结果的功能,就像它们来自本地数据库一样。
Drupal 需要知道数据将来自何处。为此,您首先需要设置一些名称空间并注册两个将用于本示例的 SPARQL 端点。
  1. 要设置名称空间,单击管理工具栏中的 Configuration,转到 Web Services 块中的 RDF publishing settings 页面,然后选择RDF namespaces 选项卡。Research funding 数据集使用一个具有以下名称空间的特定 RDF 模式:http://research.data.gov.uk/def/project/
    将此名称空间与 project 前缀相关联,如图 2 所示。对于 DBpedia,使用与名称空间 http://dbpedia.org/property/ 关联的前缀 dbp


    图 2. 注册 Research funding 数据集中使用的 project 名称空间
    屏幕显示了前缀和词汇表 URI 字段。前缀在字段中包含项目,词汇表 URI 包含 http://research.data.gov.uk/def/project/
  2. 要注册 SPARQL 端点,在管理工具栏中单击 Structure 并选择 SPARQL Endpoints Registry。图 3 给出了一个示例。通过输入每个 SPARQL 端点的标题和端点来添加它们:
    • DBpedia: http://dbpedia.org/sparql
    • Research funding: http://services.data.gov.uk/research/sparql


    图 3. SPARQL 端点注册表,包含两个数据集的端点
    包含我们的两个数据集的端点的 SPARQL 端点注册表
您需要在 Drupal 中描述数据集,以便 SPARQL Views 知道您希望从数据集提取何种特定数据项。在 语义 Web,Linked Data 和 Drupal,第 1 部分:使用 PDF 公开您的数据 中已经说明,数据网络由拥有属性(谓语)和值(宾语)的资源组成。当查询 RDF 时,SPARQL Views 将需要知道哪些数据实际可供查询。这些属性在 Views 中称为字段。您需要在构建任何 SPARQL Views 之前定义这些字段。示例用例有两种类型的资源:agency 和 project。对于每种资源类型,定义您感兴趣的字段,并定义什么 RDF 谓语可用于从各个数据集捕获其值。
单击管理工具栏中的 Structure 并选择 SPARQL Views resource types。单击 Add sparql views resource type 并输入您的每种类型的端点名称:agency 将与 DBpedia 相关联,project 将与 Research funding 端点相关联,如图 4 所示。

图 4. 创建 SPARQL View 资源类型
创建 SPARQL View 资源类型,选择了 Research funding endpoint。
现在两种资源类型都已添加到系统中,您可以添加希望用户查询每项资源的适当字段。在 Drupal 7 中创建字段非常简单,方法与为节点内容类型创建字段相同。
单击 agency 资源类型的 Manage fields, 并输入字段名称(比如 Description)。选择一个机器名称(通常与字段名称相同但使用小写)description,机器名称只能包含小写字符、数字和下划线。它在内部用于引用字段。对于字段类型,选择 Text,如图 5 所示,保存表单。

图 5. 添加与您希望从数据集提取的属性对应的字段
添加与您希望从数据集提取的属性对应的字段的表单
您然后应该填写字段配置表单。当保存该表单时,保留所有设置不动,除了最后一组字段。在这里指定用于从数据集提取此数据项的 RDF 谓语。该实例使用 rdfs:comment 作为 DBpedia 上的一个机构的 Description 字段,如图 6 所示。

图 6. 指定在数据集中用于查询给定值的 RDF 谓语
指定在数据集中用于查询给定值(在这里是一个机构的描述)的 RDF 谓语
表 1 显示用于 agency 资源类型的字段和相关 RDF 映射。

表 1. agency 资源类型的字段和相关 RDF 映射
名称rdfs:label
缩写dbp:abbreviation
描述rdfs:comment
主页foaf:homepage
位置dbp:location

表 2 给出了对应于 project 资源类型的字段和 RDF 映射。

表 2. 对应于 project 资源类型的字段和 RDF 映射
名称rdfs:label
参考号project:grantRefNumber
价值project:grant
抽象dc:abstract
基金管理机构project:funder

为 resource 类型创建上述表中的所有字段。当第二次创建字段名称时,确保使用了字段创建表单中的 Add existing field 行。您为 Drupal 字段选择的名称可以是任意的,无需与数据集中使用的 RDF 映射匹配。
最后,您需要一个容器来显示两个数据集的结果。示例使用了一个 Drupal 节点作为容器来实现该用途。第一项任务是创建一个内容类型 Agency page。在 Structure > Content type 中,单击 Add content type
  • 名称:Agency page
  • 描述:A page containing information about an agency from various datasets.
  • 显示设置:取消选择 Display author and date information,因为它与该示例无关。
  • 注释设置:选择 Closed,因为该页面上不需要注释功能。
保存此表单之后,单击 Manage fields 并删除 Body 字段(如果它未使用)。添加一个名为 Agency URI 的字段,它将包含您希望显示其信息的机构的 URI。无需为此字段指定任何 RDF 映射。
现在您可以为您希望显示其信息的机构创建一个实际页面。单击灰色快捷方式栏中的 Add content 并选择 Agency page。为此页面填写一个标题,比如 “Information about the Engineering and Physical Sciences Research Council”。在 Agency URI 文本字段中,粘贴此机构的 DBpedia URI,可以在项目页面上找到它:
http://research.data.gov.uk/doc/project/epsrc/EP/C545222/1

只需右键单击创建者名称:
http://dbpedia.org/resource/Engineering_and_Physical_Sciences_Research_Council

选择这个特定的 URI 是因为,它是包含了两个数据集。提交表单之后,您将注意到您刚传递的 URI 显示在标题下。此 URI 将在以后将视图组装到页面上时发挥重要作用,但它没有必要显示。在编辑 Agency page 内容类型时,可以通过在 format 下拉菜单中选择 <hidden> 将它隐藏在 Manage Display 选项卡下。
现在所有元素都已齐备,可以执行以下步骤了:
  • 构建将使用指定的 RDF 映射查询数据集的实际视图。
  • 在合适的页面中显示结果。
转到 Structure > Views 并单击 Add new view 以创建一个新 SPARQL 视图。首先为关于 DBpedia 机构的信息创建视图。为它命名,比如 “Agency information” 并在 Show 下拉列表中选择 SPARQL Views: DBpedia 类型。您将不能创建一个页面,但是可以创建一个区域,其标题为 “Funding Agency Details (source: DBpedia)”。单击 Continue and edit 将转到 Views 的主用户界面。此用户界面的大部分内容不是特定于 SPARQL Views 的。如果您熟悉 Views,将会发现许多概念,比如字段、关系、排序标准、过滤器等。Views 非常灵活,拥有丰富的选项和设置。
字段是可在显示结果期间显示的数据项。它们可显示、隐藏或依据用例相互组合。
  1. 单击 Fields 对话框右上角的 add 按钮列出可用字段。选择复选框 agency: field_name 并单击 Add and configure fields 将它添加到字段列表中。配置字段表单保持原样,然后单击 Apply
    对所有其他字段重复此步骤:描述、主页、位置和缩写。尝试使用每个字段的设置指定一个标签,将字段输出包装在 <strong> 或 <em> 内。主页 URI 可转换为一个链接,只需选择 Output this field as a link 并将链接路径设置为[agency_field_homepage]
  2. 上下文过滤器可用于指定视图在执行查询时要使用的输入参数。示例使用了一个参数告诉 “Agency information” 视图,它只需要查询附近的 Agency 数据。您在节点上输入的 URI 将在这里派上用场。
    要添加上下文过滤器,打开右侧的 “Advanced” 字段集并单击 Add,选择 agency: URI 复选框,单击 Add and configure contextual filters。在 “When the filter value is NOT in the URL” 中选择 Provide default argument。在 “Type” 中选择Field Value (Node)。在 Source Field 中,选择 Agency URI 字段。这些设置将告诉视图使用哪个 Agency URI 的值作为 SPARQL 查询的 WHERE 模式的主体。单击 Apply
  3. 不要忘记单击右上角的 Save 保存您所做的所有设置。
您现在拥有了第一个基础 SPARQL 视图,它可放在您为工程和自然科学研究委员会创建的节点内。此视图将使用一个将在该节点中显示的区域来实现。
  1. 转到 Structure > Blocks 管理站点上的各个区域并找到名为 agency_information: Block 的区域。将此区域移动到内容区中,放在 Main page content 区域之上,如图 7 所示。单击 Save

    图 7. 管理站点上的各个区域
    包含下拉字段和一个配置选项的 3 列表单。
  2. 要管理此区域的可视性设置,单击此区域的 Configure。在 Content types 垂直选项卡中,选择 Agency page,使该 SPARQL View 区域仅在想要的页面上显示。请参见图 8。

    图 8. 管理可视性设置
    Visibility settings 表单,在 show block for specific content types 下选择了 agency page
  3. 转到您为该机构创建的节点,现在应该看到您刚创建的 SPARQL View 区域,其中包含来自 DBpedia 的机构细节,如图 9 所示。

    图 9. SPARQL View 区域,包含机构细节
    页面上有两个选项,包含显示机构细节的 SPARQL View 区域
第二个 SPARQL 视图的构建与第一个视图非常相似。按照相同的步骤执行,将第二个视图命名为 Funded projects 并选择类型SPARQL Views: Research funding。区域的标题将是 “Projects funded (source: data.gov.uk)”。添加以下字段:
  • Name
  • Reference Number
  • Value
  • Abstract
忽略 Funding Agency,因为您在查看它的页面时就已经知道它了。
添加上下文过滤器 field_funding_agency 并采用与第一个视图相同的方式配置它。将该区域添加到内容区并像第一个视图的区域一样配置它。浏览一下机构节点。应该会看到添加了许多内容。但是,您将注意到,布局看起来不正确:第一个视图仅显示了一个资源(该机构)的值。第二个视图一次显示了许多资源,所以需要为它采用不同的模板。在这里使用表格更合理,每个结果将占一行,值将是表格的列。这对于 Views 不存在问题。
返回到 Funded Projects 视图的编辑表单。在左侧的 format 窗格中,单击 Unformatted list 并选择 Table。将显示所有列的列表,可在这里改进表格布局,比如将 Value 列右对齐以实现更好的可读性。也可以让它可排序。
可以对视图进行其他改进,比如选择 Trim this field 为抽象的最大长度(比如 150 个字)。您可以以链接的形式输出 Name 字段,只需添加 URI 字段,从显示界面执行它,并使用它作为名称的替代模式。保存视图并找到机构页面,它现在包含该机构所创立的所有项目的表格,如图 10 所示。

图 10. 机构页面,包含已创立的所有项目的表格
机构页面,包含已创立的所有项目的表格
在本文中,您学习了如何使用 Drupal 7 和 SPARQL Views 将来自两个不同 SPARQL 端点的单一资源的数据组合在一起。本文仅探讨了使用 SPARQL、RDF 查询语言组合视图的众多方式中的一部分。我们希望您将继续探索 Drupal 7、Views 和 SPARQL Views 提供的各种可能性,查找组合 Linked Data 的新方式。

学习
获得产品和技术
讨论
  • 加入 developerWorks 中文社区。查看开发人员推动的博客、论坛、组和维基,并与其他 developerWorks 用户交流。
//www.ibm.com/developerworks/i/p-scorlosquet.jpg
Stéphane Corlosquet 拥有爱尔兰 Digital Enterprise Research Institute (DERI) 语义 Web 领域的硕士学位。他是 Mass General Institute for Neurodegenerative Disease (MIND), MGH 的一位软件工程师,研究科学协作框架(一种基于 Drupal 的分发框架,用于构建生物医学领域研究人员的在线社区。Stéphane 为 Drupal 6 做出了重要贡献,是 30 位对 Drupal 7 核心贡献最大的人之一。他负责维护 Drupal 7 中的 RDF 模块,是 Drupal 安全团队的成员。关于他的更多信息可在 http://openspring.net/ 上找到。
http://www.ibm.com/developerworks/i/p-liclark.jpg
Lin Clark 是一位 Drupal 开发人员,专攻 Linked Data。她对 Drupal 7 核心计划的 RDF 作出了很大贡献,创建了 SPARQL Views 作为 2010 年 Google Summer of Code 的一部分,并发表了很多关于在日常应用程序中使用 Linked Data 技术的优势的演讲。她曾就读于卡耐基梅隆大学,目前在爱尔兰高威大学数字化企业研究所攻读硕士学位。关于 Lin Clark 的更多信息见 lin-clark.com。

语义 Web,Linked Data 和 Drupal,第 1 部分: 使用 PDF 公开您的数据


语义 Web,Linked Data 和 Drupal,第 1 部分: 使用 PDF 公开您的数据

Lin Clark, Drupal 开发人员, Digital Enterprise Research Institute, NUI Galway
简介: Drupal 7 是第一个在其内核中支持语义 Web 技术的主流内容管理系统。语义 Web 技术随时可用,允许您将 Web 应用从一个文档型应用转换为一个数据型应用。在本文中,学习使您的 web 数据更具互操作性,使您的数据共享更为高效的技术。一个示例显示了如何通过使用 RDF 发布内容来让 Drupal 7 实现发布 Linked Data。
发布日期: 2012 年 5 月 02 日
级别: 中级 原创语言: 英文
访问情况 : 971 次浏览
评论: 0 (查看 | 添加评论 - 登录)
平均分 5 星 共 1 个评分 平均分 (1个评分)
为本文评分

在 2001 年,Tim Berners-Lee 先生的一篇传奇文章 “The Semantic Web”,勾勒出了这样一个世界,您的手持代理可以和其他代理交换数据并制定决策使您的生活更加简便。从那时起到现在,语义 Web 已经有了相当大的改进,在最近几年也有了一个更加务实的转变。随着 Linked Data Initiative 的出现,研究和开发都关注 Berners-Lee 所谓的最主要的困难:数据互操作性。
无需创建大量自定义代码就可以从 Linked Data 技术获益。本文将介绍 Drupal 7 如何提供广泛的数据互操作性能。学习如何使用 Resource Description Framework (RDF) 公开您的 web 数据。您可以 下载 本文所使用的源代码。
为了更好地理解本文的示例,安装一个 Drupal 7 。Drupal 需要 PHP 和一个数据库服务器(比如 MySQL)才可运行。
目前,web 上的很多数据都不能互操作。例如,如果您想将数据从一个网站取出,然后与其他网站上的数据组合,您需要编写一个自定义爬虫(crawler),从页面中抓取您所需要的信息。如果您想使用那些预算较少的网站(比如个人、政府和教育机构运行的网站)上的信息,这一点尤为重要。如果开发人员有权访问网站上的结构化数据,那通常是通过专有 API 进行的,这些 API 各个网站都不相同。
Linked Data Initiative 使用很小一部分语义 Web 技术和概念(比如 RDF)来尝试解决互操作性问题,并使重利用和合并 web 上的数据更为容易。
随着对数据互操作性的关注,开发和创新的步伐不断加快,因为企业看到了语义 web 的力量。例如 Google 使用 RDF in attributes (RDFa) 来支持 Rich Snippets,这呈现一个片段,应用 Google 算法来突出显示 web 页面中嵌入的结构化数据。它们通过重点显示页面内容的某一部分来提供较为有用的搜索结果,如 图 1 所示。不同的账户显示增强的搜索结果在点击率上有 15-30% 的提高。

图 1. 一个菜谱的 Google Rich Snippet 
Google Rich Snippet 突出显示页面的某个元素
2010 年,Facebook 开始使用 RDFa 来驱动 Like 按钮,开发人员可以将其放在自己的站点上。一个 Web 页面上仅包含一点点 RDFa,使它和一个 Facebook 页面大小差不多。当访问者单击这个 Like 按钮时,访问者和外部页面在 Facebook 中建立一个连接。这类互操作性的动力来自遵守一些简单原则和少数语义 web 技术。
对于 Linked Data,最重要的准则是为 web 上的所有内容使用不同的名称,而不是使用一系列 ID 或者其他标识符。创建完全不同的名称的一个简单方法是使用域命名系统。例如,如果您在自己的网站上提供关于 jane-doe 的信息,这很难区分不同的名为 Jane Doe 的人的信息。使用标识符 http://example.com/people/jane-doe,就很容易区分所指的 Jane Doe。标识符样式被称为 HTTP URI
如果您使用了 HTTP URI 来进行识别,那么您也可以使用 web 架构来提供使关于 Jane Doe 的更多信息。您可以给用户提供关于 Jane 的更多信息,当用户访问 http://example.com/people/jane-doe 时,就可以看到她的姓名、上网号、所处位置以及她所撰写的刊物。
如果您之前使用数据库或者面向对象语言进行工作,那么对 RDF 可能比较熟悉。它只是一个 “实体-属性-值”(entity-attribute-value)模型(在 RDF 中,attributes 通常称为 properties),如 表 1 所示。

表 1. “实体-属性-值” 模型 
实体属性
http://example.com/people/jane-doenameJane Doe
为了确保互操作性,您必须使用大家都可以理解的属性名,因此,也使用 URI 作为属性。人们通常在词汇表(或者,更正式的是,本体论) 中发布一些属性 URI 包。
以下是词汇表示例。
Friend of a Friend (FOAF)
提供描述人的属性: namehomepagembox (email)、accountbased_near
Dublin Core (DC)
提供描述发表作品的属性 :abstractcreateddateCopyrightedpublisher
Semantically-Interlinked Online Communities (SIOC)
提供描述在线社交网络和其他用户的属性:followshas_replylast_reply_datemoderator_ofsubscriber_of
参阅 参考资料 获取更多关于词汇表的信息。
使用 URI 作为属性,上述 entity-attribute-value 语句看起来像这样:
<http://example.com/people/jane-doe> <http://xmlns.com/foaf/0.1/name> "Jane Doe"

尖括号中的是完整的 URI 值,引号中的是文本值。
通过使用紧凑的 URIs(CURIEs)和定义这些 CURIEs 方法的前缀使内容易于阅读。清单 1 显示了一个示例。

清单 1. 使用 CURIEs 的 RDF 语句 
    
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX person: <http://example.com/people/>

person:jane-doe foaf:name "Jane Doe"

这样,web 架构就变成了一种数据库结构,但不是所有的数据都位于一个数据存储库中,数据可位于不同的独立网站中,根据需要轻松地合并和集成。
您可以使用 SPARQL 查询语句来从这个 RDF 数据集中检索数据
很多数据集和信息中心(比如 Wikipedia)能够通过 Linked Data 打开。尽管 Wikipedia 中的很多内容都是免费文本,且很难作为 Linked Data 公开,但很多结构化信息可在 Wikipedia 页面右侧的 infoboxes 中找到。这个 infoboxes 可能包含诸如城市人口或作者风格和笔名这类信息。
DBpedia 是一个社区,致力于从 Wikipedia 中抽象结构化信息,并通过使用 RDF 将其公开使得此信息在 web 中可用。整个 RDF 文件可以从转储中下载,供应用程序所用。也提供 示范查询接口
在 DBpedia 中挖掘数据的一个简单方法是寻找与一个主题相关联的 URI。例如,假设您想寻找匹兹堡的城市人口或其他信息,首先,找到 Wikipedia 页面的 URL,然后使用 清单 2 中的 SPARQL 查询寻找与该页面相关的 DBpedia URI。因为 Snorql 界面包括示例中的前缀,您可以使用 CURIEs,无需声明您的前缀。

清单 2. 查找匹兹堡的 DBpedia URI 的查询语句
    
SELECT ?uri WHERE {
  ?uri foaf:page <http://en.wikipedia.org/wiki/Pittsburgh>
}

URI 是 <http://dbpedia.org/resource/Pittsburgh>(尽管 Snorql 接口只为您提供到另一个查询的链接,如 清单 3 所示)。

清单 3. 在 DBpedia 中查找关于匹兹堡的所有信息的查询语句
    
SELECT ?property ?hasValue ?isValueOf
WHERE {
  { <http://dbpedia.org/resource/Pittsburgh> ?property ?hasValue }
  UNION
  { ?isValueOf ?property <http://dbpedia.org/resource/Pittsburgh> }
}

这个查询语句好像很难理解,不用担心。重要的是理解在运行这个查询时,可以看到 DBpedia 中包含的关于匹兹堡的所有信息,比如全年的平均温度、经度/纬度坐标,城市标志图像和该城市诞生的著名人物。
如果您只想从 DBpedia 中提取一个事实 — 比如城市人口 — 可以使用 清单 4 中的这个查询语句。

清单 4. 查找匹兹堡人口的查询语句
    
SELECT ?population WHERE {
<http://dbpedia.org/resource/Pittsburgh> dbpedia2:populationMetro ?population
}

通过遍历不同事物之间的链接可以找到更多事实。进一步查找,获取匹兹堡出生的人名清单。添加 dbo 前缀,这样您可以编写dbo:birthPlace 而不是 dbpedia:ontology/birthPlace,如 清单 5 所示。

清单 5. 获取在匹兹堡出生的人名清单的查询语句
    
PREFIX dbo: <http://dbpedia.org/ontology/>

SELECT ?person WHERE {
?person dbo:birthPlace <http://dbpedia.org/resource/Pittsburgh> .
}

现在,您有了一个在匹兹堡出生的人名清单。为了使其更加有趣,以某一标准对此列表进行筛选。例如,仅需要属于 “美国博客作者” 这类人。要这样做,使用一个称为 rdf:type 的属性,如 清单 6 所示。

清单 6. 获取出生在匹兹堡的美国博客作者的查询语句
    
PREFIX dbo: <http://dbpedia.org/ontology/>

SELECT ?person WHERE {
?person dbo:birthPlace <http://dbpedia.org/resource/Pittsburgh> ;
        rdf:type <http://dbpedia.org/class/yago/AmericanBloggers> .
}

您可以获取关于在匹兹堡出生的博客作者列表的更多信息。清单 7 显示了如何获取文章提要,可以作为简要传记。

清单 7. 获取在匹兹堡出生的美国博客作者简短摘要的查询语句
    
PREFIX dbo: <http://dbpedia.org/ontology/>

SELECT ?person ?bio WHERE {
?person dbo:birthPlace <http://dbpedia.org/resource/Pittsburgh> ;
        rdf:type <http://dbpedia.org/class/yago/AmericanBloggers> ;
        dbo:abstract ?bio .
}

您可能注意到了,这个查询得到的比您所需要的更多,包括英语和每种现存译文的摘要。如果只要英文版,使用 FILTER 并选中语言,如 清单 8 所示。

清单 8. 英语摘要查询
    
PREFIX dbo: <http://dbpedia.org/ontology/>

SELECT ?person ?bio WHERE {
?person dbo:birthPlace <http://dbpedia.org/resource/Pittsburgh> ;
        rdf:type <http://dbpedia.org/class/yago/AmericanBloggers> ;
        dbo:abstract ?bio .
FILTER langMatches( lang(?bio), "en" )
}

上述查询只返回查询的英文版本。
SPARQL 使得从一个 RDF 数据集中获取您想要的目标信息比较容易,从而可以轻松地访问数据和跨网络重用。
Drupal 为小型数据发布者提供更为广泛的数据互操作性功能。它是一个开源内容管理系统,使开发人员和终端用户可以轻松地创建健壮的数据输入表单。该表单适合捕获结构化数据,以各种方式灵活地格式化数据。
有了 Drupal 7,甚至更小的网站都能够使用 RDF 公开它们的数据。在新 Drupal 7 网站中,基本的页面和文章内容是默认公开的。本产品的关键是 RDF Mapping API。有了这些 API,任何格式的字段都可以映射到一个 RDF 属性,任何内容类型都可以被映射到一个 RDF 类型。例如,如果该网站有一个唱片艺术家清单,则内容可能有类型 mo:MusicArtist。字段可能被映射到mo:fanpagemo:discographymo:biography 等等。
任何定义了映射的内容类型都将使用 RDFa(HTML 属性中的 RDF)自动公开内容。例如,之前的 Jane Doe 场景在 RDFa 中看起来如 清单 9 所示。

清单 9. 清单 1 中的语句在 RDFa 中的表示
    
<div about="http://example.com/people/jane-doe">
  <h1 property="foaf:name">Jane Doe</h1>
</div>

Drupal 处理标记的格式化,使其更易于发布有效 RFDa,网站所有者现在可以和其他人共享自己的数据,也可以很容易地利用各种机会,比如 Google 的 Rich Snippets。
在本小节中,您将开始发布 Linked Data。示例创建了一个 Recipe 内容类型,用于发布烹饪菜谱,可作为 Google Rich Snippets 显示。
您可以 下载 本文所用源代码。
为了跟随示例逐步学习,需要安装一个 Drupal 7 。要运行 Drupal,需要 PHP 和一个数据库服务器,比如 MySQ。如果您已经在您的开发环境中安装了 PHP 和一个数据库服务器,查看安装指南中的说明。如果没有安装,Acquia 提供易于使用的 Acquia Stack Installer,为您安装 Apache Web Server、PHP、MySQL 服务器和 Drupal 7 网站。参阅 参考资料 获取更多信息。
建立了网站之后,试着使用第二个工具栏中的 Add content 按钮添加一个 Article。您的新内容将显示在首页列表中。看看源代码,注意 RDF 已经包含在 HTML 中了。例如,文章作者是通过 sioc:has_creator 标记的,因为 Page 和 Article 内容类型都是默认 RDF 映射的。
本小节余下部分将使用其本身的自定义映射(您通过代码定义的)创建一个新内容类型。(内容类型及其映射也可以通过一个用户界面定义,这不在本文范围之内。)
Drupal 模块的第一个要求是 .info 文件,如 清单 10 所示。它向系统提供关于模块中的文件以及其他您依赖的模块的信息。

清单 10. rdf_example.info 文件
    
name = RDF Example
description = Demonstrates an RDF mapping using the RDF Mapping API.
core = 7.x
dependencies[] = richsnippets 
dependencies[] = field_collection

依赖项矩阵告知 Drupal 哪个模块需要在该模块安装之前安装。注意 field_collection 本身依赖 Entity API。见 参考资料 获取下载模块的链接。
该示例在 Rich Snippets 模块上添加了一个依赖项,因为您需要对 RDFa 进行一些较小的调整。依赖项被添加在 field_collection上,因为您将使用它来创建字段组,比如营养信息或配料。
下一步是创建内容类型,以及在 .install 文件中附加相关字段。这个 .install 文件由 3 个函数组成,如下所示。
函数作用
rdf_example_install实现 hook_install,在模块安装时被调用。
_rdf_example_installed_fields一个私有函数,被 rdf_example_install 调用;为我们需要的字段提供字段定义。
_rdf_example_installed_instances另一个私有函数,被 rdf_example_install 调用;定义附加到内容类型的字段。

在 rdf_example_install 中,首先创建 Recipe 节点类型,如 清单 11 所示。

清单 11. 在 rdf_example_install 中定义一个节点类型
    
  // Define the node type.
  $rdf_example = array(
    'type' => 'recipe',
    'name' => $t('Recipe'),
    'base' => 'node_content',
    'description' => $t('The recipe node is defined to demonstrate RDF mapping.'),
  );

  // Set additional defaults and save the content type.
  $content_type = node_type_set_defaults($rdf_example);
  node_type_save($content_type);
  

创建可以附加到 Recipe 节点类型的字段,如 清单 12 所示。这些字段可以通过 Fields UI 被其他模块和其他用户所重用。字段定义保存在另一个函数中(_rdf_example_installed_fields),用于进行代码清理。

清单 12. 创建可以添加到节点类型的字段
    
  foreach (_rdf_example_installed_fields() as $field) {
    field_create_field($field);
  }

上述代码调用 _rdf_example_installed_fields 获取需要安装的字段列表。该字段定义包含字段名和类型,以及基数(这是该字段可拥有的值的数量)。此外,设备被配置在某些字段上。对于字段定义,该示例只创建将要使用的所有字段。您不需要担心哪一个内容类型将被附加。
在 清单 13 中注意 recipe_nutrition 是一个 field_collection 字段,是一个特殊类型,连接到一个 field_collection 实体,该实体有其自己的 RDF 类型并含有自己的字段。该实体类型动态创建为 recipe_nutrition。下一步将向其中附加字段,如 清单 14 所示。

清单 13. 在 _rdf_example_installed_fields() 中定义字段
    
array(
    'recipe_photo' => array(
      'field_name' => 'recipe_photo',
      'cardinality' => 1,
      'type'        => 'image',
    ),
    'recipe_summary' => array(
      'field_name'  => 'recipe_summary',
      'cardinality' => 1,
      'type'        => 'text',
      'settings'    => array(
        'max_length' => 500,
      ),
    ),
    'recipe_nutrition' => array(
      'field_name'  => 'recipe_nutrition',
      'cardinality' => 1,
      'type'        => 'field_collection',
    ),
    'recipe_serving_size' => array(
      'field_name'  => 'recipe_serving_size',
      'cardinality' => 1,
      'type'        => 'text',
    ),
    'recipe_calories' => array(
      'field_name'  => 'recipe_calories',
      'cardinality' => 1,
      'type'        => 'number_integer',
    ),
  );

现在,字段已经在系统中创建了,使用 field_create_instance 将该字段的实例附加到 Recipe 内容类型和 Recipe Nutrition 字段集合(在 Drupal 中,这些类型被称为 bundles)。再一次,实例定义放置在一个分离函数中(_rdf_example_installed_instances)进行代码清理,清单 14 显示了一个示例。

清单 14. 附加字段示例到 rdf_example_install 中的内容类型
    
  foreach (_rdf_example_installed_instances() as $bundle_name => $bundle) {
    foreach ($bundle as $instance) {
      $instance['entity_type'] = $bundle_name == 'recipe' ? 'node' : 
'field_collection_item';
      $instance['bundle'] = $bundle_name;
      field_create_instance($instance);
    }
  }

上述代码调用 _rdf_example_installed_instances 获取字段实例定义。在 _rdf_example_installed_instances 中,您可以创建一个附加该实例的类型确定的数组。在本例中,它是 Recipe 内容类型或者 Recipe Nutrition 字段集合,如 清单 15 所示。

清单 15. 在 _rdf_example_installed_instances() 中定义实例
    
  $instances = array();
  $instances['recipe'] = array(
    'recipe_photo' => array(
      'field_name'  => 'recipe_photo',
      'label'       => $t('Photo of the prepared dish'),
    ),
    'recipe_summary' => array(
      'field_name' => 'recipe_summary',
      'label'       => $t('Short summary describing the dish'),
      'widget'      => array(
        'type'    => 'text_textarea',
      ),
    ),
    'recipe_nutrition' => array(
      'field_name' => 'recipe_nutrition',
      'label'      => $t('Recipe Nutrition Information'),
    ),
  );
  $instances['recipe_nutrition'] = array(
    'recipe_serving_size' => array(
      'field_name' => 'recipe_serving_size',
      'label'       => $t('Serving size'),
    ),
    'recipe_calories' => array(
      'field_name' => 'recipe_calories',
      'label'       => $t('Calories'),
    )
  );

在 .module 文件中,为您所定义的字段和内容类型创建 RDF 映射。因为内容类型是在这个模块中定义的,使用 hook_rdf_mapping 为内容类型创建 RDF 映射。更改其他模块创建的内容类型的映射在这里不作说明。要更改现有映射,在安装函数中您可以使用 RDF Mapping API 提供的 rdf_mapping_load 和 rdf_mapping_save 函数。
正如您在创建实例中一样,通过 bundle 类型结构化该数组。为 Recipe 内容类型定义的映射如 清单 16 所示,为 Recipe Nutrition 字段集合定义的映射如 清单 17 所示。

清单 16. 来自 rdf_example.module 的菜谱 RDF 映射声明
    
    'recipe' => array(
      'type' => 'node',
      'bundle' => 'recipe',
      'mapping' => array(
        'rdftype' => array('v:Recipe'),
        // We don't use the default bundle mapping for title. Instead, we add
        // the v:name property. We still want to use dc:title as well, though,
        // so we include it in the array.
        'title' => array(
          'predicates' => array('dc:title', 'v:name'),
        ),
        'recipe_summary' => array(
          'predicates' => array('v:summary'),
        ),
        // The photo URI isn't a string but instead points to a resource, so we
        // indicate that the attribute type is rel. If type isn't specified, it
        // defaults to property, which is used for string values.
        'recipe_photo' => array(
          'predicates' => array('v:photo'),
          'type' => 'rel',
        ),
        'recipe_nutrition' => array(
          'predicates' => array('v:nutrition'),
          'type' => 'rel',
        ),
      ),
    ),


清单 17. 来自 rdf_example.module 的菜谱营养映射声明
    
    'nutrition' => array(
      'type' => 'field_collection_item',
      'bundle' => 'recipe_nutrition',
      'mapping' => array(
        'rdftype' => array('v:Nutrition'),
        'recipe_serving_size' => array(
          'predicates' => array('v:servingSize'),
        ),
        'recipe_calories' => array(
          'predicates' => array('v:calories'),
        ),
      ),
    ),

最后,实现 hook_rdf_namespaces,这样前缀定义就被包含在 HTML 文档的顶部,如 清单 18 所示。

清单 18. 来自 rdf_example.module 的 RDF 名称空间声明 
    
function rdf_example_rdf_namespaces() {
  return array(
    // Google's namespace for their custom vocabularies.
    'v' => 'http://rdf.data-vocabulary.org/#', 
  );
}

模块完成,试着安装一下。Recipe 内容类型应该显示在 Add 内容页面。
在 Recipe 节点表单上提供标题、图像和摘要字段。为了在测试工具中查看 Rich Snippet ,您需要添加一个图像。您提交了一个节点之后,就可以选择添加营养信息了。确保至少添加一卡路里。
现在您已经有了自己的菜谱了,使用 Rich Snippets Testing Tool 测试。您可以看到一个显示图像和卡路里数的预览视图。
Linked Data 技术使网络数据更好地互操作、可重复使用、也更容易使用。像 Google 和 Facebook 这类企业已经开始构建这些技术了,因为它们使数据共享更为简单。有了 Drupal,小型数据发布者和使用者也可以从这些技术获益,不需要创建一些自定义代码。在本文中,您已经学习了如何使用 RDF 公开您网站的数据。
请继续关注本系列第 2 部分,了解如何使用由他人提供的数据,以及如何在您的 Drupal 网站中合并他人的数据和您自己的数据。

下载
描述名字大小下载方法
本文源代码rdf_example.zip3KBHTTP

学习
获得产品和技术
讨论
Lin Clark 的照片
Lin Clark 是 Drupal 的一名开发人员,专门从事 Linked Data 方面的工作。她是多个 Drupal 模块(比如 Microdata 和 SPARQL Views)的维护人员,还积极参与了 W3C 的 HTML Data Task Force 和 Drupal 的 HTML 5 计划。她曾就读于卡耐基梅隆大学,现正在攻读 NUI Galway 的 Digital Enterprise Research Institute 的研究硕士学位。您可以在 lin-clark.com 上了找到关于她的更多信息。