精通语义网上的结构化数据-全-

龙哥盟 / 2024-10-06 / 原文

精通语义网上的结构化数据(全)

原文:Mastering Structured Data on the Semantic Web

协议:CC BY-NC-SA 4.0

一、语义网简介

传统网站的内容仅是人类可读的,这不适于自动处理,并且在搜索相关信息时效率低下。Web 数据集可以被视为彼此不相关联的孤立的数据孤岛。这种限制可以通过使用强大的格式来组织和发布数据来解决,这些格式可以为网页内容添加结构和意义,并将相关数据相互链接。计算机可以更好地“理解”这些数据,这对任务自动化很有用。

语义网

虽然二进制文件通常包含机器可读的元数据,如 JPEG 图像中的快门速度 1 或 MP3 音乐文件中的专辑名称,但传统网站的文本内容不能被自动化软件代理解释(即不理解)。为软件代理提供语义(含义)的网站形成了语义网,这是 21 世纪初引入的传统网络的扩展。语义网是 Web 2.0 [3]和 Web 3.0 [4]的一个主要方面。Web 2.0 是一个总括术语,用于描述即时消息、IP 语音、维基、博客、论坛、社交媒体门户和网络联合背后的一系列技术。下一代网络被称为 Web 3.0,这是一个涵盖定制、语义内容和更复杂的人工智能网络应用的总称,包括计算机生成的内容(见图 1-1 ) A978-1-4842-1049-9_1_Fig1a_HTML.jpg

A978-1-4842-1049-9_1_Fig1_HTML.jpg

图 1-1。

The evolution of the Web [5] Caution

语义这个词在网络上的其他上下文中也有使用。例如,在 HTML5 中有语义的(换句话说,有意义的)结构化元素,但是这个表达式指的是元素的“意义”。在这种情况下,语义一词将元素的“含义”与旧 HTML 版本的通用元素(如“无意义的”div)进行了对比,如section(主题分组)。标记元素的语义不应该与语义 web 上使用的元数据注释和 Web 本体的语义(换句话说,机器可处理性)相混淆。后者可以提供比标记元素更复杂的数据。

与传统的 Web(“文档 Web”)相比,语义 Web 包括“数据 Web”[6],它连接“事物” 2 (代表真实世界的人和物体),而不是对计算机毫无意义的文档。语义网的机器可读数据集用于各种网络服务[7],如搜索引擎、数据集成、资源发现和分类、编目、智能软件代理、内容评级和知识产权描述[8]、博物馆门户网站[9]、社区网站[10]、播客[11]、大数据处理[12]、业务流程建模[13]和医学研究。在语义网上,可以从看似不相关的领域自动检索数据,以便组合它们,找到关系,并做出发现[14]。

结构数据

传统的网站依赖于标记语言作为文档结构,依赖于样式表作为外观,依赖于脚本作为行为,但是内容只能由人类阅读。例如,当在网络上搜索“捷豹”时,传统的搜索引擎算法并不总是能够区分英国豪华车和南美掠夺者(图 1-2 )。

A978-1-4842-1049-9_1_Fig2_HTML.jpg

图 1-2。

Traditional web search algorithms rely heavily on context and file names

一个典型的网页包含结构化元素、格式化文本,甚至一些多媒体对象。默认情况下,网站设计者创建的标题、文本、链接和其他网站组件对计算机来说是没有意义的。虽然浏览器可以显示基于标记的 web 文档,但只有人类的大脑才能解释信息的含义,因此计算机和人类之间的理解存在巨大差距(见图 1-3 )。即使为图像指定了替换文本(imgfigure 3 元素上具有描述性值的alt属性),数据也不是结构化的或链接到相关数据,并且传统网页段落的人类可读的单词不与任何特定的软件语法或结构相关联。如果没有上下文,网站提供的信息对搜索引擎来说可能是模糊的。

A978-1-4842-1049-9_1_Fig3_HTML.jpg

图 1-3。

Traditional web site contents are meaningless to computers

机器可读数据的概念并不新鲜,也不仅限于网络。想想信用卡或条形码,它们都包含人类可读和机器可读的数据(图 1-4 )。然而,一个人或一个产品有不止一个标识符,这可能会引起歧义。

A978-1-4842-1049-9_1_Fig4_HTML.gif

图 1-4。

Human-readable and machine-readable data

即使是遵循严格语法规则的格式良好的 XML 文档,在机器可处理性方面也有严重的局限性。例如,如果在<SLR></SLR>之间定义了一个 XML 实体,那么 SLR 代表什么?它可以指单镜头反光相机、自动装弹步枪、服务级报告、系统级需求、斯里兰卡卢比等等。

通过将有组织的(结构化的)数据添加到网站,作为标记注释或专用的外部元数据文件,并将它们链接到其他相关的结构化数据集,可以使内容成为机器可处理的和明确的。除了其他好处之外,结构化数据文件比传统的网站支持更广泛的任务,处理起来也更有效率。结构化数据格式已经在计算中使用了几十年,尤其是在 Access 和 SQL 关系数据库中,在这些数据库中可以执行查询来有效地检索信息。因为有直接将关系数据库映射到核心语义网技术的标准,公开不可用的数据库现在可以在语义网上共享[15]。市场上也有基于语义网标准的商业数据库软件包(5Store、AllegroGraph、BigData、Oracle、OWLIM、Talis Platform、Virtuoso 等)[16]。

与关系数据库相比,web 上的大多数数据存储在(X)HTML 文档中,这些文档包含要在 Web 浏览器中呈现为格式化文本、图像和多媒体对象的非结构化数据。发布非结构化数据对于一般目的来说是令人满意的;然而,存储在传统 web 文档中或与之相关联的大量数据不能以这种方式处理。用来描述人与人之间的社会联系的数据就是一个很好的例子,它应该包括用传统 Web 的超链接无法表达的关系类型和多个关系方向[17]。

语义标注的真正好处是人类可以浏览传统的 web 文档,而语义 Web 爬虫可以处理机器可读的标注来分类数据实体,发现实体之间的逻辑链接,建立索引,以及创建导航和搜索页面。

语义 Web 组件

结构化数据处理依赖于提供知识领域(感兴趣的领域、学科)内的概念、术语和关系的正式描述的技术。知识表示和推理是人工智能(AI)领域,用于以计算机系统可以用来解决复杂任务的机器可读形式表示信息。分类法或受控词汇表是可以用作元数据元素值的术语的结构化集合。例如,事件词汇表可用于以机器可读的格式描述音乐会、讲座和节日,而组织词汇表适用于发布关于学校、公司或俱乐部的机器可读元数据。受控词汇表是映射概念及其关系的概念数据模式(数据模型)的一部分。

最广泛采用的知识管理标准是资源描述框架(RDF)、网络本体语言(OWL)和简单知识组织系统(SKOS)。知识组织系统(KOS)用于处理权威列表、分类、主题词表、主题地图、本体等等。Web 本体是形式化的概念结构,换句话说,是领域中的概念集合以及它们之间的关系的复杂知识表示。命名空间机制用于通过指向一个外部词汇表来揭示标签和属性的含义,该外部词汇表以机器可处理的格式描述规程的概念,扩展了标记语言的词汇表(元素和属性的集合)。例如,智能手机本体以机器可处理的格式定义了智能手机的所有功能以及这些功能之间的关系,以便软件代理可以通过指向本体文件来“理解”用于在网页上注释单词的任何这些功能的含义。Web 本体使得以机器可读的格式描述任何主题的复杂语句成为可能。语义网的架构由“语义网栈”来说明,它显示了标准的层次结构,其中每一层都依赖于下面的层(见图 1-5 )。

A978-1-4842-1049-9_1_Fig5_HTML.gif

图 1-5。

The Semantic Web Stack

虽然前面的数据格式主要是机器可读的,但它们可以从人类可读的网页链接,或者作为语义注释集成到人类可读的网页中,例如微格式、RDFa 或 HTML5 微数据。

本体论

本体论(ontology)一词最初在哲学中被引入,是为了研究存在的本质。在计算机科学中,本体是指通过数据模型来描述我们世界的一部分,如一个组织、一个研究项目、一个历史事件、我们的同事、朋友等。,以机器可读的方式,通过正式定义一组类(概念)、属性(属性)、关系类型和实体(个体、实例)。最先进的本体语言(如 OWL)支持以下组件:

  • 类:抽象的组,对象的集合或集合,对象类型。类通常表示其成员共享公共属性的组或类。类的层次结构表现为较高级别的(超类或父类)和较低级别的(子类或子类)。例如,一个公司可以表示为一个类,其中包含部门和员工等子类。
  • 属性:以对象和类为特征的方面、属性、特征或参数
  • 个体:实例或对象。例如,如果我们的域覆盖公司,每个员工都是一个个体。
  • 关系:类之间、个体之间、个体和类之间、单个对象和集合之间或者集合之间的逻辑联系
  • 功能术语:由某些关系形成的复杂结构,可以用来代替语句中的单个术语
  • 限制:正式定义的有效值的限制或范围
  • 规则:If-then 语句(先行-结果句)定义逻辑推理
  • 公理:逻辑形式的断言,与规则一起,形成了本体描述的整体理论。不同于生成语法或形式逻辑中公理的定义,其中公理仅包括被定义为先验知识的陈述,语义 Web 本体的公理还包括从公理陈述导出的理论。公理用于对类或实例的值施加约束,因此公理一般用基于逻辑的语言来表达。公理适用于验证本体的一致性。
  • 事件:属性或关系更改

本体工程

本体工程是计算机科学的一个领域,它涵盖了构建本体的方法和方法论。语义 Web 本体的目的是实现一个公共的和共享的知识,准备在应用之间传输,提供跨不同领域的组织或同一领域的不同视图的互操作性。本体转换是开发新的本体来处理现有本体的新需求,以达到新的目的。从同一个知识领域的两个或多个本体创建一个新的单个连贯本体被称为本体合并。本体集成是从来自不同知识领域的两个或多个源本体创建一个新的本体。本体映射是定义不同本体中实体之间语义关系的一种形式表达。本体对齐是在两个或更多本体之间创建一致且连贯的链接的过程,其中第一本体的陈述确认第二本体的陈述。

推理

自动发现看似不相关的结构化数据之间的关系被称为推理。自动生成的新关系基于词汇表中定义的结构化数据和附加信息,例如一组规则。新的关系要么显式声明,要么通过查询返回。作为一个例子,如果我们声明“不可饶恕是一部西部片”,而一个本体声明“每部西部片都是一部电影”,语义 Web 代理可以自动推断出声明“不可饶恕是一部电影”,这原本是没有声明的。

语义网特征

语义网有许多与众不同的特点,这些特点在传统网站上很少见到或根本没有使用。例如,大部分数据是以明确声明的开放许可发布的,允许真正免费的数据共享和分发。正式定义的数据连接使自动知识发现成为可能,同时还能进行准确的语句验证。每一个对象和功能都与一个网址相关联,因此您可以引用几乎所有内容,从表格单元格到图像或两个人的友谊。

免费、开放的数据仓库

Open data and content can be freely used, modified and shared by anyone for any purpose.

—OpenDefinition.org

自动化和数据处理依赖于数据访问,因此“开放数据”是语义网的一个基本特征。已经有数百个政府组织、企业和个人将机器可读的结构化数据作为开放数据( https://data.cityofchicago.orghttp://data.alberta.cahttp://data.gov.uk 等)发布。),尽管并不是所有的都明确地提供了一个开放许可,使数据真正“开放”。语义 Web 应用也受益于开放 API、开放协议、开放数据格式和开源软件工具来重用、混合和重新发布数据。在语义 Web 上,世界上的人、产品、服务和对象的机器可读数据是开放的和可访问的,无需注册和支付会员费或订阅费,软件代理可以代表您自动访问这些数据。

适应性信息

在传统的 web 上,每个 Web 文档都是由一个人或一个团队编辑的,而语义 Web 文档是由一群人通过作为“全球数据库”的相关文档来编辑的因此,数据集更准确、更具关联性、更具描述性。信息不仅仅是关于页面,而是关于连接的和可重用的数据。数据的分类、重组和重用是语义网的一个基本概念。

唯一 Web 资源标识符

Web 资源可以通过唯一的 IP 地址来定位。然而,它们很难被记住,而且数量有限。这就是大多数情况下使用域名的原因。图 1-6 显示了一个域名和一个 URL 的关系: www.masteringhtml5css3.com 是节点masteringhtml5css3.com的子域,是com(代表商业)域的子域。RFC 1035 [18]、RFC 1123 [19]和 RFC 2181 [20]定义了域名语法规则。

A978-1-4842-1049-9_1_Fig6_HTML.gif

图 1-6。

The domain within the URL

子域树最多可以包含 127 级。每个标签最多可包含 63 个字符。根据 RFC 2181,域名的全长是 253 个字符。传统域名不能包含基于拉丁字母的带有音调符号的字符、非拉丁字符或文字。随着国际化域名(IDN)的引入,可以用本地字母和文字表示多种语言的名称和单词。

统一资源标识符(URI)是在互联网上标识名称或资源的字符串(RFC 2396 [21])。URIs 可以被分类为统一资源定位符(URLsRFC 1738 [22])、统一资源名称(urn)或两者。URN 定义了资源的身份,而 URL 提供了查找资源的方法(包括协议和路径)。URIs 经常被错误地用作 URL 的同义词,尽管 URI 是一个更广泛的术语(RFC 3305 [23])。URN 和 URL 都是 URI 的子集,但它们通常是不相交的集合。URL 最著名的例子是万维网上的网站地址。清单 1-1 显示了通用的 URL 语法。

Listing 1-1. URL Syntax

protocol://domain:port/path?query_string#fragment_identifier

该协议后跟一个冒号。URL 的其他部分取决于所使用的方案。通常,有一个域名或 IP 地址、一个可选的端口号和一个可选的资源或脚本路径。PHP 或 CGI 脚本之类的程序可能有一个查询字符串。URL 的结尾可以是一个可选的片段标识符,它以数字符号(#)开头,在标记语言中,它指向通过提供的路径可用的文档的一部分。片段标识符在语义网上被广泛用于区分文件和它所代表的实体(例如,一个人和描述他/她的文件或者一本书和描述它的文件)。片段标识符的这种使用提供了无限数量的唯一标识符,而不考虑域名的有限选择。清单 1-2 展示了一个例子,其中http是协议, www.masteringhtml5css3.com 是域,URL 标识一本书而不是存储在metadata目录中的文件webstandardsbook.rdf

Listing 1-2. A Typical URL with Fragment Identifier

http://www.masteringhtml5css3.com/metadata/webstandardsbook.rdf#book

因为许多 URL 组件是可选的,所以它们中的一个或多个通常会被省略。

为了避免注册和更新域名的不便并解决不是每个用户都有他/她自己的域名的问题,可以将网址重定向(通常使用 302 HTTP 重定向)到 web 上的中间和更持久的位置,而不是文件或目录的实际物理位置。这样的 URL 被称为持久统一资源定位器(PURLs)。官方采购在 https://purl.org 登记。许多语义词汇和本体使用 PURLs。本体列在ontology目录下,例如 http://purl.org/ontology/vidont/

摘要

在这一章中,你了解到传统网站的一个主要限制是它们无组织的和孤立的内容,这些内容主要是为了人类的理解而创建的。您已经熟悉了语义 Web 的基本概念、主要应用领域以及结构化数据处理的效率。您知道核心语义 Web 组件,并且理解许多标准依赖于其他技术。您熟悉独特的语义 Web 特性,例如开放许可、带有自动推断语句和知识发现的分散数据存储,以及与所表示的每一点知识相关联的唯一 URI 标识符。

下一章将向你介绍用机器可处理的标准来表示信息的知识表示和推理。

参考

Hausenblas, M., Adida, B., Herman, I. (2008) RDFa—Bridging the Web of Documents and the Web of Data. Joanneum Research, Creative Commons, World Wide Web Consortium. www.w3.org/2008/Talks/1026-ISCW-RDFa/ . Accessed 18 January 2015.   Berners-Lee, T. (2001) Business Model for the Semantic Web. World Wide Web Consortium. www.w3.org/DesignIssues/Business . Accessed 18 January 2015.   Ankolekar, A., Krötzsch, M., Tran, T., Vrandečić, D. The Two Cultures: Mashing Up Web 2.0 and the Semantic Web. Web Semantics: Science, Services and Agents on the World Wide Web 2008, 6(1):70–75.   Shannon, V. (2006) A “more revolutionary” Web. International Herald Tribune. The New York Times Company. www.nytimes.com/2006/05/23/technology/23iht-web.html?scp=1&sq=A+%27more+revolutionary%27+Web&st=nyt. Accessed 18 January 2015.   Spivack, N. (2015) Web 3.0: The Third Generation Web Is Coming. http://lifeboat.com/ex/web.3.0 . Accessed 16 March 2015.   Herman, I. (ed.) (2009) How would you define the main goals of the Semantic Web? In: W3C Semantic Web FAQ. World Wide Web Consortium. www.​w3.​org/​2001/​sw/​SW-FAQ#swgoals. Accessed 18 January 2015.   Sbodio, L. M., Martin, D., Moulin, C. Discovering Semantic Web services using SPARQL and intelligent agents. Web Semantics: Science, Services and Agents on the World Wide Web 2010, 8(4): 310–328.   Herman, I. (2009) W3C Semantic Web Frequently Asked Questions. World Wide Web Consortium. www.w3.org/RDF/FAQ . Accessed 18 January 2015.   Hyvönen, E., Mäkelä, E., Salminen, M., Valo, A., Viljanen, K., Saarela, S., Junnila, M., Kettula, S. MuseumFinland—Finnish museums on the Semantic Web. Web Semantics: Science, Services and Agents on the World Wide Web 2005, 3(2–3): 224–241.   Bojārs, U., Breslin, J. G., Finn, A., Decker, S. Using the Semantic Web for linking and reusing data across Web 2.0 communities. Web Semantics: Science, Services and Agents on the World Wide Web 2008, 6(1): 21–28.   Celma, Ò., Raimond, Y. ZemPod: A Semantic Web approach to podcasting. Web Semantics: Science, Services and Agents on the World Wide Web 2008, 6(2): 162–169.   Saleem, M., Kamdar, M. R., Iqbal, A., Sampath, S., Deus, H. F., Ngomo, A.-C. Big linked cancer data: Integrating linked TCGA and PubMed. Web Semantics: Science, Services and Agents on the World Wide Web 2014, http://dx.doi.org/10.1016/j.websem.2014.07.004.   Oinonen, K. (2005) On the road to business application of Semantic Web technology. Semantic Web in Business—How to proceed. In: Industrial Applications of Semantic Web: Proceedings of the 1st IFIP WG12.5 Working Conference on Industrial Applications of Semantic Web. International Federation for Information Processing. Springer Science+Business Media, Inc., New York.   Murphy, T. (2010) Lin Clark On Why Drupal Matters. Socialmedia. http://socialmedia.net/2010/09/07/lin-clark-on-why-drupal-matters . Accessed 9 September 2010.   Arenas, M., Bertails, A., Prud’hommeaux, E., Sequeda, J. (eds.) (2012) A Direct Mapping of Relational Data to RDF. www.w3.org/TR/rdb-direct-mapping/ . Accessed 18 January 2015.   Clark, K. (2010) The RDF Database Market. Clark & Parsia, LLC. http://weblog.clarkparsia.com/2010/09/23/the-rdf-database-market/ . Accessed 18 January 2015.   Dertouzos, L. M., Berners-Lee, T., Fischetti, M. (1999) Weaving the Web: The Original Design and Ultimate Destiny of the World Wide Web by Its Inventor. Harper San Francisco, San Francisco.   Mockapetris, P. (1987) Domain names—Implementation and specification. RFC 1035. The Internet Engineering Task Force. http://tools.ietf.org/html/rfc1035 . Accessed 18 January 2015.   Braden, R. (ed.) (1989) Requirements for Internet Hosts—Application and Support. RFC 1123. The Internet Engineering Task Force. http://tools.ietf.org/html/rfc1123 . Accessed 18 January 2015.   Elz, R., Bush, R. (1997) Clarifications to the DNS Specification. RFC 2181. The Internet Engineering Task Force. http://tools.ietf.org/html/rfc2181 . Accessed 18 January 2015.   Berners-Lee, T., Fielding, R., Masinter, L. (1998) Uniform Resource Identifiers (URI): Generic Syntax. RFC 2396. The Internet Society. http://tools.ietf.org/html/rfc2396 . Accessed 18 January 2015.   Berners-Lee, T., Masinter, L., McCahill, M. (eds.) (1994) Uniform Resource Locators (URL). RFC 1738. The Internet Engineering Task Force. http://tools.ietf.org/html/rfc1738 . Accessed 18 January 2015.   Mealling, M., Denenberg, R. (eds.) (2002) Uniform Resource Identifiers (URIs), URLs, and Uniform Resource Names (URNs): Clarifications and Recommendations. RFC 3305. The Internet Society. http://tools.ietf.org/html/rfc3305 . Accessed 18 January 2015.   Footnotes 1

流亡者或 XMP。有关更多信息,请参见 Leslie Sikos: Web 标准:掌握 HTML5、CSS3 和 XML(纽约,Apress,2014)。

2

“物”的概念也用在其他上下文中,例如“物联网”(IoT),它是嵌入了电子设备、软件和传感器的物理对象的网络,包括智能对象,例如可穿戴计算机,所有这些都连接到制造商和/或运营商和/或其他设备。

3

这仅在(X)HTML5 中受支持。

二、知识表达

为了提高网站的自动化处理能力,需要正式的知识表示标准,它不仅可以用来注释简单的机器可读数据的标记元素,而且可以用机器可处理的方式表达复杂的语句和关系。在理解了这些语句的结构以及它们在资源描述框架(RDF)中的序列化之后,可以有效地对结构化数据进行建模以及在标记中进行注释,或者将其写入单独的机器可读元数据文件中。用于建模和表示数据的正式定义使得高效的数据分析和重用成为可能。搜索引擎识别和处理的三种最常见的机器可读注释是 RDFa(属性中的 RDF)、HTML5 微数据和 JSON-LD,其中 HTML5 微数据是推荐的格式。机器可读注释通过外部词汇表用附加元素和属性扩展了 core (X)HTML 标记,外部词汇表包含知识表示领域的术语和属性,以及机器可读形式的属性之间的关系。本体可用于搜索、查询、索引和管理代理或服务元数据,并提高应用和数据库的互操作性。本体对于知识密集型应用尤其有用,在这些应用中,文本提取、决策支持或资源规划是常见的任务,在用于知识获取的知识库中也是如此。语义知识库收集定义感兴趣领域的最常见概念、它们之间的关系以及相关个体的模式。这些模式是在 RDFa、HTML5 微数据或 JSON-LD 以及链接的开放数据数据集的 RDF 文件中序列化的机器可读注释所使用的事实上的标准。

词汇和本体

语义网的受控词汇表收集了用于描述感兴趣的领域或关注的领域的概念和术语。本体是更复杂的、非常正式的术语定义、个体及其属性、对象组(类)以及个体之间的关系,适于以机器可读的形式描述与感兴趣的领域相关的几乎任何陈述。

例如,要以机器可读的格式声明一个人,我们需要一个具有“人”的正式定义的词汇表一个直接的选择是朋友的朋友(FOAF)词汇表,它有一个定义一个人的典型属性的Person类,包括但不限于namehomepage。如果我们用 XML 序列化编写这段代码,我们将得到清单 2-1 中的代码。

Listing 2-1. Pseudocode for Defining the Class and a Property of a Resource

<Person>

<name>Leslie Sikos</name>

</Person>

这段代码提供了层次结构,推断出Person是类,name是属性;但是,这是断章取义。我们必须使用名称空间机制来声明哪个外部词汇表定义了这个类和属性。在 RDF/XML 序列化中,这可以使用形式为xmlns:vocabulary_prefix="vocabulary_namespace:web_address"xmlns属性来完成,在我们的例子中是xmlns:foaf=" http://xmlns.com/foaf/0.1/ ",它指向位于 http://xmlns.com/foaf/0.1/ 的 FOAF 名称空间。名称空间机制使得将 http://xmlns.com/foaf/0.1/ 缩写为foaf(也称为前缀),因此foaf:Person指的是 http://xmlns.com/foaf/0.1/Person , foaf:homepagehttp://xmlns.com/foaf/0.1/homepage 等等(参见清单 2-2 )。

Note

这些链接通常是符号链接,并不总是指向每个单独属性的专用网页,有时会转发到名称空间的域。有些词汇表有名称空间地址机制,所有链接都直接指向机器可读词汇表文件的相应部分。并不总是提供外部词汇表属性的可读解释。在 FOAF 的情况下,单个属性地址的网址指向规范的网址( http://xmlns.com/foaf/spec/ ),而单个属性有自己的片段标识符,如Person属性的地址、 http://xmlns.com/foaf/spec/#term_Person

Listing 2-2. Describing the Name of a Person Using a Class and a Property from a Vocabulary

http://xmlns.com/foaf/0.1/

<foaf:Person>

<foaf:name>Leslie Sikos</foaf:name>

</foaf:Person>

结构化数据的格式和序列化独立于词汇表定义,因此,例如,相同的 schema.org 参考可以用于 RDF、RDFa、HTML5 微数据和 JSON-LD。所需的词汇或本体取决于您想要表示的感兴趣的领域;然而,一些知识领域,比如人和书,可以用不止一个词汇表中的类和属性来描述。

schema.org 词汇集

https://schema.org 涵盖了大约 300 个概念定义,是最常用的结构化数据标记模式集合之一。Schema.org 是由谷歌、雅虎推出的,以及 2011 年的必应。Schema.org 包含最常用概念的机器可读定义,使得注释动作、创造性作品、事件、服务、医学概念、组织、人、地点和产品成为可能。

类似于前面的例子,如果我们想要描述一本书,我们需要一个具有“书”的定义和典型的书属性的词汇表。如果我们想给书名添加一个比 schema.org 的name属性更具描述性的属性,我们可以使用 Dublin Core (DC)词汇表中的title属性,产生两个名称空间声明(参见清单 2-3 )。

Listing 2-3. Describing a Book

xmlns:schema="http://schema.org/

xmlns:dc="http://purl.org/dc/terms/

<schema:Book>

<dc:title>Web Standards: Mastering HTML5, CSS3, and XML</dc:title>

</schema:Book>

这里,schema:Book缩写为 http://schema.org/Book ,是Book类的机读定义,而dc:title缩写为 http://purl.org/dc/terms/title ,是title属性的机读定义。

最常见的 schema.org 类型(类)和属性在 http://schema.org/docs/gs.html#schemaorg_types 收集,而属性的完整列表可在 http://schema.org/docs/full.html 获得。

常规、访问和结构化元数据

通用元数据,如摘要、创建者、日期、出版商、标题、网络资源(网站、图像、视频)的语言、物理资源(书籍、光盘)以及艺术品等对象,都可以使用 Dublin Core 进行描述。Dublin Core 元素被广泛部署在机器可读的注释中,用于 DMOZ [1 ],最大的多语言开放内容网页链接目录之一,以及 XMP 的 JPEG 图片元数据中。都柏林核心元素(dc)的命名空间为 http://purl.org/dc/elements/1.1/ ,都柏林核心术语(dcterms)的命名空间为 http://purl.org/dc/terms/

可以使用互连数据集词汇表(VoID)中的术语来描述结构化数据集。VoID 涵盖了常规、访问和结构化元数据定义,以及结构化数据集之间的链接描述。VoID 的前缀是void,命名空间是http://rdfs.org/ns/void#

人物词汇

一个人的特征和人与人之间的关系可以用各种受控词汇来描述,如表 2-1 中所总结的。

表 2-1。

Person Vocabularies

| 词汇 | 缩写 | 命名空间 | 典型用途 | | --- | --- | --- | --- | | `Person`来自 schema.org 的班级 | `schema:Person` | [`http://schema.org/Person`](http://schema.org/Person) | 名、姓、性别、隶属关系、奖项、国籍、尊称前缀或后缀、职称等。 | | 朋友的朋友 | `foaf` | [`http://xmlns.com/foaf/0.1/`](http://xmlns.com/foaf/0.1/) | 人员、姓名、性别、主页 | | 联系:日常生活的实用概念 | `contact` | [`http://www.w3.org/2000/10/swap/pim/contact`](http://www.w3.org/2000/10/swap/pim/contact) | 联系地点、个人头衔、母语、离你住所最近的机场 | | 联系人 | `vcard` | `http://www.w3.org/2001/vcard-rdf/3.0#` | 电子名片 | | 个人简历 | `bio` | [`http://vocab.org/bio/0.1/`](http://vocab.org/bio/0.1/) | 履历信息 | | 关系词汇 | `relationship` | [`http://vocab.org/relationship/`](http://vocab.org/relationship/) | 人与人之间的关系(`friendOf`、`parentOf`、`spouseOf`等)。) |

书籍词汇

可以使用 http://schema.org/Book 中的属性精确描述图书,定义图书格式、页数、版权所有者、流派以及图书的其他特性。都柏林核心通常用于声明图书的通用元数据。图书的国际标准书号(ISBN)不仅可以用 schema.org 的Book类的isbn属性(定义在 http://schema.org/isbn )来声明,还可以使用 URN 词汇表中的isbn属性来声明。你想读的书,你已经读过的书,或者你最喜欢的书都可以通过 http://www.ldodds.com/schemas/book/ 名称空间使用阅读列表模式来描述。

棱镜:出版词汇

行业标准元数据发布要求(PRISM)描述了印刷、在线、移动和多媒体内容的许多组成部分,包括以下内容:

  • 创作者、贡献者、版权所有者
  • 地点、组织、主题、人物、事件、复制条件
  • 出版日期,包括封面日期、张贴日期、卷数、数量
  • 重新发布和重新使用的限制

PRISM 通常用于描述合作伙伴联合、内容聚合、内容再利用、资源发现、多渠道分发、内容归档、捕获权限使用信息、RSS、XMP 和网站的机器可读注释。PRISM 名称空间对于 PRISM 2.1 Basic 为 http://prismstandard.org/namespaces/basic/2.1/ (典型前缀:prism),对于 PRISM 3.0 为 http://prismstandard.org/namespaces/prism-ad/3.0/ (常用前缀:prism-ad)。

GoodRelations:一个电子商务本体

电子商务事实上的本体是 GoodRelations ( gr),适用于描述企业、产品、价格、功能、支付选项、营业时间等等。GoodRelations 的命名空间是http://purl.org/goodrelations/v1#。GoodRelations 被广泛部署,也被 Yahoo!还有百思买。

出版本体论

虽然出版物的通用元数据可以在 Dublin Core 中表达,但也有专门为描述出版物和引文而编写的本体。表 2-2 总结了四种部署最广泛的出版本体(法比奥、普罗、PSO 和 PWO)和四种引用本体(CiTO、BiRO、C4O 和 DoCO),它们被称为语义出版和引用本体(SPAR),以及书目本体(bibo)。

表 2-2。

Publication and Referencing Ontologies

| 本体论 | 缩写 | 命名空间 | 典型用途 | | --- | --- | --- | --- | | 书目本体论 | `bibo` | [`http://purl.org/ontology/bibo/`](http://purl.org/ontology/bibo/) | 引用,文献分类,描述文献,发行人,编辑,采访者,执行者,ISBN 等。 | | 书目参考本体 | `biro` | [`http://purl.org/spar/biro/`](http://purl.org/spar/biro/) | 书目记录、参考文献、收藏和列表 | | 引用计数和上下文表征本体 | `c40` | [`http://purl.org/spar/c4o/`](http://purl.org/spar/c4o/) | 引用数量、引用上下文 | | 引文类型本体论 | `cito` | [`http://purl.org/spar/cito/`](http://purl.org/spar/cito/) | 引用的事实和修辞类型和性质(例如,共同的作者,一个出版物证实了另一个的结论) | | 文档组件本体 | `doco` | [`http://purl.org/spar/doco/`](http://purl.org/spar/doco/) | 章、节、段、表、前言、词汇表等。 | | FRBR 对齐的书目本体 | `fabio` | [`http://purl.org/spar/fabio/`](http://purl.org/spar/fabio/) | 摘要、文章、艺术作品、论文、博客帖子、会议记录 | | 发布角色本体 | `pro` | [`http://purl.org/spar/pro`](http://purl.org/spar/pro) | 代理的角色(例如,作者、编辑、审阅者、出版商) | | 发布状态本体 | `pso` | [`http://purl.org/spar/pso`](http://purl.org/spar/pso) | 出版状态(例如,提交的手稿,接受的手稿,证明) | | 发布工作流本体 | `pwo` | [`http://purl.org/spar/pwo`](http://purl.org/spar/pwo) | 发布工作流程的阶段(例如,审核中) |

DOAP:项目管理词汇

项目描述(DOAP)是描述软件项目的词汇,尤其是开源项目及其相关资源,包括参与者和 web 资源。DOAP 的命名空间是 http://usefulinc.com/doap/

许可词汇表

使用知识共享(cc)许可证可以很好地描述许可,例如版权信息、关于创造性作品的复制、分发和共享的许可和禁止,以及创作衍生作品。知识共享的命名空间是http://creativecommons.org/ns#

媒体本体论

有专门用于媒体资源的本体,如音乐和视频文件,如表 2-3 所示。

表 2-3。

Media Ontologies

| 本体论 | 缩写 | 命名空间 | 典型用途 | | --- | --- | --- | --- | | 音乐本体论 | `mo` | [`http://purl.org/ontology/mo/`](http://purl.org/ontology/mo/) | 艺术家、作曲家、指挥、唱片、imdb、唱片、混音师、歌手、节奏等。 | | 视频本体 | `vidont` | [`http://vidont.org/`](http://vidont.org/) | 电影属性(翻拍、续集、旁白等。)、视频文件属性(纵横比、音频编解码器、信箱模式、视频比特率、MAR 等。) |

在线社区词汇

在线社区的帖子、用户角色、线程、用户账户和用户组可以使用语义互连的在线社区(SIOC)来描述。SIOC 核心的命名空间是http://rdfs.org/sioc/ns#

脸书使用脸书 OpenGraph ( og)的词汇让网页拥有和脸书上任何其他对象一样的功能。OpenGraph 的命名空间是http://ogp.me/ns#

知识管理标准

最常用的知识管理标准是资源描述框架(RDF)、网络本体语言(OWL)和简单知识组织系统(SKOS)。

资源描述框架(RDF)

在语义网上,结构化数据集通常在资源描述框架(RDF)中表达,或者基于 RDF[2]。RDF 可以用来创建任何类型的 web 资源的机器可解释的描述,因为 RDF 文件可以用任意数量的外部词汇来扩展。事实上,RDF 和其他核心语义网标准,如 RDFS 和 OWL,都有它们自己的词汇表,这些词汇表通常相互结合,并使用其他词汇表进行扩展,以描述对象及其属性。然而,请记住,RDF 不仅仅是一个词汇表,因为它是一种功能齐全的语义数据建模语言。RDF 的名称空间是http://www.w3.org/1999/02/22-rdf-syntax-ns#

A978-1-4842-1049-9_2_Fig2a_HTML.jpg

RDF 词汇表定义了 XML 文字值(rdf:XMLLiteral)、属性(rdf:Property)、RDF 语句(rdf:Statement)、RDF 列表(rdf:List),以及替代容器(rdf:Alt)、无序容器(rdf:Bag)和有序容器(rdf:Seq)的类。rdf:List的一个实例是rdf:nil,代表空列表。RDF 词汇表还定义了一些属性,如rdf:type(rdf:Property的一个实例,用于表示资源是一个类的实例)、rdf:first(主题 RDF 列表中的第一项)、rdf:rest(主题 RDF 列表中在rdf:first之后的其余部分)、rdf:value(结构化值)、rdf:subject(RDF 语句的主题)、rdf:predicate(RDF 语句的谓词)和rdf:object(RDF 语句的对象)。

RDF 数据模型基于描述和表征资源(尤其是 web 资源)的语句,以称为 RDF 三元组或 RDF 语句的主-谓-对象(资源-属性-值)表达式的形式。谓语(性质)描述主语和宾语之间的关系。比如自然语言句子“Leslie 的主页是 http://www.lesliesikos.com ”可以表达为表 2-4 所示。三元组的所有元素都是由唯一的 URI 定义的资源(参见清单 2-4 )。

表 2-4。

An RDF Triple

|   | RDF 数据模型 | RDF 三元组 | | --- | --- | --- | | 科目 | 莱斯利 | [`http://www.lesliesikos.com/metadata/sikos.rdf#lesliesikos`](http://www.lesliesikos.com/metadata/sikos.rdf#lesliesikos) | | 述语 | “主页”的机器可读定义来自朋友的朋友(FOAF)外部词汇表 | [`http://xmlns.com/foaf/0.1/homepage`](http://xmlns.com/foaf/0.1/homepage) | | 目标 | [`http://www.lesliesikos.com`](http://www.lesliesikos.com/) | [`http://www.lesliesikos.com`](http://www.lesliesikos.com/) |

Listing 2-4. Describing a Person in RDF/XML

<?xml version="1.0" encoding="UTF-8"?>

<rdf:RDF xmlns:rdf="``http://www.w3.org/1999/02/22-rdf-syntax-ns#``"

xmlns:foaf="http://xmlns.com/foaf/0.1/

<foaf:Person rdf:about="http://www.lesliesikos.com/metadata/sikos.rdf#lesliesikos

<foaf:homepage rdf:resource="http://www.lesliesikos.com

<foaf:family_name>Sikos</foaf:family_name>

<foaf:givenname>Leslie</foaf:givenname>

</foaf:Person>

</rdf:RDF>

RDF 的about属性声明 RDF 语句的主题,在本例中是 http://www.lesliesikos.com/metadata/sikos.rdf#lesliesikos 。片段标识符#lesliesikos用于识别真实的人而不是文档(sikos.rdf)。那些值是网址的对象,比如一个人的主页,是使用 RDF 的resource属性声明的,与那些字符串文字(字符序列)相反,比如Sikos(FOAF 词汇表中family_name属性的值)。这个例子的语法被称为 RDF/XML 序列化(RDF/XML),它是 RDF [3 ]的标准语法,使用application/rdf+xml互联网媒体类型和.rdf.xml文件扩展名。结构化数据集可以使用各种其他语法符号和数据序列化格式以 RDF 编写,例如,RDFa、JSON-LD、Notation3 (N3)、Turtle、N-Triples [4 ]、TRiG [5 ]和 TRiX [6 ],因此 RDF 三元组的语法因格式而异。例如,N3 语法没有 RDF/XML 序列化那么冗长,其中名称空间前缀由@prefix指令声明,URIs 由小于(<)和大于(>)符号分隔,三元组由分号(;)分隔(参见清单 2-5 )。

Listing 2-5. Describing a Person in N3

@prefix :     <``http://www.lesliesikos.com/metadata/sikos.rdf#

@prefix foaf: <http://xmlns.com/foaf/0.1/

@prefix rdf:  <``http://www.w3.org/1999/02/22-rdf-syntax-ns#

:lesliesikos a foaf:Person ;

foaf:givenname "Leslie" ;

foaf:family_name "Sikos" ;

foaf:homepage <http://www.lesliesikos.com

速记符号可以用于最常见的谓词(见表 2-5 )。

表 2-5。

Shorthand Notation for Common Predicates

| 述语 | 简化符号 | | --- | --- | | <[`http://www.w3.org/1999/02/22-rdf-syntax-ns#type`](http://www.w3.org/1999/02/22-rdf-syntax-ns#type) | `a` | | <[`http://www.w3.org/2002/07/owl#sameAs`](http://www.w3.org/2002/07/owl#sameAs) | `=` | | <[`http://www.w3.org/2000/10/swap/log#implies`](http://www.w3.org/2000/10/swap/log#implies) | `=>`或`<=` |

这就是使用a声明人的 RDF 类型的原因。如果符号 3 代码在外部文件中,典型的文件扩展名是.n3。N3 的 MIME 类型和字符编码应该声明为text/n3; charset=utf-8。N3 语法中没有规定标记化和空白处理。用于解析相对 URIs 的基本 URIs 可以用@base指令设置,格式为@base < http://example.com/overview/ >。字符串转义的几个 N3 规则来源于 Python,分别是stringliteralstringprefixshortstringshortstringitemlongstringlongstringitemshortstringcharlongstringchar。此外,还可以应用在另一个 RDF 序列化(N-Triples)中使用的\U扩展。合法的转义序列有\newline\\(反斜杠、\)、\’(单引号、)、\"(双引号、")、\n (ASCII 换行,LF)、\r (ASCII 回车,CR)、\t (ASCII 水平制表符,Tab)、\uhhhh(BMP 中的 Unicode 字符)和\U00hhhhhh(平面 1-16 符号中的 Unicode 字符)。不能使用转义符\a\b\f\v,因为 RDF 中不允许使用相应的字符。

N3 的一个子集是简洁的 RDF Triple 语言,通常被称为 Turtle。Turtle 提供了一种语法,以紧凑的文本形式描述 RDF 图,这种形式很容易开发。它是符号 3 (N3)的子集和 N-三元组的超集。Turtle 在语义 Web 开发人员中很流行,被认为是 RDF/XML 的易于阅读的替代品。海龟文件的典型文件扩展名是.ttl。海龟文件的字符编码应该是 UTF-8。乌龟的 MIME 类型是text/turtle。Turtle 得到了许多软件框架的支持,这些框架可以用来查询和分析 RDF 数据,比如 Jena、Redland 和 Sesame。Turtle 文件由一系列指令、代表三元组的语句和空行组成。在 Turtle 中,三元组可以写成一系列主-谓-宾术语,由空格分隔,以句号(。).URIs 用尖括号(<>)写,字符串文字用双引号("")分隔,如<``http://www.lesliesikos.com/metadata/sikos.rdf#``> <http://xmlns.com/foaf/0.1/homepage> <http://www.lesliesikos.com>。使用 URI 前缀声明@PREFIX foaf: < http://xmlns.com/foaf/0.1/ > .,这可以缩写为<``http://www.lesliesikos.com/metadata/sikos.rdf#``> foaf:homepage <http://www.lesliesikos.com> .,其中foaf:homepage声明了 http://xmlns.com/foaf/0.1/homepage的串联,露出了原来的 URI http://xmlns.com/foaf/0.1/homepage

图 2-1 将清单 2-5 的三元组表示为 RDF 图,这是一个有向的、带标签的图,其中的节点是资源和值 [7 ]。RDF 图的节点和谓词弧对应于节点元素和属性元素。默认的节点元素是rdf:Description,它经常被用作 RDF/XML 中 RDF 语句的通用容器。为了给 RDF 语句添加上下文并使它们具有全局可解释性,RDF 三元组有时与图的名称存储在一起,称为 quads(主谓宾图名),这将在后面的章节中演示。

A978-1-4842-1049-9_2_Fig1_HTML.gif

图 2-1。

A simple RDF graph

该示例可以用其他外部词汇表的属性进行扩展,但概念保持不变。一旦创建了 RDF 文件,就有了一个可以上传到网站的机器可读的元数据文件。语义软件代理可以找到并检索这些文件中的信息(见图 2-2 ),以视觉上吸引人的方式显示人类可读的部分(见图 2-3 ),并基于 RDF 三元组生成可扩展的图(见图 2-4 ),并推断新的信息。

A978-1-4842-1049-9_2_Fig4_HTML.jpg

图 2-4。

A graph generated from an RDF file

A978-1-4842-1049-9_2_Fig3_HTML.jpg

图 2-3。

A personal description extracted from RDF and displayed on a web page

A978-1-4842-1049-9_2_Fig2_HTML.jpg

图 2-2。

RDF triples extracted by Sindice Web Data Inspector [8]

虽然这种机器可读的 RDF 文件很有用,但它们的主要应用是数据建模,所以 RDF 文件与 web 站点的标记是分开的。通过使用机器可读的注释,您可以将结构化数据直接添加到标记中,例如(X)HTML5,这些注释可以由语义数据提取器处理,如果需要,还可以转换为 RDF。

机器可读注释

网站有四种机器可读的注释格式(按介绍顺序排列):

  • 微格式,它通过核心(X)HTML 属性发布关于基本概念的结构化数据,1,例如人物、地点、事件、食谱和音频
  • RDFa,用不属于核心(X)HTML 词汇表的标记属性来表达 RDF
  • HTML5 微数据,用结构化元数据扩展 HTML5 标记(一个 HTML5 应用编程接口)
  • JSON-LD,它将结构化数据作为 JavaScript 代码添加到标记中

RDFa 和 JSON-LD 可以在大多数标记语言版本和变体中使用,而 HTML5 微数据只能在(X)HTML5 中使用。所有这些注释格式都有自己的语法。例如,词汇表在 RDFa 中用vocab属性声明,在 Microdata 中用itemtype属性声明,在 JSON-LD 中用context声明(见表 2-6 )。

表 2-6。

Data Represented as Structured Data in a Microformat, Microdata, RDFa, and JSON-LD

| 没有语义注释的标记 | `Leslie Sikos``Leslie Sikos``Leslie’s web site:````…````Leslie Sikos````Leslie’s web site: lesliesikos.com``` | | 用 HTML5 微数据标记 | ```Leslie Sikos``Leslie Sikos``Leslie’s web site:``lesliesikos.com``` | | 用 RDFa 标记 | ```Leslie Sikos``Leslie Sikos``Leslie’s web site:``lesliesikos.com``` | | 用 JSON-LD 标记 | `` |

这些语法将在下一节中描述。

微格式

第一种向(X)HTML 标记添加机器可读注释的方法被称为微格式(μF)。一些微格式应用并重用现有技术的特性,比如(X)HTML 的rel属性,而其他微格式,比如 hCard,以最简单的方式扩展了核心标记词汇表:基于普通的旧语义 HTML (POSH)。微格式不仅可以在(X)HTML 标记中实现,还可以在 XML、RSS、Atom 等中实现。微格式可以用classrelrev属性值表达站点结构、链接权重、内容类型和人际关系。它们非常容易编写,并且有大量的软件支持它们(Operator 和 Tails 为 Firefox 导出插件,Michromeformats Google Chrome 扩展,microformats transformer Optimus,或者为 Safari、Firefox 和 IE 导出 Microformats Bookmarklet)。

然而,由于局限性和开放性问题,其他机器可读的注释格式逐渐取代了微格式。不能将各种微格式作为多个值应用于同一个a元素,比如rel="nofollow"rel="friend"。HTML5 不支持投票链接微格式使用的rev属性。由profile属性提供的配置文件 URIs 不能在 HTML5 中的head元素上使用,其中profile属性值可以为锚(a)或链接元素(link)上的rel属性声明。例如,为 hCalender 微格式提供了一个包含所有三个选项的配置文件 URI。hCalendar 微格式基于 iCalendar 标准(RFC 2445)。所有使用 hCalendar 符号的内容都应该引用 hCalendar XMDP 配置文件,换句话说, http://microformats.org/profile/hcalendar ,如清单 2-6 或清单 2-7 所示,作为文档头或清单 2-8 的一部分。这些方法也可以结合使用。

Listing 2-6. Providing the hCalendar Head Profile in the Document Head (Cannot Be Used in HTML5)

<head profile="http://microformats.org/profile/hcalendar

Listing 2-7. Linking to the hCalendar Profile in the Document Head

<link rel="profile" href="http://microformats.org/profile/hcalendar

Listing 2-8. Using the hCalendar Profile in the Document Body

<a rel="profile" href="http://microformats.org/profile/hcalendar

Note

HTML5 引入的新结构元素,比如articlesection,并不能被所有的微格式解析器识别,所以这些元素的前面的属性可能不会被处理。

在接下来的部分中,我将向您概述一些最流行的微格式,即 hCalendar、hCard、rel="license"rel="nofollow"rel="tag"、投票链接和 XFN。

hCalendar 和 h 事件

您可以使用 hCalendar 微格式为体育赛事、周年纪念、提醒、会议、研讨会、会议和其他事件创建日历条目。

hCalendar 的根类名是vcalendar。事件的根类名是vevent,这是所有事件列表所必需的。这些属性由 hCalendar 的元素表示。要求的类是dtstart,应该以 ISO 日期格式提供,?? 2和summary。清单 2-9 显示了一个 hCalendar 示例。

Listing 2-9. A Three-Day Conference Represented in hCalendar

<link rel="profile" href="http://microformats.org/profile/hcalendar

<div class="vevent">

<h1 class="summary">Semantic Web Conference 2015</h1>

<div class="description">Semantic Web Conference 2015 was announced yesterday.</div>

<div>Posted on: <abbr class="dtstamp" title="20150825T080000Z">Aug 25, 2015</abbr></div>

<div class="uid">uid1@host.com</div>

<div>Organized by: <a class="organizer" href="mailto:js@expl.com">js@expl.com</a></div>

<div>Dates: <abbr class="dtstart" title="20151012T093000Z">October 12 2015, 9.30am A978-1-4842-1049-9_2_Fig2ab_HTML.jpg

UTC</abbr> – <abbr class="dtend" title="20151014T200000Z">October 14 2015, 8.00pm A978-1-4842-1049-9_2_Fig2ac_HTML.jpg

UTC</abbr></div>

<div>Status: <span class="status">Confirmed</span></div>

<div>Filed under:</div>

<ul>

<li class="category">Conference</li>

</ul>

</div>

可选属性包括但不限于:locationurldtend(ISO 日期格式)、duration(ISO 日期持续时间格式)、rdaterrulecategorydescriptionuidgeoattendeecontactorganizerattachstatusgeo属性有子属性latitudelongitude,而attendee有子属性partstatrole。那些必须定期发布新事件的人可能会发现 hCalendar 生成器 hCalendar-o-matic 很有用 [9 ]。

该规范已被 h-event 规范所取代,它支持带有类h-event的标记元素中的以下属性:p-name(事件名称或标题)、p-summary(简短摘要)、dt-start(事件开始的日期和时间)、dt-end(事件结束的日期和时间)、dt-duration(事件持续时间)、p-description(详细描述)、u-url(网站)、p-category(事件类别)和p-location(事件位置,可以包括 h-card、h-adr 或 h-geo)。所有属性都是可选的。清单 2-10 中显示了一个示例。

Listing 2-10. A Three-Day Conference Annotated Using h-event

<div class="h-event">

<h1 class="p-name"> Semantic Web Conference ’15</h1>

<p>From

<time class="dt-start" datetime="2015-10-12 09:30">12<sup>th</sup> October 2015, 9:30am</time>

to <time class="dt-end" datetime="2015-10-14 20:00">14<sup>th</sup> October 2015, 8:00pm</time>

at <span class="p-location">Nice Conference Hall</span></p>

<p class="p-summary">Semantic Web Conference 2015 was announced yesterday.</p>

</div>

骏网一卡通

hCard 微格式标准可用于通过语义标记来表示个人、公司和组织的联系数据。hCard 元数据应该在网站的联系页面上提供。据现已停产的雅虎称,2010 年夏天,hCard 突破了 20 亿大关。SearchMonkey 使 hCard 成为 2010 年前个人和组织最流行的元数据格式。由于 hCard 基于 vCard 标准(RFC 2426),因此现有的 vCard 可以轻松转换为 hCard。 3

Tip

vCard 标准广泛用于存储电子名片。例如,Microsoft Outlook 将这种格式用于“联系人”下的名片。此外,许多智能手机使用 vCard 格式将联系人存储在手机存储器中(当您设置联系人不存储在 SIM 卡上时)。

hCard 类名应该是小写的。

Caution

hCard 的根类名是vcard。具有类名vcard的元素本身被称为 hCard。

hCard 中的两个必需属性是fnn。然而,如果任何隐含的“N”优化规则有效,则第二个是可选的。 4 属性n可能有子属性family-namegiven-nameadditional-namehonorific-prefixhonorific-suffix。所有其他属性都是可选的,包括adragentbdaycategoryclassemailgeokeylabellogomailernicknamenoteorgphotorevrolesort-stringsoundteltitletzuidurl对于adr,允许的子属性有post-office-boxextended-addressstreet-addresslocalityregionpostal-codecountry-nametypevaluetypevalueemaillatitudelongitudegeoorganization-nameorganization-unitorg;以及teltypevalue。典型的 hCard 代码如清单 2-11 所示。

Listing 2-11. A Typical hCard

<link rel="profile" href="http://microformats.org/profile/hcard

<div id="hcard-John-Smith" class="vcard">

<img src="http://www.example.com/jsmith.jpg

<a class="url fn" href="http://www.example.com

<div class="org">Smith and Sons</div>

<a class="email" href="mailto:smith@example.com">smith@example.com</a>

<div class="adr">

<div class="street-address">123 Nice Street</div>

<span class="locality">Adelaide</span>,

<span class="region">SA</span>,

<span class="postal-code">5000</span>

<span class="country-name">Australia</span>

</div>

<div class="tel">+61812345678</div>

</div>

以下 hCard 元素是单数,只能提供一次:fnnbdaytzsort-stringuidclassrev。所有其他属性都允许有多个实例。通常,标记元素的 visible 属性值表示 hCard 属性的值。然而,也有一些例外。对于由一个或多个 hCard 属性的a元素表示的超链接,href属性为所有具有 URL 值的属性提供属性值(例如,photo)。如果使用了img元素,src属性保存所有带有 URL 值的属性的属性值。对于object元素,数据属性提供属性值。元素的内容是所有其他属性的属性值。如果为带有 hCard 符号的abbr元素提供了title属性,则其值将被视为 hCard 属性,而不是其他情况下使用的元素内容。

虽然手动创建 hCard 元数据很容易,但是 hCard 元数据可以由 hCard 创建者 hCard-o-matic 在规范作者的网站上生成 [10 ]。你只需简单地填写一张关于姓名、组织、国家、电子邮件和其他联系信息的表格,软件就会生成 hCard。

为了提供额外的信息,微格式也可以嵌套。例如,一个体育赛事评论可能不仅包含评论(在 hReview 中标注),同时还包含个人信息(在 hCard 中)(参见清单 2-12 )。

Listing 2-12. A Combination of hReview and hCard

<link rel="profile" href="http://microformats.org/profile/hreview

<link rel="profile" href="http://microformats.org/profile/hcard

<div class="hreview">

<h1 class="summary">The Winner Takes It All Review</h1>

<span class="reviewer vcard">

by <span class="fn">John Smith</span>, <span class="title">Editor</span> A978-1-4842-1049-9_2_Fig2ad_HTML.jpg

at <span class="org">Sport Reviews</span>

</span>

Rating: <span class="rating">4.5</span> out of 5.

<span class="description">A fascinating performance.</span>

</div>

审查由 hReview 微格式(class="hreview")描述。审核人姓名由span class="reviewer"透露。hCard 微格式嵌套在 hReview 微格式中,以便提供关于他/她的附加信息(在<span class="reviewer vcard">中是一个以空格分隔的属性值列表)。hCard 属性描述了审阅者的姓名(fn)、职位(title)和组织(org)。

rel= "许可证"

有数以百万计的网络资源保留部分或全部权利。许多与文档和对象相关联的许可证是复杂的,用户不可能知道它们。可以将rel="license"微格式添加到指向许可证描述的超链接中。这对于图像尤其有用,但也可以用于任何资源。基本的图像嵌入只应用于img元素的srcalt属性,如清单 2-13 所示。

Listing 2-13. A Basic Image Embedding

<img src="hotel.jpg" alt="The Palace Hotel" />

要声明图像许可,还应该使用relhref属性。例如,在知识共享署名-类似共享许可的情况下,它应该是清单 2-14 所示的形式。

Listing 2-14. Declaring an Image License

<link rel="profile" href="http://microformats.org/profile/rel-license

<img src="hotel.jpg" alt="The Palace Hotel"``rel="license"

ref=" http://creativecommons.org/licenses/by-sa/4.0/ "

href属性的值提供了描述许可证的资源的相关 URI。一些最常用的许可证契约如下 [11 :

  • 知识共享署名(cc by) http://creativecommons.org/licenses/by/4.0/
  • 知识共享署名分享(cc by-sa) http://creativecommons.org/licenses/by-sa/4.0/
  • 知识共享署名无衍生品(cc by-nd) http://creativecommons.org/licenses/by-nd/4.0/
  • 知识共享署名非商业性(cc by-nc) http://creativecommons.org/licenses/by-nc/4.0/
  • 知识共享署名非商业共享(cc by-nc-sa) http://creativecommons.org/licenses/by-nc-sa/4.0/
  • 知识共享署名非商业无衍生品(cc by-nc-nd) http://creativecommons.org/licenses/by-nc-nd/4.0/

您应该选择一个与您允许他人对您的作品所做的事情相匹配的许可证(商业或非商业分发、重新混合、调整、适当授权共享、修改等等)。

rel="nofollow "

属性的一个值值得进一步关注,因为它经常在搜索引擎优化(SEO)中使用。当rel="nofollow"被添加到一个超链接时,链接目的地不应该被搜索引擎考虑为附加排名。如果文档所有者需要超链接,可以应用该属性值,而不会影响他们的网页或外部网站链接的排名。例如,如果一个超链接在网页上是至关重要的,但是它的目标页面却有很低的页面排名(PR),那么这个超链接应该被提供rel="nofollow",以避免搜索引擎的惩罚。

Note

PageRank 是一种链接分析算法,用于为每个网页分配一个数字权重,以便在 0-10 的范围内表示其相对重要性。

例如,如果lowprsite.com的索引页面的 PR 值很低,但是由于那里显示的内容,您必须链接到它,那么您可以使用rel="nofollow"微格式,如清单 2-15 所示。

Listing 2-15. A Link That Will Not Be Considered by Search Engines While Indexing a Page

<link rel="profile" href="http://microformats.org/profile/rel-nofollow

<a href="http://www.lowprsite.com

尽管这种微格式被广泛使用,但它还有几个未解决的问题。rel="nofollow"微格式表示一种行为而不是一种关系,所以这个定义是不合逻辑的。微格式的名称不能反映真实的含义,它不是一个名词。虽然最初引入rel="nofollow"是为了阻止博客中的垃圾评论,但单独使用它并不能阻止垃圾评论试图向页面添加营销(只能阻止目标页面通过提高页面排名获益)。最后,许多合法的非垃圾链接作为rel="nofollow"的属性值可能会被搜索引擎忽略或降低权重,这是一个不良的副作用。

rel= "拿"

与其他微格式和一般的meta关键字不同,rel="tag"微格式可以用于可见链接。它可以应用于超链接元素,以指示链接的目的地是当前页面的一般作者指定的标签(关键字)。清单 2-16 给出了一个例子。

Listing 2-16. Using rel="tag"

<link rel="profile" href="http://microformats.org/profile/rel-tag

<a href="http://www.lesliesikos.com/category/textbooks/

投票链接

投票链接是一种基本的微格式,在a元素的rev属性上有三个可能的值:vote-forvote-againstvote-abstain。这些值是互斥的。可选地,可视翻转可以由title属性提供。清单 2-17 显示了一个例子。

Listing 2-17. A Vote Links Example

<link rel="profile" href="http://microformats.org/profile/vote-links

<a rev="vote-for" href="http://example.com/thumbsup/"

title="HTML should be the primary markup language">HTML5</a>

<a rev="vote-against" href="http://example.com/thumbsdown/"

title="XHTML should be the primary markup language">XHTML5</a>

襄樊

第一个 HTML 微格式 XHTML 朋友网络(XFN)于 2003 年 12 月推出。XFN 是由全球多媒体协议组设计的,用简单的超链接来表达人际关系。XFN 对于小册子风格的主页和博客条目特别有用。应该提供人名作为超链接的文本(在<a></a>之间)。个人网站是超链接的目标,换句话说,是href属性的值。所有关系数据都可以由a元素上的rel属性提供。允许多个值,并用空格分隔。友谊类型可以是contactacquaintancefriend。如果是个人认识的人,可以用rel属性的met属性值来表示。例如,莱斯利·西科斯的一个朋友,他个人认识他,可以在他的网站上发布 XFN 的关系,如清单 2-18 所示。

Listing 2-18. Link to the Web Site of a Friend

<link rel="profile" href="http://gmpg.org/xfn/11

I am an old friend of <a href="http://lesliesikos.com"``>Leslie Sikos</a>.

该人的住所与其朋友的住所之间的距离可以用co-residentneighbor值来表示。亲属可以设置为childparentsiblingspousekin。也支持职业关系co-workercolleague。感情也可以表达(musecrushdatesweetheart)。

CSS 样式也可以添加到 XFN 元数据中。例如,可以用粗体提供朋友,用斜体提供同事,CSS 规则如清单 2-19 所示。

Listing 2-19. Styling XFN

a[rel∼="friend"] {

font-weight: bold;

}

a[rel∼="colleague "] {

font-style: italic;

}

虽然从零开始创造 XFN 很容易,但 XFN 的创造者,如 XFN 创造者[12 或艾克西芬[13 可能会加快发展。

XMDP

XHTML 元数据配置文件(XMDP)元数据是一种基于 XHTML 的格式,用于定义机器可读和人类可读的元数据配置文件。XMDP 由属性定义列表、可选描述以及一个或多个定义列表项(如果适用)组成。配置文件定义列表由class标识(参见列表 2-20 )。

Listing 2-20. XMDP Profile Definition

<dl class="profile">

定义术语由id标识(见清单 2-21 )。

Listing 2-21. Definition Term and Data for XMDP

<dt id="property1">property1</dt>

<dd>propertydesc</dd>

例如,信息性使用的meta属性authorkeywords可以由 XMDP 定义,如清单 2-22 所示。

Listing 2-22. A Complete XMDP Example

<dl class="profile">

<dt id="author">author</dt>

<dd>A person who wrote (at least part of) the document.</dd>

<dt id="keywords">keywords</dt>

<dd>A comma and/or space separated list of the keywords or keyphrases of the document.</dd>

</dl>

草稿和未来的微格式

您可以应用微格式在各种资源上提供特定的元数据。地址信息可以用adr来描述。地理坐标(经纬度对)可以根据世界大地测量系统(WGS)以geo微格式提供。hAtom 可以用于网络联合。关于音频记录的信息可以通过使用 hAudio 微格式来嵌入。hListing 微格式可以应用于开放的分布式列表。图像、视频和音频媒体组件可以由 hMedia 描述。hNews 是在网站上提供新闻内容的微格式。产品描述可以用 hProduct 来表达。烹饪和烘焙食谱可以在网上用 hRecipe 描述。简历和履历可以和 hResume 一起发布。文档评论可以在 hReview 中编写。rel="directory"微数据可以指示链接目的地是指向当前页面的目录列表。提供下载的文件附件可以用rel="enclosure"微格式表示。rel="home"提供一个到网站主页的超链接。rel="payment"微格式是一种在线支付机制。robots meta标签的返工是机器人排除配置文件。微格式(代表 xFolksomony)是为出版书签集而设计的。不胜枚举,微格式社区欢迎元数据爱好者创建新的微格式;然而,其他格式,如 RDFa 和 HTML5 微数据,似乎取代了微格式。

网页摘要和结构化标记

RDFa(属性中的 RDF)使得在(X)HTML 标记、XML 或 SVG 中编写 RDF 三元组作为属性值成为可能。完整的 RDFa 语法(RDFa Core) [14 ]为专家提供了基本的和高级的特性,以便在标记中表达复杂的结构化数据,比如人际关系、地点和事件。那些想要在 web 文档中表达相当简单的结构化数据的人可以使用表达性较差的 RDFa Lite [15 ],这是 RDFa 的一个最小子集,更容易学习,适合大多数一般场景。RDFa Lite 支持以下属性:vocabtypeofpropertyresourceprefix。在授权使用hrefsrc属性的主机语言中,RDFa Lite 也支持它们。

一串数字在数学课上的含义与在电话簿上的含义不同,而一个词在诗歌中的含义通常与在现实生活中的含义不同。单词的含义取决于上下文,所以为了让计算机理解领域或领域(知识领域),我们必须识别定义该领域术语的机器可读词汇。在 RDFa 中,词汇表可以由vocab属性标识,要描述的实体的类型由typeof属性标注,属性由property属性标注(参见清单 2-23 )。

Listing 2-23. Basic Machine-Readable Annotation of a Person in RDFa

<p``vocab="http://schema.org/" typeof="Person"

My name is <span``property="name"``>Leslie Sikos</span> and you can find out more about me

by visiting <a property="url" href=" http://www.lesliesikos.com ">my web site</a>.

</p>

一旦前面的代码被发布并编入索引,搜索引擎将更有效地找到“Leslie Sikos 的网站”。为了在 Web 上唯一地标识这个实体,使用了resource属性(参见清单 2-24 )。resource属性是设置语句对象的选项之一,这在引用非导航链接的资源时特别有用,比如一本书的 ISBN 号。

Listing 2-24. A Unique Identifier of the Entity in RDFa

<p vocab="http://schema.org/" typeof="Person"``>

My name is <span property="name">Leslie Sikos</span> and you can find out more about me A978-1-4842-1049-9_2_Fig2ai_HTML.jpg

by visiting <a property="url" href="http://www.lesliesikos.com

</p>

词汇声明可以从每个属性中省略完整的 URI(namehttp://schema.org/nameurl缩写为 http://schema.org/url )。但是,如果您为多个真实世界的对象或人添加 RDFa 注释,您可以在您的(X)HTML 文档的html元素上声明词汇表的名称空间(例如<html xmlns:foaf=" http://xmlns.com/foaf/0.1/ " …>),并将其与一个可以在整个文档中重用的前缀相关联。每次使用文档顶部声明的词汇表中的术语时,都要添加前缀,后跟一个冒号,如foaf:nameschema:url等。使用前缀不仅方便,有时还是注释标记的唯一方法。例如,如果您需要来自不止一个词汇表的术语,额外的词汇表可以由prefix属性指定(参见清单 2-25 )。您可以引用最常用词汇表(在vocab属性值中定义)中不带前缀的任何术语,以及第二个词汇表中带有您定义为prefix属性的属性值的前缀的术语,或者在html元素上定义带有前缀名称和名称空间 URI 的xmlns属性的术语。

Listing 2-25. Using the Term “Textbook” from the FaBiO Ontology

<p vocab="http://schema.org/" typeof="Person"``prefix="fabio:http://purl.org/spar/fabio/"

resource="#sikos">

My name is <span property="name">Leslie Sikos</span> and you can find out more about me A978-1-4842-1049-9_2_Fig2ak_HTML.jpg

by visiting <a property="url" href="http://www.lesliesikos.com

I am the author of <a``property="fabio:Textbook"

href="http://lesliesikos.com/mastering-structured-data-on-the-semantic-web/>掌握A978-1-4842-1049-9_2_Fig2am_HTML.jpg

Structured Data on the Semantic Web</a>.

为了让搜索引擎“理解”所提供的链接指的是 Leslie Sikos 的一本教科书,我们使用了 FaBiO 本体论中“教科书”的机器可读定义。如果您的 RDFa 注释需要一个以上的附加词汇表,您可以将它们作为空格分隔的列表添加到prefix属性的属性值中。

最常用的词汇名称空间在 RDFa 解析器中预定义,因此您可以在标记中省略它们,并且仍然能够在 RDFa 注释中使用它们的术语(表 2-7 )。

表 2-7。

Widely Used Vocabulary Prefixes Predefined in RDFa [16]

| 前缀 | 上呼吸道感染 | 词汇 | | --- | --- | --- | | `cc` | `http://creativecommons.org/ns#` | 知识共享权利表达语言 | | `ctag` | `http://commontag.org/ns#` | 普通标签 | | `dcterms` | [`http://purl.org/dc/terms/`](http://purl.org/dc/terms/) | 都柏林核心元数据术语 | | `dc` | [`http://purl.org/dc/elements/1.1/`](http://purl.org/dc/elements/1.1/) | 都柏林核心元数据元素集,版本 1.1 | | `foaf` | [`http://xmlns.com/foaf/0.1/`](http://xmlns.com/foaf/0.1/) | 朋友的朋友(FOAF) | | `gr` | `http://purl.org/goodrelations/v1#` | 良好关系 | | `ical` | `http://www.w3.org/2002/12/cal/icaltzd#` | RDF 中的 iCalendar 术语 | | `og` | `http://ogp.me/ns#` | 脸书 OpenGraph | | `rev` | `http://purl.org/stuff/rev#` | RDF 评论 | | `sioc` | `http://rdfs.org/sioc/ns#` | 核心冲击 | | `v` | `http://rdf.data-vocabulary.org/#` | 谷歌富片段 | | `vcard` | `http://www.w3.org/2006/vcard/ns#` | RDF 中的 vCard | | `schema` | [`http://schema.org/`](http://schema.org/) | schema.org |

更复杂的注释需要仅受 RDFa 核心支持的附加属性。除了 RDFa Lite 属性,RDFa Core 还支持aboutcontentdatatypeinlistrelrev属性。

当前主题是文档的网址 5 或宿主语言设置的值,如(X)HTML 中的base元素。因此,在默认情况下,文档中写入的任何元数据都将涉及文档本身。about属性可以用来改变当前的主题并声明数据是关于什么的,使文档体中的属性成为新对象的一部分,而不是引用整个文档(就像它们在文档头中那样)。

如果一些显示的文本与表示的值不同,可以使用content属性添加一个更精确的值,该属性是一个字符数据(CDATA)字符串,为文本提供机器可读的内容。也可以选择使用datatype属性输入一个值(参见清单 2-26 )。声明类型可以确保机器能够解释字符串、日期、数字等。,而不是将它们视为字符序列。

Listing 2-26. Using the content and datatype Attributes

<html xmlns="http://www.w3.org/1999/xhtml"

prefix="xsd: http://www.w3.org/2001/XMLSchema# dc: http://purl.org/dc/terms/ ">

<head>

<title>Leslie’s Blog</title>

</head>

<body>

<h1 property="dc:title">Leslie’s Blog</h1>

<p>

Last modified: <span property="dc:modified"

content="201``4-11-2``8T12:43:0``0-0

datatype="xsd:dateTime" >28 November 2014</span>.

</p>

</body>

</html>

在 RDFa 中,两个资源(谓词)之间的关系可以使用rel属性来表达(参见清单 2-27 )。

Listing 2-27. Describing the Relationship Between Two Resources in RDFa

This document is licensed under the

<a prefix="cc:``http://creativecommons.org/ns#``"

rel="cc:license" A978-1-4842-1049-9_2_Fig2ap_HTML.jpg

href="http://creativecommons.org/licenses/by-nc-nd/3.0/">Creative Commons By-NC-ND

License</a>.

当使用rel表示谓词时,在 RDFa 语句的元素上使用hrefsrc属性来标识对象(参见清单 2-28 )。

Listing 2-28. Using href to Identify the Object

<link about="mailto:leslie@example.com" A978-1-4842-1049-9_2_Fig2ar_HTML.jpg

rel="foaf:knows" href="mailto:christina@example.com" />

两个资源(谓词)之间的反向关系可以用rev属性来表达。relrev属性可以单独或一起用在任何元素上。当有两种不同的关系要表达时,组合relrev特别有用,比如一张照片是由照片中描绘的人拍摄的(参见清单 2-29 )。

Listing 2-29. Combining the rel and rev Attributes

<img about="http://www.lesliesikos.com" src="koalahug.jpg"``/>

Caution

如果只使用relrev对三元谓词进行注释,而没有在同一个元素上定义hrefsrcresource,那么所表示的三元谓词将是不完整的 [17 ]。

inlist属性表明元素上生成的对象是一个列表的一部分,该列表共享相同的谓词和主语(参见清单 2-30 )。只有inlist属性的存在是相关的;它的属性值总是被忽略。

Listing 2-30. Using the inlist Attribute

<p prefix="bibo:http://purl.org/ontology/bibo/dc:http://purl.org/dc/terms/"A978-1-4842-1049-9_2_Fig2as_HTML.jpg

typeof="bibo:Website">

The web site <span property="dc:title">Andrew Peno Graphic and Fine Artist</span> by A978-1-4842-1049-9_2_Fig2at_HTML.jpg

<a``inlist=""``property="dc:creator" href="http://www.andrewpeno.com">Andrew Peno</a> and

<a inlist="" property="dc:creator" href=" http://www.lesliesikos.com ">Leslie Sikos</a>.

</p>

RDFa DOM API

RDFa 提供了一个文档对象模型(DOM)应用编程接口(API)来从网页中提取和利用结构化数据,用于高级用户界面和交互式应用 [18 ]。

HTML5 微数据

HTML5 微数据是在一个单独的规范中定义的 HTML5 模块,用表示结构化数据的属性扩展了 HTML5 核心词汇表 [19 ]。

全局微数据属性

HTML5 微数据将结构化数据表示为一组名称-值对。这些组称为项目,每个名称-值对都是一个属性。项目和属性由常规元素表示。为了创建一个项目,使用了itemscope属性。 6 为了给一个项目添加属性,在该项目的后代(容器元素的子元素)上使用itemprop属性,如清单 2-31 所示。

Listing 2-31. A Person’s Description in HTML5 Microdata

<div``itemscope="itemscope" itemtype="http://schema.org/Person"

<span``itemprop="name"``>``Leslie Sikos

<img src="``lesliesikos.jpg``" alt="Leslie Sikos"``itemprop="image"

Leslie’s web site:

<a href="http://www.lesliesikos.com"``itemprop="url"``>??</a>

</div>

属性值通常是字符串(字符序列),但也可以是网址,如a元素上的href属性的值、img元素上的src属性的值,或者链接或嵌入外部资源的其他元素。例如在清单 2-31 中,image item 属性的值就是img元素上src属性的属性值,也就是lesliesikos.jpg。同样,url item 属性的值也不是a元素lesliesikos.com的内容,而是a元素上href属性的属性值,也就是 http://www.lesliesikos.com 。但是,默认情况下,该项的值是元素的内容,例如本例中 name item 属性的值:Leslie Sikos(由<span></span>标记对分隔)。

通过声明定义相应项目和属性的外部词汇表的网址,使用itemtype属性来表达项目的类型和项目属性。在我们的例子中,我们使用了来自 http://schema.orgPerson词汇来定义一个人的属性,比如familyNamegivenNamebirthDatebirthPlacegendernationality等等。属性的完整列表在 http://schema.org/Person 中定义,这是itemtype的值。在这个例子中,我们用属性name声明了名字,用属性image声明了对人的描述,用属性url声明了他的网站地址。这些属性的允许值和预期格式分别在 http://schema.org/namehttp://schema.org/imagehttp://schema.org/url 中提供。

每个知识领域的条目类型是不同的,如果你想标注的是一本书而不是一个人的描述,itemtype属性的值将是 http://schema.org/Book ,这里收集并定义了书的属性,如bookFormatbookEditionnumberOfPagesauthorpublisher等。如果条目有一个全局标识符(比如一本书的唯一 ISBN 号),可以使用idemid属性对其进行注释,如清单 2-32 所示。

Listing 2-32. The Description of a Book in HTML5 Microdata

<div itemscope="itemscope" itemtype="http://schema.org/Book"

itemid="urn:isbn:97 8-1 -48420 8-84-7 "

<img itemprop="image" src="http://www.masteringhtml5css3.com/img/webstandardsbook.jpg"

alt="Web Standards" />

<span itemprop="name">Web Standards: Mastering HTML5, CSS3, and XML</span> A978-1-4842-1049-9_2_Fig2ax_HTML.jpg

by <a itemprop="author" href="http://www.lesliesikos.com

</div>

虽然 HTML5 微数据主要用于对人、组织、事件、产品、评论和链接的语义描述,但是您可以用各种各样的外部词汇来注释任何其他知识领域。

通过在声明属性的元素上声明itemscope属性,名值对组可以嵌套在微数据属性中(参见清单 2-33 )。

Listing 2-33. Nesting a Group of Name-Value Pairs

<div itemscope="itemscope">

<p>Name: <span itemprop="name">Herbie Hancock</span></p>

<p>Band: <span``itemprop="band" itemscope="itemscope"

<span itemprop="name">The Headhunters</span>

(<span itemprop="size">7</span> members)

</span>

</p>

</div>

在前面的示例中,外部项(顶级微数据项)注释一个人,内部项表示一个爵士乐队。

具有itemscope属性的元素的一个可选属性是itemref7 ,它给出了一个附加元素的列表,可以爬行这些元素来找到该项目的名称-值对。换句话说,不是具有itemscope属性的元素的后代的属性可以使用itemref属性与项目相关联,在文档的其他地方提供具有附加属性的元素标识符的列表(参见清单 2-34 )。itemref属性不是 HTML5 微数据数据模型的一部分。

Listing 2-34. Using the itemref Attribute

<div itemscope="itemscope"``id="herbie" itemref="a b"

<p``id="a"

<div``id="b"``itemprop="band" itemscope="itemscope"``itemref="c"

<div``id="c"

<p>Band: <span itemprop="name">The Headhunters</span></p>

<p>Size: <span itemprop="size">7</span> members</p>

</div>

第一项有两个属性,声明 jazz keyboardist 的名字Herbie Hancock,并在另一项上单独注释他的 jazz 乐队,另一项还有两个属性,将乐队的名字表示为The Headhunters,并使用size属性将成员数设置为7

HTML5 微数据 DOM API

HTML5 微数据有一个 DOM API,供 web 开发者直接访问结构化数据 [20 ]。

JSON-LD

与 RDFa 和 HTML5 微数据这两种向网站标记添加结构化数据的主流格式相反,链接数据的 JavaScript 对象符号(JSON-LD)被描述为 JavaScript 代码,而不是标记元素和属性。因此,JSON-LD 完全独立于(X)HTML 代码。这种轻量级链接数据格式的一个优点是便于人类读写。JSON-LD 使用 JavaScript 对象符号(JSON)传输链接数据,这是一种开放的标准格式,使用人类可读的文本来传输属性-值对 [21 ]。如果 JSON-LD 代码是在一个单独的文件而不是标记中编写的,那么实际的文件扩展名是.jsonld。JSON-LD 的互联网媒体类型是application/ld+json,如果写在标记中,JSON-LD 代码由<script></script>标记之间的花括号分隔,如清单 2-35 A978-1-4842-1049-9_2_Fig2b_HTML.jpg所示。

Listing 2-35. Compact JSON-LD Code in the Markup

<script type="application/ld+json">

{

"@context": "http://schema.org

"@type": "Person",

"image": "lesliesikos.jpg",

"name": "Leslie Sikos",

"url": "http://www.lesliesikos.com

}

</script>

这个例子使用 JSON-LD 的紧凑语法,它可以扩展为清单 2-36 中演示的完整语法符号。

Listing 2-36. Expanded JSON-LD Code

[

{

"@type": [

"http://schema.org/Person

],

"http://schema.org/image

{

"@id": "http://www.lesliesikos.cimg/lesliesikos.jpg

}

],

"http://schema.org/name

{

"@value": "Leslie Sikos"

}

],

"http://schema.org/url

{

"@id": "http://www.lesliesikos.com

}

]

}

]

JSON LD DOM API

JSON-LD 的 API 提供了一种将 JSON-LD 文档转换成更容易被特定应用使用的方法 [22 ]。

GRDDL: XML 文档到 RDF

因为有效的 XML 文档遵循非常严格的语法,所以通常可以从 XML 中提取 RDF 三元组。从各种语言的方言中收集资源描述(GRDDL,读作“griddle”)是一种将 XML 文档(包括 XHTML 文档(有或没有 hCard 或 hCalendar 等微格式)转换为 RDF 的标记格式。这些转换通常用 XSLT 表示,分以下三步进行:

Source document declaration   Link to one or more extractors   GRDDL agent extracts RDF from the document

XHTML 1.x 文档使用 head 元素上的 profile 属性来声明文档支持 GRDDL 转换,而可用的转换作为一个.xsl文件提供(清单 2-37 )。

Listing 2-37. An XHTML 1.x Document That Supports GRDDL Transformations

<head profile="http://www.w3.org/2003/g/data-view

<link rel="transformation" href="grddlxfn.xsl" />

Caution

XHTML5 不支持profile属性。

在诸如 Atom syndication format(用于新闻提要)或 KML(用于在 Google Earth 和 Google Maps 中显示地理数据)之类的 XML 文档中,只需指向名称空间,就可以将转换与 XML 名称空间相关联(清单 2-38 )。

Listing 2-38. An XML Namespace Declaration Pointing to NamespaceTransformation

<foo xmlns="http://example.com/1.0/

当访问 http://example.com/1.0/ 名称空间时,它显示出namespaceTransformation,允许从 XML 文档轻松部署 RDF/XML。

对于包含微格式的 XHTML 文档,使用特定于所应用注释的配置文件。例如,一个支持 GRDDL 并包含 hCard 信息的 XHTML 文档的概要文件如清单 2-39 所示。

Listing 2-39. An XHTML 1.x Document That Supports GRDDL and Contains hCard Information

<head profile=" http://www.w3.org/2003/g/data-view http://www.w3.org/2006/03/hcard

GRDDL 代理可以从引用 profile 转换链接的页面中提取所有 hCard 数据(清单 2-40 )。

Listing 2-40. Profile Transformation Link

The RDF data is extracted by <a rel="profileTransformation" A978-1-4842-1049-9_2_Fig2ay_HTML.jpg

href="hcard2rdf.xsl">this XSL</a> from <a href="http://example.com/hcard/">thishCard</a>.

R2RML:RDF 的关系数据库

大多数动态网站内容由关系数据库(RDB)支持,如 Microsoft SQL、MySQL、Oracle、IBM DB2 或 PostgreSQL。RDB2RML (R2RML)是一个将关系数据库直接映射到 RDF [23 ]的标准,使得数据在语义网上更易访问(见图 2-5 )。

A978-1-4842-1049-9_2_Fig5_HTML.jpg

图 2-5。

RDB2RML enables RDF benefits for data from relational databases

直接映射将 RDB 数据和模式表示为 RDF 图,称为直接图,用 Turtle 语法描述。假设我们在一个关系数据库中有两个表,一个收集人,另一个收集地址(清单 2-41 )。

Listing 2-41. RDB Input

CREATE TABLE "Addresses" (

"ID" INT, PRIMARY KEY("ID"),

"city" CHAR(10),

"state" CHAR(3)

)

CREATE TABLE "People" (

"ID" INT, PRIMARY KEY("ID"),

"fname" CHAR(10),

"addr" INT,

FOREIGN KEY("addr") REFERENCES "Addresses"("ID")

)

INSERT INTO "Addresses" ("ID", "city", "state") VALUES (52, ’Adelaide’, ’SA’)

INSERT INTO "People" ("ID", "fname", "addr") VALUES (5, ’Leslie’, 52)

两个表都有一个唯一的标识符作为主键。地址标识符提供了两个表之间的关系(图 2-6 )。

A978-1-4842-1049-9_2_Fig6_HTML.jpg

图 2-6。

RDB input tables

这个例子的 R2RML 直接映射将创建一个带有 ID 为5Leslie实体的People类,一个带有Leslie实体的城市和州细节的Addresses类,以及一个Leslie实体和相关地址之间的链接(清单 2-42 )。

Listing 2-42. RDF/Turtle Output

@base <http://example.com/DB/> .

@prefix xsd: <``http://www.w3.org/2001/XMLSchema#

<People/ID=5> rdf:type <People> .

<People/ID=5> <People#ID> 5 .

<People/ID=5> <People#fname> "Leslie" .

<People/ID=5> <People#addr> 52 .

<People/ID=5> <People#addr> <Addresses/ID=52>

<Addresses/ID=52> rdf:type <Addresses> .

<Addresses/ID=52> <Addresses#ID> 52 .

<Addresses/ID=52> <Addresses#city> "Adelaide" .

<Addresses/ID=52> <Addresses#state> "SA" .

资源描述框架模式

虽然 RDF 是语义网的基石,但是它本身并不适合描述本体。RDFS (RDF 词汇描述语言,最初是 RDF 模式语言)是一种简单的基于 RDF 的语言,用于通过定义知识领域的术语和它们之间的关系来创建 RDF 本体。RDFS 是 RDF 词汇表的扩展,具有基本的本体元素,并且重用 RDF 属性。RDFS 本体可以表示为 RDF 图。RDFS 适用于使用特定属性描述各种资源类型。RDFS 类和属性形成了 RDFS 词汇表,包括一组专门的预定义 RDF 资源及其含义,并使用带有前缀http://www.w3.org/2000/01/rdfschema#和相关联的 QName 前缀rdfs:的 URI 引用。RDFS 词汇表的类用于定义类资源(rdfs:Resource)、字符串和整数等文字值的类(rdfs:Literal)、类的类(rdfs:Class)、RDF 数据类型的类(rdfs:Datatype)、RDF 容器的类(rdfs:Container)以及容器成员属性的类(rdfs:ContainerMembershipProperty)。RDFS 的属性可以表示主题是类的子类(rdfs:subClassOf),主题是属性的子属性(rdfs:subPropertyOf),定义主题属性的域(rdfs:domain)或范围(rdfs:range),为主题添加人类可读的名称(rdfs:label),声明主题资源的描述(rdfs:comment),标识主题资源的成员(rdfs:member,添加与主题资源相关的信息(rdfs:seeAlso,提供主题资源的定义(rdfs:isDefinedBy)。

定义 RDFS 类

RDFS 类对应于用于分类和层次结构的类型或类别。在 RDFS,类 C 由清单 2-43 中所示的三元组定义,其中rdfs:Class是预定义的类,rdf:type是预定义的属性。

Listing 2-43. Class Definition in RDFS

C rdf:type rdfs:Class .

例如,example.com视频租赁公司想利用 RDFS 提供电影信息,包括西部片和喜剧。代表这些类别的类可以写成清单 2-44 所示的语句(三元组)。

Listing 2-44. Statements in RDFS

ex:Movie rdf:type rdfs:Class .

ex:Western rdf:type rdfs:Class .

ex:Comedy rdf:type rdfs:Class .

定义 RDFS 子类

假设example.com想定义西部片和喜剧是电影。这可以通过清单 2-45 中所示的 RDFS 子类来实现。

Listing 2-45. Subclass Definition in RDFS

ex:Western rdfs:subClassOf ex:Movie .

ex:Comedy rdfs:subClassOf ex:Movie .

rdfs:subClassOf属性是自反的,换句话说,一旦一个 RDFS 类被创建,它就是自身的子类,比如ex:Movie的定义推断ex:Movie rdfs:subClassOf ex:Movie .``rdfs:subClassOf属性也是传递的。预定义的rdfs:subclassOf属性在语句中用作谓词,声明一个类是另一个更一般的类的专门化。形式为C1 rdfs:subClassOf C2的语句中的rdfs:subClassOf预定义属性的含义是,类C1的任何实例也是类C2的实例。比如我们有语句ex:Comedy rdfs:subClassOf ex:Movie .(喜剧是电影)ex:ActionComedy rdf:type ex:Comedy .(动作喜剧是喜剧),就可以推导出语句ex:ActionComedy rdf:type ex:Movie .(动作喜剧是电影)(明确没有陈述的知识可以推导出来)。

定义 RDFS 实例

为了给example.org定义一个实例,比如一部单独的电影,我们可以做一个 RDF 声明,电影《坏男孩》是一部动作喜剧,如清单 2-46 所示。

Listing 2-46. Instance Definition in RDFS

@prefix films:   <http://example.com/films> .

@prefix moviedb: <http://examplefilmdb.com> .

moviedb:BadBoys rdf:type films:ActionComedy .

rdf:type预定义属性在语句I rdf:type C .中用作谓词,以声明个体 I 是类 C 的实例。在形式为C rdf:type rdfs:Class .的语句中,rdf:type用于声明类 C(被视为个体对象)是rdfs:Class预定义类的实例。显式定义类是可选的。如果我们写一个三元组比如I rdf:type C .,那么 C 就被推断为一个类(即rdfs:Class的一个实例)。一个类不限于一个层次级别,可以是其他类的子类或超类,通常用有向图表示(见图 2-7 )。

A978-1-4842-1049-9_2_Fig7_HTML.gif

图 2-7。

Hierarchy of RDFS classes on a graph

在我们的例子中,该图表示可以由本体表达的机器可读语句(清单 2-47 )。

Listing 2-47. RDFS Classes Correspond to Relationships Represented on the Graph

@prefix films:   <``http://example.com/films

@prefix rdf:     <``http://www.w3.org/1999/02/22-rdf-syntax-ns#

@prefix rdfs:    <``http://www.w3.org/2000/01/rdf-schema#

films:Movie rdf:type rdfs:Class .

films:Action rdf:type rdfs:Class .

films:Comedy rdf:type rdfs:Class .

films:Western rdf:type rdfs:Class .

films:ActionComedy rdf:type rdfs:Class .

films:Action rdfs:subClassOf films:Movie .

films:Comedy rdfs:subClassOf films:Movie .

films:Western rdfs:subClassOf films:Movie .

films:ActionComedy rdfs:subClassOf films:Comedy .

films:ActionComedy rdfs:subClassOf films:Action .

定义 RDFS 属性

可以在不引用类或不表征类的情况下定义特定属性。要为一个类创建一个属性,需要声明要定义的属性是预定义的rdf:Property类的一个实例。例如,我们编写ex:author rdf:type rdf:Property .,这样ex:author属性可以在 RDF 三元组中用作谓词,比如ex:LeslieSikos ex:author ex:WebStandards .因为 RDFS 属性也是资源,属性可以是三元组的主题或对象。比如ex:author prov:definedBy ke:LeslieSikoske:LeslieSikos prov:defined ex:author

rdfs:label属性是rdf:Property的一个实例,可以用来提供人类可读版本的资源名称。rdfs:comment属性是rdf:Property的一个实例,适合于提供人类可读的资源描述。语义网上一个非常频繁使用的 RDFS 属性是rdfs:seeAlso,它是rdf:Property的一个实例,用于指示提供关于主题资源的附加信息的资源。假设我们有教科书 Web 标准的 RDF 描述:掌握 HTML5、CSS3 和 XML。我们用 Dublin Core 词汇表中的 title 属性声明书名,因此它在 http://purl.org/dc/terms/ 的名称空间必须包含在名称空间声明中。要将该书的网站链接到描述作者其他书籍的网页,可以使用rdfs:seeAlso property(参见清单 2-48 )。因为我们也使用 RDF 和 RDFS 属性,所以它们的名称空间必须添加到名称空间声明中。

Listing 2-48. Tagging, Describing, and Linking Resources with RDFS Properties

@prefix dcterms: <http://purl.org/dc/terms/

@prefix rdf: <``http://www.w3.org/1999/02/22-rdf-syntax-ns#

@prefix rdfs: <``http://www.w3.org/2000/01/rdf-schema#

<http://www.masteringhtml5css3.com

rdfs:label "RDF Description of the web design book Web Standards" ;

dcterms:title "Web Standards: Mastering HTML5, CSS3, and XML" ;

rdfs:comment "Web Standards: Mastering HTML5, CSS3, and XML presents step-by-step A978-1-4842-1049-9_2_Fig2az_HTML.jpg

guides based on solid design principles and best practices, and shows the most common A978-1-4842-1049-9_2_Fig2ba_HTML.jpg

web development tools and web design frameworks. You will master HTML5 and its XML A978-1-4842-1049-9_2_Fig2bb_HTML.jpg

serialization, XHTML5, the new structuring and multimedia elements, the most important

A978-1-4842-1049-9_2_Fig2bc_HTML.jpg

HTML5 APIs, and understand the standardization process of HTML 5.1, HTML 5.2, and A978-1-4842-1049-9_2_Fig2bd_HTML.jpg

future HTML5 versions." ;

rdfs:seeAlso <http://www.lesliesikos.com/web-design-books/

rdfs:isDefinedBy属性是rdf:Property的实例,用于指示定义主题资源的资源,例如描述资源的受控词汇表。

定义 RDFS 域和范围

通过定义属性的域和范围,可以声明属性只应用于类的某些实例,这表明了 RDFS 类和属性与 RDF 数据之间的关系。rdfs:domain谓词表明一个特定的属性应用于一个指定类的实例(属性的域),换句话说,用谓词声明那些资源的类,这些资源可能作为主题出现在三元组中。rdfs:range谓词表示一个特定属性的值是一个指定类的实例(那些资源的类可能作为带有谓词的三元组中的对象出现,也称为属性的范围),如清单 2-49 所示。

Listing 2-49. Using RDFS Domain and Range

ex:Book rdf:type rdfs:Class .

ex:Person rdf:type rdfs:Class .

ex:author rdf:type rdf:Property .

ex:author rdfs:domain ex:Book .

ex:author rdfs:range ex:Person .

Book1 ex:hasAuthor Author .

Note

并非所有属性都有域或范围。

rdfs:range属性也可以表示属性值是用类型化的文字 8 声明的(清单 2-50 )。

Listing 2-50. Using a Typed Literal

ex:age rdf:type rdf:Property .

ex:age rdfs:range xsd:integer .

网络本体语言(OWL)

虽然使用 RDFS 可以创建简单的机器可读本体,但是复杂的知识领域需要更多的能力,例如

  • 类之间的关系(并集、交集、不相交、等价)
  • 属性基数约束(最小值、最大值、精确数,例如,一个人只有一个父亲)
  • 丰富的属性类型(对象与数据类型、特定数据类型)
  • 性质和特殊性质的特征(传递的、对称的、泛函的、逆泛函的,例如,A ex:hasAncestor BB ex:hasAncestor C暗示着A ex:hasAncestor C)
  • 指定给定属性是特定类实例的唯一键
  • 当属性用于某个类时,属性的域和范围限制
  • 类的相等性,指定具有不同 URI 引用的两个类实际上表示同一个类
  • 个体相等,指定具有不同 URI 引用的两个实例实际上代表同一个体
  • 枚举类

Web Ontology Language (OWL)是一种知识表示语言,专为创建 Web 本体而设计,具有丰富的建模构造器集,解决了 RDFS 的局限性。OWL 的第一个版本开始于 2002 年,第二个版本 OWL2 开始于 2008 年。OWL 在 2004 年成为 W3C 推荐标准 [25 ],OWL2 在 2009 年被标准化 [26 , 27 ]。OWL 基于 RDF,语义上扩展了 RDF 和 RDFS,以及它的前身语言 DAML+石油。

Note

Web 本体语言的缩写故意不是 WOL 而是 OWL [28 ]。

描述逻辑

语义网上的本体通常实现数学逻辑,这是数学的一个分支,处理形式表达式、演绎推理和形式证明。描述逻辑(DL)是人工智能中的一族形式知识表示语言,用于本体的逻辑形式,包括知识领域概念的形式推理。描述逻辑语言比命题逻辑(处理陈述性命题,不使用量词)更具表达性,在决策问题上比一阶谓词逻辑(在非逻辑对象上使用谓词和量化变量)更高效。描述逻辑可以对概念、角色和个人以及它们之间的关系进行建模。描述逻辑的核心建模概念是公理,公理是关于角色和/或概念之间关系的逻辑陈述。大多数用 OWL 编写的 web 本体都是描述逻辑的实现。

每个描述逻辑知识库(KB)由术语部分(TBox)和断言部分(ABox)组成,这两部分都包含一组公理。一个基本的描述逻辑是 AL,定语语言,支持原子否定, 9 概念交集,普遍限制,有限存在量化。

Note

描述逻辑的命名惯例是通过附加一个相应的字母来表示额外的构造器(见表 2-8 )。

表 2-8。

Common Letters Used in Description Logic Names

| 标志 | 包含 | 例子 | | --- | --- | --- | | C | 复杂概念构造函数否定 | 任意概念的否定 | | S | 具有及物角色的 ALC 的缩写 | 苹果的手机操作系统是 iOS,iOS 是为 iPhone 智能手机开发的,所以 iPhone 智能手机是苹果做的。 | | 稀有 | 有限复杂角色包含公理,自反性和非自反性,角色分离 | “一部分”和“有一部分” | | O | 对象值限制的枚举类(名词) | 非洲、南极洲、亚洲、澳大利亚、欧洲、北美洲、南美洲 | | 我 | 反向属性 | 雇佣和被雇佣者 | | 普通 | 基数限制 | 每个人都有父母。 | | F | 函数性质,唯一性量化的特例 | “有且只有一个” | | Q | 合格基数限制 | 具有⊤以外的填充符的基数限制 | | (D) | 数据类型属性、数据值或数据类型 | 在语句“克里斯蒂娜 30 岁”中注释为整数的数字 |

AL 的一个扩展是带补语的定语概念语言,描述逻辑缩写为 ALC。ALC 支持 ABox 表达式,例如个人赋值(例如,福特是一辆汽车)、属性赋值(例如,莱斯利有一个妻子,克里斯蒂娜)、TBox 表达式,例如子类关系(⊑)和等价(≡),以及合取(⊓)、析取(⊔)、否定( )、属性限制(∀,∃)、重言式(⊤,一个始终为真的逻辑公式)和矛盾(⊥).)通过组合这样的数学运算符,您可以构造复杂的类表达式,在这个描述逻辑的名称中用 C 表示。ALC 可以描述个体集合、原子类集合和角色集合。

SR 通过属性链、属性特征和角色层次扩展了 ALC 的功能。属性特征包括传递性(例如,本具有祖先紫罗兰)、对称性(例如,克里斯蒂娜是莱斯利的配偶,莱斯利是克里斯蒂娜的配偶)、不对称性(例如,莱斯利具有儿子本)、自反性(例如,克里斯蒂娜具有亲戚琳达)、非自反性(例如,克里斯蒂娜是本的父母)、功能性(例如,克里斯蒂娜有丈夫)和反功能性(例如,莱斯利是克里斯蒂娜的丈夫)。SRO 用名词,即对象值限制的枚举类来扩展 SR。SROI 给 SRO 增加了相反的性质。SROIQ 用限定的基数约束扩展了 SRO。SROIQ (D) 用数据类型扩展 SROIQ,包括方面。此外,SROIQ (D) 支持不相交属性,并为对象和数据类型增加了重言式(⊤)和矛盾式(⊥)支持(见图 2-8 )。

A978-1-4842-1049-9_2_Fig8_HTML.jpg

图 2-8。

Relationship between the description logic constructors of ALC and SROIQ(D)

除了 Abox 和 TBox 之外,SROIQ (D) 还支持所谓的角色盒(RBox)来收集与角色和角色之间的相互依赖关系相关的所有语句。每个 RBox 由一个角色层次结构(包括通用的角色包含公理)和一组角色断言组成。

OWL 变体

OWL 有三种风格,每一种都在表达能力和计算复杂性(推理实用性)之间构成了不同的妥协:

  • OWL-Full:对语言结构的使用没有限制:对 RDF 的使用没有全局限制或约束。最大的表达能力,语法自由,没有计算保证。OWL-Full 的语义是 RDFS 和 OWL-DL(基于 RDF 的语义)的混合。
  • OWL-DL:对应于描述逻辑的 OWL-Full 的受限版本。OWL-DL 提供了最大的表达性、计算完整性(所有结论都保证是可计算的)和可判定性(所有计算都可以在有限时间内完成)。它从 SROIQ (D) 继承了全局限制。在 OWL-DL 中,RDF 只能用于表达 OWL 公理。OWL-DL 实现了 SROIQ (D) 的模型理论语义,称为 OWL2 直接语义。
  • OWL-Lite:OWL-DL 的一个子集,为易于实现而设计。OWL-Lite 的适用性有限,因为它只适用于分类层次和简单约束。

OWL2 提供 SROIQ (D) 描述逻辑的表达能力;OWL-DL 基于 SHOIN (D) 描述逻辑;而 OWL-Lite 则基于 SHIF (D) 描述逻辑。

OWL 本体是 RDF 图,换句话说,是 RDF 三元组的集合。类似于 RDF 图,OWL 本体图可以用各种语法符号表示。OWL 是比 RDF 更高级的语言;实际上,它是 RDF 的一个词汇扩展。因此,RDF 图是全 OWL 本体。默认的 OWL 名称空间是http://www.w3.org/2002/07/owl#,它定义了 OWL 词汇表。没有专门为 OWL 定义的 MIME 类型,但是对于扩展名为.rdf.owl的 OWL 文档,推荐使用application/rdf+xmlapplication/xml MIME 类型。

OWL 有三个组成部分:类、属性和个体。在 OWL 中使用ClassThing来区分类和个体。在 RDFS 中,只能创建现有类的子类,而在 OWL 中,可以通过以下任何方式基于现有类构造类:

  • 枚举内容
  • 通过交叉、联合或互补
  • 通过财产限制

句法

在高层,可以使用 OWL 抽象语法 [29 和 OWL2 函数语法 [30 ]。OWL 还支持几种交换语法,包括 RDF 语法,如 RDF/XML 和 RDF/Turtle、OWL2 XML 语法 [31 ]和 Manchester 语法 [32 ],但 RDF/XML 是标准语法。

Note

在示例中,我对一个假想的智能手机本体使用声明。

OWL2 函数语法与统一建模语言(UML)兼容,UML 是部署最广泛的通用标准化建模语言之一(参见清单 2-51 )。它是干净的、可调整的、可修改的,并且易于解析。函数语法主要用于在 W3C 规范中定义正式的 OWL2 语法。

Listing 2-51. OWL2 Functional Syntax Example

Prefix(owl:=<``http://www.w3.org/2002/07/owl#

Ontology(<http://example.com/smartphone.owl>

Declaration( Class( :Smartphone ) )

)

OWL2 函数语法的符号变体是 OWL/XML 语法,它使用 XML 树结构而不是 RDF 三元组,如清单 2-52 所示。

Listing 2-52. OWL2 XML Syntax Example

<Ontology ontologyIRI="http://example.com/smartphone.owl">

<Prefix name="owl" IRI="``http://www.w3.org/2002/07/owl#

<Declaration>

<Class IRI="Smartphone"/>

</Declaration>

</Ontology>

OWL 2 的唯一标准语法是 RDF/XML 语法(参见清单 2-53 )。每个符合 OWL2 的工具都支持这种语法。

Listing 2-53. RDF/XML Syntax Example

<rdf:RDF A978-1-4842-1049-9_2_Fig2be_HTML.jpg

xmlns:owl="``http://www.w3.org/2002/07/owl#``"

xmlns:rdf="``http://www.w3.org/1999/02/22-rdf-syntax-ns#

<owl:Ontology rdf:about="Phone Ontology"/>

<owl:Class rdf:about="#Smartphone"/>

</rdf:RDF>

清单 2-54 中显示的 RDF/Turtle 语法是表示 OWL 本体的 RDF 三元组的简单语法。

Listing 2-54. RDF/Turtle Example

@prefix rdf: <``http://www.w3.org/1999/02/22-rdf-syntax-ns#

@prefix owl: <``http://www.w3.org/2002/07/owl#

<http://example.com/smartphone.owl>

rdf:type owl:Ontology .

:Smartphone rdf:type owl:Class .

不常用的曼彻斯特语法是 OWL-DL 的一种简洁、用户友好的语法,它将关于特定类、属性或个人的信息收集到一个称为帧的结构中。曼彻斯特语法易于阅读和书写,特别是对于那些不是数学逻辑专家的人来说。复杂的描述由简短、有意义的英文单词组成,同时消除了其他语法中表示的逻辑符号和优先规则,如清单 2-55 所示。

Listing 2-55. Manchester Syntax Example

Prefix: owl: <http://www.w3.org/2002/07/owl

Ontology: <http://example.com/smartphone.owl>

Class: Smartphone

性能

在 OWL 中,存在以下类型的属性:

  • 将个人链接到其他个人的对象属性
  • 将个体链接到数据值的数据类型属性(对象属性的子类)
  • 注释属性(owl:AnnotationProperty)
  • 本体属性(owl:OntologyProperty)

属性特征由属性公理定义。基本形式只表达存在。例如,在智能手机本体中,可以声明属性hasTouchscreen来表达手机的一个主要特性(参见清单 2-56 )。

Listing 2-56. A Property Declaration in OWL

<owl:ObjectProperty rdf:ID="hasTouchscreen" />

OWL 属性公理也可以定义额外的特征。OWL 重用 RDF 模式结构,如rdfs:subPropertyOfrdfs:domainrdfs:range。与其他属性的关系可以用owl:equivalentPropertyowl:inverseOf来表示(列表 2-57 )。

Listing 2-57. Two Equivalent Smartphone Properties (Accelerometer and G-sensor)

<owl:ObjectProperty rdf:ID="hasAccelerometer">

<owl:equivalentProperty>

<owl:ObjectProperty rdf:ID="hasGsensor" />

</owl:equivalentProperty>

</owl:ObjectProperty>

全局基数约束由owl:FunctionalPropertyowl:InverseFunctionalProperty定义(参见清单 2-58 )。对称性和传递性特征由owl:SymmetricPropertyowl:TransitiveProperty [33 定义。

Listing 2-58. A FunctionalProperty in OWL

<owl:ObjectProperty rdf:about="&myMobile;manufactured_by">

<rdf:type rdf:resource="&owl;FunctionalProperty" />

<rdfs:domain rdf:resource="&myMobile;Mobile" />

</owl:ObjectProperty>

OWL 为表达关系提供了精确的声明,即使它们是显而易见的。例如,两个智能手机特性的属性层次可以用rdfs:subPropertyOf来表示,如清单 2-59 所示。

Listing 2-59. Property Hierarchy in OWL

<owl:ObjectProperty rdf:ID="hasGeotagging" />

<owl:ObjectProperty rdf:ID="hasCamera">

<rdfs:subPropertyOf rdf:resource="hasGeotagging" />

</owl:ObjectProperty>

班级

与 RDF 类似,OWL 提供了对资源进行分组的类。OWL 中有六种不同的类描述:

Class identifier (URI reference). A named instance of owl:Class, a subclass of rdfs:Class.10 Listing 2-60 shows an example.   Listing 2-60. A Class Identifier in OWL

<owl:Class rdf:ID="Handheld"/>

Set of individuals (instances of a class) defined by the owl:oneOf property. For example, the class of smartphones can be declared in the RDF/XML syntax, with the RDF construct rdf:parseType="Collection", as shown in Listing 2-61.   Listing 2-61. Declaring Class Instances in OWL

<owl:Class>

<owl:oneOf rdf:parseType="Collection">

<owl:Thing rdf:about="#Touch" />

<owl:Thing rdf:about="#Type" />

<owl:Thing rdf:about="#TouchType" />

</owl:oneOf>

</owl:Class>

Property restriction: a value constraint or a cardinality constraint (for example, see Listing 2-62).   Listing 2-62. Property Restrictions in OWL

<owl:Restriction>

<owl:onProperty rdf:resource="hasGPS" />

<owl:allValuesFrom rdf:resource="#Smartphone" />

</owl:Restriction>

Intersection of two or more class descriptions. For example, the intersection of the Smartphone and the MadeByApple classes can be described by owl:intersectionOf, stating that iPhones are smartphones made by Apple (see Listing 2-63).   Listing 2-63. Intersection in OWL

<owl:Class rdf:ID="IPhone">

<owl:intersectionOf rdf:parseType="Collection">

<owl:Class rdf:about="#Smartphone" />

<owl:Class rdf:about="#MadeByApple" />

</owl:intersectionOf>

</owl:Class>

Union of two or more class descriptions.   Complement of a class description. The class extension contains exactly those individuals that do not belong to the class extension of the class description that forms the object of the statement. The complement can be described by the owl:complementOf property.

类描述可以组合成类公理。类的层次结构可以用一个子类公理来表示(列表 2-64 )。

Listing 2-64. Class Hierarchy in OWL

<owl:Class rdf:ID="Slide">

<rdfs:subClassOf rdf:resource="#smartphone" />

</owl:Class>

两个类的等价性表示它们所包含的个体是相同的。清单 2-65 显示了一个例子。

Listing 2-65. Equivalent Classes in OWL

<owl:Class rdf:about="VirtualKeyboard">

<owl:equivalentClass rdf:resource="#Softquerty">

</owl>

虽然一般来说,个人可以是几个类别的成员,但在许多情况下,成员资格是排他性的。例如,智能手机要么有物理键盘,要么有虚拟键盘(在触摸屏上)。这种类的不连续性可以用清单 2-66 来表示。

Listing 2-66. Class Disjointness in OWL

<owl:Class rdf:about="VirtualKeyboard">

<owl:equivalentClass rdf:resource="#Softquerty" />

<owl:disjointWith rdf:resource="Keyboard" />

</owl>

简单知识组织系统

简单知识组织系统(SKOS)是 W3C 推荐的表示分类法、叙词表、分类方案、主题-标题系统和结构化受控词汇表的标准。作为工业应用中最常实现的语义 Web 标准之一,SKOS 建立在 RDF 和 RDFS 的基础上,支持将受控词汇表作为链接数据轻松发布。RDF 提供了互操作性、一致性和完整性,并允许知识组织系统用于分布式的、分散的元数据应用,其中元数据是从多个资源中检索的。

SKOS 标准将 SKOS 数据模型定义为完整的 OWL 本体 [34 ]。SKOS 数据模型的元素是 OWL 类和带有单个 URIs 的属性,它们构成了 SKOS 词汇表。sko 的类和属性适合于表示叙词表的共同特征(在同义词和相关概念组中列出单词)。sko 的抽象概念由术语表示,可以使用关系(如broadernarrower)组织成层次结构,或者通过非层次(关联)关系(如related)链接起来。进一步的 SKOS 类和谓词可用于基本描述(ConceptConceptScheme)、标记(prefLabelaltLabelprefSymbolaltSymbol)、文档(definitionscopeNotechangeNote)、主题索引(subjectisSubjectOf)、分组(CollectionOrderedCollection)和主题指示(subjectIndicator)。SKOS 还提供了一些类似于 RDFS 推理规则的推理规则。

规则交换格式

用于在语义网上自动做出新发现的附加信息是基于本体论或规则集的。本体通过定义类、子类和关系来关注分类方法,而规则集关注基于现有关系发现和生成新关系的一般机制。规则集是称为规则的IF-THEN结构的集合。如果代码的IF部分的条件成立,则处理代码的THEN部分的结论。规则是一阶谓词逻辑的简化,相对容易实现,并且超越语法和语义,它们可以表达存在量化、析取、逻辑合取、否定、函数、非单调性和其他特征。

有许多不同的规则语言,例如,规则标记语言(RuleML),一种表示向前(自下而上)和向后(自上而下)规则的 XML 方法,或者语义 Web 规则语言(SWRL),它是作为 OWL 的扩展引入的。由于规则语言的不同范例、语义、特性、语法和商业利益,有必要进行规则交换。

规则交换格式(RIF)是为现有规则系统之间的规则共享和交换而设计的,换句话说,允许为一个应用编写的规则在其他应用和规则引擎中共享和重用,同时保留语义。RIF 是一组严格定义的规则语言,称为方言。RIF 的核心方言是大多数规则引擎的公共子集。基本逻辑方言(BLD)增加了逻辑函数、等式和命名参数,并支持 Horn 逻辑(文字的析取,最多有一个正文字)。产生式规则方言(PRD)在规则结论中提供具有副作用的动作。RIF 有一个到 RDF 的映射。

论证

基于描述逻辑的本体在描述 web 资源的含义方面是至关重要的,并且可以利用强大的描述逻辑推理工具来促进语义 web 站点的机器可处理性。推理推导出机器可读本体或知识库中没有明确表达的事实。描述逻辑推理机实现语义推理的分析表方法(真值树),这是一阶谓词逻辑公式最流行的证明过程。除了其他好处之外,这使得确定公式集的可满足性成为可能。推理机可以确定概念的描述是否不矛盾,或者一个描述是否比另一个描述更一般。他们可以检查一致性,以及个人是否是一个概念的实例。推理机可以检索特定概念的所有实例,并找到个人所属的最具体的概念。由于可判定性、计算复杂性和正式程度,自动处理并不总是可行的。

分析器

语义分析是将自然语言句子映射成其意义的正式表示的过程。语义解析的一种基本形式是案例角色分析(语义角色标记),它识别诸如源或目的地的角色。高级语义解析用谓词逻辑或其他形式语言表示一个句子,用于自动推理。

摘要

在这一章中,您已经熟悉了最常见的受控词汇和本体,因此除了正确的类和属性之外,您还可以为您的项目确定合适的词汇和本体。您知道如何用 RDF 建模语句,用有向图表示它们,用 RDF/XML 或 Turtle 编写它们,以及用 RDFa、Microdata 或 JSON-LD 注释它们。

下一章将向您展示如何从结构化数据创建数据集,并将它们链接到其他数据集,使您的数据集成为链接开放数据云的一部分。

参考

DMOZ—the Open Directory Project. www.dmoz.org . Accessed 20 March 2015.   Cyganiak, R., Wood, D., Lanthaler, M. (eds.) (2014) RDF 1.1 Concepts and Abstract Syntax. World Wide Web Consortium. www.w3.org/TR/rdf11-concepts/ . Accessed 18 January 2015.   Gandon, F., Schreiber, G. (eds.) (2014) RDF 1.1 XML Syntax. World Wide Web Consortium. www.w3.org/TR/rdf-syntax-grammar/ . Accessed 18 January 2015.   Carothers, G., Seaborne, A. (2014) RDF 1.1 N-Triples. A line-based syntax for an RDF graph. World Wide Web Consortium. www.w3.org/TR/n-triples/ . Accessed 18 January 2015.   Bizer, C., Cyganiak, R. (2014) RDF 1.1 TriG. RDF Dataset Language. World Wide Web Consortium. www.w3.org/TR/trig/ . Accessed 18 January 2015.   Carroll, J. J., Stickler, P. (2004) RDF Triples in XML. HP Laboratories. www.hpl.hp.com/techreports/2003/HPL-2003-268.pdf . Accessed 18 January 2015.   Klyne, G., Carroll, J. J., McBride, B. (eds.) (2014) RDF 1.1 Concepts and Abstract Syntax. World Wide Web Consortium. www.w3.org/TR/rdf11-concepts/ . Accessed 18 January 2015.   Sindice (2014) Sindice Web Data Inspector. Sindice Ltd. http://inspector.sindice.com . Accessed 18 January 2015.   King, R., Çelik, T. (2012) hCalendar Creator. http://microformats.org/code/hcalendar/creator.html . Accessed 20 March 2015.   Çelik, T. (2005) hCard Creator. The Microformats Community. http://microformats.org/code/hcard/creator . Accessed 18 January 2015.   Casserly, C. et al (eds.) (2015) Licenses. Creative Commons. http://creativecommons.org/about/licenses/ . Accessed 14 April 2015   Mullenweg, M., Çelik, T. (2004) XFN 1.1 Creator. Global Multimedia Protocols Group. http://gmpg.org/xfn/creator . Accessed 18 January 2015.   Mullenweg, M. (2014) Exefen. http://ma.tt/tools/exefen.php/ . Accessed 18 January 2015.   Adida, B., Birbeck, M., McCarron, S., Herman, I. (eds.) (2013) RDFa Core 1.1—Second Edition. Syntax and processing rules for embedding RDF through attributes. World Wide Web Consortium. www.w3.org/TR/rdfa-core/ . Accessed 18 January 2015.   Sporny, M. (ed.) (2012) RDFa Lite 1.1. World Wide Web Consortium. www.w3.org/TR/rdfa-lite/ . Accessed 18 January 2015.   Herman, I. (2014) RDFa Core Initial Context. World Wide Web Consortium. www.w3.org/2011/rdfa-context/rdfa-1.1 . Accessed 18 January 2015.   Adida, B., Birbeck, M., McCarron, S., Herman, I. (eds.) (2012) Completing incomplete triples. In RDFa Core 1.1. www.w3.org/TR/2012/REC-rdfa-core-20120607/#s_Completing_Incomplete_Triples . Accessed 18 January 2015.   Rixham, N., Birbeck, M., Herman, I. (2012) RDFa API. World Wide Web Consortium. www.w3.org/TR/rdfa-api/ . Accessed 18 January 2015.   Hickson, I. (2013) HTML Microdata. World Wide Web Consortium. www.w3.org/TR/microdata/ . Accessed 18 January 2015.   Hickson, I. (ed.) (2013) HTML Microdata. World Wide Web Consortium. www.w3.org/TR/microdata/#using-the-microdata-dom-api . Accessed 18 January 2015.   Sporny, M., Longley, D., Kellogg, G., Lanthaler, M., Lindström, N. (2014) JSON-LD 1.0. World Wide Web Consortium. www.w3.org/TR/json-ld/ . Accessed 18 January 2015.   Longley, D., Kellogg, G., Lanthaler, M., Sporny, M. (2014) JSON-LD 1.0 Processing Algorithms and API. World Wide Web Consortium. www.w3.org/TR/json-ld-api/ . Accessed 18 January 2015.   Das, S., Sundara, S., Cyganiak, R. (eds.) (2012) R2RML: RDB to RDF Mapping Language. World Wide Web Consortium. www.w3.org/TR/r2rml/ . Accessed 18 January 2015.   Brickley, D., Guha, R. V. RDF Schema 1.1. World Wide Web Consortium. www.w3.org/TR/rdf-schema/ . Accessed 18 December 2014.   Dean, M., Schreiber, G. (eds.), Bechhofer S, van Harmelen F, Hendler J, Horrocks I, McGuinness DL, Patel-Schneider PF, Stein LA (2004) OWL Web Ontology Language Reference. World Wide Web Consortium. www.w3.org/TR/owl-ref/ . Accessed 18 January 2015.   Hitzler, P., Krötzsch, M., Parsia, B., Patel-Schneider, P. F., Rudolph, S. (eds.) (2012) OWL 2 Web Ontology Language—Primer 2nd ed. World Wide Web Consortium. www.w3.org/TR/owl-primer/ . Accessed 18 January 2015.   Motik, B., Grau, B. C., Horrocks, I., Wu, Z., Fokoue, A., Lutz, C. (eds.), Calvanese, D., Carroll, J., De Giacomo, G., Hendler, J., Herman I., Parsia, B., Patel-Schneider, P. F., Ruttenberg, A., Sattler, U., Schneider, M. (2012) OWL 2 Web Ontology Language—Profiles. World Wide Web Consortium. www.w3.org/TR/owl2-profiles/ . Accessed 18 January 2015.   Herman, I. (2010) “Why OWL and not WOL?” Tutorial on Semantic Web Technologies. World Wide Web Consortium. www.w3.org/People/Ivan/CorePresentations/RDFTutorial/Slides.html#%28114%29 . Accessed 18 January 2015.   Patel-Schneider, P. F., Horrocks, I. (eds.) (2004) Abstract Syntax. In: OWL Web Ontology Language. Semantics and Abstract Syntax. World Wide Web Consortium. www.w3.org/TR/2004/REC-owl-semantics-20040210/syntax.html . Accessed 18 January 2015.   Motik, B., Patel-Schneider, P. F., Parsia, B. (eds.), Bock, C., Fokoue, A., Haase, P., Hoekstra, R., Horrocks, I., Ruttenberg, A., Sattler, U., Smith, M. (2012) OWL 2 Web Ontology Language. Structural Specification and Functional-Style Syntax 2nd Ed. World Wide Web Consortium. www.w3.org/TR/owl-syntax/ . Accessed 18 January 2015.   Motik, B., Parsia, B., Patel-Schneider, P. F. (eds.), Bechhofer, S., Grau, B. C., Fokoue, A., Hoekstra, R. (2012) OWL 2 Web Ontology Language. XML Serialization 2nd Ed. World Wide Web Consortium. www.w3.org/TR/owl-xml-serialization/ . Accessed 18 January 2015.   Horridge, M., Patel-Schneider, P. F. (2012) OWL 2 Web Ontology Language. Manchester Syntax. World Wide Web Consortium. www.w3.org/TR/owl2-manchester-syntax/ . Accessed 18 January 2015.   Dean, M., Schreiber, G. (eds.), Bechhofer S, van Harmelen F, Hendler J, Horrocks I, McGuinness DL, Patel-Schneider PF, Stein LA (2004) Properties. In: OWL Web Ontology Language Reference. World Wide Web Consortium. www.w3.org/TR/owl-ref/#Property . Accessed 18 January 2015.   Miles, A., Bechhofer, S. (2009) SKOS Simple Knowledge Organization System Reference. World Wide Web Recommendation. www.w3.org/TR/skos-reference/ . Accessed 18 January 2015.   Footnotes 1

其他三种格式更高级,因为它们可以使用任何外部词汇表中的概念。

2

除了微格式(如 hAtom、hCalendar、hCard 和 hReview)之外,还有几种 web 技术将 ISO 8601 日期格式应用于日期时间表示,如 XML、XML schema 数据类型、RDF 和 Atom。

3

vCard 的符号BEGIN:VCARD是 hCard 中的class="vcard"N:class="n"FN:class="fn",以此类推。

4

如果省略n但存在fnn的值将等于fn的值。

5

网址(统一资源标识符,URI),国际化网址(国际化资源标识符,IRI),或压缩网址(压缩 URI,居里)

6

在 HTML5 中,大多数网页设计者使用属性最小化,省略属性值(即使无关),这在 XHTML5 中是不允许的。换句话说,在 HTML5 中,你可以在 container 元素上写itemscope而不用值,而在 XHTML5 中你写itemscope="itemscope",它更冗长更精确,并且验证为 HTML5 和 XHTML5。XHTML5 语法贯穿全书。

7

itemref属性不是微数据数据模型的一部分,纯粹是注释网页组件的语法结构,对于这些组件来说,创建树结构并不简单,例如,一个表,其中的列表示项目,而单元格表示属性。

8

数据类型也可以用rdfs:Datatype来表示,比如xsd:integer rdf:type rdfs:Datatype .或者用rdf:datatype来表示,比如rdf:datatype=" http://www.w3.org/2001/XMLSchema#string "

9

对不出现在公理左侧的概念名称的否定。

10

在 OWL Lite 和 OWL DL 中。在 OWL-Full 中,它们是等价的。

三、链接开放数据

在与传统 Web 的孤立数据仓库的合同中,语义 Web 将开放数据互连,以便所有数据集都有助于全球数据集成,连接来自不同领域的数据,如人、公司、书籍、科学出版物、电影、音乐、评论、电视和广播节目、医学、统计、在线社区和科学数据。结构化数据集的联合形成了链接开放数据云,这是语义网的分散核心,软件代理可以在其中自动找到实体之间的关系,并做出新的发现。链接数据浏览器允许用户浏览数据源,并通过使用特殊(类型化)链接,沿着链接导航到其他相关数据源。链接数据搜索引擎通过跟踪数据源之间的链接来爬行数据网络,并提供对聚集数据的表达性查询能力。为了支持新型应用的数据处理,链接开放数据(LOD)被搜索引擎、政府、社交媒体、出版机构、媒体门户、研究人员和个人所使用。

关联数据原则

传统的网页是用超链接(或简单的链接)连接的超文本文档。这些超链接指向其他文档或其他文档的一部分;但是,它们不保存有关源资源和目标资源之间的关系类型的信息。虽然可以使用linka和区域标记元素上的rel属性来注释链接关系,但是它们适用于注释外部 CSS 文件、脚本文件或 favicon。如前所述,一些微格式如rel="tag"和 XFN 也声明链接关系。其他特定的关系类型可以在 Atom syndication 格式和 XLink 中定义。在语义 Web 上,可以使用rdf:type或其他序列化中的等效物(如 RDFa 中的datatype属性)来键入链接,从而为源和目的地资源之间的任意关系提供机器可解释的定义。那些从不同的资源中导出的结构化数据集被发布,它们之间具有这种类型化的链接,这些数据集被称为链接数据(也称为链接数据)。

Berners-Lee 概述了使用语义网技术,以人类和机器可读的方式在网上发布和链接数据的四个链接数据原则,以便所有发布的数据都成为单一全球数据空间的一部分。

Use URIs as names for the “things” of the Web of Data (real-world objects and people). In other words, a dereferenceable Uniform Resource Identifier (URI), such as a web address, is assigned to each resource rather than an application-specific identifier, such as a database key or incremental numbers, making every data entity individually identifiable.   Note

可取消引用的 URIs 必须符合 HTTPRange-14。多年来,HTTPRange-14 一直是语义 Web 的一个设计问题,因为当 HTTP 从仅引用文档扩展到引用“事物”(真实世界的对象和人)时,HTTP GET 的域变得不确定,导致语义 Web 资源的模糊解释。解决方法是检查 web 服务器对GET请求的响应,如果一个 HTTP 资源用 2xx 响应,那么那个 URI 标识的资源就是信息资源;如果是 303(参见其他)响应,则由该 URI 标识的资源可以是任何资源。4xx(错误)响应意味着资源的性质未知 [3 ]。

Use HTTP URIs, so that people can look up the resource names. In other words, provide the URIs over the HTTP protocol into RDF representations for dereferencing.   When someone looks up a URI, provide useful information using Semantic Web standards, such as RDF. By providing metadata about the published data, clients can assess the quality of published data and choose between different means of access.   Include links to other URIs, so that users can discover related information. When RDF links are set to other data resources, users can navigate the Web of Data as a whole by following RDF links.

越来越多的组织、企业和个人认识到关联数据的好处。一些已经实现了 LOD 的工业巨头有 Amazon.com、BBC、脸书、Flickr、Google、Thomson Reuters、纽约时报公司和 Yahoo!,仅举几例。

关联数据的五星部署方案

发布关联数据(遵循关联数据原则)并不能保证数据质量。例如,LOD 数据集中 URIs 指向的文档可能是难以重用的文档。指向一个完全机器可解释的 RDF 文件不同于指向一个包含表格作为扫描图像的 PDF 文件。五星评级系统用于表示未开放的链接数据和开放的链接数据(同时开放数据和链接数据)的质量 [4 ]。五星评级系统是累积性的,这意味着在每个级别上,数据都必须满足基础级别标准之外的附加标准 [5 ]:

| ★ | 由于特定于供应商的文件格式或缺乏结构,数据在网上可以以任何格式获得,这些格式是人类可读的,但不是机器可解释的。以下所有星号旨在使数据更容易发现、使用和理解。例如,PDF 文件中表格数据的扫描图像是一星数据。数据的可重用性是有限的。 | | ★★ | 数据以机器可读的结构化数据的形式提供。例如,保存在 Excel 文件中的表格数据是两星数据。 | | ★★★ | 数据以非专有(独立于供应商)的格式提供。例如,保存为 CSV 文件的表格数据是三星数据。 | | ★★★★ | 使用 W3C 的开放标准(RDF 和 SPARQL)发布。例如,带有使用 URIs 的 RDFa 注释的 HTML 中的表格数据是四星数据。 | | ★★★★★★□ | 以上所有内容加上与其他相关数据的链接提供了上下文。例如,带有使用 URIs 和语义属性的 RDFa 注释的 HTML 中的表格数据是五星数据。最大的可重用性和机器可解释性。 |

许可提供的权利表达使得免费数据重用成为可能。没有明确的开放许可 1 (如公共领域许可)的链接数据不能自由重用,但链接数据的质量与许可无关。当满足指定的标准时,所有五个分级都可以用于链接数据(用于没有显式开放许可的链接数据)和链接开放数据(具有显式开放许可的链接数据)。因此,五星评级系统可以用这样一种方式来描述,即标准可以在有或没有开放许可证的情况下阅读。例如,链接开放数据杯既可以读取五星链接开放数据的绿色标签,也可以读取五星链接数据的绿色标签,如图 3-1 所示。例如,作为机器可读结构化数据提供的链接数据是两星链接数据,而具有开放许可证的链接数据是两星链接开放数据。

A978-1-4842-1049-9_3_Fig1_HTML.jpg

图 3-1。

The requirements of 5 ★ Linked Data and 5 ★ Linked Open Data

因为将一个 CSV 文件转换为一组 RDF 三元组并将它们链接到另一组三元组并不一定会使数据对人类或机器更可用,即使是四星和五星链接的开放数据也有许多挑战。挑战之一是缺乏出处信息,现在可以使用 PROV-O ontology [6 ]等标准提供关于链接(开放)数据的信息。另一个挑战是查询不使用词汇表中的机器可读定义的链接数据,这很难并且几乎不可能用软件代理来解释。此外,从词汇和本体中检索的定义的质量变化很大,并且所使用的词汇可能不会限制所使用的类和角色对其预期含义的潜在解释。

LOD 数据集

根据链接开放数据原则,覆盖感兴趣领域的 RDF 三元组的有意义集合称为 LOD 数据集。LOD 数据集收集感兴趣领域内实体的描述,这些描述通常共享一个共同的 URI 前缀(例如, http://dbpedia.org/resource/ )。最大数据集的作者提供了高级功能,可以轻松访问他们的结构化数据,例如数据集的可下载压缩文件或用于高效查询的基础架构。

RDF 爬行

类似于系统地浏览传统网站以进行索引的网络爬虫,语义网络爬虫浏览语义内容以提取结构化数据并自动发现看似不相关的实体之间的关系。LOD 数据集应该以一种可以通过 RDF 爬行获得的方式发布。

RDF 转储

最流行的 LOD 数据集定期发布为可下载的压缩文件(通常是 Gzip 或 bzip2),称为 RDF dump,这是数据集的最新版本。RDF 转储应该是有效的 RDF 文件。RDF 转储文件被压缩的原因是包含数百万个 RDF 三元组的数据集非常大。Gzip 压缩的 RDF 转储的大小大约是每 1000 万个三元组 100MB,但它也取决于数据集的 RDF 序列化。表 3-1 总结了最流行的 RDF 转储。

表 3-1。

Popular RDF Dumps

| 资料组 | RDF 转储 | | --- | --- | | DBpedia(数据库管理员) | [`http://wiki.dbpedia.org/Downloads2014`](http://wiki.dbpedia.org/Downloads2014) | | 维基数据 | [`http://dumps.wikimedia.org/wikidatawiki/`](http://dumps.wikimedia.org/wikidatawiki/) | | 地名 | [`http://download.geonames.org/all-geonames-rdf.zip`](http://download.geonames.org/all-geonames-rdf.zip) | | LinkedGeoData | [`http://downloads.linkedgeodata.org/releases/`](http://downloads.linkedgeodata.org/releases/) | | 打开目录 | [`http://rdf.dmoz.org/`](http://rdf.dmoz.org/) | | 开放音乐百科全书 | ??`ftp://ftp.musicbrainz.org/pub/musicbrainz/data/` |

SPARQL 端点

类似于 MySQL 中的关系数据库查询,语义数据集的数据也可以通过强大的查询进行检索。专门为 RDF 数据集设计的查询语言被称为 SPARQL(读作“sparkle”,它代表 SPARQL 协议和 RDF 查询语言),这将在第七章中详细讨论。一些数据集提供了 SPARQL 端点,这是一个可以直接运行 SPARQL 查询的地址(由后端数据库引擎和 HTTP/SPARQL 服务器提供支持)。

常用的关联数据集

LOD 数据集发布于各种领域。跨学科数据集,如 DBpedia ( http://dbpedia.org )和 WikiData ( http://www.wikidata.org )是通用数据集,因此是最常用的数据集。地理应用可以受益于诸如 GeoNames ( http://www.geonames.org )和 LinkedGeoData ( http://linkedgeodata.org )的数据集。越来越多的大学以链接数据和 RDF 转储的形式提供有关员工、院系、设施、课程、资助和出版物的信息,如佛罗里达大学( http://vivo.ufl.edu )和根特大学( http://data.mmlab.be/mmlab )。诸如普林斯顿大学图书馆( http://findingaids.princeton.edu )之类的图书馆将书目信息发布为链接数据。匈牙利国家数字数据档案的一部分可在 http://lod.sztaki.hu 作为链接数据获得。甚至古腾堡计划也可以作为关联数据使用( http://wifo5-03.informatik.uni-mannheim.de/gutendata/ )。大英博物馆等博物馆将其部分记录发布为关联数据( http://collection.britishmuseum.org )。新闻和媒体巨头将主题词作为链接数据发布,例如纽约时报 http://data.nytimes.com 。MusicBrainz ( http://dbtune.org/musicbrainz/ )提供关于音乐艺术家及其专辑的数据,作为链接数据并通过 SPARQL 端点提供。关于音乐人、音乐专辑发行和评论的数据由 BBC Music 在 www.bbc.co.uk/music 发布为链接数据,这在很大程度上基于 MusicBrainz 和音乐本体。位于 http://www.linkedmdb.org 的链接电影数据库(LinkedMDB)是一个专用于电影的 LOD 数据集,具有与其他 LOD 数据源和电影相关网站的高质量和高数量的链接。越来越多的政府门户网站将公开可用的政府数据作为链接数据发布,例如,美国政府的 http://data.gov 或英国政府的 http://data.gov.uk 。以下部分将讨论一些最流行的 LOD 数据集。

DBpedia(数据库管理员)

schema.org 上的数百个概念定义适用于注释常见的知识领域,如人、事件、书籍和电影,但复杂的机器可读语句需要更多。

A978-1-4842-1049-9_3_Fig3a_HTML.jpg

位于 http://dbpedia.org 的 DBpedia 从维基百科文章中提取结构化的事实数据,如标题、信息框、类别和链接。因为维基百科包含近 500 万篇英文文章,所以 DBpedia 适合以机器可读的方式描述几乎任何东西。DBpedia 包含大约 340 万个由 10 亿个三元组描述的概念。

Note

Wikipedia 信息框对于 DBpedia 提取来说是最直接的,因为它们包含相应 Wikipedia 页面的属性-值对,以表格形式显示在文章的右侧,作为最重要事实的总结。然而,结构化数据提取具有挑战性,因为维基百科上的模板系统随着时间的推移而变化,导致缺乏统一性,从而相同的属性具有不同的名称,如placeofbirthbirthplace

DBpedia 的唯一资源标识符被写成形式为 http://dbpedia.org/resource/Name 的 URI 引用,其中Name源自形式为 http://en.wikipedia.org/wiki/Name 的维基百科文章的 URL。因此,每个资源都是维基百科文章的直接映射。建立 http://dbpedia.org/resource/Resource:Name 形式的 DBpedia URI 引用(通过内容协商,其中相同的内容以不同的格式提供,这取决于客户端的查询)以在语义 web 代理访问时返回 RDF 格式的机器可读描述,以及在传统 Web 浏览器访问时返回 XHTML 格式的相同信息(参见图 3-2 )。

A978-1-4842-1049-9_3_Fig2_HTML.gif

图 3-2。

DBpedia resources return XHTML or RDF through content negotiation

假设我们想用 RDF 描述一个住在阿德莱德的语义 Web 研究者,他对 Web 标准感兴趣,并且是 W3C 的成员。为此,我们需要相应的 DBpedia URIs 来标识声明为rdf:resource属性值的非信息资源(形式为 http://dbpedia.org/resource/Resource:name )(见清单 3-1 )。

Listing 3-1. Linking to DBpedia Resources

<?xml version="1.0" encoding="UTF-8"?>

<rdf:RDF A978-1-4842-1049-9_3_Fig3aa_HTML.jpg

xmlns:foaf="http://xmlns.com/foaf/0.1/"

xmlns:contact="``http://www.w3.org/2000/10/swap/pim/contact#``"

xmlns:rdf="``http://www.w3.org/1999/02/22-rdf-syntax-ns#

<foaf:person rdf:about="http://www.lesliesikos.com/datasets/sikos.rdf#sikos

<foaf:name>Leslie Sikos</foaf:name>

<foaf:based_near``rdf:resource="http://dbpedia.org/resource/Adelaide"

<foaf:topic_interest``rdf:resource="http://dbpedia.org/resource/Web_standards"

<contact:nearestAirport``rdf:resource="http://dbpedia.org/resource/Adelaide_Airport"

</foaf:person>

<rdf:Description``rdf:about="http://dbpedia.org/resource/W3C"

<foaf:member rdf:resource="http://www.lesliesikos.com/datasets/sikos.rdf#sikos

</rdf:Description>

</rdf:RDF>

DBpedia 的 SPARQL 端点是 http://dbpedia.org/sparql ,在这里可以对 DBpedia 资源进行查询,比如说 20 世纪以前在布达佩斯出生的人的名单(参见清单 3-2 )。使用 SPARQL 查询将在后面的第七章中描述。

Listing 3-2. A SPARQL Query on DBpedia

PREFIX dbo: <http://dbpedia.org/ontology/

SELECT ?name ?birth ?death ?person WHERE {

?person dbo:birthPlace :Budapest .

?person dbo:birthDate ?birth .

?person foaf:name ?name .

?person dbo:deathDate ?death .

FILTER (?birth < "1901-01-01"^^xsd:date) .

}

ORDER BY ?name

维基数据

Wikidata 是最大的 LOD 数据库之一,它以人类可读和机器可读的内容为特色,位于 http://www.wikidata.org 。Wikidata 包含来自 Wikimedia 项目(如 Wikimedia Commons、Wikipedia、Wikivoyage 和 Wikisource)的结构化数据,以及来自曾经流行的可直接编辑的 Freebase 数据集的结构化数据,产生了大约 1300 万个数据项。

与许多其他 LOD 数据集相比,Wikidata 是协作性的——任何人都可以创建新项目和修改现有项目。像维基百科一样,维基数据是多语言的。Wikidata repository 是结构化数据的中央存储,通过它,不仅可以直接访问数据,还可以通过客户端 Wikis 访问数据。数据被添加到以标签为特征的项目中,标签是通过站点链接连接的描述性别名。每个项目的特征在于由属性和属性值组成的语句。Wikidata 支持 Lua Scribunto 解析器扩展,允许在 MediaWiki 中嵌入脚本语言,并通过客户端 Wiki 访问 Wikidata 中存储的结构化数据。还可以使用 Wikidata API 检索数据。

地名

GeoNames 是一个位于 http://www.geonames.org 的地理数据库,提供全球超过 750 万个地理特征的 RDF 描述,对应超过 1000 万个地理名称。所有要素都被归类为九个要素类之一,并被细分为 645 个要素代码之一。地名以多种语言储存在数据库中。GeoNames 还包含纬度和经度、海拔、人口、行政区划和城市邮政编码等数据。坐标以制图、大地测量和导航中使用的世界大地测量系统 1984 (WGS84)标准表示。

GeoNames 资源使用 303(参见其他)重定向将概念(事物现状)与描述资源的文档区分开来。例如,阿德莱德市在地名上有两个地址: http://sws.geonames.org/2078025/http://sws.geonames.org/2078025/about.rdf 。第一个代表城市(在链接数据引用中使用的表单中);第二份是一份关于阿德莱德的文件。

LinkedGeoData

http://linkedgeodata.org 处的 LinkedGeoData 数据集使用 OpenStreetMap 数据(一种免费的可编辑世界地图)收集的信息,使其作为 LOD 数据集可用,并将该数据与其他 LOD 数据集链接。数据集的作者在 http://browser.linkedgeodata.org 提供了自己的语义浏览器,称为 LGD 浏览器和编辑器(见图 3-3 )。

A978-1-4842-1049-9_3_Fig3_HTML.jpg

图 3-3。

LinkedGeoData in the LGD Browser and Editor

语义网上不含糊的一个很好的例子是在 LGD 浏览器中搜索“Adelaide”。因为南澳大利亚有一个这个名字的城市,南非还有一个,美国有三个(科罗拉多州一个,爱达荷州一个,华盛顿一个),软件会要求澄清,并根据你的选择提供城市地图和细节(见图 3-4 )。

A978-1-4842-1049-9_3_Fig4_HTML.jpg

图 3-4。

Linked Data is unambiguous

八歧龙

YAGO(又一个伟大的本体论)是一个数据集,包含超过 1000 万个实体和 1.2 亿个关于它们的事实,这些是从维基百科类别、重定向和信息盒中自动提取的;词汇数据库 WordNet 中的同义词和上下义关系;和地名。

A978-1-4842-1049-9_3_Fig3b_HTML.jpg

与从 LOD 数据集中自动提取数据的其他数据集相比,YAGO 更加准确,因为大部分事实是手动评估的。YAGO 实体和事实通常与 DBpedia 本体相关联。YAGO 的 SPARQL 端点是 http://lod2.openlinksw.com/sparql ,但是在 https://gate.d5.mpi-inf.mpg.de/webyagospotlx/WebInterface 也可以通过 web 界面执行查询。

LOD 数据集集合

LOD 数据集可以使用位于 http://datahub.io 的 Datahub 进行注册和管理,这是一个开放的数据注册中心。政府、研究机构和其他组织使用数据中心。datahub.io 以结构化数据为动力,提供高效的搜索和分面,浏览用户数据,使用地图、图形和表格预览数据。正如您将看到的,datahub.io 注册表是将 LOD 云图的新数据集与现有数据集合并的先决条件。

Ontobee,可在 http://www.ontobee.org 获得,是一个基于 SPARQL 的链接本体数据服务器和浏览器,已经被 100 多个本体使用,包含超过 200 万个本体术语。

LOD 云图

LOD 云图表示至少有 1000 个 RDF 三元组的数据集以及它们之间的链接(图 3-5 ) [7 )。气泡的大小对应于每个数据集中存储的数据量。在云的中间,你可以看到最大的数据集,DBpedia 和 GeoNames,其次是 FOAF 档案,Freebase 和 W3C。

A978-1-4842-1049-9_3_Fig5_HTML.jpg

图 3-5。

The LOD Cloud Diagram (courtesy of Max Schmachtenberg, Christian Bizer, Anja Jentzsch and Richard Cyganiak)

如果您有一个足够大的数据集,至少包含 1,000 个三元组,并且满足链接开放数据的要求,您可以请求将其添加到 LOD 云图表中。数据集的资源必须具有可解析的http://https:// URIs,无论有无内容协商,都可以将 RDF 数据解析为 RDFa、RDF/XML、Turtle 或 N-Triples。数据集必须通过至少 50 个 RDF 链接连接到图中的任意数据集。数据集必须可以通过 RDF 爬行、RDF 转储或 SPARQL 端点来访问。数据集必须在 Datahub 上注册,并且你必须给 LOD 云图的作者发电子邮件(richard@cyganiak.demail@anjajentzsch.de)。

斯坦福大学的 Protovis 使用 CKAN API 创建了 LOD 云图的另一种可视化,并在 http://inkdroid.org/lod-graph/ 发布(见图 3-6 )。

A978-1-4842-1049-9_3_Fig6_HTML.jpg

图 3-6。

The LOD Graph generated by Protovis

CKAN 评级由颜色表示,平均评级高的数据集显示为绿色,平均评级低的数据集显示为红色。颜色的强度表示收到评级的数量,白色表示没有评级,颜色越深,评级越高。

创建 LOD 数据集

虽然大型数据集是通过软件工具生成的,但在以下部分中,您将看到如何手动创建 LOD 数据集。

RDF 结构

让我们用 RDF/XML 创建一个数据集文件!第一步是创建一个扩展名为.rdf的 UTF-8 编码的文本文件,并添加 XML prolog(参见清单 3-3 )。

Listing 3-3. XML Prolog

<?xml version="1.0" encoding="UTF-8"?>

文档内容将在<rdf:RDF></rdf:RDF>之间。名称空间列表被声明为rdf:RDF上的xmlns属性。例如,如果您想使用 FOAF 词汇表中的任何定义,您必须声明它的名称空间,以便在整个文档中缩写它(参见清单 3-4 )。

Listing 3-4. The Main Container with One Namespace Declaration

<rdf:RDF xmlns:foaf="http://xmlns.com/foaf/0.1/

</rdf:RDF>

从现在开始,您可以使用foaf前缀来缩写朋友的朋友(FOAF)名称空间,如清单 3-5 所示。

Listing 3-5. Using the foaf Prefix to Abbreviate the FOAF Namespace

<foaf:Person rdf:about="http://www.lesliesikos.com/metadata/sikos.rdf#sikos

<foaf:firstname rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Leslie A978-1-4842-1049-9_3_Fig3ad_HTML.jpg

</foaf:firstname>

<foaf:surname rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Sikos</foaf:surname>

</foaf:Person>

名称空间列表通常由 RDF、RDFS、OWL 等等以及都柏林核心、schema.org 等等的名称空间声明来扩展。,这取决于您在数据集中使用的词汇术语(参见清单 3-6 )。在开发过程中,该列表会不断扩展。

Listing 3-6. Multiple Namespace Declarations

<rdf:RDF A978-1-4842-1049-9_3_Fig3ae_HTML.jpg

xmlns:dc="http://purl.org/dc/elements/1.1/"

xmlns:dcterms="http://purl.org/dc/terms/"

xmlns:foaf="http://xmlns.com/foaf/0.1/"

xmlns:owl="``http://www.w3.org/2002/07/owl#``"

xmlns:rdf="``http://www.w3.org/1999/02/22-rdf-syntax-ns#``"

xmlns:rdfs="``http://www.w3.org/2000/01/rdf-schema#``"

xmlns:schema="http://schema.org/

在命名空间列表之后,可以提供数据集信息,包括许可,然后是数据集的实际数据(RDF 语句),这些数据将通过类型化链接链接到其他 LOD 数据集的类和实体。

批准

没有明确许可的链接开放数据只是链接数据。为了使我们的 LOD 数据集真正“开放”,我们必须显式声明许可证,这可以防止潜在的法律责任问题,并让用户清楚地知道什么使用条件适用。

数据集的许可信息可以在数据集文件或外部元数据文件中提供,例如 VoID(互连数据集的词汇表)文件。发布数据集所依据的许可证可以使用dcterms:license属性来声明。链接开放数据最常用的许可 URIs 如下:

  • http://opendatacommons.org/licenses/pddl/ 公共领域专用和许可(PDDL)——“数据/数据库的公共领域”
  • http://opendatacommons.org/licenses/by/ 开放数据共享空间归属(ODC-By)——“数据/数据库归属”
  • http://opendatacommons.org/licenses/odbl/ 开放数据库许可证(ODC-ODbL)——数据/数据库归属共享
  • https://creativecommons.org/publicdomain/zero/1.0/ CC0 1.0 通用—《知识共享公共领域弃权声明》
  • https://creativecommons.org/licenses/by-sa/4.0/ 知识共享署名共享(CC-BY-SA)
  • http://gnu.org/copyleft/fdl.html GNU 自由文档许可证(GFDL)

前四个许可是专门为数据设计的,因此强烈建议将它们用于 LOD 数据集许可。数据集的许可是一个复杂的问题,因为数据集是事实的集合,而不是创造性的作品,所以适用不同的法律。知识共享和 GPL 在网络上相当普遍;然而,它们是基于版权的,并且是为创造性作品而设计的,而不是数据集,因此当应用于数据集时,它们可能不会产生预期的法律结果。

社区规范(非约束性的使用条件)可以使用waiver:norms属性( http://vocab.org/waiver/terms/norms )来表示。一个常见的社区规范是 ODC 属性共享( www.opendatacommons.org/norms/odc-by-sa/ ),它允许使用数据集中的数据,但更改和更新也应该是公开的,包括给出的信用、链接的数据源、使用的开放格式以及没有应用 DRM。例如,如果我们有一个根据开放数据共享公共领域专用和许可条款发布的ExampleLOD数据集,并且鼓励用户遵守上述社区规范,但没有法律约束,数据集的许可如清单 3-7 所示。

Listing 3-7. LOD Dataset Licensing Example

<?xml version="1.0" encoding="UTF-8"?>

<rdf:RDF A978-1-4842-1049-9_3_Fig3al_HTML.jpg

xmlns:dcterms="http://purl.org/dc/terms/"

xmlns:rdf="``http://www.w3.org/1999/02/22-rdf-syntax-ns#``"

xmlns:wv="http://vocab.org/waive/terms/

<rdf:Description rdf:about="http://www.examplelod.com/loddataset.rdf#examplelod

<dcterms:license rdf:resource="??http://www.opendatacommons.org/odc-public-domain-

??

<wv:norms rdf:resource="http://www.opendatacommons.org/norms/odc-by-sa/

<wv:waiver rdf:datatype="http://www.w3.org/2001/XMLSchema#string">To the extent

possible under law, Example Ltd. has waived all copyright and related or neighboring A978-1-4842-1049-9_3_Fig3aq_HTML.jpg

rights to this dataset.</wv:waiver>

</rdf:Description>

Note

Datahub 注册要求从下拉列表中选择开放许可证作为字段值,并将许可证 URI 作为单独的字段设置为数据集属性,而不仅仅是数据集或 VoID 文件中提供的许可信息。

RDF 语句

数据集最通用的对象被收集在rdf:description容器中。那些已经在机器可读词汇表中定义的真实世界对象的表示通常被收集在相应的对象类下(在schema:person中的人,在schema:book中的书,等等)。因为链接开放数据的一个基本要求是用一个不可引用的 web 地址来标识所有东西,所以要确保地址和片段标识符是正确的。尽可能使用键入来区分字符串、数字、日期等。

对另一个陈述进行陈述称为具体化。它允许在多个上下文中使用三元组,但会影响数据集的形式语义。

连结

政府机构、大型企业、 2 媒体机构、社交媒体门户和研究人员处理大量数据,这些数据可以表示为结构化数据并作为链接数据发布。在 RDF 中描述政府数据、大学研究部门、同事、书籍或任何其他知识领域都会产生一个孤立的数据集文件,在链接到其他数据集之前,它不是语义网的一部分。

在语义网的结构化数据集之间创建链接被称为互连,这使得孤立的数据集成为 LOD 云的一部分,在 LOD 云中,所有资源都相互链接。这些链接使语义代理能够在数据源之间导航并发现额外的资源。链接通常发生在owl:sameAsrdfs:seeAlsofoaf:holdsOnlineAccountsioc:user以及类似的谓词上。与(X)HTML 文档的传统超链接不同,LOD 链接是两个资源之间的类型化链接。链接的主体和客体的 URIs 标识了被链接的资源。谓词的 URI 定义了链接的类型。例如,一个 RDF 链接可以说明一个人受雇于一家公司,而另一个 RDF 链接可以说明这个人认识其他人。解引用链接目的地的 URI 会产生链接资源的描述,通常包含指向其他相关 URIs 的额外 RDF 链接,这些链接也可以被解引用,依此类推。

考虑一下《Web Standards: Mastering HTML5、CSS3 和 XML,at http://www.masteringhtml5css3.com/metadata/webstandardsbook.rdf#book 这本书的机器可读描述,它使用来自 Dublin Core 词汇表的title属性声明了书名,并且在许多其他属性中,使用schema:author声明了描述作者的机器可读资源(图 3-7 )。可以使用rdfs:seeAlso来声明与该书相关的更多资源。

A978-1-4842-1049-9_3_Fig7_HTML.gif

图 3-7。

Linking a dataset to a related entity of another dataset

作者的 DBpedia 资源揭示了作者的属性,例如使用foaf:homepage定义的他的主页地址,以及在许多其他分类中,将作者链接到澳大利亚作家,以及 YAGO(图 3-8 )。

A978-1-4842-1049-9_3_Fig8_HTML.gif

图 3-8。

The DBpedia resource links the dataset to another dataset

基于yago:AustralianWriters,语义代理将找到同一类别的其他作者(图 3-9 )。通过链接到 LOD 云图上已经存在的数据集(例如指向 DBpedia 上的定义),您的数据集将成为 LOD 云的一部分。

A978-1-4842-1049-9_3_Fig9_HTML.gif

图 3-9。

Two RDF graphs sharing the same URI merge

巨型全局图,蒂姆·伯纳斯·李创造的数据网络的另一个名字,是所有自动合并的 LOD 图的超级图。

注册数据集

要考虑包含在 LOD 云图中,您的数据集必须在 http://datahub.io 上注册。为了能够注册,您需要与 Datahub 上已有的公司或研究机构有关联,或者如果它尚未注册,您必须请求新的公司注册。LOD 云图的候选数据集通过四个符合性级别进行验证。

级别 1(基本合规性)需要关于数据集的基本元数据,包括名称、标题、URL、作者和联系电子邮件,以及添加到 Datahub 上数据集的lod标记。第 2 级(最小符合性)需要数据集的主题标签,它可以是下列标签之一:mediageographiclifesciencespublicationsgovernmentecommercesocialwebusergeneratedcontentschematacrossdomain。您必须在Data and Resources部分提供一个链接 URI 与example/serialization_format ( example/rdf+xmlexample/turtleexample/ntriplesexample/x-quadsexample/rdfaexample/x-trig)的示例,以帮助人们在决定使用您的数据之前对其有所了解。您还必须提供到数据集的转储文件或 SPARQL 端点的链接。级别 3(完全符合)需要附加信息,例如数据集的最后修改日期或版本(作为字段version的值)、数据集描述(notes)、数据集的开放许可(从下拉菜单中选择)、LOD 气泡的简称(shortname)、数据集许可的链接(license_link)以及实例名称空间(namespace)。除了这些自定义字段之外,第 3 级遵从性还需要元数据,例如 VoID 文件(meta/void格式)、XML 站点地图(meta/sitemap格式)、RDF 模式(meta/rdf-schema格式)和词汇映射(mapping/format)。根据您是否使用顶级域中定义的专有词汇,您必须添加no-proprietary-vocab标记(您不使用专有词汇),或者添加deref-vocab标记(使用可解除引用的专有词汇)或no-deref-vocab标记(使用不可解除引用的专有词汇)。一旦您准备好数据集注册,您可以使用 http://validator.lod-cloud.net/ 来验证它。

Note

自从引入 LOD 云图以来,Datahub LOD 验证器使用的一些 CKAN/Datahub 字段已经被更改或停止使用。因此,验证器可能会给出错误,即使是在正确注册的数据集上。如果数据集出现这种情况,您必须通过电子邮件联系 LOD 云图表的作者,以获得人工批准。

最后一步是给作者发电子邮件(richard@cyganiak.demail@anjajentzsch.de)。LOD 云图表的作者使用更多的标签来注释您的数据集是否有任何问题,或者何时可以添加到 LOD 云图表的下一次更新中。4 级符合性意味着您的数据集已经由使用该组生成 LOD 云图的作者审查并添加到lodcloud组。

链接数据可视化

关联数据可视化工具使关联数据的分析和操作变得更加容易。链接数据可视化技术的列表包括但不限于值的比较、关系和层次的分析、时间或地理事件的分析、作为标签云或短语网络的基于文本的可视化,以及表示多维数据。

LOD 可视化( http://lodvisualization.appspot.com )可以使用从实时访问到 SPARQL 端点的树状图和树来生成可视化的层次结构。LodLive ( http://en.lodlive.it )提供了链接数据资源的图形可视化。单击节点可以展开图形结构。LodLive 可用于实时访问 SPARQL 端点(参见图 3-10 )。

A978-1-4842-1049-9_3_Fig10_HTML.jpg

图 3-10。

Browsing the Web of Data with LodLive

可从 https://gephi.github.io/ 下载的开源图形可视化和操作软件包 Gephi 是关联数据可视化的理想选择。该程序帮助探索和理解图形,修改表示,并操纵结构、形状和颜色来揭示隐藏的属性(见图 3-11 )。

A978-1-4842-1049-9_3_Fig11_HTML.jpg

图 3-11。

Advanced graph visualization with Gephi

Gephi 由复杂的布局算法驱动,专注于质量(基于力的算法)或速度(通过图形粗化进行多级细化)。异步 OpenGL exploration 引擎支持平面渲染和 3D 渲染,具有可定制的细节级别和多线程。软件工具的另一个引擎称为映射引擎,支持细化、矢量渲染和 SVG 输出,非常适合发布和绘制信息图。突出显示选项使处理大型图表变得容易。可以通过选择、移动、注释、调整大小、连接和分组节点来修改图形。通过使用动态过滤的可视化,非常强大的实时图形可视化支持最多具有 50,000 个节点和 100 万条边的网络以及迭代。

摘要

在本章中,您学习了关联开放数据的概念和要求,以及将数千个 LOD 数据集相互关联的行业。你现在明白语义代理如何基于机器可读的对象和主题的定义,以及它们之间的类型化链接,做出新的发现。您学习了 LOD 数据集的结构、许可和互连。

下一章将向您介绍语义开发工具,包括本体编辑器、推理机、语义标注器、提取器、软件库、框架和 API。

参考

Bizer, C., Heath, T., Berners-Lee, T. Linked data—The story so far. Semantic Web and Information Systems 2009, 5(3):1–22.   Berners-Lee, T. (2006) Linked Data—Design Issues. www.w3.org/DesignIssues/LinkedData.html . Accessed 25 March 2014.   Fielding, R. T. (2005) httpRange-14 Resolved. http://lists.w3.org/Archives/Public/www-tag/2005Jun/0039.html . Accessed 28 March 2015.   The Open Definition—Defining Open in Open Data, Open Content and Open Knowledge. http://opendefinition.org . Accessed 18 January 2015.   Hausenblas, M. (2012) 5 ★ Open Data. http://5stardata.info . Accessed 18 January 2015.   Lebo, T., Sahoo, S., McGuinness, D. (eds.) (2013) PROV-O: The PROV Ontology. www.w3.org/TR/prov-o/ . Accessed 27 March 2015.   Schmachtenberg, M., Bizer, C., Jentzsch, A., Cyganiak, R. (2014) The LOD cloud diagram. http://lod-cloud.net . Accessed 18 January 2015.   Berners-Lee, T. (2007) Giant Global Graph | Decentralized Information Group (DIG) Breadcrumbs. http://dig.csail.mit.edu/breadcrumbs/node/215 . Accessed 28 March 2015.   Footnotes 1

这种许可概念也在传统网络上使用,其中术语开放数据指的是免费许可。

2

如果链接的数据位于公司防火墙之后,则称为链接企业数据。

四、语义化 Web 开发工具

从半结构化数据中提取和操作 RDF 以及编写客户端应用来处理 RDF 数据是常见的任务,使用软件工具可以使这些任务变得更加简单和高效。Web 设计人员和搜索引擎优化(SEO)专家通常会生成机器可读的注释,或者将现有的结构化数据转换为不同的序列化。虽然可以在任何文本编辑器中编辑网站标记,但在处理语义注释时,需要一些高级功能,因此高级文本编辑器是一个基本工具。标注器可用于语义标注 web 页面,RDFizers 可用于将文本、HTML 和 XML 文档转换成 RDF。用 Java、JRuby、Clojure、Scala、Python 和其他编程语言编写语义 Web 应用的应用开发人员经常使用集成开发环境,其中许多环境支持语义软件库的集成。本体编辑器在本体工程中被广泛部署和使用,其中许多也支持推理。关联数据软件工具对于提取关联数据、可视化关联数据互连以及导出和发布关联数据非常有用。语义 web 浏览器可以显示从网页中提取的结构化数据,根据智能手机上的地理空间数据生成地图,并提供传统 Web 浏览器中不具备的高级导航和交互功能。

高级文本编辑器

与微软 word 或 OpenOffice.org Writer 等文字处理软件相比,纯文本编辑器不能用于文档格式化,但它们适用于创建和修改网页。然而,基本的文本编辑器对于网页设计来说并不方便,因为它们缺少一些重要的特性。例如,它们中的许多不能正确处理控制字符和空白。最广为人知的例子就是 Windows 下的记事本和 Linux 下的 vi。写字板等高级文本编辑器提供文本格式和其他附加功能。一些高级文本编辑器也是源代码编辑器,带有专门为网页设计师和软件工程师设计的附加工具。虽然不适合结构化数据转换或 LOD 处理,但高级文本编辑器是每个语义 Web 开发人员工具箱中的基本程序,因为它具有如下高级功能:

  • 全面的字符编码支持,包括完整的 Unicode 支持
  • 空白字符支持
  • 控制字符支持,例如,CR+LF (Windows)、LF only (UNIX)和 Apple (CR only)换行
  • 带标签的多文件编辑
  • 用于语法突出显示的可定制颜色模式(HTML、CSS、XML、 1 脚本等)
  • 退回/重做
  • 强制自动换行
  • 加行号
  • 自动缩进
  • 标签对和元素嵌套指南
  • 操作系统集成(将应用添加到右击菜单)

所选择的编辑器应该至少与您的一个浏览器集成为默认的源代码编辑器,您可以使用该编辑器通过热键(通常是 Ctrl+U)打开当前呈现的 web 文档。文本编辑器还有一些附加的功能,这些功能并不重要,但是很有用。

  • 自定义颜色和字体设置
  • 可定制的工具栏
  • 拼写检查器
  • 模板
  • 书签
  • 完全支持拖放
  • 内置 FTP 客户端或与 FTP 客户端集成
  • 转换(大写、小写、颠倒大小写和首字母大写)
  • 国际版本(对某些开发人员来说可能比较方便)
  • 支持在远东亚洲语言中使用的双字节字符系统(DBCS),如中文或日语(如果需要)
  • 浏览器预览(启动默认或选定的 web 浏览器进行调试和测试)

一些最著名的高级文本编辑器是 Windows 的 EditPlus 和 NotePad++(免费、开源),Linux 的 BlueFish [2 和 Komodo Edit [3 ,Mac OS 的 BBEdit [4 和 TextWrangler [5 ]。一个全面的跨平台编辑器是 Arachnophilia,它适用于 Windows、Linux、Unix、FreeBSD 和 Mac OS [6 ]。

作为一个例子,让我们看看 Notepad++的主要特性。这是一个多文件编辑器,具有方便的文件管理器选项。Notepad++只需一次单击即可保存多个文件,打开最近编辑过的文件,并为每个打开的文件提供选项卡。它有一个完全可定制的界面,具有高级功能,如线条标记、打开和关闭标签对的指南、折叠或显示当前编辑的 DOM 树级别的结构化指南以及语法高亮显示(见图 4-1 )。

A978-1-4842-1049-9_4_Fig1_HTML.jpg

图 4-1。

Syntax highlighting and tag pair guides in Notepad++

语法高亮支持多种编程和 web 开发语言,从 HTML 到 XML,从 PHP 到 Ruby。有几个预定义的颜色主题可供选择,或者您可以根据自己的喜好创建新的主题。不同的文档组件(缩进参考线、标记、标记、空白、标签对、活动和非活动标签等)可以单独设置样式。记事本++可以改变文件的文字方向。它还支持各种字符编码,可以添加和删除字节顺序标记,支持大端和小端 Unicode 文件,并将文件从一种编码转换为另一种编码。 2 应用中打开的文档可以在任何安装的浏览器中预览。

Notepad++还提供了高级的文本转换功能,例如转义某些字符、将小写字符转换为大写字符(反之亦然)、搜索匹配字符串、将十进制数字转换为十六进制数字、插入当前日期和时间、对列表进行升序或降序排序、自动将前导空格转换为制表符等等。Notepad++也支持宏,可以多次运行。特性列表可以通过额外的插件来扩展,例如 Base64 编码和解码的 MIME 工具。

语义标注器和转换器

虽然所有机器可读的元数据注释都有可用的模板,而且您也可以从头开始手动编写它们,但是您可以使用软件工具来评估您的代码,提供您的标记的人类可读部分的预览,以及提取 RDF 三元组,生成您的结构化数据的 RDF 图,和/或将注释转换为其他格式,这可能非常方便,因为有大量的 RDF 序列化。

RDFa 播放

RDFa Play 是一个实时的 RDFa 1.1 编辑器、数据可视化器和调试器,可在 http://rdfa.info/play/ 获得。它接受原始 RDFa 输入,为人类可读的数据生成实时预览,并从三元组生成一个图(参见图 4-2 )。如果修改代码,RDFa Play 会重新生成浏览器预览和图形。

A978-1-4842-1049-9_4_Fig2_HTML.jpg

图 4-2。

Live browser preview and graph in RDFa Play

RDFa Play 提供了使用 schema.org 的人员、事件和地点的 RDFa 注释示例,用 FOAF 表示的个人数据,用 GoodRelations 表示的产品描述,以及用 SVG 表示的 Dublin Core 元数据。

RDFa 1.1 蒸馏器和解析器

W3C 的 RDFa 1.1 Distiller 和 Parser at http://www.w3.org/2012/pyRdfa/ 处理包含 RDFa 的 HTML 标记,并将三元组转换为 Turtle、RDF/XML、JSON-LD 或 N-Triples。RDFa 1.1 Distiller 和 Parser 是用 Python 编写的,由 RDFLib ( https://rdflib.readthedocs.org )提供支持。它接受在线 RDFa 代码片段、上传的文件以及复制和粘贴的 RDFa 注释。文件上传和直接输入支持的主机语言有 HTML5+RDFa、XHTML+RDFa、SVG+RDFa、Atom+RDFa 和 XML+RDFa。

RDF 蒸馏器

位于 http://rdf.greggkellogg.net/distiller 的 RDF Distiller 将 RDF 图、阅读器和编写器集成到 Ruby 项目中。distiller 可以用来在不同的 RDF 序列化之间转换数据。web 界面提供了一个表单,该表单通过 URI 接收用户输入,或者作为 JSON、JSON-LD、HTML5 微数据、N3、N-Quads、N-Triples、RDFa、RDF/XML、TRiG、TRiX 或 Turtle 中的直接输入,并将代码转换为任何格式(参见图 4-3 )。

A978-1-4842-1049-9_4_Fig3_HTML.jpg

图 4-3。

RDFa to Turtle conversion in RDF Distiller

Distiller 可以自动检测输入格式,也可以从下拉列表中明确选择。

DBpedia 聚焦

DBpedia Spotlight 是一个用纯文本 [7 ]注释 DBpedia 概念的工具。它有三个基本功能:注释、消歧和标记候选项。DBpedia Spotlight 的 web 应用通过 DBpedia 资源注释可视化用户输入(参见图 4-4 )。

A978-1-4842-1049-9_4_Fig4_HTML.jpg

图 4-4。

Annotation with DBpedia Spotlight

RESTful 的、基于 SOAP 的 web API 公开了注释和消除实体歧义的功能。注释 Java/Scala API 公开了执行注释或消除歧义的底层逻辑。索引 Java/Scala API 执行必要的数据处理,以启用所使用的注释或歧义消除算法。

谷歌结构化数据测试工具

位于 http://www.google.com/webmasters/tools/richsnippets 的 Google 结构化数据测试工具适用于机器可读的元数据测试,包括微格式、RDFa 和 HTML5 微数据注释在线或通过直接输入。直接输入的代码长度限制为 1500 个字符。该工具提供了谷歌在搜索引擎结果页面(SERPs)上对你的网站的预览,以及提取的结构化数据,如项目、类型和属性(见图 4-5 )。

A978-1-4842-1049-9_4_Fig5_HTML.jpg

图 4-5。

Triples extracted by the Google Structured Data Testing Tool

该工具可以识别不完整的三元组,并在缺少任何强制属性时提供简短的解释。Google 结构化数据测试工具也指出了不属于用于对象的词汇表的属性。

Note

如果特定对象类型的某些属性缺失,Google 不会在搜索引擎结果页面上使用机器可读的元数据注释。例如,只有当你不仅提供了name,而且还提供了以下三个属性中的至少两个时,一个 hCard 描述才会被 Google 使用:organizationlocationrole,而代码有效性即使你省略了它们也是可以实现的。

该工具为应用、作者、事件、音乐、人、产品、产品报价、食谱和评论提供了机器可读的元数据示例;但是,您必须登录您的 Google 帐户来检索示例的 HTML 标记。所有其他功能无需登录即可使用。

RDFizers

那些将应用和网站数据转换成 RDF 的软件工具被称为 RDFizers。它们可以用于一次性迁移工作,或者作为语义 Web 软件工具(如 OpenLink Data Explorer)的中间件组件来实现。RDFizers 通常以软件库的形式提供。

阿帕奇 Any23

Apache any To Triples(any 23)是一个 Java 库、RESTful web 服务和命令行工具,可在 https://any23.apache.org 获得。Any23 从各种 Web 文档中提取结构化数据,包括 RDF 序列化,如 RDF/XML、Turtle、Notation 3 和 RDFa 微格式,如 Adr、Geo、hCalendar、hCard、hListing、hRecipe、hReview、License、XFN 和 SpeciesHTML5 微数据;JSON-LD;CSV(例如,从 Microsoft Excel 导出的逗号分隔值);以及诸如 Dublin Core、DOAP、FOAF、GeoNames、开放图形协议、schema.org 和 vCard 等词汇。Any23 也可以用于数据转换,如 Turtle 到 N-Triples。

Apache Any23 可以执行代码质量保证的验证。如果检测到不正确的 HTML 元素嵌套,它会自动修复 DOM 结构。Any23 不仅可以识别结构化标记元素,还可以识别meta标签和 RDFa 注释。例如,如果一个 RDFa 注释缺少前缀映射,RDFa 解析器将会发现它脱离了上下文,并且不能处理它。为了解决这个问题,Apache Any23 提供了Validator类来实现一个Rule先决条件,当匹配时,将触发Fix方法来纠正代码。

由于其全面的特性,Any23 在主要的语义 Web 应用中实现,如 Sindice。

文本工程通用架构(GATE)

由谢菲尔德大学开发的开源文本处理器工具文本工程通用架构(GATE)使用自然语言处理(NLP)方法从文本文件 [8 ]生成 RDF。GATE 的本体插件提供了一个 API 来操作 OWL-Lite 本体,可以序列化为 RDF 和 RDFS。如果使用 OWL-DL 本体,通常会显示 OWL-Lite 支持的限制的子类,但不会显示其他限制的子类。类似地,普通的 RDF/RDFS 文件也不会正确显示,因为 API 无法表示 RDF 中允许但 OWL-Lite 中不允许的许多结构。

OpenRefine

OpenRefine 是一个工具,用于探索大型数据集,清理数据并将数据从一种格式转换为另一种格式,协调和匹配数据,用 web 服务扩展数据,并将数据链接到 LOD 数据库 [9 ]。使用 OpenRefine,您可以使用正则表达式对数据进行筛选和分区,对全文字段使用命名实体提取来自动识别主题,以及使用通用 Refine 表达式语言执行高级数据操作。

本体编辑器

本体编辑器是专门为本体工程设计的软件工具。它们涵盖了本体开发所有主要阶段的共同任务,即它们

  • 确定领域和范围。本体将覆盖的知识领域是什么?潜在的实施领域是什么?它打算回答什么类型的问题?
  • 考虑重用。评估相似知识领域的其他本体。
  • 列举重要术语。为所选的知识领域创建一个全面的术语列表,而不关注类层次结构、属性、重叠术语或关系。
  • 定义类和类层次结构。
  • 定义属性和属性的特征。定义属性类型,包括简单的属性和与类、域和范围的关系,以及通用、存在和基数限制。
  • 创造个体。

受保护的

斯坦福大学的 Protégé是应用最广泛的开源本体编辑器和知识管理工具集,可以从 http://protege.stanford.edu 下载。它支持诸如 HermiT 和 FaCT++等推理器来验证本体的一致性,以及各种其他插件。Protégé最初是作为一个学习健康系统开发的,用于将原始生物医学数据转换为机器可读数据以进行决策,现在适用于建模、本体驱动的应用开发和协作本体工程。本体可以以多种格式导出,比如 RDFS 和各种 OWL 语法。

虽然可以通过图形用户界面(GUI)在 Protégé中创建本体,但该软件是基于 Java 的,因此当它被执行时,它会在一个单独的窗口中打开 GUI 后面的命令行(参见图 4-6 )。在 Protégé中创建的本体可以通过 Protégé-OWL API 从 Java 程序中访问。

A978-1-4842-1049-9_4_Fig6_HTML.jpg

图 4-6。

Protégé’s command line

Protégé的 GUI 具有主菜单、地址栏和基于选项卡的编辑器(见图 4-7 )。

A978-1-4842-1049-9_4_Fig7_HTML.jpg

图 4-7。

Protégé’s Graphical User Interface

在文件菜单中,您可以创建一个新的空本体,或者从离线或在线.owl文件中打开一个本体。本体可以保存为多种格式,包括 RDF/XML、OWL/XML、OWL 函数语法、曼彻斯特语法、OBO(开放生物医学本体格式)、KRSS2(知识表示系统规范 v2)、Latex 或 Turtle。可以从该菜单下载 Protégé可用的各种插件,也可以更新已安装的插件。

在文件➤首选项下,您可以处理隐藏的注释 uri。为了更容易地自动生成本体的类、属性和个体的唯一标识符,您可以为特定的本体设置或修改实体 URIs 的结构。一旦你设置了本体的基本 URI,本体的所有片段标识符都将以这个地址开始,以后可以随时修改(在文件➤首选项中的新本体标签)。如果在创建本体之后必须更改地址结构,这将非常有用,因为开发人员不必逐个手动更改成百上千个地址。默认的基本 URI 可以是您选择的 web 地址,并且路径可以选择性地包括实际的年、月和日。基本 URI 通常以#结尾,但如果需要的话,这可以更改为/或:(“文件➤”首选项中的“新实体”选项卡)。但是,数字符号是默认设置,因为它创建有效的片段标识符。您可以将实体 URIs 的结尾设置为任意名称,这是默认选择。如果要使用自动生成的标识符,可以设置实体标签,包括自定义 URIs 和全局唯一的前缀或后缀。

OWLViz 是一个默认安装的 Protégé插件,支持 OWL 本体的类层次结构的图形化表示,以及以树结构表示的类之间的导航(文件➤首选项中的 OWLViz 选项卡)。OWLViz 使得断言的类层次结构和推断的类层次结构的比较成为可能。默认情况下,Protégé会在程序启动时自动检查插件更新,这也可以禁用(“文件”“➤”偏好设置中的“插件”标签)。默认的插件存储库设置为 GitHub,可以更改。“文件➤”首选项中的“推理器”选项卡可以显示或隐藏类、对象属性、数据属性和对象推理,或者通过设置预计算任务(如启动推理器时要完成的分类或实现)来初始化推理器。通过设置自动扩展深度限制(默认值为3)和自动扩展子计数限制(默认值为50),可以在文件➤首选项中的树首选项下自动扩展树层次结构。默认情况下,自动树扩展是禁用的。通过单击文件➤首选项右下角的重置首选项…按钮,可以恢复在任何选项卡上意外执行的更改。

核心功能和视图通过选项卡提供。Active Ontology 选项卡显示一般的本体元数据,如标题、创建者、描述,以及重用的本体和关于本体度量的统计数据,如公理、类、对象属性、个体等的数量。Protégé还显示在打开的本体中使用的所有前缀。Protégé具有一个用于实体、类、对象属性、数据属性、注释属性和个人的专用选项卡。类层次结构显示为树形结构,其中每个节点可以单独打开或关闭。选定的实体、类或属性详细信息显示在单独的面板中。类描述提供了关于等价类、子类、类公理、成员等的信息。,以及更改值或添加新值的选项。Protégé中的类是Thing的子类,默认情况下是重叠的。可以从“工具”菜单创建类层次结构。对象或数据类型属性可以有子属性或相反的属性。这些属性可以是功能性的、传递性的、对称的、非对称的、自反的或非自反的。Protégé自动更新逆属性(比如一个家族关系本体中的hasChildisSonOf)。

“对象特性”和“数据特性”选项卡也有一个“特性”面板。对于对象属性,“特征”面板具有用于FunctionalInverse functionalTransitiveSymmetricAsymmetricReflexiveIrreflexive属性的复选框。Individuals 选项卡不仅显示了类层次结构,还显示了成员列表和属性断言。OntoGraf 选项卡提供了本体任何部分的可视化表示(见图 4-8 )。当您将鼠标悬停在图形的任何部分时,Protégé会显示片段标识符,以及子类/超类(如果有)。

A978-1-4842-1049-9_4_Fig8_HTML.jpg

图 4-8。

Graph visualization in Protégé

SPARQL 查询选项卡提供了执行 SPARQL 查询的界面。Protégé枚举前缀,提供可编辑的SELECT查询模板,您可以修改或删除该模板,并添加任意查询。

Protégé在 http://webprotege.stanford.edu 也有网络版,有协作支持。

语义工程

Altova 的 SemanticWorks 是一个可视化语义 Web 编辑器,具有图形化的 RDF 和 RDFS 编辑器以及图形化的 OWL 编辑器,支持 OWL-Lite、OWL-Full 和 OWL-DL 方言 [10 ]。SemanticWorks 提供了语法和格式检查选项,以及与错误直接链接的本体语义评估。根据所使用的序列化,上下文相关的输入帮助器显示有效输入选项的列表。SemanticWorks 可以生成 RDF/XML 和 N-Triples 格式的代码,并将 RDF/XML 转换为 N-Triples,反之亦然。该程序具有 RDF 和 OWL 图的打印选项。可以使用智能快捷方式定义新的类实例。实例、属性和类被组织在选项卡上,并且类似于软件工程环境,属性和属性值也可以通过单独的子窗口来操作。当编辑大型、复杂的图表时,当图表的当前显示部分被指示为红色矩形时,Overview 子窗口非常有用。您可以随时在图和代码视图之间切换。

顶辫作曲家

TopQuadrant 的 TopBraid Composer 是一个用于数据建模和语义数据处理的图形化开发工具。免费标准版支持 RDF、RDFS、OWL 和 SPARQL 等标准,还支持可视化编辑和查询,以及数据转换 [11 ]。商业 Maestro 版提供了一个模型驱动的应用开发环境 [12 ]。Composer 还是一个 RDFizer,它可以将 Excel 电子表格转换成 RDF 模式的实例。

TopBraid Composer 可以打开以 RDF/XML 或 Turtle 序列化的本体,将 RDFa 数据源、RSS 或 Atom 新闻提要以及电子邮件导入 RDF。它可以连接到 SPARQL 端点以及 RDBMS 源,导入制表符分隔的电子表格文件和 Excel 电子表格、在线 RDF 和 OWL 文件、UML 文件、XML 模式和 XML 目录。向导将指导您创建新项目,例如分面项目资源、来自 CSV 文件的项目、JavaScript 项目、静态 web 项目以及 XML 编辑和验证。您可以使用 RDFa 和 HTML5 微数据注释创建标记文件,并开发语义 web 应用和到耶拿 SDB 数据库、耶拿 TDB 数据库、Oracle 数据库和 Sesame 2 存储库的 RDF/OWL 文件连接。图形用户界面具有用于类、可视化表示(图表和图形)和源代码、属性、文件系统导航、导入和“篮子”的面板(参见图 4-9 )。

A978-1-4842-1049-9_4_Fig9_HTML.jpg

图 4-9。

Ontology editing with TopBraid Composer Maestro

在 Classes 面板上,您可以在以树状结构表示的本体中导航,创建和删除类,创建子类和兄弟类,按名称空间对组件进行分组,以及按名称进行搜索。除了属性操作,属性面板还集成了 GoogleMaps。在 Imports 面板上,可以显示资源及其rdf:typerdfs:labelrdfs:comment值(如果提供的话),以及规则、实例、错误、SPARQL 查询和文本搜索。在“暂存架”面板上,您可以从文本文件加载内容,也可以将内容保存到文本文件。添加选定的资源;添加匹配的属性;添加子类、子属性、实例、个体和取消引用资源。并执行批处理操作。

阿帕哈奇·斯坦布尔

Apache Stanbol 是一个语义数据建模器和全面的本体管理器 [13 ]。

A978-1-4842-1049-9_4_Fig4a_HTML.jpg

它包括一个内容管理系统,支持语义 web 服务和 Web 应用功能,如标签提取、搜索字段中的文本完成和基于提取的实体的电子邮件路由。Stanbol 组件的功能可以通过 RESTful web 服务 API 获得。RESTful 服务返回 RDF、JSON 和 JSON-LD 格式的结果。Apache Stanbol 可以作为一个独立的应用(打包成一个 runnable JAR)运行,也可以作为一个 web 应用(打包成.war)运行,部署在 servlet 容器中,比如 Apache Tomcat。它兼容 Apache 框架,如 Solr(用于语义搜索)、Tika(用于元数据提取)和 Jena(用于存储)。

Stanbol 有一个内置的 RDFizer,它处理 POST 请求中发送的传统 web 内容,内容类型在 Content-type 头中指定,并向其中添加语义信息(“RDF 增强”),以 Accept 头中指定的格式序列化。

Stanbol 还提供了一个推理器组件,它实现了一个通用的 API,并通过基于 OWLApi 和 Jena 的抽象服务支持不同的推理器和配置,实现了 Jena RDFS、OWL、OWLMini 和 HermiT。推理器模块可以执行一致性检查,如果数据一致,则返回 HTTP 状态 200,如果不一致,则返回 204。推理机也可以用于分类,换句话说,物化所有推断出的rdf:type语句。语义丰富具体化了所有推断的陈述。

Apache Stanbol 本体管理器通过互连不同本体中表示的看似不相关的知识、本体库、中央本体储存库以及常见的本体工程任务(如推理和规则执行)来支持多个本体网络。Stanbol 还可以存储和缓存语义信息,并通过其持久性服务使其可搜索。

流畅的编辑器

Fluent 编辑器是一个本体编辑器,可以处理 RDF、OWL、SWRL 文件 [14 ]。Fluent Editor 使用一种专有的表示语言和与语义网标准兼容的查询语言。这个工具是为管理复杂的本体而设计的。它有一个推理器窗口、一个查询 SPARQL 窗口、一个 XML 预览窗口、一个分类树视图和一个注释窗口。Fluent Editor 有两种类型的插件:Protégé互操作性插件,它支持向 Protégé导出数据和从 protégé导入数据;R 语言插件,它支持使用 R 和 rOntorion 开发分析模型,以及使用 R 语言开发 Fluent Editor 的插件。

本体分析工具

存在用于本体映射的软件工具和通用本体编辑器不支持的特定本体工程任务,例如语义相似性估计。

拉远

ZOOMA 是一个应用,使用映射库 [15 ]来发现最佳的本体映射和文本值到本体术语的自动映射。ZOOMA 可以重用数据库中已经断言的映射,探索最适合多个映射的映射,通过记录上下文信息导出更好的映射,并建议新的术语。可以自动处理通常观察到的值。

ZOOMA 会自动找到所有最佳映射,每次一个文本值映射到同一组术语。当使用映射存储库时,它可以检测错误,换句话说,它可以找到所有可能不正确的文本值到本体术语的映射。ZOOMA 还可以根据输入值提出新的术语映射;然而,选择最佳映射需要人工评估和评价。ZOOMA 可以很容易地用作软件库,例如,在 Apache Maven 项目中。

语义度量库

语义度量库(Semantic Measures Library,SML)是一个用于语义度量分析的 Java 库,例如通过使用本体来定义术语或概念之间的距离来估计语义相似性和相关度 [16 ]。SML 的功能也可以通过一套名为 SML 工具包的命令行工具来访问。该库支持 RDF 和 RDFS、OWL 本体、WordNet(一个词汇数据库)、医学主题词(MeSH,一个用于生命科学出版的受控词汇)、基因本体等等。

推理者

推理机从现有的本体中获得新的事实,并检查本体的完整性。由于为描述逻辑推理实现的算法不同,各种软件工具在推理特性、实际可用性和性能方面是不同的。不是所有的推理机都能评估所有可能的推论,所以它们的健全性和完备性各不相同。一些本体支持将本体与规则相结合的规则。推理机的一个共同特征是 ABOX 推理,个体的推理包括实例检查、合取查询回答和一致性检查。高级推理器支持 OWL API,这是一个使用 OWL 推理进行应用开发的标准接口。高级推理机的另一个特性是 OWLLink 支持,利用实现中立的协议与 OWL 2 推理机进行交互。

隐士

HermiT 是最流行的 OWL 2 推理机之一,可用于确定本体一致性,识别类之间的关系,并执行进一步的任务 [17 ]。HermiT 使用自己的算法,称为“hypertableau”演算,来检查 OWL 本体的一致性,并识别类之间的包含关系。隐士可以通过命令行或者在 Java 应用中被用作门徒插件(见图 4-10 )。最新的 Protégé版本带有预装的隐士插件。从命令行,您可以执行分类、查询和其他常见的推理任务。至于 Java 应用,HermiT 支持来自 OWL API 的 OWLReasoner 接口,提供对 OWL API 对象的访问,比如本体和类表达式。

A978-1-4842-1049-9_4_Fig10_HTML.jpg

图 4-10。

The HermiT reasoner running in Protégé

小球

Clark & Parsia 的 Pellet 是一个 OWL 2 DL 推理器,可以在 Protégé、Jena、TopBraid Composer 中使用,也可以通过 OWL API 接口 [18 ]在 Java 程序中使用。它基于 tableau 算法将复杂的语句分解成更小更简单的片段来检测矛盾,并支持表达性描述逻辑。Pellet 支持不同的增量推理,包括增量一致性检查和增量分类,其中更新(添加或删除)可以被处理并应用于本体,而不必从头执行所有的推理步骤。佩莱也支持用 SWRL 规则进行推理。它提供合取查询应答,并支持 SPARQL 查询。Pellet 通过 Jena 和 OWL API 推理本体。Pellet 也支持 bug 的解释。

事实++

FaCT++是一个基于 tableaux 的 OWL 2 DL 推理机 3 [19 。它可以用作描述逻辑分类器和模态逻辑可满足性测试。它为可表达的描述逻辑实现了一个可靠和完整的 tableau 算法。FaCT++可以作为一个独立的工具、一个被保护的插件来使用,并且可以通过 OWL API 在应用中使用。

比赛者

Racer(重命名为 ABox 和概念表达式推理器)是一个用于构建基于本体的应用的服务器端推理器,可通过 Java 和公共 Lisp API[20]获得。Racer 不仅提供了标准的推理机制,还提供了逻辑推理。它为描述逻辑 SRIQ (D) 实现了高度优化的 tableau 演算。Racer 支持 RDF 数据描述和 OWL 2 本体的一致性检查,可以同时打开多个本体进行本体合并。它可以找到由本体的公理归纳出的隐含子类关系,并找到属性、类或实例的同义词。Racer 可以通过 SPARQL 查询从 OWL/RDF 文档中检索信息,还支持增量查询。它支持事实优化技术以及对数量限制和 ABoxes 的优化。

应用开发框架

软件库中收集了最常见的编程任务,因此您不必编写经常使用的代码。例如,在语义 Web 应用中,一个常见的任务是将 RDF 文件从一种序列化转换为另一种序列化,这可以通过 Apache Jena 等工具轻松完成。这种软件库可以在各种环境中使用,例如通过命令行或作为集成开发环境(IDE)如 Eclipse 或 NetBeans 的插件。

耶那

Apache Jena 是一个开源的语义网和链接数据应用开发框架,支持以 RDF [21 ]编写的结构化数据的存储、检索和分析。

A978-1-4842-1049-9_4_Fig4b_HTML.jpg

Jena 的核心 RDF API 有专门的方法来提取 RDF 语句的主语、宾语和谓语,比如返回语句的ResourcegetSubject()RDFNodegetObject()和返回语句的PropertygetPredicate()。使用 Jena RDF API,您可以轻松地创建和操作 RDF 图,这些图在 Jena 中被称为模型,由Model接口表示。例如,使用 RDF API 描述一个人,首先定义对象的 URI 或主题和字符串(参见清单 4-1 ,然后使用createDefaultModel()方法创建一个空的、基于内存的Model(参见清单 4-2 )。

Listing 4-1. Constant Declaration in Jena

static String personWebsite  = "http://www.lesliesikos.com

static String personName = "Leslie Sikos";

Listing 4-2. Creating a Memory-Based Model

Model model = ModelFactory.createDefaultModel();

将使用Model创建资源(参见清单 4-3 )。

Listing 4-3. Creating a Resource

Resource lesliesikos = model.createResource(personWebsite);

最后,使用addProperty向资源添加一个属性(参见清单 4-4 )。

Listing 4-4. Adding Property to a Resource

lesliesikos.addProperty(FOAF.Name, personName);

为了从 RDF 图(Jena 模型)中检索语句,可以使用listStatements()方法(参见清单 4-5 )。

Listing 4-5. Extracting RDF Triples

StmtIterator iter = model.listStatements();

如果您需要更多的细节,您可以列出 RDF 图中所有的谓词、主题和对象,如清单 4-6 所示。

Listing 4-6. Listing All Triple Components Individually

while (iter.hasNext()) {

Statement stmt      = iter.nextStatement();

Resource  subject   = stmt.getSubject();

Property  predicate = stmt.getPredicate();

RDFNode   object    = stmt.getObject();

System.out.print(subject.toString());

System.out.print(" " + predicate.toString() + " ");

if (object instanceof Resource) {

System.out.print(object.toString());

} else {

System.out.print(" \"" + object.toString() + "\"");

}

System.out.println(" .");

}

Jena 支持 SPARQL 查询,包括通过 JDBC 驱动程序框架的 SPARQL。事实上,它可以使用 Fuseki 通过 HTTP 提供 RDF 数据,fuse ki 是一个 SPARQL 服务器,提供 REST 风格的 SPARQL HTTP 更新、SPARQL 查询和 SPARQL 更新 [22 ]。Jena 规则引擎和其他推理算法可以从 RDF 模型中导出结果。推理 API 提供了扩展和检查 triplestore 内容的推理。你不仅可以使用内置的 OWL 和 RDFS 推理器,还可以配置自己的推理规则。Jena 本体 API 可以处理数据模型、RDFS 和 OWL,包括对 OWL 1.1 特性的部分支持。Jena 有自己的高性能 triplestore 组件,称为 TDB,它将三元组直接存储到磁盘,并可以从 Java 虚拟机直接访问。SQL DB 使用关系数据库为 Jena 提供了一个持久的 triplestore,即一个用于 RDF 数据存储和查询的 SQL 数据库。Jena 支持高级文本和空间搜索。Jena 可以集成到 Eclipse 中,Eclipse 是 Java 开发人员常用的软件开发环境。

芝麻

Sesame 是一个用于 RDF 数据分析和 SPARQL 查询的开源框架 [23 ]。Sesame 框架实现的方法与其他语义框架的不同之处在于,它具有可扩展的接口,并且存储引擎与查询接口相分离。Alibaba 是一个芝麻 API,用于将 Java 类映射到本体,并从本体生成 Java 源文件,使得从 Java 直接利用 RSS、FOAF 和 Dublin Core 成为可能。Sesame 将其 RDF triplestore 作为 Java web 应用(.war)提供,可以很容易地部署到 Apache Tomcat 或 Eclipse Jetty 等应用服务器上。它支持基于内存(MemoryStore)和基于磁盘(NativeStore)的存储。RDF triplestore 提供了一个 SPARQL 查询端点。Sesame 可以集成到 Eclipse 和 Apache Maven 等软件开发环境中。

存储库 API 提供了数据文件上传、查询、提取和操作的方法。它的一个实现 SailRepository 将调用转换为您选择的 SAIL 实现,而另一个实现 HTTPRepository 通过 HTTP 提供与 Sesame 服务器的透明客户端-服务器通信。Sesame 最顶层的组件 HTTP 服务器拥有 Java servlets,用于通过 HTTP 访问 Sesame 存储库。使用 Sesame 的存储库 API,您可以直接从您的应用创建一个本地存储库,能够存储、查询和修改 RDF 数据(参见清单 4-7 )。

Listing 4-7. Creating a Basic Local Repository in Sesame

import org.openrdf.repository.Repository;

import org.openrdf.repository.sail.SailRepository;

import org.openrdf.sail.memory.MemoryStore;

Repository repo = new SailRepository(new MemoryStore());

repo.initialize();

这个存储库将使用主内存来存储数据,这是目前最快的 RDF 存储库类型。但是,创建的存储库是易变的,这意味着当对象被垃圾收集或程序执行完成时,内容会丢失。对于持久存储,您需要将数据保存到一个文件中(参见清单 4-8 )。

Listing 4-8. Creating a Local Repository with File Storage in Sesame

import org.openrdf.repository.Repository;

import org.openrdf.repository.sail.SailRepository;

import org.openrdf.sail.nativerdf.NativeStore;

File dataDir = new File("/path/to/datadir/");

Repository repo = new SailRepository(new NativeStore(dataDir));

repo.initialize();

要创建一个具有 RDF 模式推理的存储库,您必须创建一个Repository对象,方法是将一个引用传递给适当的Sail对象(参见清单 4-9 )。

Listing 4-9. Creating a Repository with RDF Schema Inferencing

import org.openrdf.repository.Repository;

import org.openrdf.repository.sail.SailRepository;

import org.openrdf.sail.memory.MemoryStore;

import org.openrdf.sail.inferencer.fc.ForwardChainingRDFSInferencer;

Repository repo = new SailRepository(

new ForwardChainingRDFSInferencer(

new MemoryStore()));

repo.initialize();

如果你使用远程 Sesame 服务器而不是本地的,远程连接必须通过初始化RemoteRepositoryManager来建立(参见清单 4-10 )。

Listing 4-10. Initializing a RemoteRepositoryManager

import org.openrdf.repository.manager.RemoteRepositoryManager;

String serverUrl = "http://localhost:8080/openrdf-sesame";

RemoteRepositoryManager manager = new RemoteRepositoryManager(serverUrl);

manager.initialize();

存储和推理层 API (SAIL)将存储和推理分开。SAIL API 主要由 triplestore 开发人员使用。RIO API 代表“RDF I/O”,包含用于 RDF 序列化的解析器和写入器。解析器可以将 RDF 文件转换成语句,而编写器可以将语句转换成 RDF 文件。RIO API 可以独立于所有其他的 Sesame 组件使用。

RDF 模型 API 定义了 RDF 构建块的表示,如语句、URIs、空白节点、文字、图形和模型。RDF 语句由org.openrdf.model.Statement接口表示,其中每个语句都有一个主语、谓语、宾语和(可选的)上下文。其中每一项都是一个org.openrdf.model.Value,涵盖了org.openrdf.model.Resourceorg.openrdf.model.Literal。每个资源代表一个 RDF 值,它或者是一个空节点(org.openrdf.model.BNode)或者是一个 URI ( org.openrdf.model.URI)。文字表示 RDF 文字值,如字符串、日期和整数。可以使用org.openrdf.model.ValueFactory创建新的三元组和值(参见清单 4-11 )。

Listing 4-11. Using a Default ValueFactory Implementation

ValueFactory factory = ValueFactoryImpl.getInstance();

一旦获得了 ValueFactory,就可以创建新的 URIs、文本和三元组(参见清单 4-12 )。

Listing 4-12. Adding URIs, Literals, and Triples to a ValueFactory Implementation

URI webstand = factory.createURI("http://yourbookdataset.com/webstand

URI title = factory.createURI("http://yourbookdataset.com/title

Literal webstandsTitle = factory.createLiteral("Web Standards");

Statement titleStatement = factory.createStatement(webstand, title, webstandsTitle);

Graph API 将 RDF 图表示为 Java 对象。org.openrdf.model.Graph类处理来自 Java 代码的 RDF 图。可以通过两种方式创建图:通过向图中添加语句以编程方式编写图,或者使用构造查询创建图。空图可以通过创建一个GraphImpl对象来获得(参见清单 4-13 )。

Listing 4-13. Creating an Empty Graph

Graph myGraph = new org.openrdf.model.impl.GraphImpl();

接下来,RDF 语句组件(主谓宾)必须使用ValueFactory对象来创建(参见清单 4-14 )。这使图准备好支持三元组,并将WebDesignBook主语、Title谓语和Web Standards宾语添加到图中。

Listing 4-14. Adding Triple Support to a Graph

ValueFactory myFactory = myGraph.getValueFactory();

String namespace = "``http://www.foo.com/bar#

URI mySubject = myFactory.createURI(namespace, "WebDesignBook");

URI myPredicate = myFactory.createURI(namespace, "Title");

Literal myObject = myFactory.createLiteral("Web Standards");

myGraph.add(mySubject, myPredicate, myObject);

另一种选择是直接使用 URIs 来添加属性(参见清单 4-15 )。

Listing 4-15. Using URIs Directly to Add Triples to a Graph

URI bookClass = myFactory.createURI(namespace, "Book");

URI rdfType = myFactory.createURI(org.openrdf.vocabulary.RDF.TYPE);

mySubject.addProperty(rdfType, bookClass);

集成开发环境

集成开发环境(ide)为高效的语义 Web 应用开发提供了一个接口,包括一个源代码编辑器,其中突出显示了各种编程语言(如 Java 和 Python)的语法。ide 有向导和内置的应用来简化软件开发、文件处理程序和其他工具来支持部署、运行和测试应用。ide 由运行时系统、工作台和其他特性组成,比如远程调试器或数据建模器。

黯然失色

Eclipse 是 Java 开发人员最受欢迎的 IDE 之一,它提供了基本的工具,如 Java IDE、CVS 客户端、Git 客户端、XML 编辑器和 Apache Maven 集成 [24 ]。

A978-1-4842-1049-9_4_Fig4c_HTML.jpg

Eclipse 是使用 Apache Jena 和 Sesame 的流行 ide 之一。Eclipse 的安装可以按如下方式完成:

A prerequisite of Eclipse is the Java Development Kit (JDK). Download it from http://www.oracle.com/technetwork/java/javase/downloads/ and install it (Figure 4-11).

A978-1-4842-1049-9_4_Fig11_HTML.jpg

图 4-11。

Installing the Java Development Kit for Eclipse   Caution

Java 开发工具包不同于 Java 运行时环境(JRE),也称为 Java 虚拟机(JVM),它是一种在您的计算机上运行 Java 程序的安全计算环境。

Visit http://www.eclipse.org and download the installer. Eclipse is available for Windows, Linux, and Mac OS X. The Windows binary is distributed as a ZIP archive, the Linux and the Apple installers as gzipped TAR archives.   Extract the installation files and execute eclipse.exe.   You have to specify a folder for Eclipse project files. If you want to use the same path every time you launch Eclipse, you can set the folder to the default Eclipse project folder.

在 Eclipse 中设置 Apache Jena

一旦安装了 Eclipse,就可以设置 Apache Jena 了。

Go to http://jena.apache.org/download/ , select a download mirror, and download the binary distribution suitable for your platform (.zip or .tar.gz).   Extract the Jena files from the archive.   In Eclipse, select File ➤ New ➤ Java Project.   Right-click the name of the newly created project and select Properties (or select File ➤ Properties).   Select Java Build Path and click the Libraries tab.   Click Add Library… on the right.   Select User Library as the library type (see Figure 4-12).

A978-1-4842-1049-9_4_Fig12_HTML.jpg

图 4-12。

Load the Apache Jena software library to Eclipse   Click the Next ➤ button on the bottom.   Click User Libraries… on the right.   Click the New… button.   Add a name to your library, such as JenaLib.   Click the Add external JARs… button on the right.   Browse to your Jena directory (apache-jena-versionNumber) and go to the lib subdirectory.   Select all the .jar files (for example, with Ctrl+A) and click Open (see Figure 4-13).

A978-1-4842-1049-9_4_Fig13_HTML.jpg

图 4-13。

Apache Jena to be added to the Eclipse project   Click OK.   Click Finish.   Once you click OK, the Jena software library will be added to your Eclipse project.

为了查看 Jena 库的运行情况,让我们创建一个 Java 程序来将 RDF/XML 序列化的 FOAF 文件转换成 Turtle!

In the Package Explorer, right-click src and select New ➤ Package and create a package.   Click the package name and select New ➤ File.   Specify a file name and click Finish.   Add the file content (type in directly or copy-paste it). If you don’t have a FOAF file yet, create one manually in RDF/XML serialization or generate one using FOAF-a-matic at http://www.ldodds.com/foaf/foaf-a-matic.html . The asterisk (*) in front of the file name on the file’s tab indicates that the file has been changed. When you save the file with File ➤ Save or Ctrl+S, the character disappears. Save the file as, for example, foaf.rdf.   Note

如果您有 Windows-1252 不支持的字符,Eclipse 会为您提供用 UTF-8 编码保存文件的选项,以避免字符丢失。

Right-click the package and select New ➤ Class and add a name such as Main (creates Main.java).   Write the code to open the FOAF file and convert it to Turtle serialization using Apache Jena. Import the model (com.hp.hpl.jena.rdf.model.Model) and the File Manager of Jena (com.hp.hpl.jena.util.FileManager). Using the File Manager, load the model (FileManager.get().loadModel()) and write the RDF content out to the standard output (the console) in Turtle using System.out (see Listing 4-16).   Listing 4-16. Loading and Converting an RDF File Using Jena

package JenaPackage;

import com.hp.hpl.jena.rdf.model.Model;

import com.hp.hpl.jena.util.FileManager;

public class Main {

public static void main(String args[])

{

FileManager.get().addLocatorClassLoader(Main.class.getClassLoader());

Model model = FileManager.get().loadModel("C:/develop/eclipse/workspace/ A978-1-4842-1049-9_4_Fig4aa_HTML.jpg

jenaapp/src/jenapackage/foaf.rdf");

model.write(System.out,"TURTLE");

}

}

Run the program by clicking the Run button on the top toolbar (white triangle in green circle) or Run under the Run menu. The Console shows the output in Turtle (see Figure 4-14).

A978-1-4842-1049-9_4_Fig14_HTML.jpg

图 4-14。

Using Apache Jena to convert RDF/XML to Turtle

在 Eclipse 中设置 Sesame

一旦安装了 Eclipse,就可以将 Sesame 添加到您的环境中,类似于 Jena。

Go to http://sourceforge.net/projects/sesame/ and download the binary distribution.   Extract the Sesame files from the archive.   In Eclipse, select File ➤ New ➤ Java Project.   Right-click the name of the newly created project and select Properties (or select File ➤ Properties).   Select Java Build Path and click the Libraries tab.   Click Add Library… on the right.   Select User Library as the library type.   Click the Next > button on the bottom.   Click User Libraries… on the right.   Click the New… button.   Add a name to your library, such as JenaLib.   Click the Add external JARs… button on the right.   Browse to your Sesame directory (openrdf-sesame-version``Number) and go to the lib subdirectory.   Select all the .jar files (for example, with Ctrl+A) and click Open (see Figure 4-15).

A978-1-4842-1049-9_4_Fig15_HTML.jpg

图 4-15。

Adding Sesame to Eclipse   Click OK.   Click Finish.   Once you click OK, the Sesame software library will be added to your Eclipse project.

要查看 Sesame 库的运行情况,让我们创建一个 Java 程序,初始化一个存储库,并向该存储库添加数据和从中检索数据!

Create a new Java class. To make it easier to write our code, on the New Java Class window, tick the checkbox public static void main(String[] args) under Which method stubs would you like to create?   To store RDF data, we first have to create a repository. While there are many different types of repositories, for our example, we need a simple local repository with fast in-memory store (see Listing 4-17).   Listing 4-17. Creating a Local Repository in Sesame

Repository rep = new SailRepository(new MemoryStore());

然而,要使用这段代码,我们必须手动编写一些import语句(参见清单 4-18 )。

Listing 4-18. Import Packages from the Sesame Library

import org.openrdf.repository.Repository;

import org.openrdf.repository.sail.SailRepository;

import org.openrdf.sail.memory.MemoryStore;

或者,您可以使用 Ctrl+Shift+O 热键强制自动解析缺失的导入。

Initialize the repository by calling the rep.initialize() method.   Add data to the repository. You can add triples directly from Java or load them from external files. In this example, we add some statements directly. To do so, we need a namespace to be used for creating new URIs and a ValueFactory for creating URI, BNode, and Literal objects (see Listing 4-19).   Listing 4-19. Adding Data to the Repository

String namespace = "http://example.com/";

ValueFactory f = rep.getValueFactory();

Create a new URI through an identifier for the person Leslie (see Listing 4-20).   Listing 4-20. Creating a URI

URI leslie = f.createURI(namespace, "leslie");

To add data to the repository, you have to open a RepositoryConnection (Listing 4-21).   Listing 4-21. Opening a Connection

RepositoryConnection conn = rep.getConnection();

To ensure that any connection is open only when needed, create a try-finally code block (see Listing 4-22). The try clause holds the tasks to be performed during a connection, while the finally clause is used to close the connection when it is not needed anymore or if something goes wrong.   Listing 4-22. A try-finally Block

try {

}

finally {

conn.close();

}

In the try clause, add triples to the repository (see Listing 4-23).   Listing 4-23. Adding RDF Statements to a Sesame Repository

conn.add(leslie, RDF.TYPE, FOAF.PERSON);

conn.add(leslie, RDFS.LABEL, f.createLiteral("Leslie", XMLSchema.STRING));

第一个三元组将Leslie描述为一个Person,第二个三元组将 Leslie 的名字描述为一个字符串。

Note

经常使用的名称空间(RDF,RDFS,FOAF 等。)在 Sesame 中预定义为常量。

Retrieve the data from our repository using the getStatements method (see Listing 4-24), which has four arguments.   Listing 4-24. Data Retrieval from a Repository

RepositoryResult<Statement> statements = conn.getStatements(null, null, null, A978-1-4842-1049-9_4_Fig4ab_HTML.jpg

true);

前三个参数表示要匹配的主语、谓语和宾语。在这种情况下,我们希望检索所有的三元组。前三个参数将是null。最后一个参数是布尔值,用于指示是否应该包括由推理器推理的那些语句。在这个例子中,我们没有使用任何推理器,所以第四个值对输出没有任何影响。

或者,也可以使用 SPARQL 查询从存储库中提取数据。

Convert the result to a Sesame Model (see Listing 4-25), which is a Java Collection.   Listing 4-25. Converting the Result to a Model

Model model = Iterations.addAll(statements, new LinkedHashModel());

To provide a neat output, we need some namespace abbreviations, so that the output won’t include full URIs. Again, we can use the predefined constants for the RDF, RDFS, XMLSchema, and FOAF namespaces (see Listing 4-26).   Listing 4-26. Namespace Declaration

model.setNamespace("rdf", RDF.NAMESPACE);

model.setNamespace("rdfs", RDFS.NAMESPACE);

model.setNamespace("xsd", XMLSchema.NAMESPACE);

model.setNamespace("foaf", FOAF.NAMESPACE);

model.setNamespace("ex", namespace);

Display the output in Turtle on the Console, using the Sesame toolkit Rio (“RDF I/O”) (see Listing 4-27).   Listing 4-27. Sending the Output to the Console

Rio.write(model, System.out, RDFFormat.TURTLE);

最终的代码应该如清单 4-28 所示。

Listing 4-28. A Complete Sesame Code Example

package sesamePackage;

import info.aduna.iteration.Iterations;

import org.openrdf.model.Statement;

import org.openrdf.model.URI;

import org.openrdf.model.Model;

import org.openrdf.model.ValueFactory;

import org.openrdf.model.impl.LinkedHashModel;

import org.openrdf.model.vocabulary.FOAF;

import org.openrdf.model.vocabulary.RDF;

import org.openrdf.model.vocabulary.RDFS;

import org.openrdf.model.vocabulary.XMLSchema;

import org.openrdf.repository.Repository;

import org.openrdf.repository.RepositoryConnection;

import org.openrdf.repository.RepositoryException;

import org.openrdf.repository.RepositoryResult;

import org.openrdf.repository.sail.SailRepository;

import org.openrdf.sail.memory.MemoryStore;

import org.openrdf.rio.RDFFormat;

import org.openrdf.rio.RDFHandlerException;

import org.openrdf.rio.Rio;

public class SesameApp {

public static void main(String[] args) throws RepositoryException, RDFHandlerException {

Repository rep = new SailRepository(new MemoryStore());

rep.initialize();

String namespace = "http://example.com/

ValueFactory f = rep.getValueFactory();

URI leslie = f.createURI(namespace, "leslie");

RepositoryConnection conn = rep.getConnection();

try {

conn.add(leslie, RDF.TYPE, FOAF.PERSON);

conn.add(leslie, RDFS.LABEL, f.createLiteral("Leslie", XMLSchema.STRING));

RepositoryResult<Statement> statements = conn.getStatements(null,  null,  null,  true);

Model model = Iterations.addAll(statements, new LinkedHashModel());

model.setNamespace("rdf", RDF.NAMESPACE);

model.setNamespace("rdfs", RDFS.NAMESPACE);

model.setNamespace("xsd", XMLSchema.NAMESPACE);

model.setNamespace("foaf", FOAF.NAMESPACE);

model.setNamespace("ex", namespace);

Rio.write(model,  System.out, RDFFormat.TURTLE);

}

finally {

conn.close();

}

}

}

最后,您可以运行应用。存储在存储库中的数据和从存储库中检索的数据显示在控制台上(参见图 4-16 )。

A978-1-4842-1049-9_4_Fig16_HTML.jpg

图 4-16。

Using Sesame to store and retrieve RDF triples

开发工具

NetBeans 是另一个流行的 Java 集成开发环境。

A978-1-4842-1049-9_4_Fig4d_HTML.jpg

NetBeans 由 Apache Ant 提供支持,支持 Apache Maven、重构、版本控制等。IDE 的所有功能都是通过模块提供的。

在 NetBeans 中设置 Apache Jena

在 NetBeans 中集成 Apache Jena 类似于我们讨论的 Eclipse 的安装。

Go to http://jena.apache.org/download/ , select a download mirror, and download the binary distribution suitable for your platform (.zip or .tar.gz).   Extract the Jena files from the archive.   In NetBeans, select File ➤ New Project ➤ JavaWeb.   Give a name to the project and select servers.   Select File ➤ Project Properties.   Select the Libraries category and select Add JAR/Folder.   Select the required files.   When the files are listed, verify and click OK.

要在您的项目中使用 Jena,您必须导入所需的包,如前几节所述。

如果您在 NetBeans 中使用 Apache Maven 集成,也可以按如下方式启动 Jena 项目:

Select File ➤ New Project ➤ Maven ➤ Java Application.   Add a name to the project and additional information, such as location, then click Finish.   Once NetBeans has created a new Maven project and opened it, right-click Dependencies and choose Add Dependency….   Declare the Group ID, such as org.apache.jena, the Artifact ID, such as jena-core, and the version of your Jena integration.   Open the Dependencies directory and check the dependencies.   Note

通过右键单击依赖项并选择下载声明的依赖项,可以强制下载声明的依赖项。

立方体网络

CubicWeb 是用 Python [26 ]编写的面向对象的语义 Web 应用框架。它支持 RDF 和 OWL,具有半自动 XHTML/XML/JSON/text 生成功能,以及一种类似于 SPARQL 的专有查询语言。CubicWeb 支持 SQL 数据库和 LDAP 目录。快速应用开发由称为“立方体”的可重用组件库提供支持,包括常见任务的数据模型和视图。例如,file多维数据集包含了file实体类型、图库视图功能和一个文件导入工具。如果你构建一个博客应用,你创建一个新的立方体,比如mycube,并重用blog立方体(见图 4-17 )。

A978-1-4842-1049-9_4_Fig17_HTML.jpg

图 4-17。

Visualization of the data model in CubicWeb

当您开发新的 web 应用时,您创建一个新的多维数据集,从现有多维数据集中选择构建块,在多维数据集的架构中创建类定义,并创建实例。这些立方体有一个标准的文件夹结构来存储 Python 脚本、样式表、JavaScript 文件和翻译文件。

链接数据软件

辛迪克

Sindice 是最受欢迎的关联数据平台之一。Sindice 收集、处理和整合来自 RDF、RDFa、微格式和 HTML5 微数据的链接数据 [27 ]。Sindice 的组件之一是位于 http://inspector.sindice.com 的 Sindice Web Data Inspector,这是一个全面的语义数据提取工具。该工具可用于从 URI 或直接输入提供的标记、RDF/XML、Turtle 或 N3 文档中提取 RDF 三元组。Sindice Web Data Inspector 可用于检索语义数据(Inspect 按钮),组合语义数据提取和验证(Inspect + Validate 按钮),或本体分析和推理(见图 4-18 )。

A978-1-4842-1049-9_4_Fig18_HTML.jpg

图 4-18。

Comprehensive options on the start screen of Sindice Web Data Inspector

因此,该工具提供了从文件中检索到的主谓宾三元组的完整列表。输出格式也可以更改为 N-triples 或 RDF/XML。

Note

出于可用性原因,Sindice Web Data Inspector 最多只显示 1,000 个三元组。

“适马”选项是机器可读元数据的一个很好的例子。软件工具可以从正确编写的语义文档中提取结构化数据,并任意显示。这是语义网的真正本质!

Sindice Web Data Inspector 的一个有用特性是可以从语义文档中生成一个可伸缩的图形。该图不仅显示了三元组,还提供了文件中使用的本体和词汇的快速总结。

Sindice Web Data Inspector 还有一个带有两个不同选项的验证功能。第一个称为“RDF 语法验证”,根据 W3C 规范执行 RDF 语法验证。第二个选项是“学究式验证器”,它对提取的三元组进行验证。在有效文档的情况下,两个验证器都给出结果“有效文档”

阿帕契·土拨鼠

Apache Marmotta 是一个链接数据服务器、SPARQL 服务器和链接数据开发环境 [28 ]。Marmotta 通过 HTTP 内容协商为人类可读和机器可读的读写数据访问提供了一个链接数据平台(LDP)。

A978-1-4842-1049-9_4_Fig4e_HTML.jpg

Marmotta 具有用于 LD 应用开发的模块和库。模块化服务器架构使得仅实现所需的功能成为可能。例如,如果您的项目不需要推理,您可以排除推理器模块。Marmotta 为常见的 LD 任务提供了一组链接数据库,例如访问 LD 资源和查询链接数据(通过一种简单的 LD 查询语言 LDPath)。triplestore 与服务器分离,因此可以独立使用。Apache Marmotta 平台被实现为一个 Java web 应用,并被部署为一个.war文件。它是一个使用上下文和依赖注入(CDI)的面向服务的架构,CDI 是 Java web 应用开发的一组服务。Marmotta 核心是 Apache Marmotta 的基础组件,它提供链接数据访问、RDF 导入和导出功能以及管理界面。Marmotta Core 联合了服务和依赖注入、三元组存储、系统配置和日志记录。

作为一个 SPARQL 服务器,Marmotta 通过 HTTP Web 服务提供了一个公共的 SPARQL 1.1 查询和更新端点以及对 SPARQL 1.1 的全面支持。Marmotta 在 KiWi triplestore 中提供了一个快速的本机 SPARQL 实现,这是一个高性能、高可伸缩的事务性 triplestore 后端,用于 OpenRDF Sesame,构建在 MySQL、PostgreSQL 或 H2 等关系数据库之上。为了使 SPARQL 查询更容易,Apache Marmotta 提供了 Squebi,一个轻量级用户界面。除了 KiWi,Marmotta 默认的 triplestore 后端,你还可以选择 Sesame Native(基于 Sesame Native RDF 后端),BigData(基于 BigData 集群化的 triplestore),或者 Titan(基于 Titan 图数据库)。Marmotta Reasoner 是一个可选模块,是 KiWi triplestore 的基于规则的推理机。它在 RDF 三元组上实现了 datalog 风格的规则。Marmotta Loader 是一个命令行工具,用于将各种格式的 RDF 数据加载到不同的 triplestores 中。它支持 RDF 序列化,也可以导入目录、分割文件、gzip 和 bzip2 压缩文件,以及 Tar 和 zip 存档。

Marmotta 软件库不仅可以用作 Marmotta 平台的组件,还可以用作独立的轻量级 Java 库。Apache Marmotta LDClient 库是一个灵活的模块化 RDFizer,适用于链接数据项目,通过不同的协议和数据提供者检索远程链接数据资源 [29 ]。Marmotta 的模块支持 RDF/XML、Turtle、N3、JSON-LD、RDFa、XML、HTML,可以处理 Freebase、脸书、YouTube、Vimeo、MediaWiki 内容。该软件库可通过 Java 的ServiceLoader类进行扩展,为 RDF、RDFa、脸书、YouTube 和 Wikipedia 等传统数据源提供定制包装器,并为映射 XML 和 JSON 等其他格式提供基类。另一个库 Marmotta LDCache 可以像在本地一样访问远程链接的数据资源。它支持诸如脸书图这样的遗留数据源的包装。LDCache 提供了一个本地 triplecache。另一个可选的库是 Marmotta LDPath,这是一种不如 SPARQL 表达能力强的查询语言,但专门为查询云中的链接数据而设计。LDPath 具有基于路径的导航功能,它从资源开始,沿着链接前进。

Note

如果使用 SPARQL 查询,建议使用 LDPath 而不是 LDCache。

LDPath 包含一个大型函数库,可以集成到您自己的应用中。LDPath 可以与 LDCache 和 LDClient 一起使用,并支持后端,如 Jena 和 Sesame。

sameAs.org

因为互连是链接开放数据云中的基础,所以您通常会定义描述 RDF 中表示的相同对象的资源。例如,你参考你居住城市的机器可读定义,指向它在 DBpedia、GeoNames 和 Freebase 上的资源页面。因为寻找等效的资源页可能很耗时,你可能会发现 www.sameas.org 的工具很有用,它可以在不同的数据集上寻找等效的资源页(见图 4-19 )。

A978-1-4842-1049-9_4_Fig19_HTML.jpg

图 4-19。

sameAs finds equivalent resource definitions from different LOD datasets

卡利马科斯

Callimachus 4 是一个集成的链接数据应用开发环境,用于图形存储、可视化、RDFa 模板化、使用 XSLT 和 XProc 进行数据处理、SPARQL 查询和链接开放数据发布 [30 ]。它适用于标准化元数据和组合来自不同系统的数据,以及组合企业数据和来自 Web 的开放数据。

Callimachus 扩展了 RDFa 语法,允许在属性中使用变量和 URIs。Callimachus 进一步扩展了 RDFa 语法,引入了允许在属性值或文本节点中替换值的表达式。Callimachus 将属性转换成图形模式。空白节点和空属性内容被视为通配符。带有通配符或变量的图形模式可以选择在结果中加入合作伙伴。

新词

新语是一个免费开源的词汇发布平台 [31 ]。它作为一个 Drupal 插件发布,支持 RDF 和 RDFS,部分支持 OWL。新词可以导入用 RDF/XML、RDFa、Turtle 或 OWL 编写的离线和在线文件(见图 4-20 )。新词的表单域具有客户端验证输入是否正确的功能。新词显示了术语之间的双向关系。您可以在 Turtle 中将任意三元组添加到任何词汇表的 RDF 输出中。

A978-1-4842-1049-9_4_Fig20_HTML.jpg

图 4-20。

Neologism can import vocabulary and ontology files written in any of the mainstream RDF serializations

LODStats

LODStats 是一个用 Python 编写的可扩展框架,用于高性能数据集分析 [32 ]。它收集统计数据集特征,如类使用计数、类层次结构深度、属性层次结构深度、不同实体等。LODStates 非常强大,其开发人员将该框架与 CKAN(LOD 云元数据注册中心)集成在一起,以生成关于 LOD 云的及时而全面的统计数据。

语义 Web 浏览器

语义 Web 浏览器是浏览工具,用于探索和可视化 RDF 数据集,并通过链接数据进行增强,例如 DBpedia 中的机器可读定义或 GeoData 中的地理空间信息。语义 web 浏览器提供了不同于传统 Web 浏览器的探索、导航和交互功能。它们不仅显示人类可读的注释,还显示机器可读的注释和提取的 RDF 三元组。传统的浏览器使用超链接在文档之间导航,而语义 Web 浏览器提供了用键入的链接向前和向后导航的机制。语义 Web 浏览器支持基于分面的(分面的)浏览,方法是处理称为分面的离散过滤器属性列表,逐步细化对信息集合的搜索,并将结果可视化(例如从地理空间数据生成地图)。语义 Web 浏览器也支持旋转,即数据的维度方向。例如,旋转最初聚合的BookPublisherDate会产生PublisherDateBook。语义 Web 浏览器可以将非链接数据转换为链接数据,并创建到相关 URIs 的链接。它们提供文本搜索和/或 SPARQL 查询,并支持第三章中讨论的五星数据部署方案,用于数据消费、生成、聚合、扩充和重新解释。

制表机

制表器是 W3C 的语义 web 浏览器和编辑器,可作为 Web 应用和 Firefox 插件在 http://www.w3.org/2005/ajar/tab 使用。它可以以各种可视化格式显示链接的数据。制表器包含一个用 JavaScript 编写的 RDF 存储。该工具有两种模式:探索模式和查询模式。在浏览模式下,它显示一个谓词-对象对表,其中可能还包含嵌套属性。浏览选项之一是大纲模式,用户可以通过打开树结构的分支来浏览资源。Outliner 模式解决了 RDF 可视化工具(如 IsaViz)使用的圆形和箭头图的局限性,这些图对于具有许多节点和许多不同属性的大量数据来说效率很低。在 Outliner 模式下,当在链接数据图中搜索与给定字段匹配的子图时,用户还可以通过选择多个字段并按 Find All 按钮来执行图匹配查询。实例在每个类的专用窗格中列出。制表器还可以显示检索打开的文档、可读内容和 RDF 所涉及的网络活动。

当用作编辑器时,制表器支持大纲模式下的三个编辑选项:对象修改、用现有谓词添加新对象以及向现有主语添加新的谓词-对象对。要修改包含文字值的单元格,请在单元格高亮显示时单击一次(或按 Enter ),以便该字段变得可编辑。编辑完成后,你只需按回车键。如果谓词-对象对的对象不是一个文字值,而是一个 URI 标识符,您可以通过名称或拖放来选择它。制表器总是尽可能尝试显示名称而不是 URI(例如,文本描述而不是rdfs:labeldc:title)。当谓词不存在时,可以通过单击表末尾左侧显示的蓝色加号来向属性或对象表添加新的事实。当添加新对时,将会出现一个谓词的自动完成框,同时可以像往常一样选择对象。

当您查询子图模式时,会生成一个表。插入新行会创建一个与查询匹配的新子图。编辑单元格值时,会删除一条语句,并在同一文档中插入另一条语句。

大理石

Marbles 是一个服务器端应用和链接数据引擎,用于语义数据检索和存储。作为一个语义 Web 浏览器,它显示彩色的“弹珠”来指示数据来源和数据源之间的关系。Marbles 也可以用作 SPARQL 端点,支持SELECTCONSTRUCTDESCRIBE查询。一旦你从 http://sourceforge.net/projects/marbles/files/ 下载了.war文件,你就可以把它放到一个 J2EE 的 web 容器里,比如 Tomcat,来自动安装 Marbles。对于手动安装,调用源代码发行版上的ant installremove任务,然后调用根目录下的 servlet。其中,弹珠是在 DBpedia Mobile 中实现的。

OpenLink Data Explorer (ODE,最初是 OpenLink RDF Browser)是一个利用结构化数据的浏览器扩展。ODE 在标准视图菜单中增加了两个选项,都在主菜单和上下文菜单中(见图 4-21 )。

A978-1-4842-1049-9_4_Fig21_HTML.jpg

图 4-21。

ODE options in the context menu

数据浏览器可用于 Internet Explorer、Firefox、Safari、Google Chrome 和 Opera ( http://ode.openlinksw.com/#Download )。让我们为 Firefox 安装附加软件吧!

Go to http://s3.amazonaws.com/opldownload/ajax-tools/ode/1.1/firefox3.0/ode.xpi .   Depending on your security settings, Firefox might prevent automatic installation. Click Allow to download the add-on.   The Software Installation pop-up asks for permission to proceed (“Install add-ons from authors whom you trust.”) Click Install Now.   Restart Firefox.

安装后,该插件就可以从视图菜单和上下文菜单中使用了。“查看实体描述”选项提供当前页面的结构化描述。查看数据源为从当前页面检索的结构化数据提供原始数据显示选项(参见图 4-22 )。

A978-1-4842-1049-9_4_Fig22_HTML.jpg

图 4-22。

Result screen of View Data Sources

插件的设置可通过工具➤ OpenLink 数据浏览器➤选项获得。首先,您可以选择查看器。默认的是 OpenLink 数据浏览器,但是您也可以选择 Zitgist 数据查看器、Marbles、DISCO、制表器或自定义查看器。对于链接数据访问,有一个 RDFizer 服务、一个 SPARQL 端点,您还可以定义 HTTP 头。RDFizer 和 SPARQL 端点的默认主机是linkeddata.uriburner.com,可以任意修改。RDFizer 是 Virtuoso Sponger ( http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/VirtSponger ),是 Virtuoso 的 SPARQL 处理器和代理 Web 服务的一个组件。海绵支持 RDFa,GRDDL,亚马逊网络服务,易贝网络服务,免费基础网络服务,脸书网络服务,雅虎!财务、XBRL 实例文档、文档对象标识符(DOI)、RSS 和 Atom 提要、MP3 音乐文件的 ID3 标签、vCard、微格式、Flickr 和 Del.icio.us 内容。

OpenLink Data Explorer 处理 RDF、Turtle 和 Notation3 MIME 数据。MIME 数据的默认查看器是 Virtuoso Describe,但是您也可以选择 Virtuoso About 或 Virtuoso ODE(带或不带 SSL)。

DBpedia Mobile

DBpedia Mobile 是一个用于移动设备的位置感知 DBpedia 客户端应用,提供地图视图和支持 GPS 的启动器应用 [33 ]。根据移动设备的 GPS 位置,DBpedia Mobile 会显示一张地图,其中包含从 DBpedia 数据集中提取的附近位置的信息。覆盖了大约 30 万个地理位置。DBpedia Mobile 由 Marbles 链接数据浏览器的渲染引擎和 SPARQL 功能提供支持。地图渲染后,您可以浏览关于该位置的其他信息,并直接转到 DBpedia、GeoNames、Flickr 和其他数据集。

伊萨维兹

作为一个 RDF 的可视化创作工具,IsaViz 将数据表示为一个圆形箭头图,它显示了彼此相关的“事物”(见图 4-23 ) [34 )。这在分析数据结构时很有用。在 IsaViz 图上,当大量“事物”通过相同的属性联系在一起时,您可以看到聚类。

A978-1-4842-1049-9_4_Fig23_HTML.jpg

图 4-23。

An RDF graph in IsaViz

RelFinder

RelFinder (Relationship Finder)可以用来可视化、过滤和分析对象之间的大量关系。它适用于知识表示和知识发现。RelFinder 提供了对数据集的标准 SPARQL 访问。在 http://www.visualdataweb.org/relfinder/relfinder.php 有在线版本,可以根据选择的对象及其关系生成有向图(见图 4-24 )。

A978-1-4842-1049-9_4_Fig24_HTML.jpg

图 4-24。

Visualizing connections with RelFinder

摘要

在本章中,您已经熟悉了常用的软件工具,这些工具可以生成、存储、提取和可视化 RDF 数据。您了解了如何为您的 web 站点生成 RDFa 注释,以及如何使用 Google 结构化数据测试工具测试 RDFa 和微数据注释。您看到了如何设置集成开发环境,使用软件库来编写语义 Web 应用,以及在存储库中存储 RDF 数据和从存储库中检索 RDF 数据的示例。您知道用于导入、编辑和序列化数据集的最流行的链接数据平台。

下一章将向您介绍语义 Web 服务标准,包括服务使用的协议、接口和语言,如位置感知应用和语义电子商务门户。

参考

Ho, D. et al. (2014) Notepad++. Don Ho. http://notepad-plus-plus.org . Accessed 31 March 2015.   Sessink, O. (2014) BlueFish. The Bluefish Project Team. http://bluefish.openoffice.nl/ . Accessed 4 November 2014.   ActiveState Software (2014) Komodo. ActiveState Software. www.activestate.com/komodo-ide . Accessed 4 November 2014.   Bare Bones Software (2014) BBEdit. Bare Bones Software, Inc. www.barebones.com/products/bbedit/ . Accessed 4 November 2014.   Bare Bones Software (2014) TextWrangler. Bare Bones Software, Inc. www.barebones.com/products/textwrangler/index.html . Accessed 4 November 2014   Lutus, P. (2014) Arachnophilia. www.arachnoid.com/arachnophilia/ . Accessed 4 November 2014.   GitHub (2015) DBpedia Spotlight. https://github.com/dbpedia-spotlight/dbpedia-spotlight . Accessed 31 March 2015.   The GATE project team (2015) GATE. https://gate.ac.uk . Accessed 31 March 2015.   The OpenRefine community (2015) OpenRefine. http://openrefine.org . Accessed 31 March 2015.   Altova (2012) Altova SemanticWorks 2012 User and Reference Manual. www.altova.com/documents/SemanticWorks.pdf . Accessed 31 March 2015.   TopQuadrant (2015) TopBraid Composer Standard Edition. www.topquadrant.com/tools/modeling-topbraid-composer-standard-edition/ . Accessed 31 March 2015.   TopQuadrant (2015) TopBraid Composer Maestro Edition. www.topquadrant.com/tools/ide-topbraid-composer-maestro-edition/ . Accessed 31 March 2015.   The Apache Software Foundation (2015) Apache Stanbol. http://stanbol.apache.org . Accessed 31 March 2015.   Fluent Editor. www.cognitum.eu/semantics/FluentEditor/ . Accessed 15 April 2015.   The European Bioinformatics Institute (2015) ZOOMA. www.ebi.ac.uk/fgpt/zooma/ . Accessed 31 March 2015.   Harispe, S. (2014) Semantic Measures Library & ToolKit. www.semantic-measures-library.org . Accessed 29 March 2015.   Motik, B., Shearer, R., Glimm, B., Stoilos, G., Horrocks, I. (2013) HermiT OWL Reasoner. http://hermit-reasoner.com . Accessed 31 March 2015.   Clark & Parsia (2015) Pellet: OWL 2 Reasoner for Java. http://clarkparsia.com/pellet/ . Accessed 31 March 2015.   Tsarkov, D., Horrocks, I. (2007) FaCT++. http://owl.man.ac.uk/factplusplus/ . Accessed 31 March 2015.   University of Luebec (2015) Racer. www.ifis.uni-luebeck.de/index.php?id=385 . Accessed 31 March 2015.   The Apache Software Foundation (2015) Apache Jena. http://jena.apache.org . Accessed 31 March 2015.   The Apache Software Foundation (2015) Apache Jena Fuseki. http://jena.apache.org/documentation/fuseki2/ . Accessed 31 March 2015.   Broekstra, J., Ansell, P., Visser, D., Leigh, J., Kampman, A., Schwarte, A. et al. (2015) Sesame. http://rdf4j.org . Accessed 31 March 2015.   The Eclipse Foundation (2015) Eclipse. www.eclipse.org . Accessed 31 March 2015.   Oracle Corporation (2015) NetBeans IDE. https://netbeans.org . Accessed 31 March 2015.   Logilab (2015) CubicWeb Semantic Web Framework. www.cubicweb.org . Accessed 31 March 2015.   Digital Enterprise Research Institute (2015) Sindice—The Semantic Web index. http://sindice.com . Accessed 31 March 2015.   The Apache Software Foundation (2015) Apache Marmotta. http://marmotta.apache.org . Accessed 31 March 2015.   The Apache Software Foundation (2015) http://marmotta.apache.org/ldclient/ . Accessed 31 March 2015.   3 Round Stones (2015) Callimachus—Data-driven applications made easy. http://callimachusproject.org . Accessed 31 March 2015.   National University of Ireland (2011) Neologism—Easy Vocabulary Publishing. http://neologism.deri.ie/ . Accessed 31 March 2015.   Auer, S., Ermilov, I., Lehmann, J., Martin, M. (2015) LODStats. http://aksw.org/Projects/LODStats.html . Accessed 1 April 2015.   Bizer, C. (2008) DBpedia Mobile. http://wiki.dbpedia.org/DBpediaMobile . Accessed 31 March 2015.   Pietriga, E. (2007) IsaViz: A Visual Authoring Tool for RDF. www.w3.org/2001/11/IsaViz/ . Accessed 31 March 2015.   Footnotes 1

在 Windows 系统上,用于语法突出显示的文件格式取决于文件扩展名,因此默认情况下,扩展名为.rdf的整个 RDF/XML 文件可能是白色的,而同一编辑器中的同一文件在另存为.xml时会被语法突出显示。

2

对于那些可以合理地转换为另一种更高级的编码而不牺牲特殊字符的编码(例如,ANSI 到 UTF-8),应该使用此功能。

3

FaCT++部分支持 OWL 2 键约束和数据类型。

4

以卡利马科斯命名(310/305?–公元前 240 年),他是“目录学之父”,在古老的亚历山大图书馆工作。

五、语义化 Web 服务

在这个面向服务的世界里,在线服务是 web 产品的重要组成部分。网上购物、机票预订、酒店预订、导航、公共交通服务、政府服务、社区服务和媒体服务是我们日常生活的一部分。然而,服务产品的范围正在扩大。例如,在信息技术(IT)行业,也有各种各样的服务。在越来越流行的云计算环境中,基本的服务模式是基础设施即服务(IaaS),如亚马逊 EC2 和谷歌云存储;平台即服务(PaaS),如 WHM、微软 Azure 和谷歌应用引擎;以及软件即服务(SaaS),如 Hosted Exchange、GoogleApps 和 NetSuite。IT 行业的其他服务包括但不限于数据库即服务(DBaaS)、图形即服务(GaaS)、存储即服务(STaaS)、测试环境即服务(TEaaS)、API 即服务(APIaaS)、网络即服务(NaaS)和统一通信即服务(UCaaS)。Web 服务通常拥有提供电子商务、动态地图导航、物理设备远程控制等功能的网站。主流的基于 XML 的 web 服务互操作性标准只指定了语法,而没有指定消息的语义。语义 Web 技术可以用定义良好、丰富的语义增强面向服务的环境。语义 Web 服务利用语义 Web 技术来自动化服务,并支持跨异构用户和域的自动服务发现、组合和执行。

语义 Web 服务建模

Web 服务是使用可重用组件通过标准互联网协议可编程访问的程序[1]。Web 服务是分布式的,封装了离散的功能。语义 web 服务(SWS)通过语义使 Web 服务特征可被机器解释。语义 web 服务旨在将 Web 服务和语义 Web 技术结合起来,以实现服务相关任务的自动化,如发现、组合等。[2].语义 web 服务可以解决传统 web 服务的一些限制,例如语法描述和手工检查 Web 服务可用性、使用和集成的需要。语义 Web 服务的生命周期包括服务描述或注释、广告、发现、选择、组合和服务的执行,使用四种类型的语义:数据语义、功能语义、服务质量(QoS)语义和执行语义。语义 Web 服务的使用过程包括以下内容[3]:

  • 发布:使服务能力的描述可用
  • 发现:定位适合给定任务的不同服务
  • 选择:在可用的服务中选择最合适的服务
  • 组合:组合服务以实现目标
  • 中介:解决数据、协议和流程不匹配的问题
  • 执行:按照编程约定调用服务

语义 Web 服务有三种不同类型的属性:功能、行为和非功能属性。功能属性定义了 web 服务的能力。行为属性提供了一种通过与其他服务交互来实现所需功能的方法。非功能属性设置了对功能和行为属性的约束,或者添加了关于服务的元数据。例如,假设我们有一个航班预订服务,其中的功能是实际的预订,当安全性是非功能性属性时,这可能会受到使用安全连接的约束。基于服务的语义 web 应用的通信和集成由 WSDL(一种用于 web 服务的 XML 描述语言)、SOAP(一种用于在服务和客户端之间交换任意 XML 数据的基于 XML 的消息格式)和 UDDI(一种用于 Web 服务注册的数据模型和 API)提供。换句话说,服务消费者通过 UDDI 注册中心找到服务,该注册中心指向 web 服务的 WSDL 描述,以及使用 SOAP 与消费者通信的实际服务。

典型的语义 Web 服务有三个阶段(发布、搜索和绑定),以及三个实体(服务请求者、服务提供者和服务注册中心)。例如,服务提供商可以以广告的形式向 UDDI 服务注册中心发布服务的描述,该描述包括服务提供商的简介(公司名称和地址)、服务简介(如服务名称和类别)以及服务接口定义 URL (WSDL 描述)。

使用 XML 消息的通信:SOAP

简单对象访问协议(SOAP)是一种通过 web 服务发送和接收 XML 消息的语法。每个 SOAP 消息都包含一个包装消息的 SOAP 信封、一个数据编码描述以及包含后端应用的特定于应用的消息的 SOAP 主体(参见图 5-1 )。

A978-1-4842-1049-9_5_Fig1_HTML.jpg

图 5-1。

Structure of a web-based SOAP message

SOAP 消息的根元素是Envelope元素,它是HeaderBody元素的容器(参见清单 5-1 )。Body元素可以有选择地包含一个Fault元素,只有当 web 服务出现故障时才使用这个元素。

Listing 5-1. Structure of a SOAP Message

<?xml version="1.0"?>

<soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope

<soap:Header>

</soap:Header>

<soap:Body>

<soap:Fault>

</soap:Fault>

</soap:Body>

</soap:Envelope>

SOAP 信封总是包含指向 http://www.w3.org/2001/12/soap-envelope 的名称空间声明。Header元素是Envelope元素的可选子元素,它可以提供与消息本身不直接相关的信息,比如 SOAP 请求的最大时间要求。Header元素使用与Envelope元素相同的 XML 名称空间。Header元素的mustUnderstand布尔属性可以显式声明(mustUnderstand="true")处理消息的 SOAP 代理必须“理解”报头块。如果不理解报头,则返回 SOAP 错误。role属性可以指定 SOAP 消息转发器或处理器。

Note

SOAP 支持可以在Header元素和Fault元素中使用的预定义和自定义角色。SOAP 消息由三种类型的节点处理:发送方、转发方(并不总是使用,对应于next角色),以及实际处理 SOAP 消息的最后一个节点(对应于ultimateReceiver角色)。下一个角色的 URI 是 http://www.w3.org/2003/05/soap-envelope/role/next ,而ultimateReceiver角色的 URI 是 http://www.w3.org/2003/05/soap-envelope/role/ultimateReceiver

relay属性决定一个标题块如果不被处理是否可以被中继。

作为强制元素的Body元素包含了将由客户端或 web 服务处理的 SOAP 消息的主要部分,比如一个service元素及其嵌套在其中的参数。如果您在Body元素中声明了一个Fault元素,那么在处理 SOAP 消息时如果出现错误,它就可以执行动作。Fault元素有两个必需的子元素(CodeReason)和三个可选的子元素(NodeRoleDetail)(参见清单 5-2 )。

Listing 5-2. SOAP Fault Structure

<env:Fault>

<env:Code>

<env:Value>env:Sender</env:Value>

<env:Subcode>

<env:Value>env:Sender</env:Value>

<env:Subcode>

</env:Subcode>

</env:Subcode>

</env:Code>

<env:Reason>

<env:Text>Incorrect Input Data</env:Text>

</env:Reason>

<env:Node>http://example.com/theNodeWhichFailed</env:Node>

<env:Role>

http://www.w3.org/2003/05/soap-envelope/role/ultimateReceiver

</env:Role>

</env:Fault>

Value元素是Code元素的子元素。Value元素可以有五个值之一。VersionMismatch属性表明在 SOAP 消息中发现的根元素不是有效的Envelope元素。如果没有处理任何标题子元素,则返回MustUnderstand属性值。如果 header 元素的编码(encodingStyle属性值)不能被处理,那么返回的错误就是DataEncodingUnknown属性的值。如果发送方发送了一个包含丢失或无效数据的错误编写的 SOAP 消息,则使用Sender属性值。如果 SOAP 消息的接收者未能处理消息,例如 web 服务所依赖的数据库不可用,则返回Receiver属性值。如果需要单独的代码块进行错误处理,可以选择将Subcode元素添加到Code元素中。

Reason元素包含一个或多个提供故障原因的Text元素。描述的自然语言可以由Text元素上的lang属性指定为 ISO 语言代码。可选的Node元素包含一个 URI,用于标识发生故障的节点。Role元素包含发生故障的节点的角色。Detail元素有子元素,提供关于发生的错误的附加信息。这些子元素使用您的自定义名称空间。

Web 服务描述语言(WSDL)

web 服务描述语言(WSDL,读作“Wiz'-dul”)是一种基于 XML 的接口定义语言,将 Web 服务的功能描述为网络端点或端口的集合,适合于消息交换[4]。端口是通过将网络地址与可重用绑定相关联来定义的,端口集合定义了 WSDL 服务。交换数据的抽象、类型化定义形成了 WSDL 消息。一个或多个端点支持的操作集合是端口类型。协议和数据格式规范提供了一个可重用的绑定,这是一个特定端口类型的具体协议和数据格式规范,使 WSDL 能够描述 web 服务的公共接口。WSDL 文件的文件扩展名为.wsdl,而互联网媒体类型为application/wsdl+xml。WSDL 2.0 文件包含以下元素:

  • description元素是根元素,它包含所有其他 WSDL 元素。
  • types元素是缺省情况下使用 XML Schema 描述的客户机和 web 服务之间交换的数据类型的规范。
  • 元素列举了 web 服务的操作,为每个输入和输出操作交换的消息,以及错误消息。
  • binding元素描述了如何通过网络访问 web 服务,通常将 web 服务绑定到 HTTP 协议。
  • service元素声明了在网络上何处可以访问 web 服务,即服务的 URL。
  • 可选的documentation元素可以包含人类可读的 web 服务描述。
  • 可选的import元素可以导入 XML 模式或其他 WSDL 文件。

结果,WSDL 文档的框架如清单 5-3 所示。

Listing 5-3. Skeleton WSDL Document

<description>

<types>

</types>

<interface>

</interface>

<binding>

</binding>

<service>

</service>

</description>

所有 WSDL 文件的第一部分是在description根元素中的一个或多个服务的定义,它也包括标准的名称空间声明,以及targetNamespace,关于服务信息的逻辑名称空间(参见清单 5-4 )。

Listing 5-4. XML Prolog and Namespace Declarations in WSDL

<?xml version="1.0" encoding="UTF-8"?>

<description A978-1-4842-1049-9_5_Fig5aa_HTML.jpg

xmlns="http://www.w3.org/ns/wsdl"

xmlns:tns="http://www.example.com/wsdl" A978-1-4842-1049-9_5_Fig5ac_HTML.jpg

xmlns:whttp="http://www.w3.org/ns/wsdl/http"

xmlns:wsoap="http://www.w3.org/ns/wsdl/soap"

targetNamespace="http://www.example.com/wsdl">

属性将元素的默认名称空间设置为标准的 WSDL 名称空间, http://www.w3.org/ns/wsdl 。默认命名空间应用于整个 WSDL 文档中没有显式声明另一个命名空间的所有元素。xmlns:tns属性声明了一个与targetNamespace的值相同的名称空间 URI(这个模式要指向的 web 服务的名称空间),提供了一种通过这个名称空间前缀(tns)来引用目标名称空间的机制。属性可以用来声明模式目标名称空间 URI,它是 XML 模式名称空间的 URI,用于元素上的 web 服务类型。xmlns:wsoap声明了用于bindings元素的 WSDL SOAP URI。xmlns:soap可以用来指向由 WSDL 文档描述的 web 服务所使用的 SOAP 版本的 SOAP URI。xmlns:wsdlx声明了 WSDL 扩展 URI。

在 WSDL 文档中需要复杂的数据类型来定义 web 服务请求和响应(参见清单 5-5 )。web 服务通常有一个输入类型、一个输出类型,有时还有一个错误类型。如果 web 服务有多个操作,每个操作可能有自己的输入类型、输出类型和错误类型。只要 web 服务的 API 支持,就可以用任何语言来声明数据类型,但最常见的是,使用 XML 模式来指定数据类型。如果只使用简单数据类型,可以省略本文档部分。

Listing 5-5. Abstract Types in WSDL

<types>

<xs:schema A978-1-4842-1049-9_5_Fig5af_HTML.jpg

xmlns:xs="http://www.w3.org/2001/XMLSchema"

targetNamespace="http://www.example.com/wsdl">

<xs:element name="request"> … </xs:element>

<xs:element name="response"> … </xs:element>

</xs:schema>

</types>

web 服务支持的操作可以用interface元素来描述(参见清单 5-6 )。每个操作代表客户端和服务之间的一个交互。对于每个请求,客户端只能调用一个操作。fault元素定义了一个可以发送回客户端的错误,这个错误可以被多个操作使用。operation元素描述了一个方法或过程。

Listing 5-6. Abstract Interfaces in WSDL

<interface name="Interface1">

<fault name="Fault1" element="tns:response" />

<operation name="Operation1" pattern="http://www.w3.org/ns/wsdl/in−out">

<input messageLabel="Message1" element="tns:request" />

<output messageLabel="Message2" element="tns:response" />

</operation>

</interface>

下一部分通过声明操作和消息的协议和数据格式规范,定义了应该如何执行操作。这是通过使用binding元素将 web 服务“绑定”到可以访问它的协议来实现的。绑定元素上的name属性的值被service元素引用(参见清单 5-7 )。interface属性指的是在同一个 WSDL 文件中定义的interface元素的名称(使用同一个文档的目标名称空间的前缀)。type属性定义了接口绑定的消息格式。

Listing 5-7. Binding over HTTP in WSDL

<binding name="HttpBinding" interface="tns:Interface1" A978-1-4842-1049-9_5_Fig5ah_HTML.jpg

type="http://www.w3.org/ns/wsdl/http

<operation ref="tns:Operation1" whttp:method="GET" />

</binding>

SOAP 绑定可以由wsoap:protocol属性指定(参见清单 5-8 )。当元素存在时,它声明一个错误,这个错误可以由 web 服务通过绑定发送回来。该错误在绑定引用的interface元素中定义。operation元素上的ref属性声明了绑定引用的interface元素中定义的操作。属性指定了 SOAP 的默认消息交换模式(MEP)。

Listing 5-8. Binding with SOAP in WSDL

<binding name="SoapBinding" interface="tns:Interface1" A978-1-4842-1049-9_5_Fig5ai_HTML.jpg

type="http://www.w3.org/ns/wsdl/soap"

wsoap:protocol="http://www.w3.org/2003/05/soap/bindings/HTTP/"

wsoap:mepDefault="http://www.w3.org/2003/05/soap/mep/request−response">

<operation ref="tns:Operation1" />

</binding>

最后一部分指定绑定的一个或多个端口地址。service元素是网络端点或端口的容器,通过它们可以访问 web 服务(参见清单 5-9 )。

Listing 5-9. Offering Endpoints for Both Bindings

<service name="Service1" interface="tns:Interface1">

<endpoint name="HttpEndpoint" binding="tns:HttpBinding" A978-1-4842-1049-9_5_Fig5al_HTML.jpg

address="http://www.example.com/rest/"/>

<endpoint name="SoapEndpoint" binding="tns:SoapBinding" A978-1-4842-1049-9_5_Fig5am_HTML.jpg

address="http://www.example.com/soap/"/>

</service>

</description>

元素的属性描述了 web 服务的名称。interface属性指定了与服务相关的界面元素。元素的属性声明了服务的网址。

WSDL 语义注释

web 服务描述语言的语义注释(SAWSDL)是一个标准,用于指定 Web 服务数据绑定如何映射到正式模型[5]。SAWSDL 提供了一种可重复的方式,通过固定的数据绑定将 RDF 或 OWL 连接到语义 Web 服务,从而更容易以编程方式找到满足应用需求的服务数据。SAWSDL 通过一组 Web 服务描述语言和 XML 模式定义语言的扩展属性提供了对 WSDL 组件的附加语义的描述。SAWSDL 的名称空间前缀是sawsdl,指向 www.w3.org/ns/sawsdl ,以及sawsdlrdf,指向www.w3.org/ns/sawsdl#

WSDL 文档中的接口可以使用modelReference进行注释,这提供了对描述 WSDL 接口的语义模型中的一个或多个概念的引用(参见清单 5-10 )。

Listing 5-10. SAWSDL Model Reference for a WSDL Interface

<wsdl:interface name="Order" sawsdl:modelReference="http://yourbookshop.com/textbooks

</wsdl:interface>

WSDL 操作也可以使用modelReference进行注释,通过为操作指定行为方面或进一步的语义定义,引用语义模型中的概念来提供操作的高级描述(参见清单 5-11 )。

Listing 5-11. SAWSDL Model Reference for a WSDL Operation

<wsdl:operation name="order" pattern="http://www.w3.org/ns/wsdl/in-out"

sawsdl:modelReference="http://www.example.com/purchaseorder#RequestPurchaseOrder">

<wsdl:input element="OrderRequest" />

<wsdl:output element="OrderResponse" />

</wsdl:operation>

SAWSDL 模型参考实现的另一个例子是指向故障的高级描述的故障注释,它可能还包括进一步的语义注释(参见清单 5-12 )。

Listing 5-12. SAWSDL Model Reference for a WSDL Fault

<wsdl:interface name="Order">

<wsdl:fault name="ItemUnavailableFault" element="AvailabilityInformation" A978-1-4842-1049-9_5_Fig5ao_HTML.jpg

sawsdl:modelReference="http://www.example.com/purchaseorder#ItemUnavailable" />

</wsdl:interface>

假设我们有一个带有语义 Web 服务接口的在线商店。服务的 WSDL 描述可以用 SAWSDL 进行注释,如清单 5-13 所示。

Listing 5-13. SAWSDL Annotations in the WSDL File of a Semantic Web Service

<wsdl:description A978-1-4842-1049-9_5_Fig5ap_HTML.jpg

targetNamespace="http://www.example.com/wsdl/order#" A978-1-4842-1049-9_5_Fig5aq_HTML.jpg

EmphasisFontCategoryNonProportional">http://www.w3.org/2002/ws/sawsdl/spec/wsdl/order#``"

xmlns:wsdl="http://www.w3.org/ns/wsdl"

xmlns:xs="http://www.w3.org/2001/XMLSchema"

xmlns:sawsdl=" http://www.w3.org/ns/sawsdl "

<wsdl:types>

<xs:schema targetNamespace="http://www.example.com/wsdl/order#" A978-1-4842-1049-9_5_Fig5au_HTML.jpg

elementFormDefault="qualified">

<xs:element name="OrderRequest" A978-1-4842-1049-9_5_Fig5av_HTML.jpg

sawsdl:modelReference="http://example.com/purchaseorder#OrderRequest" A978-1-4842-1049-9_5_Fig5aw_HTML.jpg

sawsdl:loweringSchemaMapping="``http://www.example.com/mapping/lower.xml

<xs:complexType>

<xs:sequence>

<xs:element name="customerNo" type="xs:integer" />

<xs:element name="orderItem" type="item" minOccurs="1" maxOccurs="unbounded" />

</xs:sequence>

</xs:complexType>

</xs:element>

<xs:complexType name="item">

<xs:all>

<xs:element name="UPC" type="xs:string" />

</xs:all>

<xs:attribute name="quantity" type="xs:integer" />

</xs:complexType>

<xs:element name="OrderResponse" type="confirmation" />

<xs:simpleType name="confirmation" A978-1-4842-1049-9_5_Fig5ax_HTML.jpg

sawsdl:modelReference=" http://www.example.com/purchaseorder#OrderConfirmation "

<xs:restriction base="xs:string">

<xs:enumeration value="Confirmed" />

<xs:enumeration value="Pending" />

<xs:enumeration value="Rejected" />

</xs:restriction>

</xs:simpleType>

</xs:schema>

</wsdl:types>

<wsdl:interface name="Order"``sawsdl:modelReference="http://example.com/textbooks"

<wsdl:operation name="order" pattern="http://www.w3.org/ns/wsdl/in-out"

sawsdl:modelReference=" http://www.example.com/purchaseorder#RequestPurchaseOrder "

<wsdl:input element="OrderRequest" />

<wsdl:output element="OrderResponse" />

</wsdl:operation>

</wsdl:interface>

</wsdl:description>

OrderRequest元素上的loweringSchemaMapping指向一个映射,它显示了订单请求中的元素如何从模型中的语义数据映射到 ws 的实际执行格式,例如 string 或 integer。换句话说,loweringSchemaMapping将数据从语义模型降低到 XML。相比之下,LiftingSchemaMapping将数据从 XML 提升到语义模型。

XML 模式文档可以用 SAWSDL 进行类似的注释。

面向服务的 Web 本体语言(OWL-S)

作为 web 本体语言(OWL)的扩展,服务的 Web 本体语言(OWL-S)促进了 Web 服务任务的自动化,例如发现、组合、互操作、执行和执行监控[6]。OWL-S 关注 web 服务能力以及功能和非功能属性。OWL-S 基于情境演算表示 web 服务行为,情境演算是一种用于表示和推理以二阶逻辑表示的动态域的形式逻辑。OWL-S 作为一种上层本体语言,适合通过一个Service类来描述 web 服务。Service类的每个实体都是一个ServiceProfile

OWL-S 将服务描述组织成四个概念区域:服务模型、概要文件、基础和服务。流程模型描述了客户端如何与服务交互,包括输入、输出、前提条件和服务执行结果的集合。服务配置文件将服务执行的任务描述为人类可读的数据,包括服务名称、服务描述、实现限制、服务质量、发布者和联系信息。基础提供了客户端与服务交互所需的所有细节,包括通信协议、消息格式和端口号。对于接地,最常用的语言是 WSDL 语。因为 OWL-S 原子进程对应的是 WSDL 运算,OWL-S 原子进程的输入输出对应的是 WSDL 消息,而 OWL-S 原子进程的输入输出类型对应的是 WSDL 抽象类型。该服务将其他部分绑定到一个可以搜索、发布和调用的单元中。

Note

服务的不同部分可以以不同的方式重用和连接。例如,服务提供者可能将流程模型与几个概要文件连接起来,以便为不同的市场提供定制的广告。

使用 OWL-S,软件代理可以自动发现 web 服务,以满足特定质量约束下的特定需求。OWL-S 还允许软件代理自动读取 web 服务输入和输出的描述,并调用服务。此外,OWL 支持自动执行复杂的任务,这些任务涉及到各种 web 服务的协调调用,完全基于目标的高级描述。

OWL-S 的超类适用于不同的高级服务描述。由ServiceProfile提供的基本信息将一个概要文件实例链接到一个服务实例。presents属性可以用来表达服务实例和配置文件实例之间的关系。presentedBy属性表示一个配置文件与一个服务相关。

serviceNametextDescriptioncontactInformation OWL-S 属性提供了主要用于人类消费的描述。前两个属性只允许一个值,但可以提供任意数量的联系人。serviceName的值是可以用作服务标识符的服务的名称。textDescription提供了一个简短的服务描述,包括服务提供、服务先决条件以及要与接收者共享的附加信息。contactInformation使用广泛部署的词汇表声明联系人,如 FOAF、vCard 或 Schema。

服务功能、所需条件以及预期和意外结果可以用 OWL-S 属性来定义,例如hasInputhasOutput数据类型属性以及hasPreconditionhasResult对象属性,所有这些都是hasParameter对象属性的子属性。附加的配置文件属性,例如保证的服务质量,可以通过serviceParameter来表达,这是一个可选的配置文件描述属性列表。属性的值是类的一个实例。

服务类别可以使用ServiceCategory来表达,通常是通过引用外部词汇表中的定义。categoryName属性将服务类别的名称声明为字符串或用作流程参数的属性的 URI。taxonomy的值将分类方案定义为分类的 URI。value属性明确引用了一个分类值。code的属性值是与分类相关的代码。serviceParameterName是作为文字或 URI 的参数名。sParameter指向外部本体中的参数值。

serviceClassificationserviceProduct属性指定了所提供的服务类型和该服务所处理的产品。换句话说,serviceClassification是服务配置文件和服务本体之间的映射,而serviceProduct是服务配置文件和产品本体之间的映射。

为了将服务表示为流程,OWL-S 1.1 定义了Process(ServiceModel的子类)。Parameter类有InputOutput子类来描述过程参数(参见清单 5-14 )。

Listing 5-14. Input and Output Are Subclasses of Parameter

<owl:Class rdf:ID="Input">

<rdfs:subClassOf rdf:resource="#Parameter" />

</owl:Class>

<owl:Class rdf:ID="Output">

<rdfs:subClassOf rdf:resource="#Parameter" />

</owl:Class>

过程参数通常表示为 SWRL 变量(见清单 5-15 ),因为 SWRL 是一种专门为表达 OWL 规则而设计的语言[7]。

Listing 5-15. A Process Parameter as a SWRL Variable

<owl:Class rdf:about="#Parameter" rdf:ID="/parameterType/">

<rdfs:subClassOf rdf:resource="&swrl;#Variable" />

</owl:Class>

每个参数都有一个类型,其 URI 值指定了一个类或数据类型的类型(参见清单 5-16 )。例如,该类型可用于评估电子商务服务的信用卡号。

Listing 5-16. Parameter Type Specified by a URI

<owl:Class rdf:ID="Parameter">

<rdfs:subClassOf>

<owl:Restriction>

<owl:onProperty rdf:resource="#parameterType" />

<owl:minCardinality rdf:datatype="&xsd;#nonNegativeInteger">1</owl:minCardinality>

</owl:Restriction>

</rdfs:subClassOf>

</owl:Class>

一个流程至少有两个代理,即TheClientTheServer。使用hasParticipant属性可以列出更多的代理(参见清单 5-17 )。

Listing 5-17. Process Agents in OWL-S

<owl:ObjectProperty rdf:ID="hasParticipant">

<rdfs:domain rdf:resource="#Order" />

</owl:ObjectProperty>

<owl:ObjectProperty rdf:ID="hasClient">

<rdfs:subPropertyOf rdf:resource="#hasContract" />

</owl:ObjectProperty>

<process:Parameter rdf:ID="TheClient">

<process:Parameter rdf:ID="TheServer">

如果流程有前提条件,除非前提条件为真,否则流程无法执行。先决条件可以用 OWL-S 表示,如清单 5-18 所示。

Listing 5-18. Precondition Definition

<owl:ObjectProperty rdf:ID="hasPrecondition">

<rdfs:domain rdf:resource="#Order" />

<rdfs:range rdf:resource="#Payment" />

</owl:ObjectProperty>

输入和输出指定了服务流程的数据转换。输入指定流程执行所需的信息,而输出提供转换后的数据(参见清单 5-19 )。

Listing 5-19. The hasInput, hasOutput, and hasLocal Subproperties of hasParameter

<owl:ObjectProperty rdf:ID="hasParameter">

<rdfs:domain rdf:resource="#Order" />

<rdfs:range rdf:resource="#Status" />

</owl:ObjectProperty>

<owl:ObjectProperty rdf:ID="hasInput">

<rdfs:subPropertyOf rdf:resource="#validCard" />

<rdfs:range rdf:resource="#Input" />

</owl:ObjectProperty>

<owl:ObjectProperty rdf:ID="hasOutput">

<rdfs:subPropertyOf rdf:resource="#orderPlaced" />

<rdfs:range rdf:resource="#Ordering" />

</owl:ObjectProperty>

<owl:ObjectProperty rdf:ID="hasLocal">

<rdfs:subPropertyOf rdf:resource="#ordered" />

<rdfs:range rdf:resource="#Local" />

</owl:ObjectProperty>

输出和状态变化(效果)一起被称为结果(见清单 5-20 )。

Listing 5-20. A Result

<owl:Class rdf:ID="Result">

<rdfs:label>Result</rdfs:label>

</owl:Class>

<owl:ObjectProperty rdf:ID="hasResult">

<rdfs:label>hasResult</rdfs:label>

<rdfs:domain rdf:resource="#Order" />

<rdfs:range rdf:resource="#Ordering" />

</owl:ObjectProperty>

如果一个结果被声明,那么输出和效果条件可以用四个ResultVar(作用于一个特定的结果)或Local变量(绑定在前提条件中并在结果条件中使用):inConditionwithOutputhasEffecthasResultVar(参见清单 5-21 )。属性指定了产生结果的条件。withOutputhasEffect属性决定了当声明的条件为真时会发生什么。hasResultVar属性声明了绑定在inCondition属性中的变量。

Listing 5-21. Output and Effect Conditions

<owl:ObjectProperty rdf:ID="inCondition">

<rdfs:label>inCondition</rdfs:label>

<rdfs:domain rdf:resource="#Order" />

<rdfs:range rdf:resource="#Payment" />

</owl:ObjectProperty>

<owl:ObjectProperty rdf:ID="hasResultVar">

<rdfs:label>hasResultVar</rdfs:label>

<rdfs:domain rdf:resource="#Order" />

<rdfs:range rdf:resource="#Ordering" />

</owl:ObjectProperty>

<owl:ObjectProperty rdf:ID="withOutput">

<rdfs:label>withOutput</rdfs:label>

<rdfs:domain rdf:resource="#Order" />

<rdfs:range rdf:resource="#Output" />

</owl:ObjectProperty>

<owl:ObjectProperty rdf:ID="hasEffect">

<rdfs:label>hasEffect</rdfs:label>

<rdfs:domain rdf:resource="#Order" />

<rdfs:range rdf:resource="#Ordering" />

</owl:ObjectProperty>

虽然 OWL-S 通过描述服务提供和需求适合其主要目的,但由于其有限的表达能力,不相关的操作不受支持。

Web 服务建模本体(WSMO)

Web 服务建模本体(WSMO,发音为“Wizmo”)是一个语义 Web 服务的概念模型,使用 WSML 形式描述语言和 WSMX 执行环境[8]作为本体覆盖了核心语义 Web 服务元素。WSMO 源自并基于 Web 服务建模框架(WSMF) [9]。WSMO 支持 web 服务中涉及的发现、选择、组合、中介、执行和监控任务的部分或全部自动化。WSMO 的四个主要组成部分是目标、中介、web 服务描述和表示为顶级元素的本体(见图 5-2 )。

A978-1-4842-1049-9_5_Fig2_HTML.jpg

图 5-2。

Top-level WSMO elements

与 OWL-S 相似,WSMO 也定义了到 WSDL 的映射,但是是基于本体的,这防止了在整个服务使用过程中本体描述的丢失。尽管 OWL-S 没有中介的概念,中介是编排的副产品或来自翻译公理,但在 WSMO,中介是核心概念元素。

WSMO 有一个基于目标的服务描述方法,可以在基于目标搜索服务时使用。目标是服务要满足的客户的愿望。中介是组件之间的连接器,提供不同本体之间的互操作性,并解决结构、语义和概念上的不匹配。

有四种类型的 WSMO 中介器:链接两个目标的中介器,导入本体并解决本体之间可能的表示不匹配的中介器,链接 web 服务和目标的中介器,以及链接两个 web 服务的中介器。语义 Web 服务描述可以涵盖功能和用法描述。功能描述描述了服务的能力,而使用描述描述了接口。本体提供了所有其他组件使用的信息的正式描述。

WSMO 元素由非功能属性描述,使用 Dublin Core 元数据集(ContributorCoverageCreatorDescriptionFormatIdentifierLanguagePublisherRelationRightsSourceSubjectTitleType)来完成项目描述和资源管理(参见清单 5-22 )。

Listing 5-22. Core WSMO Nonfunctional Properties Expressed Using Dublin Core in an Example Ontology

ontology <"http://www.example.com/holidayplanner">

nonFunctionalProperties

dc:title hasValue "Holiday Planner Example Ontology"

dc:creator hasValue "Leslie Sikos"

dc:subject hasValues {"Trip", "Itinerary", "Stop", "Ticket"}

dc:description hasValue "Our Holiday Packages"

dc:publisher hasValue "Leslie Sikos"

dc:date hasValue "2015-02-21"

dc:format hasValue "text/html"

endNonFunctionalProperties

service类可用于从客户和服务提供者的角度描述服务,以具有非功能属性、导入的本体(如果有的话)、中介、服务能力、服务接口、功能、公理和本体实例的通用元数据为特征(参见清单 5-23 )。

Listing 5-23. The Definition of the service Class

Class service

hasNonFunctionalProperties type nonFunctionalProperties

importsOntology type ontology

usesMediator type {ooMediator, wwMediator}

hasCapability type capability multiplicity = single-valued

hasInterface type interface

hasFunction type function

hasInstance type instance

hasAxiom type axiom

非功能属性可以表达比一般服务元数据更多的内容,因为它们涵盖了可用性和稳定性的服务质量(QoS)信息,例如AccuracyNetworkRelatedQoSPerformanceReliabilityRobustnessScalabilitySecurityTransactionalTrust,以及其他财务、所有权和版本信息(FinancialOwnerVersion)。例如,服务提供商可以使用非功能性的 WSMO 房产来描述学生折扣或养老金领取者优惠标准。

除了非功能属性,本体定义可以包含导入的本体(importsOntology)。为了处理异构性,您可以使用usesMediators来定义中介(参见清单 5-24 )。

Listing 5-24. Defining a Mediator

usesMediators {<<``http://www.example.com/externalMediator.wsml

本体的知识领域的实体集可以使用concept来定义。例如,对于度假预订服务,您必须定义country的概念及其属性,比如 ISO 国家代码(参见清单 5-25 )。

Listing 5-25. Defining Entity Sets for the Domain

concept country subConceptOf {cnt:country, geo:country}

nonFunctionalProperties

dc:description hasValue "Country Codes"

endNonFunctionalProperties

isoCode ofType xsd:string

nonFunctionalProperties

dc:description hasValue "ISO 3166 Country Code"

endNonFunctionalProperties

概念之间的关系可以用relation来定义(见清单 5-26 )。

Listing 5-26. Defining Relations between Concepts[10]

relation equalDistance

nonFunctionalProperties

dc:description hasValue "Computes equality of a distance"

endNonFunctionalProperties

d1 ofType distance

d2 ofType distance

definedBy

forAll ?x,?y ( equalDistance[d1 hasValue ?x, d2 hasValue ?y] equivalent A978-1-4842-1049-9_5_Fig5az_HTML.jpg

kilometers(?x,?k1) and kilometers(?y,?k2) and ?k1=?k2).

relation lessThanDistance

nonFunctionalProperties

dc:description hasValue "Computes -less than- for a distance"

endNonFunctionalProperties

d1 ofType distance

d2 ofType distance

definedBy

forAll ?x,?y ( equalDistance[d1 hasValue ?x, d2 hasValue ?y] equivalent A978-1-4842-1049-9_5_Fig5ba_HTML.jpg

kilometers(?x,?k1) and kilometers(?y,?k2) and ?k1<?k2).

relation moreThanDistance

nonFunctionalProperties

dc:description hasValue "Computes -more than- for a distance"

endNonFunctionalProperties

d1 ofType distance

d2 ofType distance

definedBy

forAll ?x,?y ( equalDistance[d1 hasValue ?x, d2 hasValue ?y] equivalent A978-1-4842-1049-9_5_Fig5bb_HTML.jpg

kilometers(?x,?k1) and kilometers(?y,?k2) and ?k1>?k2).

通过定义函数,可以将算法添加到你的 WSMO 本体中。例如,如果您的假期预订服务支持以公里和英里表示的距离,您可以编写函数将距离从一种单位转换为另一种单位(参见清单 5-27 )。

Listing 5-27. Defining Functions in WSMO[10]

function kilometers

nonFunctionalProperties

dc:description hasValue "Expressing a distance in kilometers"

endNonFunctionalProperties

d ofType distance

range ofType xsd:float

definedBy

forAll ?x,?y (kilometers[d hasValue ?d, result hasValue ?y] equivalent A978-1-4842-1049-9_5_Fig5bc_HTML.jpg

?d[amount hasValue ?a, units hasValue ?u] and ((?u="Kilometers" and ?y=?a) or A978-1-4842-1049-9_5_Fig5bd_HTML.jpg

(?a="Miles" and ?y=?a*1.609344))).

function miles

nonFunctionalProperties

dc:description hasValue "Expressing a distance in miles"

endNonFunctionalProperties

d ofType distance

range ofType xsd:float

definedBy

forAll ?x,?y (miles[d hasValue ?d, result hasValue ?y] equivalent A978-1-4842-1049-9_5_Fig5be_HTML.jpg

?d[amount hasValue ?a, units hasValue ?u] and ((?u="Miles" and ?y=?a) or A978-1-4842-1049-9_5_Fig5bf_HTML.jpg

(?a="Kilometers" and ?y=?a/1.609344))).

本体实例可以使用instance来定义。例如,在航班预订服务中,您可以定义您的服务所提供的目的地国家,如清单 5-28 所示。

Listing 5-28. An Instance in a WSMO Ontology

instance Australia memberOf country

isoCode hasValue "AU"^^xsd:string

一个本体的逻辑陈述(公理表达式)可以由axiom定义(见清单 5-29 )。

Listing 5-29. An Instance in a WSMO Ontology

axiom validDistance

nonFunctionalProperties

dc:description hasValue "The distance must be larger than 0km or 0m."

endNonFunctionalProperties

definedBy

constraint

?D[amount hasValue ?A, units hasValue ?U] memberOf distance and ?A < 0 and not A978-1-4842-1049-9_5_Fig5bg_HTML.jpg

(U="Kilometers" or U="Miles").

服务的功能能力可以使用capability类来表达,它涵盖了前提条件、假设、后置条件和效果(状态变化)公理,以及在前提条件、后置条件、假设和效果之间共享的变量(参见清单 5-30 )。

Listing 5-30. The Definition of the capability Class in WSMO

Class capability

hasNonFunctionalProperties type nonFunctionalProperties

importsOntology type ontology

usesMediator type {ooMediator, wgMediator}

hasSharedVariables type sharedVariables

hasPrecondition type axiom

hasAssumption type axiom

hasPostcondition type axiom

hasEffect type axiom

例如,如果您使用政府服务来注册养老金领取者,服务执行的效果是用户成为养老金领取者。

web 服务接口以两种方式描述了使用interface类的 web 服务的操作能力:通过编排和编排(参见清单 5-31 )。编排从交互的角度来表达 web 服务能力,换句话说,它对所有服务交互进行建模,包括状态描述的不变元素(状态签名)、由实例集描述的状态以及状态变化(受保护的转换)。编排从功能的角度表达了 web 服务的能力。

Listing 5-31. Choreography and Orchestration Defined for the interface Class

Class interface

hasNonFunctionalProperties type nonFunctionalProperties

importsOntology type ontology

usesMediator type ooMediator

hasChoreography type choreography

hasOrchestration type orchestration

web 服务的目的可以通过goal类来表达(参见清单 5-32 )。例如,服务的目标可以是用户注册、购票或预订房间。

Listing 5-32. The Definition of the goal Class in WSMO

Class goal sub-Class wsmoTopLevelElement

importsOntology type ontology

usesMediator type {ooMediator, ggMediator}

requestsCapability type capability multiplicity = single-valued

requestsInterface type interface

MicroWSMO 和 WSMO-Lite

MicroWSMO 是 hRESTS [11]的一个扩展,通过 SAWSDL 扩展为语义注释而设计,如 model(表示链接是模型引用)和 lifting(降低链接到各自的数据转换)[12]。hRESTS 为 RESTful 服务提供了一个 WSDL 等价物,使得注释服务描述的 HTML 标记成为可能。清单 5-33 中显示了一个例子。

Listing 5-33. Annotated Service Description

<div``class="service"

<p><span``class="label"``>Dream Holidays</span> is a

<a``rel="model"

</p>

<p``class="operation"

</p>

</div>

microWSMO 可以使用这些注释来引用与 WSMO-Lite 相同的轻量级服务建模本体的元素,后者用具体的服务语义填充注释。WSMO-Lite 不局限于特定的服务描述格式,允许为 SOAP 和 REST 创建匹配的堆栈。

Web 服务建模语言(WSML)

Web 服务建模语言(WSML)是一种公理化表达的正式语言,它为 Web 服务建模本体 WSMO 的元素提供了概念语法和语义[13]。WSML 可用于正式描述 WSMO 元素为本体、语义 Web 服务、目标和中介。WSML 基于数理逻辑,如描述逻辑和一阶逻辑,以及逻辑编程。

WSML 有两种语法:概念语法和逻辑表达式语法。概念语法用于本体、目标、web 服务和中介建模。逻辑表达式使用逻辑语言细化了本体、目标、web 服务和中介定义。概念语法有一种类似框架的风格,通过这种风格,类、关系和实例以及它们的属性被指定在一个单一的语法结构中。但是,属性名在 WSML 是全局的。参数列表用逗号分隔,并用花括号括起来。语句以关键字开始,可以分布在多行中。WSML 实现了 RDF 命名空间机制。WSML 关键字在名称空间www.wsmo.org/wsml/wsml-syntax#中定义,通常用前缀wsml缩写。WSML 标识符可以是数据值、国际化资源标识符(IRIs,是可以包含 Unicode 字符的 URIs,例如中文表意字符、日文汉字、西里尔字符等。),或者匿名标识符。基本数据类型是字符串、整数和小数。数据值基于 XML 模式数据类型,但是用不同的语法表示(参见清单 5-34 )。

Listing 5-34. The Date “22 February 2015” in WSML

_date(2015,2,22)

字符串、整数和十进制数据类型有三种语法快捷方式。字符串数据值可以写在双引号之间(参见清单 5-35 )。字符串中的双引号应该使用\进行转义。

Listing 5-35. A String in Double Quotation Marks

dc#title hasValue "Your Amigo"

可以在不声明数字类型的情况下写入整数值。比如5就是_integer("5")的快捷方式。如果有十进制符号,则该数字被假定为十进制数。例如,22.5_decimal("22.5")的快捷方式。

IRI 以下划线开始,用双引号括起来(见清单 5-36 )。

Listing 5-36. A Full IRI in WSML

_"http://example.org/YourOntology#YourTerm"

IRIs 可以缩写为序列化限定名(sQName),它结合了名称空间前缀和本地实体名,用#分隔。以清单 5-35 为例,dc#title对应 http://purl.org/dc/elements/1.1#titlefoaf#name缩写 http://xmlns.com/foaf/0.1/namexsd#stringhttp://www.w3.org/2001/XMLSchema#stringschema#Person对应 http://schema.org/Person 。WSML 定义了两个虹膜,一个代表普遍真理( http://www.wsmo.org/wsml/wsml-syntax#true ),另一个代表普遍谬误( http://www.wsmo.org/wsml/wsml-syntax#false )。

第三种 WSML 标识符类型,即匿名标识符,代表全球唯一的 IRI。

可选的名称空间引用可以定义在 WSML 文档的顶部,WSML 变体标识的下面。名称空间引用块前面是namespace关键字。除了默认名称空间之外,所有名称空间引用都由前缀和标识名称空间的 IRI 组成(参见清单 5-37 )。

Listing 5-37. Namespace Declarations in WSML

namespace {_"``http://www.yourdefaultns.com/yourOntology/term#``",

dc _"``http://purl.org/dc/elements/1.1#``",

foaf _"http://xmlns.com/foaf/0.1/",

xsd _"``http://www.w3.org/2001/XMLSchema#``",

wsml _"``http://www.wsmo.org/wsml-syntax#

WSML 头可能包含非功能属性,可能导入本体,可能使用中介。非功能属性块由关键字nonFunctionalPropertiesendNonFunctionalProperties限定,可以缩写为nfpendnfp。块中的属性值列表包含属性标识符、hasValue关键字和属性值,属性值可以是任何类型的标识符(数据值、IRI、匿名标识符或逗号分隔的列表)。都柏林核心属性被推荐用于非功能属性定义;然而,其他外部词汇表的术语也是允许的(参见清单 5-38 )。

Listing 5-38. A Nonfunctional Property Block in WSML

nonFunctionalProperties

dc#title hasValue "WSML Example"

dc#subject hasValue "training"

dc#description hasValue "WSML non-functional property examples"

dc#contributor hasValue {_"http://lesliesikos.com/datasets/sikos.rdf#sikos

dc#date hasValue _date("2015-02-22")

dc#format hasValue "text/html"

dc#language hasValue "en-AU"

endNonFunctionalProperties

在标题中,可以选择使用importsOntology关键字,通过声明名称空间 IRI 来导入本体(参见清单 5-39 )。

Listing 5-39. Importing Ontologies

importsOntology {_" http://purl.org/dc/elements/1.1# ", _" http://schema.org/Person "}

可以选择在标题中用关键字usesMediator定义中介,以链接不同的 WSML 元素(本体、目标和 web 服务)并解决元素之间的异构性(参见清单 5-40 )。

Listing 5-40. Using a Mediator

usesMediator _"``http://example.com/importMediator

Web 服务业务流程执行语言(WS-BPEL)

业务流程需要复杂的异常管理、企业协作、任务共享和端到端控制。web 服务业务流程执行语言(WS-BPEL),通常缩写为 BPEL(业务流程执行语言),是一种基于 XML 的标准语言,用于指定业务流程的 Web 服务操作。BPEL 适用于面向服务的架构(SOA),由 Oracle 等行业巨头实现,基于更早的执行语言,如 IBM 的 Web Service Flow Language (WSFL)和微软的 XLang。BPEL 最初的十个设计目标如下:

Define business processes that interact with external entities through web service operations and that manifest themselves as web services. Both the operations and the web services are defined using WSDL 1.1.   Define business processes based on an XML serialization. Do not define a graphical representation of processes or provide any particular design methodology for processes.   Define a set of web service orchestration concepts to be used by external (abstract) and internal (executable) views of a business process.   Provide hierarchical as well as graph-like controls.   Provide data manipulation functions for process data and control flow.   Support an identification mechanism for process instances that allows the definition of instance identifiers at the application message level.   Support the implicit creation and termination of process instances as the basic life cycle mechanism.   Define a long-running transaction model based on compensation actions and scoping to support failure recovery for parts of long-running business processes.   Use web services as the model for process decomposition and assembly.   Build on web services standards.

为了定义服务交互的逻辑,BPEL 通过 web 服务编排定义了业务流程行为。BPEL 进程使用 web 服务接口传输信息。BPEL 可以将 web 服务交互建模为可执行的业务流程、抽象的业务流程,或者通过流程的行为。BPEL 编程语言支持

  • 消息发送和接收
  • XML 和 WSDL 类型变量
  • 一种基于属性的消息关联机制
  • 一个可扩展语言插件模型,允许用多种语言编写表达式和查询 1
  • 结构化编程构造,例如if-then-elseif-elsewhilesequence和流
  • 局部变量、故障处理程序、补偿处理程序和事件处理程序中的逻辑
  • 控制变量访问的范围

一些流行的 BPEL 引擎是 Apache ODE、BizTalk Server、Oracle BPEL 流程管理器、SAP Exchange 基础设施、Virtuoso Universal Server 和 WebSphere Process Server。

语义 Web 服务软件

开发人员可以使用语义执行环境,如 WSMX 和 IRS,来提供语义 Web 服务的自动发现、组合、选择、中介和调用。使用专门构建的框架和插件,如 Web 服务建模工具包(WSMT)和 Protégé的语义自动发现和集成插件,可以加速语义 Web 服务的开发。

Web 服务建模执行环境(WSMX)

Web 服务建模执行环境(WSMX)是 Web 服务建模本体的参考实现,使用 WSML 作为内部语言,WSMT 用于建模[14]。这是一个面向业务应用的开源执行环境,在 http://sourceforge.net/projects/wsmx/ 提供集成的 web 服务,提供增强的业务流程自动化和可伸缩性。WSMX 消费语义消息,发现语义标注的 web 服务,并处理它们。在请求的服务和提供的服务的后端应用之间,WSMX 有一个系统接口、一个管理接口、用于映射和数据存储访问的资源管理器接口,以及一个推理器框架。

互联网推理服务(IRS-III)

互联网推理服务(IRS)是开放大学的语义 Web 服务框架,它允许应用语义描述和执行 Web 服务[15]。它支持在语义网的上下文中提供语义推理服务。互联网推理服务最著名的实现是 IRS-III。

Web 服务建模工具包(WSMT)

Web 服务建模工具包(WSMT)是一个用于快速语义 Web 服务开发和部署的轻量级框架,可在 http://sourceforge.net/projects/wsmt/ 获得。它还在一个应用中收集了现有的 SWS 工具。Web 服务建模工具包可以集成到 WSMX 和 IRS-III 执行环境中。

Web 服务建模工具包主要是为在集成开发环境(如 Eclipse 或 NetBeans)中开发软件的 Java 程序员设计的。该工具包旨在帮助使用 WSMO 范式的语义 Web 服务的开发者。Java 开发人员可以将 Web 服务建模工具包与其他插件结合起来,例如 Eclipse Web Tools Platform (WTP ),它为创建语义 Web 服务提供了支持 XML 和 WSDL 的工具,并使用 WSMO 对它们进行语义描述。Web 服务建模工具包支持通过编辑、验证、测试和部署来创建语义 Web 服务中使用的常见文档类型。该工具包提供了一个文本编辑器、一个基于表单的编辑器和一个 WSML 验证器,并为推理和发现提供了不同的视图。

因为两个本体之间的映射是在设计时创建的,并在运行时自动应用,以便执行实例转换,所以 Web 服务建模工具包为本体-本体映射提供了指导。WSMT 映射用抽象映射语言(AML)表示,然后转换成 WSML。该工具包具有 AML 文本编辑器和可视化编辑器、AML 验证器,并提供 AML 的映射和测试视图。

语义自动发现和集成(SADI)

语义自动发现和集成(SADI)是一组轻量级的语义 Web 服务设计模式( https://code.google.com/p/sadi/ )。它主要是为科学服务出版物设计的,在生物信息学中特别有用。在 web 标准的支持下,SADI 实现了语义 Web 技术来消费和生产 OWL-DL 类的 RDF 实例,其中输入和输出类 URIs 通过 HTTP GET 解析为 OWL 文档。SADI 支持 RDF/XML 和 Notation3 序列化。SADI 设计模式提供了基于用户需求的适当服务的自动发现,并且可以自动将这些服务链接到复杂的分析工作流中。SADI 是 Protégé ontology editor、IO Informatics Knowledge Explorer to graph visualization 以及 Taverna(一个开源工作流设计和执行工作台)的插件。

UDDI 语义网服务列表

通用描述、发现和集成(UDDI)是一个独立于平台的基于 XML 的目录服务,面向提供 web 服务的企业。它在一个单一、开放和安全的环境中以编程方式描述 web 服务和业务流程。WSDL 描述了 UDDI,并通过 SOAP 进行通信。UDDI 可用于提高电子商务之间的互操作性,简化在线交易。类似于电话簿的白页或黄页,UDDI 允许带有企业名称、位置以及所提供的产品和/或网络服务的企业列表。任何公司都可以添加到 UDDI 注册,无论企业规模大小。已经上市的企业包括微软、IBM、Ariba、惠普、康柏、美国运通、SAP 和福特,这里仅举几个最著名的例子。UDDI 可以帮助企业主发现相关业务和决策者,以增加对现有客户和潜在客户的访问,扩大产品和市场覆盖范围。

摘要

在这一章中,你学习了什么是语义 Web 服务,以及如何用 WSDL 描述它们,用 SAWSDL 注释它们,用 OWL-S、WSMO、MicroWSMO、WSMO-Lite 和 WSML 建模它们。您已经熟悉了语义 Web 服务软件,例如 WSMX 和 IIR-III 执行环境,以及 WSMT 工具包和 SADI Protégé插件。您了解了用于动态查找和发现外部业务合作伙伴和服务提供商提供的服务的 UDDI 服务列表。

下一章将向您展示如何在专门构建的图数据库中有效地存储三元组和四元组:三元组存储和四元组存储。

参考

Domingue, J., Martin, D. (2008) Introduction to the Semantic Web Tutorial. The 7th International Semantic Web Conference, 26–30 October, 2008, Karlsruhe, Germany.   Facca, F. M., Krummenacher, R. (2008) Semantic Web Services in a Nutshell. Silicon Valley Semantic Web Meet Up, USA.   Stollberg, M., Haller, A. (2005) Semantic Web Services Tutorial. 3rd International Conference on Web Services, Orlando, FL, USA, 11 July 2005.   Chinnici, R., Moreau, J.-J., Ryman, A., Weerawarana, S. (eds.) (2007) Web Services Description Language (WSDL) Version 2.0 Part 1: Core Language. www.w3.org/TR/wsdl20/ . Accessed 2 April 2015.   Farrell, J., Lausen, H. (eds.) (2007) Semantic Annotations for WSDL and XML Schema. www.w3.org/TR/sawsdl/ . Accessed 2 April 2015.   Martin, D. et al. (2004) OWL-S: Semantic Markup for Web Services. www.w3.org/Submission/OWL-S/ . Accessed 2 April 2015.   Horrocks, I. et al. (2004) SWRL: A Semantic Web Rule Language. Combining OWL and RuleML. www.w3.org/Submission/SWRL/ . Accessed 2 April 2015.   Lausen, H., Polleres, A., Roman, D. (eds.) (2005) Web Service Modeling Ontology (WSMO). www.w3.org/Submission/WSMO/ . Accessed 2 April 2015.   Fensel, D., Bussler, C. (2002) The Web Service Modeling Framework WSMF. www.swsi.org/resources/wsmf-paper.pdf . Accessed 2 April 2015.   Stollberg, M., Lausen, H., Polleres, A., Lara, R. (eds.) (2004) Locations Ontology. www.wsmo.org/2004/d3/d3.2/b2c/20041004/resources/loc.wsml.html . Accessed 4 April 2015.   Roman, D., Kopecký, J., Vitvar, T., Domingue, J., Fensel, D. (2014) WSMO-Lite and hRESTS: Lightweight semantic annotations for Web services and RESTful APIs. Web Semantics: Science, Services and Agents on the World Wide Web, http://dx.doi.org/ 10.1016/j.websem.2014.11.006 .   Kopecký, J., Vitvar, T. (2008) MicroWSMO: Semantic Description of RESTful Services. http://wsmo.org/TR/d38/v0.1/20080219/d38v01_20080219.pdf . Accessed 4 April 2015.   de Bruijn, J. et al. (2005) Web Service Modeling Language (WSML). www.w3.org/Submission/WSML/ . Accessed 2 April 2015.   DERI and STI2 (2008) Web Service Modelling eXecution environment. www.wsmx.org . Accessed 4 April 2015.   Domingue, J. et al. (2011) Internet Reasoning Service. http://technologies.kmi.open.ac.uk/irs/ . Accessed 2 April 2015.   Footnotes 1

BPEL 有本地 XPath 1.0 支持。

六、图数据库

图模型和算法无处不在,因为它们适用于电子商务、社交媒体网络、研究、计算机网络、电子学中的知识表示,以及最大流问题、路线问题和网络搜索。图数据库是具有创建、读取、更新和删除(CRUD)方法的数据库,这些方法展示了图形数据模型,例如属性图(包含节点和关系)、超图(关系可以连接任意数量的节点)、RDF 三元组(主题-谓词-对象)或四元组(命名为图形-主题-谓词-对象)。图数据库通常是为在线事务处理(OLTP)系统设计的,并针对事务性能、完整性和可用性进行了优化。与关系数据库和 NoSQL 数据库不同,包括三元存储和四元存储在内的专用图数据库不依赖于索引,因为图自然地提供了邻接索引,并且附加到节点的关系提供了到其他相关节点的直接连接。使用这种局部性遍历图来执行图查询,这可以以比通过全局索引连接数据的关系数据库高几个数量级的效率来执行。事实上,大多数图数据库都非常强大,甚至适用于大数据应用。

图数据库

为了利用资源描述框架(RDF)的能力,语义网上的数据可以存储在图数据库中,而不是关系数据库中。图数据库是存储 RDF 语句并实现语义查询的图结构的数据库,使用节点、边和属性来表示和检索数据。少数图数据库是基于关系数据库的,而大多数都是为存储和检索 RDF 语句而专门构建的。

图数据库有两个重要的属性,它们决定了效率和实现潜力。第一个是存储,它可以是本地图存储,也可以是将 RDF 图转换为关系、面向对象或通用数据库结构的数据库引擎。另一个主要属性是处理引擎。真正的图数据库实现了所谓的无索引邻接,由此连接的节点在数据库中彼此物理链接。因为每个元素都包含指向其相邻元素的直接指针,所以不需要索引查找。图数据库通过对图形节点和关系的简单抽象来存储任意复杂的 RDF 图。与其他数据库管理系统不同,图数据库不像关系数据库那样使用外键来推断实体之间的连接,也不像 MapReduce 那样使用其他数据。计算算法被实现为图形计算引擎,它识别聚类并回答查询。

图数据库相对于关系数据库和 NoSQL 商店的主要优势之一是性能。在索引、计算能力、存储和查询方面,图数据库通常比传统数据库强大数千倍。在关系数据库中,数据关系的查询性能会随着数据集的增长而下降,与之相反,图数据库的性能保持相对稳定。

虽然关系数据库预先需要一个关于知识领域的全面的数据模型,但是图数据库天生是灵活的,因为图可以毫不费力地用新节点和新关系类型来扩展,而子图可以自然地合并到它们的超图中。

因为图数据库实现了免费的标准,如用于数据建模的 RDF 和用于查询的 SPARQL,所以存储通常没有专有格式和第三方依赖性。图数据库的另一大优势是可以选择使用任意的外部词汇表和模式,而数据可以通过应用编程接口(API)和强大的查询以编程方式获得。

Note

一些图数据库在存储和检索 RDF 三元组或四元组时有局限性,因为底层模型并不总是很好地涵盖 RDF 的特性,例如,使用 URIs 作为标识符并不是默认场景,而且命名约定通常与 RDF 不同。大多数图数据库不支持现成的 SPARQL,尽管许多图数据库提供了 SPARQL 插件。图数据库供应商推出的专有查询语言没有像 SPARQL 那样标准化。

被广泛采用的关系数据库最初被设计成以一种有组织的方式存储诸如表格结构之类的数据。具有讽刺意味的是,关系数据库在处理特殊关系时性能很差。例如,关系数据库的外键意味着开发和维护开销,而它们对于数据库的工作至关重要。在关系数据库中联接两个表可能会增加复杂性,因为外键元数据与业务数据混合在一起。即使简单的查询在计算上也可能很复杂。关系数据库中稀疏表的处理很差。关于 NoSQL 数据库,包括面向键值、文档和列的数据库,关系处理也不完美。因为 NoSQL 数据库通常存储多组不相连的文档、值或列(取决于类型),所以它们对于存储数据互连和图形并不理想。

图数据库的主要参数是每秒三倍或每秒四倍的负载率(有时与索引时间相结合)和查询执行时间。可用于比较图数据库的其他特征是许可、源可用性(开放源、二进制分发或两者)、可伸缩性、图形模型、模式模型、API、专有查询语言和查询方法、支持的平台、一致性、对分布式处理的支持、分区、可扩展性、可视化工具、存储后端(持久性)、语言和备份/恢复选项。表 6-1 总结了最常用的图数据库的比较。

表 6-1。

Comparison of Common Graph Databases [2]

|   | 许可证 | 平台 | 语言 | 分配 | 费用 | 事务性的 | 基于记忆的 | 基于磁盘的 | 单节点 | 分布式的 | 图形算法 | 基于文本的查询语言 | 可嵌入 | 软件 | 数据存储 | 类型 | | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | | 关系型数据库 | GPL/专有 | x86 | C/C++ | 容器 | 自由的 | X | – | X | X | – | – | 结构化查询语言 | X | X | X | sqldb(SQL db) | | 神谕 | 所有人 | x86 | C/C++ | 容器 | $180–$950 | X | – | X | X | X | – | 结构化查询语言 | X | X | X | sqldb(SQL db) | | 数据库 | 所有人 | x86-Win | C++ | 容器 | $898–$8592 | X | – | X | X | – | – | 结构化查询语言 | – | X | X | sqldb(SQL db) | | 数据库 | 公有土地 | x86 | C | Src/Bin | 自由的 | X | X | X | X | – | – | 结构化查询语言 | X | X | X | sqldb(SQL db) | | 速写 | 所有人 | x86 | 可能是 Java | 容器 | Free-ish/$$$ | X | – | X | X | – | X | SPARQL/RDFS++/Prolog | – | X | X | 基因组数据库 | | 阿朗戈布 | 街头流氓 | x86 | C/C++/JS | Src/Bin | 自由的 | – | – | X | X | – | – | 可接受的质量标准 | – | X | X | GDB/KV/DOC(多氯联苯/多氯联苯/多氯联苯) | | DEXEDRINE 的简称 | 所有人 | x86 | C++ | 容器 | 免费个人/商业$$ | X | – | X | X | – | X | 横越 | X | – | X | 基因组数据库 | | FlockDB | 街头流氓 | 爪哇 | Java/Scala/Ruby | 科学研究委员会 | 自由的 | – | – | X | X | X | – | – | – | X | X | 基因组数据库 | | 图表库 | 所有人 | 爪哇 | 爪哇 | 容器 | 免费,每月 15 美元,20,000 美元 | ? | – | X | X | – | – | 界限 | X | X | X | 基因组数据库 | | HyperGraphDB | lgpl(lgpl) | 爪哇 | 爪哇 | 科学研究委员会 | 自由的 | mvcc(mvcc) | X | X | X | X | – | Hg 查询/遍历 | X | – | – | hyperdub | | 无限图 | 所有人 | x86/Java | Java/C++ | 容器 | 免费试用/5000 美元 | 两者 | – | X | X | X | – | 格林林 | X | X | X | 基因组数据库 | | 信息网格 | AGPL/专有 | 爪哇 | 爪哇 | Src/Bin | 免费+支持 | – | X | X | X | X | – | – | X | X | – | 基因组数据库 | | Neo4j | GPL/专有 | 爪哇 | 爪哇 | Src/Bin | 免费,6000-24000 美元 | X | – | X | X | – | X | Cypher | X | X | X | GDB/NoSQL | | OrientDB | 街头流氓 | 爪哇 | 爪哇 | Src/Bin | 免费+支持 | 两者 | X | X | X | X | – | 扩展 SQL/Gremlin | X | X | X | GDB/NoSQL | | 土卫六 | 街头流氓 | 爪哇 | 爪哇 | Src/Bin | 免费+支持 | 两者 | – | X | X | X | – | 小妖精 | X | X | – | 基因组数据库 | | 百吉饼 | 加州大学伯克利分校软件(Berkeley Software Distribution) | 爪哇 | Java/Scala/Spark | 科学研究委员会 | 自由的 | – | X | – | X | X | X | – | X | – | – | 英国标准管螺纹(British Standard Pipe) | | 巴黎银行卢森堡 | 促进 | x86/C++ | C++ | Src/Bin | 自由的 | – | X | – | X | – | X | – | X | – | – | 图书馆 | | 福纳斯 | 街头流氓 | 爪哇 | 爪哇 | 科学研究委员会 | 免费+支持 | 两者 | – | X | X | X | – | 格林林 | X | X | – | 大数据 | | 杰吉 | GPL/CDDL | 爪哇 | Java/OpenGL | Src/Bin | 自由的 | – | X | – | X | – | X | – | X | X | – | 工具包 | | 长颈鹿吗 | 街头流氓 | 爪哇 | 爪哇 | 科学研究委员会 | 自由的 | – | X | ; | X | X | X | – | X | – | – | 英国标准管螺纹(British Standard Pipe) | | GraphLab | 街头流氓 | x86 | C++ | 科学研究委员会 | 自由的 | – | X | X | X | X | X | – | X | – | – | 英国标准管螺纹(British Standard Pipe) | | 图表流 | lgpl/Cecil-c 足球俱乐部 | 爪哇 | 爪哇 | Src/Bin | 自由的 | – | X | – | X | – | X | – | X | – | – | 图书馆 | | 哈马 | 街头流氓 | 爪哇 | 爪哇 | 科学研究委员会 | 自由的 | – | X | – | X | X | X | – | X | – | – | 英国标准管螺纹(British Standard Pipe) | | mtgl(mtgl) | 加州大学伯克利分校软件(Berkeley Software Distribution) | x86/XMT | C++ | 科学研究委员会 | 自由的 | – | X | – | X | – | X | – | X | – | – | 图书馆 | | 网络 x | 加州大学伯克利分校软件(Berkeley Software Distribution) | x86 | 计算机编程语言 | Src/Bin | 自由的 | – | X | – | X | – | X | – | X | – | – | 图书馆 | | 飞马座 | 街头流氓 | 爪哇 | 爪哇 | Src/Bin | 自由的 | – | – | X | X | X | X | – | – | X | – | 大数据 | | 毒刺 | 加州大学伯克利分校软件(Berkeley Software Distribution) | x86/XMT | C | 科学研究委员会 | 自由的 | – | X | – | X | – | X | – | X | X | X | 图书馆 | | uRiKA | 所有人 | X 波段微波发射机(X-band Microwave Transmitter) | 可能是 C++ | 容器 | $$$$ | ? | X | – | X | – | – | SPARQL | – | X | X | 装置 |

虽然图数据库供应商经常将他们的产品与其他图数据库进行比较,但事实上,基准测试 RDF 数据库的行业标准是 Lehigh University Benchmark (LUBM),它适用于性能比较 [3 ]。

三联商店

所有为存储 RDF 三元组而设计的图数据库都被称为三元组存储或主-谓-对象数据库,然而,构建在现有商业关系数据库引擎(如基于 SQL 的数据库)之上的三元组存储通常不如具有从头构建的用于存储和检索 RDF 三元组的数据库引擎的本地三元组存储有效。由于将基于图形的 RDF 模型映射到 SQL 或 NoSQL 查询的困难,本地三元组存储的性能通常更好。

图数据库的优势源自 RDF、OWL 和 SPARQL 的优势特性。RDF 数据元素是全球唯一的和链接的,利用了图形结构的优势。添加一个新的模式元素就像插入一个带有新谓词的三元组一样简单。图数据库也支持专门的 SPARQL 查询。与关系数据库的列标题、外键或约束不同,图数据库的实体是用类来分类的;谓词是属性或关系;它们都是数据的一部分。由于 RDF 的实现,图数据库支持知识发现的自动推理。存储在这些数据库中的数据可以通过机器可读的本体统一词汇、词典和分类法。图数据库通常用于语义数据集成、社会网络分析和链接开放数据应用。

Quadstores

在没有图标识符的情况下,并不总是能够解释 RDF 语句。例如,如果一个给定的名字被用作主语,如果我们不陈述我们想要描述的人,这就是断章取义。然而,如果我们将同一个人的网站地址添加到描述同一个人的每个三元组中,所有的组成部分都变得全球唯一和不可引用。四元组是一个带有图形标识符的主谓宾三元组。被识别的图称为命名图。

比如考虑一个注册在 datahub.io 上的 Turtle 文件中的 LOD 数据集描述,比如 http://www.lesliesikos.com/datasets/sikos-void.ttl 。为了制作关于数据集图的 RDF 语句,subject 被设置为表示图的 RDF 文件的文件名和扩展名( http://www.lesliesikos.com/datasets/sikos.rdf )。这使得编写关于文件的 RDF 语句成为可能,将它描述为一个 LOD 数据集(void:Dataset),使用 Dublin Core 为它添加一个人类可读的标题(dc:title,声明它的创建者(dc:creator,等等,如图 6-1 所示。

A978-1-4842-1049-9_6_Fig1_HTML.gif

图 6-1。

Referencing from a named graph to another named graph Caution

注意 http://www.lesliesikos.com/datasets/sikos.rdfhttp://www.lesliesikos.com/datasets/sikos.rdf#sikos 的区别。第一个例子引用了一个文件;第二个是指档案中描述的人。

如果一个图数据库存储了每个三元组的图名(代表图的上下文或出处信息),这个数据库就称为四元存储。

最流行的图数据库

一些部署最广泛的高性能图数据库是 AllegroGraph、Neo4j、Blazegraph(以前的大数据)、OpenLink Virtuoso、Clark & Parsia 的 Stardog、BigOWLIM、4Store、YARS2、Jena TDB、RDFox、Jena SDB、Mulgara、RDF Gateway、Kowari 和 Sesame。然而,并不是每个人都使用本地图数据库引擎来存储三元组或四元组。例如 Oracle Spatial 和 Graph 与 Oracle 数据库,Jena 与 PostgreSQL,以及 3Store 与 MySQL 3。

速写

AllegroGraph 是业界领先的图数据库平台 [4 ]。它可以将地理空间、时间和社交网络查询组合成单个查询。它支持在线备份、时间点恢复、复制和热备用。AllegroGraph 支持自动三重索引、用户定义的索引以及谓词级别的文本索引。与其他数据库类似,AllegroGraph 实现了事务处理的 ACID(原子性、一致性、隔离性和持久性)属性。原子性意味着事务要么完全失败,要么完全成功。一致性意味着每个事务都将数据库作为一个整体从一种一致状态带到另一种一致状态,因此数据库永远不会不一致。隔离是指所有事务都可以处理其他已完成事务的数据,而不能依赖并发运行的事务的部分结果。持久性意味着,一旦数据库系统向应用发出事务成功完成的信号,即使存在硬件和软件故障,事务所做的更改也将持续,除非硬盘故障破坏了数据。

所有的 AllegroGraph 客户端(Java、Python、JavaScript、Lisp)都是基于 REST 协议的。AllegroGraph 支持多种编程语言和环境,例如 Sesame 或 Jena 中的 Java(通过命令行或 Eclipse 等 IDE)、Python、Ruby、C#、Clojure、JRuby、Scala、Perl、Lisp 和 PHP。graph 数据库支持在 Amazon EC2 上为分布式计算提供云托管。一般的图遍历可以通过 JIG 来执行,这是一个基于 JavaScript 的接口。AllegroGraph 还支持专用和公共会话。AllegroGraph 作为一个高级图数据库来存储 RDF 三元组,并通过各种查询 API(如 SPARQL 和 Prolog)来查询存储的三元组。它通过内置的推理机支持 RDFS++推理。AllegroGraph 包括对联邦、社会网络分析、地理空间能力和时间推理的支持。AllegroGraph 有三个版本:免费版(三元组数量限制在 500 万)、开发者版(三元组数量限制在 5000 万)、企业版(不限三元组)。

AllegroGraph 不仅可以存储三元组或四元组,还可以存储附加信息,包括命名图(上下文)和模型(包括唯一的三元组标识符和事务编号),这使它成为一个五元组存储。AllegroGraph 在表示和索引地理空间和时间数据方面特别有效。它有 7 个标准指数和 24 个用户控制指数。标准索引是一组排序索引,用于快速识别可能匹配特定查询模式的连续三元组块。这些索引通过引用其排列的名称来识别。默认的一组指数称为spogiposgiospgigspoigposigospii,其中

  • s代表主语 URI
  • p代表谓语 URI
  • o代表物体 URI 或文字
  • g代表图 URI
  • i代表三元组标识符(在三元组存储中是唯一的)

自定义索引排列用于消除应用不需要的索引,或者实现自定义索引以匹配不常见的三元模式。

AllegroGraph 支持全文索引、自由文本索引和范围索引。全文索引使得搜索布尔表达式、带有通配符的表达式和短语成为可能。自由文本索引支持自由文本搜索,通过它可以将关键字搜索与查询结合起来。

AllegroGraph 完全支持 RDF、SPARQL 1.0 和部分 SPARQL 1.1,并包括一个 RDFS++推理机。查询不仅可以通过 SPARQL 执行,还可以使用 Lisp、Prolog 或 JavaScript 以编程方式执行。Prolog 是通过一个叫做 CLIF+的可用性层为规则实现的,这使得将规则和查询结合起来变得很容易。AllegroGraph 在存储属性图方面也非常有效。AllegroGraph 支持节点类型、边类型、节点和边属性,以及有向、无向、受限和循环边、属性索引和本体。它支持通过邻接表和特殊索引的遍历。

AllegroGraph 实现了多种图形算法。例如,对于社交网络分析,它使用具有一流功能的生成器来处理单节点输入并返回所有子节点,而速度由邻域矩阵或邻接哈希表来保证。AllegroGraph 考虑了各种图特征,比如分离度(两个节点之间的距离)和连接强度(两个节点之间通过谓词和规则的最短路径的数量)。

AllegroGraph 的所有功能都可以通过 Lisp shell 获得,许多功能来自 cshell、wget 和 curl。Franz Inc .为开发人员提供 JavaScript、Prolog 和 Lisp 算法、Lisp 和 JavaScript 脚本、REST/JSON 协议支持、IDE 集成和管理工具。您可以从各种格式导入数据,并通过从 AllegroGraph 客户端创建三重转储来导出数据。

网络视图

WebView 是 alle program 基于 HTTP 的图形用户界面(GUI ),用于用户和存储库管理,包含在 alle program 服务器分发包中。要连接到 WebView,请在 web 浏览器中浏览到服务器的 AllegroGraph 端口。如果您本地安装了 AllegroGraph,请使用带有端口号的 localhost。默认端口号为10035。使用 WebView,您可以浏览目录、存储库和联盟,管理存储库,将 Prolog 规则和函数应用于存储库,对存储库执行 RDFS++推理,以及将 RDF 数据导入存储库或存储库中的特定图形。WebView 可以显示已使用的命名空间,并提供添加新命名空间的选项。Telnet 连接可以对 AllegroGraph 进程开放,用于调试。本地和远程存储库可以联合成一个访问点。

WebView 支持存储库的三重索引配置和自由文本索引设置。SPARQL 和 Prolog 查询可以被执行、保存和重用,并且查询可以被捕获为 URL 以嵌入到应用中。WebView 可以将constructdescribe SPARQL 查询结果可视化为图形。查询结果被连接到三元组和资源,从而很容易发现连接。WebView 还可用于管理 AllegroGraph 用户、用户角色和存储库访问,以及用于提交和回滚的开放会话。

安装 AllegroGraph 服务器

本机安装 AllegroGraph 服务器有两种选择。第一个选项是以管理员身份在 Red Hat、Fedora 或 CentOS 上安装 RPM (Red Hat Package Manager)包中的 AllegroGraph。第二种选择是通过从一个.tar.gz档案中提取文件来安装服务器,这不需要管理权限。第三个选项是部署 VMware 应用装置,出于性能原因,不建议这样做。

安装 RPM 包

要从 RPM 包安装 AllegroGraph 服务器,需要执行以下步骤:

Download the .rpm file from the Franz web site at http://franz.com/agraph/downloads/server .   Install the RPM (see Listing 6-1)   Listing 6-1. Installing the AllegroGraph Server from the RPM Package

# rpm -i agraph-``version_number

其中version_number是您将要安装的最新版本。

Run the configuration script as shown in Listing 6-2.   Listing 6-2. Run the Configuration

# /usr/bin/configure-agraph

该脚本将询问用于存储配置文件、日志文件、数据、设置和服务器进程标识符的目录,以及端口号(参见清单 6-3 )。

Listing 6-3. Directory and Port Settings

Welcome to the AllegroGraph configuration program. This script will A978-1-4842-1049-9_6_Fig6aa_HTML.jpg

help you establish a baseline AllegroGraph configuration.

You will be prompted for a few settings.  In most cases, you can hit A978-1-4842-1049-9_6_Fig6ab_HTML.jpg

return to accept the default value.

Location of configuration file to create:

[/home/leslie/tmp/ag5.0/lib/agraph.cfg]:

Directory to store data and settings:

[/home/leslie/tmp/ag5.0/data]:

Directory to store log files:

[/home/leslie/tmp/ag5.0/log]:

Location of file to write server process id:

[/home/leslie/tmp/ag5.0/data/agraph.pid]:

Port:

[10035]:

Tip

默认答案通常是足够的,如果需要,可以在以后重新配置。

If you are logged on as the root operator when running the script, you will be asked to create a non-root user account (see Listing 6-4).   Listing 6-4. Creating a Restricted User Account

User to run as:

[agraph]:

User ’agraph’ doesn’t exist on this system.

Create agraph user:

[y]:

Add a user name and password for the AllegroGraph super-user (see Listing 6-5). This user is internal and not identical to the server logon account.   Listing 6-5. Creating the SuperUser Account

SuperUser account name:

[super]:

SuperUser account password:

你必须通过重复来确认密码。

Set the instance timeout in seconds, i.e., the length of time a database will stay open without being accessed (see Listing 6-6). The default value is 604800 (one week in seconds).   Listing 6-6. Set Instance Timeout

Instance timeout seconds:

[604800]:

The configuration file is saved to the folder you specified in step 3 (see Listing 6-7).   Listing 6-7. The Configuration File Is Saved

/home/leslie/tmp/ag5.0/lib/agraph.cfg has been created.

If desired, you may modify the configuration.

The start and stop commands specific to your installation are displayed (see Listing 6-8).   Listing 6-8. Commands to Start and Stop the Server with Your Installation

You can start AllegroGraph by running:

/home/leslie/tmp/ag5.0/bin/agraph-control --config /home/leslie/tmp/ag5.0/lib/agraph.cfg start

You can stop AllegroGraph by running:

/home/leslie/tmp/ag5.0/bin/agraph-control --config /home/leslie/tmp/ag5.0/lib/agraph.cfg stop

If you use a commercial version, you have to install the license key purchased from Franz Inc. The license key includes the client name, defines the maximum number of triples that can be used, the expiration date, and a license code. To install your license key, copy the whole key content you received via e-mail, and paste it into the agraph.cfg configuration file.   Note

还可以通过在configure-agraph命令上指定--non-interactive来非交互地运行配置脚本,以及提供脚本可能会提出的问题的答案的附加参数。需要路径作为其值的参数有--config-file--data-dir--log-dir--pid-file. --runas-user期望一个用户,而--create-runas-user告诉脚本创建在--runas-user中命名的用户,如果它还不存在的话。可以使用--super-user声明获得超级用户权限的内部用户,这需要用户名作为其值。该用户的密码可以设置为--super-password,后跟密码。如果不希望密码显示在命令行中,可以用--super-password-file指定一个包含超级用户密码的文件,后跟路径。

要验证安装,请打开浏览器并加载 AllegroGraph WebView URL,它是服务器的 IP 地址,后跟分号(:)和端口号。对于本地安装,IP 地址被替换为localhost

如果您想在以后的任何时候卸载服务器,您可以在rpm命令中使用erase参数,如清单 6-9 所示,这不会删除 AllegroGraph 创建的其他目录。

Listing 6-9. Uninstalling AllegroGraph

# rpm --erase agraph

安装 TAR 归档文件

安装 AllegroGraph 服务器的另一个选项是解压缩 gzipped TAR(磁带归档)。对于 Ubuntu 和其他 Linux 用户来说,这是一个很好的选择,并且不需要管理权限。

Download the .tar.gz file from http://franz.com/agraph/downloads/server .   Extract the archive using the tar command, as shown in Listing 6-10.   Listing 6-10. Extracting the TAR Archive

$ tar zxf agraph-``version_number

The command creates the agraph-version_number subdirectory, which includes install-agraph, the installation script. You must provide the path to a writable directory on which you want to install AllegroGraph, as shown in Listing 6-11.   Listing 6-11. Run the Installation Script

$ agraph-5.0/install-agraph /home/leslie/tmp/ag5.0

Installation complete.

Now running configure-agraph.

Answer the questions to configure your installation (similar to steps 3–6 for configuring the RPM installation). The last step reveals how you can start and stop your server.   Verify your installation by opening a browser and directing it to your server IP or localhost with the port number you specified during installation.

要卸载一个旧的.tar.gz安装,删除 AllegroGraph 安装目录,如清单 6-12 所示。

Listing 6-12. Removing the AllegroGraph Directory

% rm -rf obsolete-allegrograph-directory/

部署虚拟机

如果您使用虚拟的 64 位 Linux 来评估或使用 AllegroGraph,您需要一个虚拟环境,并且您必须部署虚拟机映像文件。

Note

Franz Inc .鼓励本地安装,而不是虚拟环境,即使是为了评估。

Download the virtual environment you want to use, such as VMware Player for Windows or VMware Fusion for Mac OS, from https://my.vmware.com/web/vmware/downloads .   Download the virtual machine image file from http://franz.com/agraph/downloads/ .   Unzip the image.   Run the VMware Player.   Click Open a Virtual Machine.   Browse to the directory where you unzipped the image file and open AllegroGraph vx Virtual Machine.vmx file, where x is the version of AllegroGraph.   Take ownership, if prompted.   Play Virtual Machine.   When prompted for Moved or Copied, select Copied.   Log in to the Linux Virtual Machine as the user franz, with the password allegrograph.   To start AllegroGraph, double-click the agstart shortcut on the Desktop and select Run in Terminal Window when prompted, or open a Terminal window and run the agstart command.   Launch FireFox and click AGWebView in the taskbar, or visit http://localhost:10035.   Log in to AllegroGraph as the test user, with the password xyzzy.

要停止 AllegroGraph,双击桌面上的 agstop 快捷方式,并在出现提示时选择在终端窗口中运行,或打开终端窗口并运行agstop命令。

安装 AllegroGraph 客户端

AllegroGraph 拥有 Java、Python、Clojure、Ruby、Perl、C#和 Scala [5 ]的客户端。例如,Java 客户机的一个选项是将其作为 Eclipse 项目运行。Jena 客户机是 Java 客户机的变体。Python 客户端在核心 Python 安装之上需要 Python 的cjsonpycurl库。您可以使用rpm命令中的q参数检查这些包是否安装在您的系统上,如清单 6-13 所示。

Listing 6-13. Checking Python Dependencies for AllegroGraph

rpm -q python python-cjson python-pycurl

如果没有安装,在大多数 Linux 系统上你必须使用yum(见清单 6-14 )。

Listing 6-14. Installing Dependencies

sudo yum install python python-cjson python-pycurl

对于 Ubuntu 系统,你需要apt-get来安装所需的库(参见清单 6-15 )。

Listing 6-15. Installing Dependencies on Ubuntu

sudo apt-get install python python-cjson python-pycurl

Java API

启动服务器后,可以从 Java 中使用new AllegroGraphConnection();连接到默认运行的服务器(参见清单 6-16 )。如果您使用的端口号不是默认的10035端口,您必须使用setPort(port_number)设置端口号。

Listing 6-16. Connecting to the AllegroGraph Server Through the Java API

import com.franz.agbase.*;

public class AGConnecting {

public static void main(String[] args) throws AllegroGraphException {

AllegroGraphConnection ags = new AllegroGraphConnection();

try {

System.out.println("Attempting to connect to the server on port" + ags.getPort());

ags.enable();

} catch (Exception e) {

throw new AllegroGraphException("Server connection problem.", e);

}

System.out.println("Connected.");

}

}

可以使用create方法创建一个三元组存储,并用closeTripleStore方法关闭,如清单 6-17 所示。您可以使用ags.disable()断开与 AllegroGraph 服务器的连接。

Listing 6-17. Creating an AllegroGraph Triplestore with the Java API

import com.franz.agbase.*;

public class AGCreateTripleStore {

public static void main(String[] args) throws AllegroGraphException {

AllegroGraphConnection ags = new AllegroGraphConnection();

try {

ags.enable();

} catch (Exception e) {

throw new AllegroGraphException("Server connection problem.", e);

}

try {

AllegroGraph ts = ags.create("newstore", AGPaths.TRIPLE_STORES);

System.out.println("Triplestore created.");

System.out.println("Closing triplestore…");

ts.closeTripleStore();

} catch (Exception e) {

System.out.println(e.getMessage());

}

System.out.println("Disconnecting from the server…");

ags.disable();

}

}

从 Java 打开 AllegroGraph triplestore 有两种方法:使用access方法打开存储,如果存储不存在,它将被创建;或者使用open方法打开现有的存储,但是如果 triplestore 不存在,它将给出一个错误。让我们打开一个三元组存储并索引所有的三元组,如清单 6-18 所示。

Listing 6-18. Indexing all Triples of an AllegroGraph Triplestore

import com.franz.agbase.*;

import com.franz.agbase.AllegroGraph.StoreAttribute;

public class AGOpenTripleStore {

public static void main(String[] args) throws AllegroGraphException {

AllegroGraphConnection ags = new AllegroGraphConnection();

try {

ags.enable();

} catch (Exception e) {

throw new AllegroGraphException("Server connection problem.", e);

}

System.out.println("Opening triplestore…");

ts = ags.open("existingstore", AGPaths.TRIPLE_STORES);

System.out.println("Triple store opened with " + ts.numberOfTriples() + " triples.");

try {

System.out.println("Indexing triplestore…");

ts.indexAllTriples();

} catch (Exception e) {

System.out.println(e.getLocalizedMessage());

}

ts.closeTripleStore(true);

System.out.println("Disconnecting from the server.");

ags.disable();

}

默认访问模式是读+写。要以只读模式打开一个 triplestore,将StoreAttribute设置为READ_ONLY(参见清单 6-19 )。

Listing 6-19. Open a Triplestore in Read-Only Mode

ts = new AllegroGraph(AGPaths.TRIPLE_STORES + "yourstore");

ts.setAttribute(StoreAttribute.READ_ONLY, true);

ags.open(ts);

让我们在 N-triples 中的 triplestore 中添加一个 triple。一旦com.franz.agbase.*被导入并且与服务器的连接建立,您就可以使用addStatement向 triplestore 添加一条语句(参见清单 6-20 )。

Listing 6-20. Adding an RDF Statement to the Triplestore

ts.addStatement("<http://www.lesliesikos.com/datasets/sikos.rdf#sikos>",

"<http://xmlns.com/foaf/0.1/homepage>",

"<http://www.lesliesikos.com

使用showTriples方法可以检索和显示默认图的所有三元组(参见清单 6-21 )。

Listing 6-21. Listing All Triples

TriplesIterator cc = ts.getStatements(null, null, null);

AGUtils.showTriples(cc);

使用showTripleStoreInfo可以检索三元组存储信息,如三元组的数量或三元组存储中使用的名称空间列表(参见清单 6-22 )。

Listing 6-22. Displaying Triplestore Information

import com.franz.agbase.*;

public class AGTripleStoreInfo {

public static void showTripleStoreInfo(AllegroGraph mystore) throws AllegroGraphException {

System.out.println("NumberOfTriples: " + ts.numberOfTriples());

AGUtils.printStringArray("Namespace Registry: ", ts.getNamespaces());

}

}

为了运行一个简单的 SPARQL SELECT查询来检索所有的主-谓-宾三元组(SELECT * {?s ?p ?o}),我们创建一个SPARQLQuery对象(sq)并使用doSparqlSelect显示查询结果(参见清单 6-23 )。

Listing 6-23. Querying the Triplestore Through the Java API

import com.franz.agbase.*;

public class AGSparqlSelect {

public static void main(String[] args) throws AllegroGraphException {

AllegroGraphConnection ags = new AllegroGraphConnection();

try {

ags.enable();

} catch (Exception e) {

throw new AllegroGraphException("Server connection problem", e);

}

AllegroGraph ts = ags.renew("sparqlselect", AGPaths.TRIPLE_STORES);

ts.addStatement("<http://www.lesliesikos.com/datasets/sikos.rdf#sikos>",

"<http://xmlns.com/foaf/0.1/homepage>",

"<http://www.lesliesikos.com

ts.addStatement("<http://www.lesliesikos.com/datasets/sikos.rdf#sikos>",

"<http://xmlns.com/foaf/0.1/interest>",

"<http://dbpedia.org/resource/Electronic_organ

String query = "SELECT * {?s ?p ?o}";

SPARQLQuery sq = new SPARQLQuery();

sq.setTripleStore(ts);

sq.setQuery(query);

doSparqlSelect(sq);

}

public static void doSparqlSelect(SPARQLQuery sq) throws AllegroGraphException {

if (sq.isIncludeInferred()) {

System.out.println("\nQuery (with RDFS++ inference):");

} else {

System.out.println("\nQuery:");

}

System.out.println("  " + sq.getQuery());

ValueSetIterator it = sq.select();

AGUtils.showResults(it);

}

}

粗哑的

Gruff 是一个基于 grapher 的 triplestore 浏览器、查询管理器和 AllegroGraph [6 ]的编辑器。Gruff 提供了各种工具,用于显示循环图、创建属性表以及以 SPARQL 或 Prolog 代码的形式管理查询。在 graph view 中,可以使用 Gruff 可视化和操作 AllegroGraph 图中存储的节点和关系,如图 6-2 所示。

A978-1-4842-1049-9_6_Fig2_HTML.jpg

图 6-2。

Visualizing a graph stored in AllegroGraph using Gruff [7]

查询视图显示一个视图,您可以在该视图上运行 SPARQL 或 Prolog 查询,并在表中查看结果。图形查询视图通过排列表示查询中三元组模式的节点框和链接线,使得将查询可视化地规划为图表成为可能。三元组模式可以包含变量以及图形对象。图形查询视图支持层次结构和过滤器,以及 SPARQL 或 Prolog 查询的自动生成。表视图显示单个节点的属性表。可以使用超链接浏览相关节点,并且可以直接编辑属性值。每个表行代表存储中的一个 RDF 三元组。

Neo4j

Neo4j 是世界领先的图数据库之一,它查询连接数据的速度比关系数据库快一千倍 [8 ]。Neo4j 有一个免费的“社区版”和一个商业的“企业版”,都支持属性图;本地图形存储和处理;高性能原生 API ACID;自己的图查询语言,Cypher 和 HTTPS(通过插件)。仅在企业版中提供的高级性能和可伸缩性特性是企业锁管理器,一种高性能缓存;聚类;热备份;和高级监控。通过安装一个名为 neo-rdf 的插件,Neo4j 可以用作三重存储或四重存储。

装置

Neo4j 服务器在 Windows 下有两种格式:.exe.zip。Neo4j 可以使用.exe安装程序进行安装,如下所示:

Download the latest Neo4j Server executable installation file from www.neo4j.org/download .   Double-click the .exe file.   Click Next and accept the agreement.   Start the Neo4j Server by clicking Neo4j Community under Start button ➤ All Programs ➤ Neo4j Community ➤ Neo4j Community

默认情况下会选择C:\Users\username\Documents\Neo4j\default.graphdb数据库,可以更改(见图 6-3 )。

Click the Start button, which creates the necessary files in the background in the specified directory.   Access Neo4j by visiting http://localhost:7474 in your browser (see Figure 6-4).

A978-1-4842-1049-9_6_Fig4_HTML.jpg

图 6-4。

Neo4j started

A978-1-4842-1049-9_6_Fig3_HTML.jpg

图 6-3。

Neo4j ready to be started

左侧 Neo4j web 界面的侧边栏提供了对有关当前 Neo4j 数据库(节点标签、关系类型以及数据库位置和大小)、保存的脚本(参见图 6-5 )的信息以及诸如文档、指南、示例图应用、参考以及 Neo4j 社区资源等信息的方便的可点击访问。

A978-1-4842-1049-9_6_Fig5_HTML.jpg

图 6-5。

The web interface of Neo4j

Neo4j web 界面在顶层提供命令编辑和执行(从$ :开始),包括使用 Neo4j 的查询语言 Cypher 进行查询。如果您编写复杂的查询或命令,或者您希望经常使用的命令,您可以保存它们以供将来使用。默认情况下,命令编辑器是一个单行编辑器,仅适用于短查询或命令。如果需要更多的空间,可以用 Shift+Enter 切换到多行编辑,这样就可以编写跨越多行的命令,或者编写多个命令,而不用逐个执行(见图 6-6 )。

A978-1-4842-1049-9_6_Fig6_HTML.jpg

图 6-6。

Writing Cypher commands

在多行编辑中,可以使用 Ctrl+Enter 运行查询。使用命令历史可以很容易地检索以前使用的命令。在命令行编辑器中,您也可以使用客户端命令,比如打开 Neo4j 帮助的:help。浏览器窗口的主要部分显示内容、查询答案等。,具体取决于您使用的命令。每个命令的执行都会产生一个结果框架(子窗口),它被添加到流的顶部,以创建一个按时间倒序排列的可滚动集合。每个子窗口都可以最大化为全屏,或者通过鼠标悬停在子窗口右上角的两个图标来关闭。类似的子窗口也用于数据可视化。可以使用:clear命令清除该流。

Neo4j 的 web 界面提供了高级可视化选项。节点和关系可以用您选择的颜色显示标识符或标签。通过 CSS 样式表可以任意改变图形可视化的颜色、线宽、字体大小和气泡大小,如图 6-7 所示。

A978-1-4842-1049-9_6_Fig7_HTML.jpg

图 6-7。

Graph visualization options in Neo4j

Java API

Neo4j 有一个原生 Java API 和一个 Cypher Java API。为了演示 Neo4j 的原生 Java API,让我们在 Eclipse 中开发一个 Java 应用。

Click OK.   Click Finish.   Once you click OK, the Neo4j software library will be added to your Eclipse project.   If you don’t have Eclipse installed, follow the instructions discussed in Chapter 4.   Visit http://www.neo4j.org/download and under the Download Community Edition button, select Other Releases.   Under the latest release, select the binary of your choice for Linux or Windows.   Extract the archive.   In Eclipse, create a Java project by selecting File ➤ New ➤ Java Project.   Right-click the name of the newly created project and select Properties (or select File ➤ Properties).   Select Java Build Path and click the Libraries tab.   Click Add Library… on the right.   Select User Library as the library type.   Click the Next ➤ button on the bottom.   Click User Libraries… on the right.   Click the New… button.   Add a name to your library, such as NEO4J_JAVA_LIB.   Click the Add external JARs… button on the right.   Browse to your Neo4j directory (neo4j-community-version_number) and go to the lib subdirectory.   Select all the .jar files (for example, with Ctrl+A) and click Open, which will add the files to your project library (see Figure 6-8).

A978-1-4842-1049-9_6_Fig8_HTML.jpg

图 6-8。

The Neo4j software library

让我们用节点、节点之间的关系、节点属性和关系属性创建一个简单的图。

Initialize the database as shown in Listing 6-24.   Listing 6-24. Initializing the Database

import org.neo4j.graphdb.GraphDatabaseService;

import org.neo4j.graphdb.Node;

import org.neo4j.graphdb.Relationship;

import org.neo4j.graphdb.RelationshipType;

import org.neo4j.graphdb.Transaction;

import org.neo4j.graphdb.factory.GraphDatabaseFactory;

public class Neo4jDemo

{

private static final String DB_PATH = "target/neo4jdemodb";

GraphDatabaseService graphDb;

Node firstNode;

Node secondNode;

Relationship relationship;

}

Define a new relationshSeip type as WEBSITE_OF (see Listing 6-25).   Listing 6-25. Defining a New Relationship Type

private static enum RelTypes implements RelationshipType

{

WEBSITE_OF

}

Create the main method, as shown in Listing 6-26.   Listing 6-26. Creating the main Method

public static void main(final String[] args)

{

Neo4jDemo dbsample = new Neo4jDemo();

dbsample.createDb();

dbsample.shutDown();

}

Create the graph nodes graphDb.createNode(); set node and relationship properties with setProperty; and display the RDF statement, using the label of the subject and the predicate, and the URI of the object (see Listing 6-27). The simple RDF statement will describe the relationship between the machine-readable description of a person and the URL of his/her web site.   Listing 6-27. Creating Nodes and Setting Properties

void createDb()

{

graphDb = new GraphDatabaseFactory().newEmbeddedDatabase(DB_PATH);

try ( Transaction tx = graphDb.beginTx() )

{

firstNode = graphDb.createNode();

firstNode.setProperty("uri", "http://dbpedia.org/resource/Leslie_Sikos

firstNode.setProperty("label", "Leslie Sikos");

secondNode = graphDb.createNode();

secondNode.setProperty("uri", "http://www.lesliesikos.com

secondNode.setProperty("label", "website address");

relationship = firstNode.createRelationshipTo(secondNode, RelTypes.WEBSITE_OF);

relationship.setProperty("uri", "http://schema.org/url

relationship.setProperty("label", "website");

System.out.print(secondNode.getProperty("uri") + " is the ");

System.out.print(relationship.getProperty("label") + " of ");

System.out.print(firstNode.getProperty("label"));

tx.success();

}

}

Shut down the Neo4j database once you have finished (see Listing 6-28).   Listing 6-28. Shutting Down Neo4j

void shutDown()

{

System.out.println();

System.out.println("Shutting down database…");

graphDb.shutdown();

}

Run the application (see Listing 6-29) to display the RDF statement we created in the database (see Figure 6-9).

A978-1-4842-1049-9_6_Fig9_HTML.jpg

图 6-9。

A Neo4j application in Eclipse   Listing 6-29. Final Code for Creating a Database with Nodes and Properties, and Displaying Stored Data

import org.neo4j.graphdb.GraphDatabaseService;

import org.neo4j.graphdb.Node;

import org.neo4j.graphdb.Relationship;

import org.neo4j.graphdb.RelationshipType;

import org.neo4j.graphdb.Transaction;

import org.neo4j.graphdb.factory.GraphDatabaseFactory;

public class Neo4jDemo

{

private static final String DB_PATH = "target/neo4jdemodb";

GraphDatabaseService graphDb;

Node firstNode;

Node secondNode;

Relationship relationship;

private static enum RelTypes implements RelationshipType

{

WEBSITE_OF

}

public static void main(final String[] args)

{

Neo4jDemo dbsample = new Neo4jDemo();

dbsample.createDb();

dbsample.shutDown();

}

void createDb()

{

graphDb = new GraphDatabaseFactory().newEmbeddedDatabase(DB_PATH);

try ( Transaction tx = graphDb.beginTx() )

{

firstNode = graphDb.createNode();

firstNode.setProperty("uri", "http://dbpedia.org/resource/Leslie_Sikos

firstNode.setProperty("label", "Leslie Sikos");

secondNode = graphDb.createNode();

secondNode.setProperty("uri", "http://www.lesliesikos.com

secondNode.setProperty("label", "website address");

relationship = firstNode.createRelationshipTo(secondNode, RelTypes.WEBSITE_OF);

relationship.setProperty("uri", "http://schema.org/url

relationship.setProperty("label", "website");

System.out.print(secondNode.getProperty("uri") + " is the ");

System.out.print(relationship.getProperty("label") + " of ");

System.out.print(firstNode.getProperty("label"));

tx.success();

}

}

void shutDown()

{

System.out.println();

System.out.println("Shutting down database…");

graphDb.shutdown();

}

}

4 商店

4Store 是一个高效、可扩展且稳定的 RDF 数据库,可用于 Arch Linux、Debian、Ubuntu、Fedora 和 CentOS 等 Linux 系统,以及 Mac OS 和 FreeBSD [9 ]。要在 Linux 上安装 4Store,请按照下列步骤操作:

Download the installer from http://www.4store.org .   Prepare your system to be used with 4Store by configuring it to look for libraries in /usr/local/lib and/or /usr/local/lib64. On most systems, you have to create a file called /etc/ld.so.conf.d/local.conf to achieve this, which contains these two paths, each on a separate line. You have to run /sbin/ldconfig as root. Once completed, the $PKG_CONFIG_PATH environmental variable should include the correct paths for locally installed packages.1 Check whether your Linux distribution includes all the dependencies, namely raptor, rasqal, glib2, libxml2, pcre, avahi, readline, ncurses, termcap, expat, and zlib.   Build your 4Store from Tarballs or Git. For the first option, extract the files from the .tar.gz archive with tar xvfz 4store-version.tar.gz. Change the working directory to the 4store-version directory with cd. Run ./configure, and then run make. For the second option, change directory using cd to the directory that Git cloned, and run sh autogen.sh. The rest of the installation is the same as in the steps for the first option.   Note

从 Git 创建您的构建可能需要额外的依赖项。

Install 4Store by running make install as root.

如果你想在 Mac 上安装 4Store,下载最新版本,打开.dmg,通过拖拽到Applications文件夹来安装 4Store 应用。

安装完成后,您可以运行 4Store 应用,它会为您提供一个命令行。您可以使用命令4s-backend-setup triplestorename创建一个 triplestore,使用4s-backend triplestorename启动该 triplestore,并使用4s-httpd -p portnumber triplestorename运行一个 SPARQL 端点。web 界面将在http://localhost:portnumber出现在您的浏览器中。

从 RDF 文件导入数据的最简单命令是使用4s-import,指定导入数据的数据库名称和源 RDF,如清单 6-30 所示。

Listing 6-30. Importing Data from an RDF File to 4Store

4s-import your4store external.rdf

若要以编程方式导入数据,可以根据您喜欢的语言从各种选项中进行选择。例如,在 Ruby 中,您可以使用4store-ruby ( https://github.com/moustaki/4store-ruby ),这是一个通过 HTTP 工作的 Ruby 接口。要访问 SPARQL 服务器,只需要 HTTP PUT 调用,大多数现代编程语言都支持这种调用,不需要安装特定于存储的包。然而,专门构建的软件库使 HTTP 请求变得更加容易。例如,在 Ruby 中,可以使用rest-client ( https://github.com/rest-client/rest-client ),如清单 6-31 所示。如果没有安装rest-client,可以正常安装,比如sudo gem install rest-client

Listing 6-31. Using rest-client

#!/usr/bin/env ruby

require ’rubygems’

require ’rest_client’

filename = ’/social.rdf’

graph    = ’http://yourgraph.com

endpoint = ’http://localhost:8000’

response = RestClient.put endpoint + graph, File.read(filename), :content_type => A978-1-4842-1049-9_6_Fig6ai_HTML.jpg

’application/rdf+xml’

puts "Response #{response.code}:

#{response.to_str}"

要从命令行运行脚本,请使用 ruby 命令,并将文件名作为参数,比如ruby loadrdf24store.rb。现在,如果您在浏览器中访问http://localhost:portnumber/status/size/,从 RDF 文件添加的新三元组应该会列出来。

让我们以编程方式运行一个 SPARQL 查询,并将结果处理为 XML,以列出数据集的 RDF 类型。

Install the XML parser Nokogiri for Ruby as gem install nokogiri.   Load all the required libraries (see Listing 6-32).   Listing 6-32. Loading Required Libraries

#!/usr/bin/env ruby

require ’rubygems’

require ’rest_client’

require ’nokogiri’

Create a string for storing the SPARQL query and another one to store the endpoint (see Listing 6-33).   Listing 6-33. Creating the Query and Endpoint Strings

query = ’SELECT DISTINCT ?type WHERE { ?thing a ?type . } ORDER BY ?type’

endpoint = ’http://localhost:8000/sparql/’

Using Nokogiri, process the XML output of the SPARQL query (see Listing 6-34).   Listing 6-34. Processing the SPARQL Query Output

response = RestClient.post endpoint, :query => query

xml = Nokogiri::XML(response.to_str)

Find all the RDF types in the XML output and display them with puts, as shown in Listing 6-35.   Listing 6-35. Finding the RDF Types of the Output

xml.xpath(’//sparql:binding[@name = "type"]/sparql:uri’, ’sparql’ => ’``http://www.w3.org/2005/sparql-results#

puts type.content

end

Save the script as a Ruby file and run it using the ruby command with the file name as the parameter, such as ruby rdf-types.rb.

神谕

Oracle 是业界领先的数据库。Oracle Spatial and Graph 是 Oracle 的 RDF triplestore/quadstore 和本体管理平台,提供自动分区和数据压缩,以及与 Oracle 数据库的高性能并行和直接路径加载以及通过 Jena 的加载[10]。

Oracle Spatial and Graph 通过 SPARQL 1.1、SPARQL endpoint web services、SPARQL/update、具有开源 Apache Jena 和 Sesame 的 Java APIs、具有嵌入式 SPARQL 图形模式的 SQL 查询以及 SQL insert 和 Update 支持并行 SPARQL 和 SQL 查询以及 RDF 图形更新。它还支持使用 SQL 操作符进行本体辅助的表数据查询。Oracle Spatial and Graph 采用并行、增量和安全操作进行本地推理,通过 RDFS、OWL 2、SKOS、用户定义的规则和用户定义的推理扩展进行可扩展推理。它为 PelletDB 和 TrOWL 提供了推理插件。Oracle Spatial 和 Graph 的语义索引适用于集成自然语言处理器的文本挖掘和实体分析。该数据库还支持 R2RML 关系数据到 RDF 三元组的直接映射。对于空间 RDF 数据存储和查询,Oracle 也支持 GeoSPARQL。

Oracle Spatial 和 Graph 可以与 Apache Jena 和 Sesame 应用开发环境以及用于查询、可视化和本体管理的领先语义 Web 工具集成。

火焰图

Blazegraph 是 SYSTAP 的旗舰图数据库产品,SYSTAP 是图数据库(以前称为 Bigdata)的供应商。它是一个高度可扩展的开源存储和计算平台[11]。Blazegraph 适用于大数据应用,并被选为维基数据查询服务,专门设计用于支持大图,提供语义 Web (RDF/SPARQL)和图数据库(tinkerpop,blueprints,以顶点为中心)API。强健、可扩展、容错的企业级存储和查询功能与高可用性、在线备份、故障转移和自我修复相结合。

Blazegraph 具有超高性能的 RDF 图数据库,支持 RDFS 和 OWL Lite 推理,以及 SPARQL 1.1 查询。Blazegraph RDF 图数据库专为海量信息而设计,在一个 15 节点集群上,不到一小时就可以加载 10 亿条图形边。Blazegraph 可以在单机模式(Journal)、高可用性复制集群模式(HAJournalServer)或水平分片集群模式(BlazegraphFederation)下实现。Blazegraph 不仅可以从本地文件系统读取数据,还可以从 Web 或 Hadoop 分布式文件系统(HDFS)读取数据,从而执行分布式作业。存储索引是为单台机器上多达 500 亿条边的超大型数据集设计的,但 Blazegraph 在水平扩展架构中实现时可以扩展甚至更大的图形。除了高可用性,HAJournalServer 还提供复制、在线备份和水平查询伸缩。BlazegraphFederation 具有快速、可扩展的并行索引存储和递增的集群大小增长。这两个平台都支持带有快照隔离的完全并发读取器。

Blazegraph 为 Sesame 和 Blueprint 提供了 API。Blazegraph 可以作为服务器部署,并通过轻量级 REST API 访问。Blazegraph 与 Java 包装一起发布,包括一个芝麻包装和一个蓝图包装。Blazegraph 还有几个企业部署选项,包括一个高可用性架构和一个用于超大型图形的动态分片横向扩展架构。

摘要

在本章中,您了解了图数据库的强大功能以及它们相对于主流关系数据库和 NoSQL 数据库的优势。现在您已经理解了三元组和四元组的概念,以及用于语义 Web 应用的两种主要图数据库类型:三元组存储和四元组存储。现在,您已经熟悉了最流行的图数据库,并且知道如何安装和配置 AllegroGraph、Neo4j 和 4Store,以及如何使用它们的 API 进行编程数据库访问。您知道 AllegroGraph 和 Neo4j 用于显示、分析和操作图形节点和链接的可视化选项。

下一章将向您展示如何使用 SPARQL(RDF 的主要查询语言)查询结构化数据集,以及使用专有查询语言查询图形数据存储。您将学习如何基于链接开放数据(LOD)数据集中的知识编写查询来回答复杂的问题。

参考

Cudré-Mauroux, P., Enchev, I., Fundatureanu, S., Groth, P., Haque, A., Harth, A., Keppmann, F. L., Miranker, D., Sequeda, J., Wylot, M. (2013) NoSQL Databases for RDF: An Empirical Evaluation. Lecture Notes in Computer Science 2013, 8219:310–325, http://dx.doi.org/10.1007/978-3-642-41338-4_20.   McColl, R., Ediger, D., Poovey, J., Campbell, D., Bader, D. A. (2014) A performance evaluation of open source graph databases. In: Proceedings of the first workshop on Parallel programming for analytics applications, pp 11–18, New York, NY, http://dx.doi.org/10.1145/2567634.2567638.   Heflin, J. (2015) SWAT Projects—the Lehigh University Benchmark (LUBM). http://swat.cse.lehigh.edu/projects/lubm/ . Accessed 8 April 2015.   Franz, Inc. (2015) AllegroGraph RDFStore Web 3.0’s Database. http://franz.com/agraph/allegrograph/ . Accessed 10 April 2015.   Franz, Inc. (2015) AllegroGraph Client Downloads. http://franz.com/agraph/downloads/clients . Accessed 10 April 2015.   Franz, Inc. (2015) Gruff: A Grapher-Based Triple-Store Browser for AllegroGraph. http://franz.com/agraph/gruff/ . Accessed 10 April 2015.   Franz, Inc. (2015) http://franz.com/agraph/gruff/springview3.png . Accessed 10 April 2015.   Neo Technology Inc. (2015) Neo4j, the World’s Leading Graph Database. http://neo4j.com . Accessed 10 April 2015.   Garlik (2009) 4store—Scalable RDF storage. www.4store.org . Accessed 10 April 2015.   Oracle (2015) Oracle Spatial and Graph. www.oracle.com/technetwork/database/options/spatialandgraph/overview/index.html . Accessed 10 April 2015.   SYSTAP LLC (2015) Blazegraph. www.blazegraph.com/bigdata . Accessed 10 April 2015.   Footnotes 1

假设您的 Linux 发行版没有打包最近版本的 Raptor 和 Rasqal。

七、查询

虽然机器可读数据集主要是为软件代理发布的,但自动数据提取并不总是一个选项。语义信息检索通常涉及用户基于数据集或数据库中正式表示的知识来搜索复杂问题的答案。虽然结构化查询语言(SQL)用于查询关系数据库,但查询图数据库和平面资源描述框架(RDF)文件可以使用 SPARQL 协议和 RDF 查询语言(SPARQL)来完成,SPARQL 是 RDF 的主要查询语言,比 SQL 强大得多。SPARQL 是一种标准化语言,能够查询本地和在线 RDF 文件、链接开放数据(LOD)数据集和图数据库;基于查询的图中的信息构建新的 RDF 图;向图中添加新的 RDF 语句或从图中删除三元组;推断逻辑结果;和跨不同储存库的联合查询。SPARQL 可以一次查询多个数据源,将较小的图动态合并成一个大的超级图。虽然图数据库通常有专有的查询语言(通常基于或扩展 SPARQL),但大多数公开可用的数据集都有一个 SPARQL 端点,您可以从该端点运行 SPARQL 查询。对于开发人员来说,许多语义 Web 软件工具都提供了 SPARQL 应用编程接口(API)用于编程访问。

SPARQL:RDF 的查询语言

如前所述,RDF 的主要查询语言是 SPARQL(读作“sparkle”,SPARQL 协议和 RDF 查询语言的递归首字母缩写),它可用于检索和操作存储在 RDF 中的信息,或以 RDF [1 ]格式检索的信息。输出可以是结果集或 RDF 图。

结构和语法

SPARQL 使用类似 Notation3 的语法。URIs 可以完整地写在小于(<)和大于(>)字符之间(参见清单 7-1 ),或者使用带有PREFIX关键字的名称空间机制进行缩写(参见清单 7-2 )。

Listing 7-1. Full URI Syntax in SPARQL

<http://example.com>

Listing 7-2. Using the Namespace Mechanism in SPARQL

PREFIX schema: <http://schema.org/

在声明了 Schema.org 命名空间( http://schema.org/ )后,例如 http://schema.org/Person 可以缩写为schema:Person。SPARQL 查询的默认名称空间可以通过使用不带前缀的PREFIX指令来设置(例如PREFIX : < http://yourdefaultnamespace.com/ >),这样就可以在查询中使用空前缀,比如as ?a :knows ?b。与 N3 类似,URI http://www.w3.org/1999/02/22-rdf-syntax-ns#typerdf:type可缩写为a。文字可以用或不用语言标记和类型来编写。普通字符串由引号分隔,如"a plain literal",而包括语言标签的普通字符串以@符号和标准语言代码结尾,如"Wagen"@de(德语中的单词 car)。类型化文字的编写类似于 RDF 中的类型化文字,例如,"55"^^xsd:integer (55 是一个整数,而不是字符串中两个无意义的字符)。常用的类型文字可以缩写成"true"^^xsd:boolean对应于true,而整数和小数分别被自动假定为xsd:integerxsd:decimal类型。因此,"5"^^xsd:integer可以缩写为5,而"13.1"^^xsd:decimal可以写成13.1

每个 SPARQL 查询都有一个头和一个体。SPARQL 查询的头是一个表达式,用于构造查询的答案。针对 RDF 图的查询评估是通过检查主体是否与图匹配来执行的,这导致主体中变量的一组绑定。使用关系操作符(如 projection 和 distinction)处理这些绑定,以生成查询的输出。主体可以是简单的三元模式表达式,也可以是包含三元模式的复杂 RDF 图模式表达式,比如主谓宾 RDF 三元组,其中每个主、谓或宾都可以是一个变量。主体还可以包含合取、析取、可选部分和变量值约束(见图 7-1 )。

A978-1-4842-1049-9_7_Fig1_HTML.gif

图 7-1。

The structure of SPARQL queries

BASE指令、名称空间声明(PREFIX)、数据集声明(FROMFROM NAMED)和查询修饰符(GROUP BYHAVINGORDER BYLIMITOFFSETBINDINGS)是可选的。指令和前缀列表用于缩写 URIs。BASE关键字定义了基本 URI,查询中的所有相对 URIs 都是根据它进行解析的。前缀列表可以包含任意数量的PREFIX语句。分号前面的前缀缩写pref代表前缀 URI,可以在整个 SPARQL 查询中使用,这样就不必重复长 URIs(标准名称空间机制)。FROM子句指定要搜索的默认图形。FROM NAMED子句可用于指定要查询的命名图。在某些情况下,例如,当用于查询的 SPARQL 端点专用于要从中检索数据的 LOD 数据集时,FROM子句是可选的,可以安全地省略。WHERE子句指定了用于提取期望结果的模式。查询修饰符,如ORDER BYLIMIT,如果存在,位于查询的最后部分。

SPARQL 1.0 和 SPARQL 1.1

SPARQL 的第一个版本 SPARQL 1.0 发布于 2008 年 [2 ]。SPARQL 1.0 引入了 SPARQL 语法、SPARQL 查询语法、RDF 术语约束、图模式、解决方案序列和解决方案修饰符,以及四种核心查询类型(SELECTCONSTRUCTASKDESCRIBE)。SPARQL 1.0 已经通过 SPARQL 1.1 [3 ]中的新特性进行了显著扩展。

例如,SPARQL 1.1 支持聚合。要执行聚合,首先必须根据GROUP BY子句中的表达式将结果分成不同的组。然后,评估SELECT子句中的投影和聚合函数,以获得每组一个结果。最后,必须在一个HAVING子句中过滤汇总的结果。

SPARQL 1.1 更新语言支持图形更新操作(INSERT DATADELETE DATADELETE/INSERTLOADCLEAR)和图形管理操作(CREATEDROPCOPYMOVEADD ) [4 )。INSERT DATA操作将请求中内联写入的一些三元组添加到 graphstore 中。如果 graphstore 中的各个图包含 RDF 三元组,则使用DELETE DATA操作来移除 RDF 三元组。根据在WHERE子句中指定的查询模式的绑定,DELETE/INSERT操作可用于从 graphstore 中删除三元组或向其添加三元组。LOAD操作从国际化资源标识符(IRI)中读取一个 RDF 文档,并将其三元组插入 graphstore 中的指定图中。CLEAR操作删除 graphstore 中指定图形中的所有三元组。CREATE操作在 graphstore 中创建新图。DROP操作删除图形及其所有内容。COPY操作修改一个图形以包含另一个图形的副本。换句话说,它将输入图中的所有数据插入到目标图中。MOVE操作将所有数据从一个图形移动到另一个图形。ADD操作将一个图形的所有数据复制到另一个图形中。还可以通过一种称为 SPARQL 1.1 统一 HTTP 协议 [5 ]的协议来更新 RDF 图。

SPARQL 1.1 服务描述规范 [6 ]提供了一种发现 SPARQL 服务信息的方法,比如支持的扩展功能和默认数据集的细节。它还有一个描述 SPARQL 服务的词汇表,这个词汇表有名称空间 IRI http://www.w3.org/ns/sparql-service-description#和前缀sd。在语义 Web 应用中,并不总是能够显式地编写用于图模式匹配的图结构,这就是为什么 SPARQL 1.1 定义了语义蕴涵关系,称为蕴涵机制 [7 ]。这些标准的语义蕴涵关系可以用在依赖于从显式给出的断言中推断出的 RDF 语句的应用中,以便使用语义蕴涵关系而不是显式给出的图结构来执行图模式匹配。SPARQL 1.1 支持查询输出的其他序列化格式,包括 JSON [8 ]、CSV 和 TSV [9 ],超出了 SPARQL 1.0 支持的格式,如 XML [10 。除了 SPARQL 1.0 中引入的四种核心 SPARQL 查询类型之外,SPARQL 1.1 还支持推理查询和联邦查询,您将在下一节中看到。

查询类型

可选的名称空间声明后跟查询。SPARQL 中的四种核心查询类型是SELECTASKCONSTRUCTDESCRIBE查询。SELECT查询为匹配查询模式的变量提供了一个值选择。是/否查询(ASK查询)提供一个布尔值。查询从上述值以及资源描述中创建新的 RDF 数据。DESCRIBE查询返回包含匹配资源的新 RDF 图。最常用的 SPARQL 查询是SELECT查询。

除了基本的查询类型,SPARQL 1.1 还支持通过REASON查询进行推理,并使用SERVICE关键字 [11 ]执行分布在不同 SPARQL 端点上的查询(联邦查询)。

模式匹配

查询输出结果子句后面是模式匹配。SPARQL 查询中可以使用两种不同的模式类型:三元模式和图形模式。SPARQL 三元组模式类似于 RDF 的主谓宾三元组,但是它们也可以包含变量。这使得从 RDF 图中选择符合模式中描述的标准的 RDF 三元组成为可能。任何或所有的主语、谓语或宾语值都可以是变量,它们都由字符串前面的问号 1 标识,如?name。为了精确匹配 RDF 三元组,您必须编写主谓宾名称,后跟一个.,如清单 7-3 所示。

Listing 7-3. Exact RDF Triple Matching in SPARQL

ex:Person schema:familyName "Sikos" .

为了匹配一个变量,你必须用一个变量替换适当的三元组(主语、谓语或宾语)(见清单 7-4 )。

Listing 7-4. Matching One Variable in SPARQL

?person schema:familyName "Sikos" .

变量不限于三元组模式的任何部分。您可以用变量替换任何三元组(主语、谓语或宾语)(参见清单 7-5 )。

Listing 7-5. Matching Multiple Variables in SPARQL

?person schema:familyName ?name .

甚至所有组件都可以是变量。例如,三元组模式?subject ?object ?name将匹配 RDF 图中的所有三元组。有时候,需要的选择规则比你用一个三元组模式所能表达的要复杂得多。三重模式的集合被称为图形模式,由花括号界定(参见清单 7-6 )。

Listing 7-6. A Graph Pattern in SPARQL

{

?who schema:name ?name.

?who iswc:research_topic ?research_topic.

?who foaf:knows ?others.

}

图形模式可用于匹配可选部分、创建模式的联合、嵌套、过滤可能匹配的值,以及选择模式匹配的数据源。因此,一个图形模式将会找到所有的资源,所有的期望属性都写在模式中。图形模式使得编写复杂的查询成为可能,因为在多个三元模式中使用同一个变量的情况下,每个返回的资源都可以替换到变量的所有出现处。这导致了传统 Web 所不知道的真正复杂的选择,因此除了一些基本的操作符,如 AND、OR 或 XOR,您不能在搜索中使用多重过滤。但是 SPARQL 也支持过滤函数,包括逻辑运算(!&&||=!=<<=>>=)和数学运算(+-*/,以及比较运算(=!=><)。SPARQL 具有用于检查 web 地址、空白图节点、文字和边界(isURIisBlankisLiteralbound)、诸如strdatatypelang之类的访问器(参见清单 7-7 )以及诸如sameTermlangMatchesregex之类的其他函数的内置测试,用于检查相同的术语、语言匹配和编写正则表达式。

Listing 7-7. Language Checking in SPARQL

lang(?title)="en"

除了 SPARQL 1.0 的操作符和函数之外,SPARQL 1.1 还支持存在检查函数(EXISTSNOT EXISTS),这两个函数都可以用作图形模式的一部分(比如在清单 7-8 中,查找没有电子邮件地址的人)以及用于FILTER表达式中。

Listing 7-8. Existence Checking in a Graph Pattern

SELECT ?person

WHERE

{

?person rdf:type foaf:Person .

NOT EXISTS { ?person foaf:mbox ?email }

}

SPARQL 1.1 还具有额外的功能,如COUNTSUMAVGMINMAXSAMPLEGROUP_CONCAT。此外,SPARQL 1.1 支持属性路径,允许三元模式匹配图中任意长度的路径。谓词与类似于正则表达式的操作符组合在一起(见表 7-1 )。

表 7-1。

Property Path Constructs in SPARQL 1.1

| 建造 | 意义 | | --- | --- | | `path1/path2` | 正向路径(`path1`后跟`path2`) | | `^path1` | 反向路径(对象到主题) | | `path1|path2` | `path1`或`path2` | | `path1*` | `path1`,重复零次或多次 | | `path1+` | `path1`,重复一次或多次 | | `path1?` | `path1`,可选 | | `path1{m,n}` | 至少`m`次,不超过`n`次`path1` | | `path1{n}` | `path1`的确切发生次数`n` | | `path1{m,}` | 至少出现`path1`次`m` | | `path1{,n}` | 最多出现`path1`次`n` |

溶液改性剂

SPARQL 查询的最后一个可选部分是解决方案修饰符。一旦计算出模式的输出(以变量值表的形式),解决方案修饰符允许您修改这些值,应用标准的经典操作符,如 projection、【2】DISTINCT(删除重复项)、ORDER(排序机制)和LIMIT(设置返回结果的最大数量)。

选择查询

最常见的 SPARQL 查询是SELECT查询。SELECT子句指定 SPARQL 查询返回的数据项(变量绑定)。即使 LOD 数据集可能包含数千甚至数百万个 RDF 三元组,您也可以选择那些符合您的标准的项目。例如,从一个作家的数据集中,你可以列出那些生活在 20 世纪的作家或者是美国人。SPARQL 支持小丑字符,因此您可以使用SELECT *选择查询中提到的所有变量。如果你想消除潜在的重复,在SELECT后面使用DISTINCT关键字,比如SELECT DISTINCT ?var. SELECT查询经常被用来通过特定的变量和表达式提取三元组。例如,假设我们需要一个查询来提取使用foaf:name声明的某人的 FOAF 文件中提到的所有名字。名称空间的缩写需要一个PREFIX声明。该查询是一个SELECT查询,它使用一个变量作为名称(?name),并使用一个具有三元模式的WHERE子句来查找与foaf:name谓词链接的所有主语(?person)和宾语(?name)(参见清单 7-9 )。

Listing 7-9. A SELECT Query to Find Subjects and Objects Linked with a Declared Predicate

PREFIX foaf:  <http://xmlns.com/foaf/0.1/

SELECT ?name

WHERE {

?person foaf:name ?name .

}

如果我们需要 FOAF 文件中指定了电子邮件地址的所有人,我们必须声明两个谓词,一个用于名称(foaf:name),另一个用于电子邮件地址(foaf:mbox),而所有的主语(?person)和宾语(?name?email)都是变量(参见清单 7-10 )。

Listing 7-10. A SELECT Query to Find Subjects and Objects Linked with Two Different Predicates

PREFIX foaf:  <http://xmlns.com/foaf/0.1/

SELECT ?name ?email

WHERE {

?person foaf:name ?name .

?person foaf:mbox ?email .

}

输出将包含所有的姓名和电子邮件地址。

Note

如果用Schema.org/Person描述人物,可以用givenNamefamilyName属性表示姓名,用email属性表示电子邮件地址,而名称空间必须修改为 http://schema.org/

SELECT查询的结果通常显示为一个值表(HTML、XML 或 JSON 格式)。

过滤

如果我们必须从 DBpedia 中提取所有人口超过 500 万的内陆国家,我们需要在WHERE子句中使用FILTER关键字(参见清单 7-11 )。

Listing 7-11. A SELECT Query with a Filter to Extract All Landlocked Countries from DBpedia with More Than 5 Million Inhabitants

PREFIX rdfs: <``http://www.w3.org/2000/01/rdf-schema#

PREFIX type: <http://dbpedia.org/class/yago/

PREFIX prop: <http://dbpedia.org/property/

SELECT ?country_name ?population

WHERE {

?country a type:LandlockedCountries ;

rdfs:label ?country_name ;

prop:populationEstimate ?population .

FILTER (?population > 5000000) .

}

所提供的布尔条件将过滤掉不需要的查询结果,在本例中,过滤掉所有人口少于 500 万的内陆国家。

Note

前面的例子使用了快捷方式;来分隔共享相同主题?country的三元组模式。

询问问题

如果您需要一个是/否问题的答案,可以使用 SPARQL 中的 ASK 查询。例如,您可以查询 DBpedia 来找出亚马逊河是否比尼罗河长(参见清单 7-12 )。

Listing 7-12. An ASK Query in SPARQL

PREFIX prop: <http://dbpedia.org/property/

ASK

{

<http://dbpedia.org/resource/Amazon_River

<http://dbpedia.org/resource/Nile

FILTER(?amazon > ?nile) .

}

ASK查询的结果不是true就是false。在我们的例子中,输出是true

构造查询

SPARQL 不仅可以用于从数据集中检索信息,还可以创建新的图,或者通过添加新的三元组来重塑现有的 RDF 图。这种查询称为CONSTRUCT查询。假设您想通过添加祖母来扩展您的家谱描述。为此,你必须确定其他家庭成员的性别和亲子关系(见清单 7-13 )。

Listing 7-13. Preparing a CONSTRUCT Query

:Ben   :hasParent  :Christina ;

:gender     :male .

:Luke  :hasParent  :Linda ;

:gender     :male .

:Christina :hasParent :Anna ;

:gender    :female .

:Linda :hasParent :Anna ;

:gender    :female .

:Anna  :gender    :female .

下一步是运行一个CONSTRUCT查询来基于前面的创建新的三元组,以指定谁是谁的祖母(参见清单 7-14 )。

Listing 7-14. A CONSTRUCT Query

PREFIX : <http://samplefamilytreeonto.com/

CONSTRUCT { ?p :hasGrandmother ?g . }

WHERE {?p      :hasParent ?parent .

?parent :hasParent ?g .

?g      :gender    :female .}

新构造的三元组描述了两个孙子和他们的祖母之间的关系(参见清单 7-15 )。

Listing 7-15. A CONSTRUCT Query Generates New Triples

:Ben

:hasGrandmother  :Anna .

:Luke

:hasGrandmother  :Anna .

描述查询

DESCRIBE查询描述了给定变量匹配的资源。例如,如果您在国家数据集上运行一个DESCRIBE查询(参见清单 7-16 ,输出将是与被查询国家相关的所有三元组(参见清单 7-17 )。

Listing 7-16. A DESCRIBE Query

DESCRIBE ?country

Listing 7-17. The Output of a DESCRIBE Query

ex:Hungary a geo:Country;

ex:continent geo:Europe;

ex:flag <http://yourwebsite.com/img/flag-hun.png

联邦查询

在 SPARQL 1.1 中,查询可以在查询执行期间在另一个 SPARQL 端点上发出查询。这些查询称为联邦查询,其中远程 SPARQL 端点由关键字SERVICE声明,该关键字将查询的相应部分发送到远程 SPARQL 端点。例如,如果远程 SPARQL 端点是 DBpedia 的端点,那么可以编写一个联邦查询,如清单 7-18 所示。

Listing 7-18. A Federated Query in SPARQL 1.1

SELECT DISTINCT ?person

WHERE {

SERVICE <http://dbpedia.org/sparql> { ?person a <http://schema.org/Person

} LIMIT 10

清单 7-19 显示了该查询的一个示例输出,从 DBpedia 中识别了十个人。

Listing 7-19. Federated Query Result Example

---------------------------------------------------------

| person                                                |

=========================================================

| <http://dbpedia.org/resource/%C3%81ngel_Gim%C3%A9nez

| <http://dbpedia.org/resource/Aaron_Lines

| <http://dbpedia.org/resource/Abel_Lafleur

| <http://dbpedia.org/resource/Ada_Maimon

| <http://dbpedia.org/resource/Adam_Krikorian

| <http://dbpedia.org/resource/Albert_Constable

| <[http://dbpedia.org/resource/Alex_Reid_(actress](http://dbpedia.org/resource/Alex_Reid_(actress)

| <[http://dbpedia.org/resource/Alex_Reid_(art_dealer](http://dbpedia.org/resource/Alex_Reid_(art_dealer)

| <[http://dbpedia.org/resource/Alex_Reid_(fighter](http://dbpedia.org/resource/Alex_Reid_(fighter)

| <[http://dbpedia.org/resource/Alex_Reid_(footballer](http://dbpedia.org/resource/Alex_Reid_(footballer)

---------------------------------------------------------

原因查询

在 SPARQL 1.1 中,推理可以通过执行一个带有REASON关键字的 SPARQL 查询来执行,后面是一个本体或声明性语言中的规则集(声明为一个 URL,指向一个由<>或花括号之间的内联 N3 规则限定的规则),以及一个OVER和一个WHERE子句的组合来定义用于推理的三元组。

例如,要列出来自两个不同数据集的 Leslie Sikos 的所有熟人,您可以编写一个带推理的联邦查询,如清单 7-20 所示,而不管 Leslie Sikos 是否将他们列为熟人,或者其他人是否声明他们认识他。

Listing 7-20. Find Acquaintances Regardless of the Relationship Direction

REASON {

{ ?x foaf:knows ?y } => { ?y foaf:knows ?x }

}

OVER {

:LeslieSikos foaf:knows ?person .

}

WHERE {

{

SERVICE <http://examplegraph1.com/sparql

} UNION {

SERVICE <http://examplegraph2.com/sparql

}

}

SPARQL 查询的 URL 编码

为了给自动化流程提供进行 SPARQL 查询的选项,SPARQL 可以通过 HTTP 使用,使用 SPARQL 协议(在 SPARQL 中缩写为 P)。SPARQL 端点可以处理带有 HTTP GETPOST请求参数的 SPARQL 查询。该查询是 URL 编码的,以转义特殊字符并创建查询字符串作为query变量的值。这些参数在标准化的 SPARQL 协议 [12 中定义。例如,看一下清单 7-21 中所示的默认 DBpedia SPARQL 端点( http://dbpedia.org/sparql/ )查询。

Listing 7-21. A URL-Encoded SPARQL Query

http://dbpedia.org/sparql?default-graph-uri=http%3A%2F%2Fdbpedia.org&query=select+distinct+%3FConcept+where+{[]+a+%3FConcept}+LIMIT+100&format=text%2Fhtml&timeout=30000&debug=on

Note

第二个参数(default-graph-uri)是 DBpedia 的专有实现,它扩展了标准的 URL 编码的 SPARQL 查询。

图表更新操作

在 SPARQL 1.1 中,可以使用INSERT DATA操作将新的 RDF 三元组添加到图中。如果目标图不存在,则创建目标图。举个例子,假设有两个关于一本书的 RDF 陈述,分别是图表、标题和格式(参见清单 7-22 )。

Listing 7-22. Data Before the INSERT DATA Operation

@prefix dc: <http://purl.org/dc/elements/1.1/

@prefix schema: <http://schema.org/

<http://www.lesliesikos.com/mastering-structured-data-on-the-semantic-web/> dc:title

"Mastering Structured Data on the Semantic Web" .

<http://www.lesliesikos.com/mastering-structured-data-on-the-semantic-web/>

schema:bookFormat schema:Paperback .

要向这个关于作者和书写该书的语言的图中添加两个新的三元组,可以使用INSERT DATA操作,如清单 7-23 所示。因为两个三元组的主题是相同的,所以在分号分隔的列表中只需声明一次。

Listing 7-23. Adding New Triples to a Graph, Using the INSERT DATA Operation

PREFIX dc: <http://purl.org/dc/elements/1.1/

PREFIX schema: <http://schema.org/

INSERT DATA

{

<http://www.lesliesikos.com/mastering-structured-data-on-the-semantic-web/> dc:creator

"Leslie Sikos" ;

schema:inLanguage "English" .

}

结果,这个图将包含关于这本书的四个三元组,如清单 7-24 所示。

Listing 7-24. Data After the INSERT DATA Operation

@prefix dc: <http://purl.org/dc/elements/1.1/

@prefix schema: <http://schema.org/

<http://www.lesliesikos.com/mastering-structured-data-on-the-semantic-web/> dc:title

"Mastering Structured Data on the Semantic Web" .

<http://www.lesliesikos.com/mastering-structured-data-on-the-semantic-web/>

schema:bookFormat schema:Paperback .

<http://www.lesliesikos.com/mastering-structured-data-on-the-semantic-web/> dc:creator

"Leslie Sikos" .

<http://www.lesliesikos.com/mastering-structured-data-on-the-semantic-web/> dc:inLanguage

"English" .

SPARQL 1.1 还支持使用DELETE DATA操作移除 RDF 三元组。例如,要从清单 7-24 中删除书籍的格式和语言,您声明前缀,使用DELETE DATA操作,并列出要删除的语句(参见清单 7-25 )。

Listing 7-25. Removing Triples from a Graph, Using the DELETE DATA Operation

PREFIX schema: <http://schema.org/

PREFIX dc: <http://purl.org/dc/elements/1.1/

DELETE DATA

{

<http://www.lesliesikos.com/mastering-structured-data-on-the-semantic-web/>

schema:bookFormat schema:Paperback ; dc:inLanguage "English" .

}

图表管理操作

在 SPARQL 1.1 中,可以使用COPY操作将 RDF 语句从默认图复制到命名图。例如,假设我们有清单 7-26 中所示的三元组。

Listing 7-26. Data Before Copying

# Default Graph

@prefix foaf:  <http://xmlns.com/foaf/0.1/

<http://examplegraph.com/Leslie> a foaf:Person .

<http://examplegraph.com/Leslie> foaf:givenName "Leslie" .

<http://examplegraph.com/Leslie> foaf:mbox  <mailto:leslie@examplegraph.com> .

# Graph http://examplenamedgraph.com

<http://examplenamedgraph.com/Christina> a foaf:Person .

<http://examplenamedgraph.com/Christina> foaf:givenName "Christina" .

默认图的所有三元组都可以通过COPY操作复制到命名图,如清单 7-27 所示。

Listing 7-27. A COPY DEFAULT TO Operation SPARQL 1.1

COPY DEFAULT TO <http:/examplenamedgraph.com>

COPY DEFAULT TO操作的结果如清单 7-28 所示。

Listing 7-28. Data After the COPY DEFAULT TO Operation

# Default Graph

@prefix foaf:  <http://xmlns.com/foaf/0.1/

<http://examplegraph.com/Leslie> a foaf:Person .

<http://examplegraph.com/Leslie> foaf:givenName "Leslie" .

<http://examplegraph.com/Leslie> foaf:mbox  <mailto:leslie@examplegraph.com> .

# Graph http://examplenamedgraph.com

@prefix foaf:  <http://xmlns.com/foaf/0.1/

<http://examplegraph.com/Leslie> a foaf:Person .

<http://examplegraph.com/Leslie> foaf:givenName "Leslie" .

<http://examplegraph.com/Leslie

Note

命名图的原始内容因COPY操作而丢失。

类似地,可以使用MOVE操作将 RDF 语句从默认图移动到命名图。例如,假设您有清单 7-29 中所示的数据。

Listing 7-29. Data Before the MOVE DEFAULT TO Operation

# Default Graph

@prefix foaf:  <http://xmlns.com/foaf/0.1/

<http://examplegraph.com/Nathan> a foaf:Person .

<http://examplegraph.com/Nathan> foaf:givenName "Nathan" .

<http://examplegraph.com/Nathan> foaf:mbox  <mailto:nathan@examplegraph.com> .

# Graph http://examplenamedgraph.com

@prefix foaf:  <http://xmlns.com/foaf/0.1/

<http://examplenamedgraph.com/Peter> a foaf:Person .

<http://examplenamedgraph.com/Peter> foaf:givenName "Peter" .

要将所有 RDF 语句从默认图移动到命名图中,可以使用MOVE操作,如清单 7-30 所示。

Listing 7-30. A MOVE DEFAULT TO Operation

MOVE DEFAULT TO http://examplenamedgraph.com

Note

命名图的原始内容因MOVE操作而丢失(见清单 7-31 )。

Listing 7-31. Data After the MOVE DEFAULT TO Operation

# Default Graph

# Graphhttp://examplenamedgraph.com

@prefix foaf:  <http://xmlns.com/foaf/0.1/

<http://examplegraph.com/Nathan> a foaf:Person .

<http://examplegraph.com/Nathan> foaf:givenName "Nathan" .

<http://examplegraph.com/Nathan> foaf:mbox  <mailto:nathan@examplegraph.com> .

使用ADD操作,RDF 语句可以从输入图插入到目标图。清单 7-32 显示了从默认图添加到命名图的 RDF 三元组示例。

Listing 7-32. Data Before the ADD Operation

# Default graph

@prefix foaf:  <http://xmlns.com/foaf/0.1/

<http://examplegraph.com/Michael> a foaf:Person .

<http://examplegraph.com/Michael> foaf:givenName "Michael" .

<http://examplegraph.com/Michael> foaf:mbox  <mailto:mike@examplegraph.com> .

# Graph http://examplenamedgraph.com

@prefix foaf:  <http://xmlns.com/foaf/0.1/

<http://examplenamedgraph.com/Jemma> a foaf:Person .

清单 7-33 中的ADD操作执行该任务。

Listing 7-33. An ADD Operation in SPARQL 1.1

ADD DEFAULT TO <http://examplenamedgraph.com>

结果,默认图形被合并到命名图形中(参见清单 7-34 )。

Listing 7-34. The Result of an ADD Operation

# Default graph

@prefix foaf:  <http://xmlns.com/foaf/0.1/

<http://examplegraph.com/Michael> a foaf:Person .

<http://examplegraph.com/Michael> foaf:givenName "Michael" .

<http://examplegraph.com/Michael> foaf:mbox  <mailto:mike@examplegraph.com> .

# Graph http://examplenamedgraph.com

@prefix foaf:  <http://xmlns.com/foaf/0.1/

<http://examplenamedgraph.com/Jemma

<http://examplegraph.com/Michael> a foaf:Person .

<http://examplegraph.com/Michael> foaf:givenName "Michael" .

<http://examplegraph.com/Michael> foaf:mbox <mailto:mike@example> .

专有查询引擎和查询语言

虽然大多数语义 Web 平台和图数据库通过 SPARQL 查询引擎(如 Apache Jena 的 ARQ 或 AllegroGraph 的 sparql-1.1)支持 SPARQL,但一些供应商提供了自己的查询语言。这些查询语言中有许多与 SPARQL 部分兼容或相似,但是除了与它们一起发布的产品之外,它们通常与其他语义 Web 软件产品不兼容。

SeRQL:Sesame RDF 查询语言

Sesame 不仅支持 SPARQL,还支持 SeRQL(读作“circle”),即 Sesame RDF 查询语言 [13 ]。不管您是连接到本地还是远程的 Sesame 存储库,您都可以对一个SesameRepository对象执行 SeRQL 查询,以表格的形式检索结果,并显示值(参见清单 7-35 )。

Listing 7-35. A SeRQL Query, Using the Sesame Repository API

String query = "SELECT * FROM {x} p {y}";

QueryResultsTable resultsTable = myRepository.performTableQuery(QueryLanguage.SERQL, query);

int rowCount = resultsTable.getRowCount();

int columnCount = resultsTable.getColumnCount();

for (int row = 0; row < rowCount; row++) {

for (int column = 0; column < columnCount; column++) {

Value value = resultsTable.getValue(row, column);

if (value != null) {

System.out.print(value.toString());

}

else {

System.out.print("null");

}

System.out.print("\t");

}

System.out.println();

}

Note

一些存储库操作需要提升权限,因此您可能需要在获取存储库对象之前登录到SesameService。例如,如果您没有对存储库的读取权限,您将获得一个AccessDeniedException

如果您必须更改存储库中的大量 RDF 三元组,您可以将 Sesame Graph API 与 SeRQL CONSTRUCT查询结合使用。例如,如果我们有一个存储库,它用许多三元组描述了一本书的手稿,并且这本书在存储库的最后一次更新之后已经出版了,那么对于来自出版状态本体(PSO)的PublicationStatus属性,有许多过时的属性值(draft)应该被更改为published。我们不是为每个受影响的三元组手动更改属性值,而是从现有的PublicationStatus语句中派生出新的三元组,将这些语句的对象从draft更改为published(参见清单 7-36 )。

Listing 7-36. Changing Multiple Property Values, Using the Sesame Graph API

myRepository.addGraph(QueryLanguage.SERQL, A978-1-4842-1049-9_7_Fig7ai_HTML.jpg

"CONSTRUCT {X} <http://purl.org/spar/pso/PublicationStatus> {\"published\"} " +

"FROM {X} <http://purl.org/spar/pso/PublicationStatus

现在所有的三元组都用新的属性值更新了;然而,这些三元组是重复的。具有过时属性值的原始三元组必须从图中移除。为此,我们选择所有带有对象draft(旧值)的PublicationStatus三元组,并从存储库中移除这些三元组(参见清单 7-37 )。

Listing 7-37. Removing All Triples with the Obsolete Property Value

myRepository.removeGraph(QueryLanguage.SERQL, A978-1-4842-1049-9_7_Fig7ak_HTML.jpg

"CONSTRUCT * " + "FROM {X} <http://purl.org/spar/pso/PublicationStatus

Note

只有当 SeRQL 不支持更新操作时,才需要这种变通方法。更新 Sesame 存储库的另一个选择是使用 SAIL API。

CQL: Neo4j 的查询语言

Neo4j 有一种专有的查询语言,称为 Cypher Query Language (CQL),这是一种声明式模式匹配语言,具有类似 SQL 的、非常简单的、人类可读的语法 [14 ]。最常用的 Neo4j CQL 命令和子句是CREATE(创建节点、关系和属性)MATCH(检索关于节点、关系和属性的数据)RETURN(返回查询结果)WHERE(提供过滤检索数据的条件)DELETE(删除节点和关系)REMOVE(删除节点和关系的属性)ORDER BY(对检索数据进行排序)SET(添加或更新标签)。最常用的 Neo4j CQL 函数是String(处理字符串文字)、Aggregation(对 CQL 查询结果执行一些聚合操作)和Relationship(获取startnodeendnode等关系的细节)。Neo4j CQL 的数据类型类似于 Java 编程语言。数据类型用于定义节点和关系的属性,如booleanbyteshortintlongfloatdoublecharstring

MATCH命令通过节点名和节点标签识别节点。MATCH命令期望节点名和标签名作为用冒号分隔的花括号中的参数(参见清单 7-38 )。

Listing 7-38. MATCH Command Syntax

MATCH

(

node-name:label-name

)

在 CQL 中,RETURN子句与MATCH命令一起使用,从 Neo4j 图数据库中检索关于节点、关系和属性的数据。RETURN子句可以检索节点的部分或全部属性,并检索节点的部分或全部属性以及关联关系。RETURN子句的参数是节点名和属性名(参见清单 7-39 )。

Listing 7-39. RETURN Clause Syntax

RETURN

node-name.property1-name, … node-name. propertyn-name

例如,要检索代表大学院系的Fac节点的所有属性数据,可以将MATCH命令与RETURN子句结合起来,如清单 7-40 所示。

Listing 7-40. Retrieving All Faculty Data

MATCH (fac: Fac)

RETURN fac.facno,fac.fname,fac.location

该命令返回的行数将与数据库中存储的大学院系数相同。

与 SPARQL 类似,Neo4j 的 CQL 使用WHERE子句来获取想要的数据(参见清单 7-41 )。然而,在 CQL,不是在SELECT命令中使用WHERE子句,而是在SELECT的 CQL 对等词MATCH中使用它。

Listing 7-41. The Syntax of the WHERE Clause in CQL

WHERE condition boolean_operator additional_condition

第一个参数提供条件,由属性名、比较运算符和值组成。属性名是图形节点的名称或关系的名称。比较运算符为=(等于)、<>(不等于)、<(小于)、>(大于)、<=(小于等于)或>=(大于等于)中的一种。该值是文字值,如数字、字符串文字等。第二个和第三个参数(布尔运算符和多个条件)是可选的。布尔运算符可以是ANDORNOTXOR

要按升序或降序对行进行排序,请使用带有MATCH命令的ORDER BY子句(类似于 SPARQL 在SELECT查询上的ORDER BY)。ORDER BY子句包含用于排序的属性列表,可选地后跟DESC关键字(当以降序排序时)。

识别要查询的数据集

要从 LOD 数据集中访问数据,您可以执行语义搜索、浏览数据集目录或直接从专用查询界面运行查询。对于搜索机器可读数据,可以使用 Sindice ( http://sindice.com )或 FactForge ( http://factforge.net )等语义搜索引擎。第三方数据市场如 http://datamarket.com 可以从二级数据源中发现开放数据,为数据寻找者消费或获取数据。

为了从数据集中检索信息,可以在称为 SPARQL 端点(如前所述)的专门构建的访问点上运行 SPARQL 查询,这些访问点通常提供一个 web 接口和一个可选的 API。给定资源的 SPARQL 端点的自动发现并不简单;但是,对于给定 URI 的 SPARQL 端点,可以查询数据集目录,如 http://datahub.iohttp://dataportals.org 。因为将所有 LOD 数据集添加到 LOD 云图的先决条件是提供一个专用的 SPARQL 端点,所以 Datahub 注册中心通常包含一个 SPARQL 端点 URL。

另一种识别 SPARQL 端点的方法是使用 VoID 标准化词汇表,这是专门为描述数据集而设计的。在 VoID 文件中,描述是以 URL 的形式提供的,它可以从 URI 中规范化地派生出来。

公共 SPARQL 端点

许多 SPARQL 端点是公开可用的,通常有一个默认的 LOD 数据集集用于查询。您的 SPARQL 查询将在端点的默认图上运行,除非您在查询中引用了命名图。比如 DBpedia 的 SPARQL 端点是 http://dbpedia.org/sparql/ ,默认在 DBpedia 上运行查询。

Note

DBpedia 为其 SPARQL 端点提供了另外两个接口。第一个叫做 SPARQL Explorer,可以在 http://dbpedia.org/snorql/ 获得。第二个是在 http://querybuilder.dbpedia.org 可用的 DBpedia 查询构建器,可以用来构建自己的查询。因为数据集在每种情况下都是相同的,所以 SPARQL 查询结果在所有三个接口上都是相同的。

专用于特定数据集的 SPARQL 端点可以是特定于域的。由于数据网是高度分布式的,所以没有 SPARQL 端点来查询整个语义网(就像传统 Web 上的 Google 搜索一样)。然而,最常用的公共 SPARQL 端点可以查询包含数百万甚至数十亿个三元组的极大数据集,适合回答复杂问题(见表 7-2 )。

表 7-2。

Popular Public SPARQL Endpoints

| 服务/数据集 | SPARQL 端点 | | --- | --- | | Datahub/CKAN | [`http://semantic.ckan.net/sparql`](http://semantic.ckan.net/sparql) | | DBpedia(数据库管理员) | [`http://dbpedia.org/sparql/`](http://dbpedia.org/sparql/) | | 地名 | [`http://geosparql.org/`](http://geosparql.org/) | | 链接开放商业 | [`http://linkedopencommerce.com/sparql/`](http://linkedopencommerce.com/sparql/) | | 链接开放数据云 | [`http://lod.openlinksw.com/sparql`](http://lod.openlinksw.com/sparql) | | LinkedGeoData | [`http://linkedgeodata.org/sparql`](http://linkedgeodata.org/sparql) | | 辛迪克 | [`http://sparql.sindice.com/`](http://sparql.sindice.com/) | | 尿酸燃烧器 | [`http://uriburner.com/sparql`](http://uriburner.com/sparql) |

设置您自己的 SPARQL 端点

如果在服务器上发布 LOD 数据集,您可能希望设置一个专用的 SPARQL 端点来提供对它的轻松访问。有一些免费的、开源的和商业的产品,并不是所有的都完全支持 SPARQL 1.1,但是大多数都完全支持 SPARQL 1.0。有些产品是可以安装在 web 服务器上的独立 SPARQL 端点,而其他产品则是提供 SPARQL 端点功能的更全面的产品。部署最广泛的 SPARQL 端点是 OpenLink Virtuoso、Fuseki、D2R、4store SPARQL Server 和 PublishMyData。

OpenLink Virtuoso 是目前部署最广泛的 SPARQL 端点。其中,Virtuoso 被实现为 DBpedia 和 DBpedia Live、LinkedGeoData、Sindice、BBC、BioGateway、data.gov、CKAN 和 LOD 云缓存的 SPARQL 端点。

Virtuoso SPARQL 查询编辑器提供了与特定安装相关联的默认 LOD 数据集,在查询命名图形时可以覆盖该数据集。例如,DBpedia SPARQL 端点的默认数据集是 http://dbpedia.org ,如图 7-2 所示。这在 Virtuoso 的每次安装中明显不同,但界面通常非常相似,如果不是完全相同的话。

A978-1-4842-1049-9_7_Fig2_HTML.jpg

图 7-2。

A Virtuoso SPARQL endpoint

Query Text是一个多行文本区域,您可以在其中编写 SPARQL 查询。这个 textarea 通常包含一个框架查询,您可以通过覆盖、删除或添加 SPARQL 代码来轻松修改它。在 textarea 下,您可以选择输出格式,也可以选择查询执行停止之前的最长时间,以及查询的严格检查。一些安装提供了一组样本查询作为下拉列表。您通常也有两个按钮:一个运行您编写的查询(Run Query),另一个清除文本区域(Reset)。

输出格式下拉列表可能会因安装的不同而有所不同,但一般来说,您可以选择 HTML、电子表格、XML、JSON、JavaScript、Turtle、RDF/XML、N-Triples、CSV、TSV 和 CXML。由于配置或缺少组件,某些输出格式可能不可用。比如适合刻面视图的 CXML 数据交换格式,可以用 Microsoft Pivot 等程序显示,需要 Virtuoso Universal Server(Virtuoso 开源不包含一些需要的功能),ImageMagick 插件,二维码插件(0.6 版本之前;在 0.6 版之后,它是可选的),并且要安装 sparql_cxml VAD 包,以便获得该选项。

要安装 OpenLink Virtuoso SPARQL 端点,请按照下列步骤操作:

Download Virtuoso Open Source from http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/VOSDownload or the commercial edition of Virtuoso from http://virtuoso.openlinksw.com/download/ .   For the commercial Windows Open Source Edition, run the installer; otherwise, create a build.   Verify the installation and the configuration of the environmental variables by running the virtuoso -? Command.   Start the Virtuoso server with virtuoso-start.sh.   Verify the connection to the Virtuoso Server, using isql localhost (if using the default DB settings), isql localhost:1112 (assuming demo database), or visit http://<virtuoso-server-host-name>:[port]/conductor in your browser   Open the SPARQL endpoint at http://<virtuoso-server-host-name>:[port]/sparql.   Run a test query such as SELECT DISTINCT * WHERE {?s ?p ?o} LIMIT 50.

富士见

Fuseki 是 Apache Jena 的 SPARQL 服务器,使用 HTTP 上的 SPARQL 协议提供 REST 风格的 SPARQL HTTP 更新、SPARQL 查询和 SPARQL 更新。

Download the binary distribution from https://jena.apache.org/download/ .   Unzip the file.   Set file permission using the chmod +x fuseki-server s-* command.   Run the server by executing the command fuseki-server --update --mem /ds, which creates an in-memory, non-persistent dataset. If you want to create an empty, in-memory (non-persistent) dataset and load a file into it, use --file=FILE instead of --mem.

Fuseki 的默认端口号是 3030,可以用形式为--port=number的 port 参数覆盖。Fuseki 不仅支持 SPARQL 1.1 查询、SPARQL 1.1 更新操作和将文件上传到选定的数据集,还为 SPARQL 查询和 SPARQL 更新以及 RDF 序列化提供了验证器。要打开 Fuseki 的控制面板,在浏览器中访问http://localhost:3030,点击Control Panel,并选择数据集。

Fuseki 服务器的 URI 模式由主机、随后的数据集和端点组成,所有这些都用斜杠分隔。

  • http://host/dataset/query (SPARQL 查询端点)
  • http://host/dataset/update (SPARQL 更新端点)
  • http://host/dataset/data (SPARQL 图存储协议端点)
  • http://host/dataset/upload(文件上传端点)

要将一些 RDF 数据加载到服务器的默认图中,使用s-put命令,如清单 7-42 所示。

Listing 7-42. Load RDF Data into the Default Graph of Fuseki

s-put http://localhost:3030/ds/datadefault books.ttl

要从服务器的默认图中检索数据,使用s-get命令(参见清单 7-43 )。

Listing 7-43. Retrieving Data, Using s-get

s-get http://localhost:3030/ds/datadefault

可以使用 SPARQL 查询服务器的默认图,使用s-query命令使用…/query端点,如清单 7-44 所示。

Listing 7-44. SPARQL Querying with Fuseki

s-query --service http://localhost:3030/ds/query ’SELECT * {?s ?p ?o}’

可以使用带有s-update…/update端点来执行 SPARQL UPDATE查询。作为一个例子,让我们清除默认图形,如清单 7-45 所示。

Listing 7-45. A SPARQL UPDATE Query with Fuseki

s-update --service http://localhost:3030/ds/update ’CLEAR DEFAULT’

要在 Java 应用中使用 SPARQL 1.1 查询,可以使用 Apache Jena 的 SPARQL 查询引擎 ARQ 的QueryExecutionFactory.sparqlService。对于 SPARQL 更新的编程访问,使用UpdateExecutionFactory.createRemote。SPARQL HTTP 可以通过DatasetAccessor使用。

D2R

D2R 服务器是一个工具,用于将关系数据库发布为链接数据,通过浏览器界面提供对数据库内容的访问,并使用 SPARQL 查询数据库。D2R 通过映射执行 SPARQL 查询到 SQL 查询的动态转换。其中,D2R 被用作 Dailymed 的 SPARQL 终点,daily med 是一个全面的、最新的美国上市药物数据集。D2R 服务器可以按如下方式安装:。

Download the server from http://d2rq.org .   Run the server in one of the following ways:

  • 从命令行(用于开发或测试),语法如清单 7-46 所示

.Listing 7-46. Running D2R From the Command Line

d2r-server [--port port] [-b serverBaseURI][--fast] [--verbose] [--debug] mapping-file.ttl

因为默认端口号是2020,所以默认服务器 URI 是http://localhost:2020。可以选择将fast参数用于性能优化,将verbose参数用于详细日志记录,将debug参数用于完整日志记录。或者,您可以声明要使用的 D2RQ 映射文件的名称。如果没有提供映射文件,则必须在命令行上指定数据库连接,以便使用默认映射。

Ensure that the mapping file includes a configuration block, setting the base URI in the form http://servername/webappname/. The d2r:Server instance in this file configures the D2R server (see Listing 7-47).

  • 将 D2R 服务器 web 应用部署到一个 servlet 容器中,比如 Apache Tomcat 或 Jetty(用于生产)。

Listing 7-47. D2R Configuration File Example

@prefix d2r: <http://example.com/d2r-server/config.rdf#> .

@prefix meta: <http://exampe.com/d2r-server/metadata#> .

<> a d2r:Server;

rdfs:label "My D2R Server";

d2r:baseURI <http://localhost:2020/>;

d2r:port 2020;

d2r:vocabularyIncludeInstances true;

d2r:sparqlTimeout 300;

d2r:pageTimeout 5;

meta:datasetTitle "My Dataset" ;

meta:datasetDescription "This dataset contains Semantic Web A978-1-4842-1049-9_7_Fig7al_HTML.jpg

publication resources." ;

meta:datasetSource "The dataset covers publications from all related A978-1-4842-1049-9_7_Fig7am_HTML.jpg

datasets such as XY." ;

meta:operatorName "John Smith" ;

d2r:Server实例支持多种配置属性。可以使用rdfs:label提供人类可读的服务器名称。可以使用d2r:baseURI(相当于–b命令行参数)来声明服务器的基本 URI。服务器的端口号可以添加为d2r:port(与命令行中的--port相同)。默认情况下,词汇表类的 RDF 和 HTML 表示也是列表实例,属性表示也是使用属性的列表三元组。d2r:vocabularyIncludeInstances配置属性接受false布尔值来覆盖这种行为。要指定映射文件更改的自动检测,可以使用d2r:autoReloadMapping属性。默认值为true。可以使用d2r:limitPerClassMap设置每个类别映射的最大实体数量。默认值为50,可以通过将属性值设置为false来禁用该限制。可以使用d2r:limitPerPropertyBridge配置每个属性桥的最大值数量。默认值为50,可以通过将属性值设置为false来禁用该限制。D2R 服务器的 SPARQL 端点的超时可以以秒为单位设置为d2r:sparqlTimeout属性的属性值。如果想要禁用 SPARQL 端点的超时,请将值设置为0。生成资源描述页面的超时可以使用d2r:pageTimeout以秒为单位进行类似的设置,也可以通过将该值设置为0来禁用。可以使用d2r:metadataTemplate覆盖默认的资源元数据模板,它为路径名指定一个文字值,可以是绝对的,也可以是相对于服务器配置文件的位置。默认的数据集元数据模板可以被d2r:datasetMetadataTemplate的值覆盖。属性允许自动创建和发布所有数据集和资源元数据,它接受一个布尔值。如果省略了d2r:disableMetadata属性,则采用true值。

The name of the configuration file declared as the configFile param in /webapp/WEB-INF/web.xml has to be changed to the name of your configuration file. The recommended location of the mapping file is the /webapp/WEB-INF/ directory.   In the main directory of the D2R server, run ant war, which creates the d2rq.war file (requires Apache Ant).   The name of your web application can optionally be changed by renaming the file to webappname.war.   Deploy the .war file into your servlet container, such as by copying it into the webapps directory of Tomcat.

4store SPARQL 服务器

4store 提供了一个 SPARQL HTTP 协议服务器,它可以使用 SPARQL HTTP 查询协议来回答 SPARQL 查询。要运行 4store 的 SPARQL 服务器,请使用清单 7-48 中所示的带有端口号和 KB 名称的4s-httpd命令。

Listing 7-48. Running 4store’s HTTP Server

4s-httpd -p port_number 4store_KB_name

Note

多个 4store KBs 必须在不同的端口上运行。

一旦服务器开始运行,就可以在 web 浏览器的http://localhost:port_number/status/访问概览页面,在http://localhost:port_number/sparql/访问 SPARQL 端点,在http://localhost:port_number/test/访问 HTML 界面。从命令行,您可以使用位于 https://github.com/tialaramex/sparql-query 的 sparql-query 工具查询 SPARQL 服务器。

发布我的数据

PublishMyData 是一个商业链接数据发布平台。因为它是云中的软件即服务(SaaS),你不必安装任何东西来使用它。除了 SPARQL 端点,PublishMyData 还提供 RDF 数据托管、链接的数据 API 和可定制的可视化。它支持 SPARQL 1.1。要从代码中提交 SPARQL 查询,向 SPARQL 端点发出 HTTP GET 请求,如清单 7-49 所示。

Listing 7-49. SPARQL Query on PublishMyData

http://example.com/sparql?query=URL-encoded_query

例如,要运行查询SELECT * WHERE {?s ?p ?o} LIMIT 10并在 JSON 中获得结果,要使用的 URL 将具有清单 7-50 中所示的结构。

Listing 7-50. URL-Encoded SPARQL Query with PublishMyData

http://example.com/sparql.json?query=SELECT+%2A+WHERE+%7B%3Fs+%3Fp+%3Fo%7D+LIMIT+10

为了演示编程访问,让我们使用 JavaScript 从 SPARQL 端点请求数据(参见清单 7-51 )。

Listing 7-51. Using jQuery to Request Data Through the SPARQL Endpoint

<!DOCTYPE html>

<html>

<head>

<script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>

</head>

<body>

<script type="text/javascript">

var siteDomain = "example.com";

var query = "SELECT * WHERE {?s ?p ?o} LIMIT 10";

var url = "http://" + siteDomain + "/sparql.json?query=";

url += encodeURIComponent(query);

$.ajax({

dataType: ’json’,

url: url,

success: function(data) {

alert(’success: ’ + data.results.bindings.length + ’ results’);

console.log(data);

}

});

</script>

</body>

</html>

当请求作为 JSON 的 SPARQL 输出时,可以传递一个回调参数,这样结果将被包装在函数中,这可以防止在旧浏览器下运行 JavaScript 时出现跨域问题(参见清单 7-52 )。

Listing 7-52. Using a Callback Function

http://example.com/sparql.json?callback=myCallbackFunction&query=SELECT+%2A+WHERE+%7B%3Fs A978-1-4842-1049-9_7_Fig7an_HTML.jpg

+%3Fp+%3Fo%7D+LIMIT+10

或者,您可以使用 jQuery 发出 JSON-P 请求,并通过将dataType设置为jsonp来省略 URL 中的回调参数,如清单 7-53 所示。

Listing 7-53. Using JSON-P for SPARQL Querying

queryUrl = ’example.com/sparql.json?query=SELECT+%2A+WHERE+%7B%3Fs+%3Fp+%3Fo%7D+LIMIT+10’

$.ajax({

dataType: ’jsonp’,

url: queryUrl,

success: function(data) {

// callback code

alert(’success!’);

}

});

还可以使用 Ruby 从 PublishMyData SPARQL 端点请求数据,如清单 7-54 所示。

Listing 7-54. Make a Request to the PublishMyData SPARQL Endpoint in Ruby

require ’rest-client’

require ’json’

query = ’SELECT * WHERE {?s ?p ?o} LIMIT 10’

site_domain = "example.com"

url = "http://\#example.com/sparql.json"

results_str = RestClient.get url, {:params => {:query => query}}

results_hash = JSON.parse results_str

results_array = results_hash["results"]["bindings"]

puts "Total number of results: \#{results_array.length}"

本例中的请求被写成 JSON,结果将被放入一个哈希表中。

摘要

在本章中,您学习了 SPARQL 的基础,SPARQL 是 RDF 的标准化查询语言。现在,您已经熟悉了查询类型,并且知道如何编写 SPARQL 查询来回答复杂的问题、显示具有特定特性的 RDF 图的所有节点、过滤结果或者向数据集添加新的三元组。到目前为止,您已经认识了最流行的 SPARQL 端点接口,并且知道如何设置自己的端点。

下一章将向您展示如何处理大容量、高速度的数据集,如何在大数据应用中利用语义网技术,以及如何向您的网站添加结构化数据,以便考虑将其纳入 Google 知识图。

参考

The W3C SPARQL Working Group (2013) SPARQL 1.1 Overview. W3C Recommendation. World Wide Web Consortium. www.w3.org/TR/sparql11-overview/. Accessed 6 March 2015.   Prud’hommeaux, E., Seaborne, A. (2008) SPARQL Query Language for RDF. www.w3.org/TR/rdf-sparql-query/ . Accessed 18 April 2015.   Harris, S., Seaborne, A. (2013) www.w3.org/TR/sparql11-query/ . Accessed 18 April 2015.   Gearon, P., Passant, A., Polleres, A. (eds.) (2013) SPARQL 1.1 Update. www.w3.org/TR/sparql11-update/ . Accessed 18 April 2015.   Ogbuji, C. (ed.) (2013) SPARQL 1.1 Graph Store HTTP Protocol. W3C Recommendation. World Wide Web Consortium. www.w3.org/TR/sparql11-http-rdf-update/ . Accessed 6 March 2015.   Williams, G. T. (ed.) SPARQL 1.1 Service Description. www.w3.org/TR/sparql11-service-description/ . Accessed 18 April 2015.   Glimm, B., Ogbuji, C. (eds.) (2013) SPARQL 1.1 Entailment Regimes. www.w3.org/TR/sparql11-entailment/ . Accessed 18 April 2015.   Seaborne, A. (ed.) (2013) SPARQL 1.1 Query Results JSON Format. www.w3.org/TR/sparql11-results-json/ . Accessed 18 April 2015.   Seaborne, A. (ed.) (2013) SPARQL 1.1 Query Results CSV and TSV Formats. www.w3.org/TR/sparql11-results-csv-tsv/ . Accessed 18 April 2015.   Hawke, S. (ed.) (2013) SPARQL Query Results XML Format (Second Edition). www.w3.org/TR/rdf-sparql-XMLres/ . Accessed 18 April 2015.   Prud’hommeaux, E., Buil-Aranda, C. (eds.) (2013) SPARQL 1.1 Federated Query. www.w3.org/TR/sparql11-federated-query/ . Accessed 18 April 2015.   Feigenbaum, L., Williams, G. T., Clark, K. G., Torres, E. (eds.) (2013) SPARQL 1.1 Protocol. W3C Recommendation. World Wide Web Consortium. www.w3.org/TR/sparql11-protocol/ . Accessed 9 March 2015.   Broekstra, J., Ansell, P., Visser, D., Leigh, J., Kampman, A., Schwarte, A. et al. (2015) The SeRQL query language. http://rdf4j.org/sesame/2.7/docs/users.docbook?view#chapter-serql . Accessed 22 April 2015.   Neo Technology, Inc. (2015) Intro to Cypher. http://neo4j.com/developer/cypher-query-language/ . Accessed 22 April 2015.   Footnotes 1

或者,可以使用美元符号($)。

2

只有那些由聚合和常量组成的表达式才能使用聚合在 SPARQL 查询级别中进行投影。唯一的例外是将GROUP BY与一个或多个仅包含一个变量的简单表达式一起使用,该变量可以从该级别进行投影。

八、大数据应用

使用传统软件工具无法处理的不同格式的巨大且不断增长的数据池的可持续性是网页设计师、互联网营销人员和软件工程师的下一个重大挑战,需要新的技术和实践。处理大数据的方法之一是使用语义网技术,特别是机器可解释的元数据和链接数据。实现资源描述框架(RDF)和基于 RDF 的标准可以确保数据及其含义被封装,并且在连接来自不同数据源的不同数据时可以管理概念和关系。图形表示,如脸书的开放图,为数据分析添加了上下文并可视化了大数据。基于大数据的面向服务架构(SOA)基础设施使得实时更新大数据成为可能。可以自动对数据进行分类、关联关系和发现新的关系,这样就可以收集和集成数据,而不必担心模式和数据描述,还可以提供数据描述。语义网上的大数据应用包括但不限于下一代搜索引擎结果页面、社交媒体图表、自然语言内容分析、发布关于大规模世界事件的事实数据、链接 BBC 的在线内容以及高性能数据存储和处理。

大语义数据:语义网上的大数据

大数据是指任何大容量、高速度的数据集,这些数据集太大太复杂,无法使用传统的数据处理工具、应用和数据库系统进行处理。这种数据集代表数十亿字节的数据,存储了数十亿个隐藏值,无法进行高效的自动机器处理。大数据有四个特征:

  • 卷:海量数据集中存储和检索的大量数据。挑战在于实现合理的处理速度,尤其是在实时应用中。
  • 速度:高速数据流。挑战在于流数据处理。
  • 多样性:不同形式的数据。挑战在于处理不同的数据结构、数据格式和序列化。
  • 准确性:数据的不确定性。面临的挑战是处理信任问题、确定准确性和应对糟糕的数据质量。

解决大数据相关问题的一个有希望的方法是实施语义网技术,以构建能够高效处理大数据并随着不断增长的数据处理需求而发展的系统。

谷歌知识图和知识库

语义网上最著名的大数据应用之一是 2012 年推出的谷歌知识图。Google Knowledge Graph 是一个语义知识库,它使用从各种来源收集的语义搜索信息来增强传统的搜索引擎结果页面(SERPs)。知识图使用的数据源包括 Google 索引的页面、GoogleMaps 上的对象、公共数据源(如 Wikipedia)、LOD 数据集(如 DBpedia)、CIA World Factbook 和 FDA 数据集,以及特定主题的资源(如 Weather Underground 和 World Bank ),分别用于气象信息和经济统计。知识图搜索的结果不仅是比传统搜索更准确的相关信息,还有相关信息,例如人们搜索最多的类似资源。例如,如果你搜索达芬奇,你不仅会得到关于他和他的著名作品如《蒙娜丽莎》和《最后的晚餐》的事实,谷歌还会提示同一时代的其他著名画家,如扬·范·艾克、丢勒、拉斐尔和米开朗基罗(见图 8-1 )。

A978-1-4842-1049-9_8_Fig1_HTML.jpg

图 8-1。

The Google Knowledge Graph finds data resources related to your search phrase [1]

同样,如果搜索动作电影的标题,结果将包括类似的电影,而搜索特定的发明者将显示其他发明者,具有类似的研究领域和奖项。知识图包含超过 5 亿个对象和超过 180 亿个关于不同对象之间关系的事实,帮助软件代理“理解”搜索关键字的含义,并且这些数字还在不断增长。

根据使用的搜索短语,从 Google Knowledge Graph 检索到的搜索结果以两种方式表示。第一个称为谷歌知识面板,显示在搜索引擎结果页面的右侧,靠近有机搜索结果。搜索人员或品牌名称通常会出现一个知识面板,如图 8-2 所示。

A978-1-4842-1049-9_8_Fig2_HTML.jpg

图 8-2。

Facts about Tim Berners-Lee shown by the Google Knowledge Panel

如果对象在脸书、YouTube、Twitter、Instagram、Google+等社交媒体上存在。,还将显示指向这些页面的链接。最相关的链接显示在“人们也搜索”下面,可以通过单击“查看更多”链接来扩展。如果你搜索一个活着的音乐家,你可能还会在知识面板上看到“即将到来的事件”,包括即将到来的音乐会的地点和日期。

从 Google Knowledge Graph 检索的数据的第二种数据表示是 Google Knowledge Carousel,它显示与搜索短语相关的实体。例如,如果你搜索克林特·伊斯特伍德的电影记录,谷歌会提供有机结果,一个关于克林特·伊斯特伍德的知识面板,以及一个关于他最著名电影的知识转盘,如《好、坏、丑》、《不可饶恕》、《亡命之徒乔西·威尔士》、《老爷车》、《一把美元》、《肮脏的哈利》等(见图 8-3 )。当您单击“知识面板”上的某些链接类型时,也可以使用转盘。例如,如果您单击知识面板上显示的音乐家的即将举行的音乐会,该音乐家的所有即将举行的音乐会将显示在顶部的转盘上。

A978-1-4842-1049-9_8_Fig3_HTML.jpg

图 8-3。

Searching for an actor’s filmography gives both a Knowledge Carosel and a Knowledge Panel

Google 知识库结合了来自传统网站的数据,包括非结构化文本、DOM 树和表格,以及来自 Freebase 的结构化数据。这是一个自动提取结构化数据的大型数据库。用户可以检索的信息量取决于查询的结构和正确性。

知识库从知识图及其来源中获取大量数据,并收集自己的数据,对其可靠性进行排名,并将所有结果汇编到由机器学习算法收集的超过 16 亿个事实的数据库中。不再有关于美洲虎(汽车品牌或动物)或泰姬陵(纪念碑、音乐家或赌场)的模糊自然语言查询,因为谷歌完全知道这些“东西”之间的区别

将您的公司、产品和事件纳入知识图表

如果你在你的网站上使用受控词汇术语描述你的公司、产品、服务或事件,无论是 HTML5 微数据还是 JSON-LD,它们都将被视为包含在谷歌知识图中。Schema.org 术语可以用来定义特征和关系,例如一个人的姓氏( http://schema.org/familyName )、音乐专辑的流派( http://schema.org/music/artist/album )、或者商店的营业时间( http://schema.org/openingHours )。你使用的类别越精确越好。例如,如果你有一场音乐会,用 http://schema.org/MusicEvent 而不是 http://schema.org/Event ,或者如果你有一场足球比赛,用 http://schema.org/SportsEvent 而不是 http://schema.org/Event 。例如,活动组织者可以通过在 JSON-LD 中将结构化数据作为单独的代码块添加到标记中来描述即将到来的活动,这样 Google 就可以将它们包含在知识图上(参见清单 8-1 )。如前所述,在第三章的中,使用@context@type定义词汇表。

Listing 8-1. JSON-LD Annotation of a Band in the Markup

<script type="application/ld+json">

{

"@context"  : "http://schema.org

"@type"     : "MusicEvent",

"name"      : "Nice Band Live",

"startDate" : "2015-09-18T20:00",

"url"       : "http://www.nicebandexample.com/tour/150918

"location"  : {

"@type"   : "Place",

"name"    : "The Oval",

"address" : "1234 Blackwood Plaza",

"sameAs"  : "http://www.xyzoval.com

},

"performer" : {

"@type"   : "MusicGroup",

"name"    : "Nice Band",

"sameAs"  : "http://www.nicebandexample.com

},

"offers"   : {

"@type" : "Offer",

"url"   :http://www.exampleticketseller.com

}

}

</script>

同样,在线零售商和商店可以使用 Schema.org 术语描述产品。要确定您可以使用哪些属性,请转到 http://schema.org/Book 并查看属性列表。这里,我们添加了带有url的书的网站,通过引用相应的 DBpedia 页面定义了作者,使用 Schema.org 术语声明了可用的格式(平装本和电子书),以及其他属性(见清单 8-2 )。

Listing 8-2. JSON-LD Annotation of a Product Description

<script type="application/ld+json">

{

"@context": "http://schema.org

"@type": "Book",

"url": "http://www.lesliesikos.com/web-standards-mastering-html5-css3-and-xml-second-

edition/",

"author": "http://dbpedia.org/resource/Leslie_Sikos

"bookFormat": "http://schema.org/Paperback

"bookFormat": "http://schema.org/EBook

"datePublished": "2014-12-24",

"image": "http://www.lesliesikos.com/img/web-design-book.jpg

"inLanguage": "English",

"isbn": "1484208846",

"name": "Web Standards: Mastering HTML5, CSS3, and XML",

"numberOfPages": "524",

"offers": {

"@type": "Offer",

"availability": "http://schema.org/InStock

"price": "39.89",

"priceCurrency": "USD"

},

"publisher": "http://dbpedia.org/resource/Apress

"about": "http://dbpedia.org/resource/Web_design

}

</script>

可以使用 GoodRelations 对产品进行注释,包括易贝或 Gumtree 上的广告网页、接受的支付方式、商品价格和货币、产品类别、描述产品的官方供应商网页以及产品描述等属性(参见清单 8-3 )。

Listing 8-3. JSON-LD Annotation of a Product Offering in the Markup

{

"@context": {

"gr": "``http://purl.org/goodrelations/v1#

"pto": "http://www.productontology.org/id/

"schema": "http://schema.org/

"xsd": "``http://www.w3.org/2001/XMLSchema#

"schema:url": {

"@type": "@id"

},

"gr:acceptedPaymentMethods": {

"@type": "@id"

},

"gr:hasBusinessFunction": {

"@type": "@id"

},

"gr:hasCurrencyValue": {

"@type": "xsd:float"

}

},

"@id": "http://www.ebay.com/itm/ExampleAd-Giant-TCR-Advanced-1-Road-Bike-/21621444051

"@type": "gr:Offering",

"gr:acceptedPaymentMethods": "gr:Cash",

"gr:description": "Want to sell my Giant TCR Advanced 1 Road Bike as I’m moving A978-1-4842-1049-9_8_Fig8ab_HTML.jpg

interstate",

"gr:hasBusinessFunction": "gr:Sell",

"gr:hasPriceSpecification": {

"gr:hasCurrency": "USD",

"gr:hasCurrencyValue": "1350"

},

"gr:includes": {

"@type": [

"gr:Individual",

"pto:Racing_bicycle"

],

"gr:name": "Giant TCR Advanced 1",

"schema:url":https://www.giant-bicycles.com/enus/bikes/model/tcr.advanced.1.force/A978-1-4842-1049-9_8_Fig8ac_HTML.jpg

14797/66271/"

},

"gr:name": "Used Giant Road Bike"

}

要向有关本地企业的 HTML5 标记中添加结构化数据,可以使用 Schema.org 的 local business 词汇表。确保您使用最适合您业务的类型( http://schema.org/Library 用于图书馆, http://schema.org/ShoppingCenter 用于购物中心, http://schema.org/AutomotiveBusiness 用于车库, http://schema.org/FinancialService 用于财务规划师和银行等)。).学校或者体育俱乐部应该用 http://schema.org/Organization代替,而 http://schema.org/Corporation 更适合企业。最常用的 LocalBusiness 属性是名称、描述、地址和电话(参见清单 8-4 )。物理地址细节可以嵌入到 PostalAddress 中。

Listing 8-4. LocalBusiness Annotated with Microdata

<div itemscope="itemscope" itemtype="http://schema.org/LocalBusiness

<h1><span itemprop="name">The Blue Cafe</span></h1>

<span itemprop="description">A nice cafe on the beach with a friendly atmosphere.</span>

<div itemprop="address" itemscope="itemscope" itemtype="http://schema.org/PostalAddress

<span itemprop="streetAddress">123 Esplanade</span>

<span itemprop="addressLocality">Nice Beach</span>,

<span itemprop="addressRegion">CA</span>

</div>

<p>

Phone: <span itemprop="telephone">123-456-7890</span>

</p>

</div>

根据您希望在站点上显示为人类可读数据的内容和希望添加为机器可读数据的内容,您可以使用不同的标记元素和样式表。对于那些仅为软件代理添加的数据,使用meta元素上的属性值。

社交媒体应用

语义网上大数据实施的优秀例子是社交媒体图,如脸书社交图、Twitter 兴趣图、Twitter 关注图、LinkedIn 专业图或 LinkedIn 经济图。

脸书社交图

脸书社交图是世界上最大的社交图,包含大约 10 亿用户的数十 Pb 的结构化数据。因为每个对象都是一个图节点,每个关系都是脸书社交图上的一个图边(见图 8-4 ),任何对象都可以作为用户在浏览器中直接访问,也可以通过脸书应用以编程方式访问。

A978-1-4842-1049-9_8_Fig4_HTML.jpg

图 8-4。

On the Facebook Social Graph, every object is a node and every connection is an edge

事实上,这种大量用户数据的轻松访问远远超出了脸书,因为脸书社交图的社交关系和链接也被其他社交网络门户网站使用,如 Pinterest 和 Last.fm(社交自举)。

你有没有想过脸书是如何推荐朋友的?利用脸书社交图的边缘,可以很容易地识别出那些至少有一个共同朋友的人(见图 8-5 )。

A978-1-4842-1049-9_8_Fig5_HTML.jpg

图 8-5。

The edges of the Facebook Social Graph make it possible to suggest people you may know

脸书图形 API

脸书图形应用编程接口是 Facebook 平台的核心,使开发者能够从脸书用户档案中读取数据和向其中写入数据。Graph API 通过人物、照片、事件、页面等图形对象,以及它们之间的联系,如朋友关系、共享内容、照片标签等,来表示脸书社交图的当前状态。换句话说,Graph API 使得从脸书社交图中以编程方式访问用户对象和连接成为可能,这可用于脸书应用。

Graph API 不仅可以查询数据,还可以发布新的故事,发布开放的 Graph 故事,阅读脸书用户的信息,上传照片,更新社交图中的信息,以及执行脸书应用使用的类似任务。脸书社交图的所有对象(用户、相册、照片、状态信息、页面等。)具有唯一的标识符,该标识符是正整数,并且使得引用任何节点或边成为可能。

最初,Graph API 专门在 JSON 中向应用提供数据。JSON 的两个不同的键/值对集是对象(其中键是字符串)和数组(将键集表示为非负整数的有限计数序列)。这些值可以是 JSON 对象、数组或原语(字符串、数字、布尔值和 null)。

因为 Graph API 是 RESTful JSON API,所以可以在浏览器中访问它。Graph API 的 web 接口称为 Graph API Explorer,可在 https://developers.facebook.com/tools/explorer/ 获得。有了这个工具,你可以使用和遍历脸书社交图。您必须拥有脸书帐户并登录才能使用图形 API 浏览器。一旦您登录并访问 Graph API Explorer,您可以在右侧看到一个 JSON 对象,它有两个属性,即当前用户的标识符和名称,因为这是默认选择的两个字段(显示在左侧的me节点下)。如果您取消选中这两个复选框,并点击提交,图形 API 浏览器将显示更多关于用户的信息(参见图 8-6 )。提供多少细节取决于您的隐私设置。当查询中没有指定字段时,这些字段值是要返回的默认数据。

A978-1-4842-1049-9_8_Fig6_HTML.jpg

图 8-6。

With the Graph API Explorer, you can access fields of a node in the Facebook Social Graph

如果您需要关于节点的更多数据,您可能需要生成一个访问令牌(Get Access Token),选择您选择的附加字段,并授予 Graph API 访问这些数据的权限。Graph API Explorer 在后台执行简单的 HTTP GET请求,如清单 8-5 所示,并在左侧提供一个下拉菜单,包含GETPOSTDELETE选项。默认值为GET。要启动新的请求,您必须单击右侧的提交。

Listing 8-5. HTTP GET Request Through the Graph API Explorer

GET /v2.2/me HTTP/1.1

Host: graph.facebook.com

虽然脸书社交图中的每个节点都有一个标识符,但是您可以通过数字 ID 或用户名(如果对象有用户名的话)来引用任何节点。例如,如果您在GET之后将请求从默认的me值更改为您的用户 ID 或用户名,并点击 Submit,您的查询会得到相同的结果。这甚至适用于脸书页面。

由于在幕后使用了 HTTP GET请求,每个查询也可以直接执行。例如,要获取这本书的脸书页面的信息( http://facebook.com/SemanticWebBook ),可以直接在浏览器中打开 http://graph.facebook.com/SemanticWebBook 来检索 JSON 输出。这使得通过处理 HTTP 请求和 JSON 格式的软件库,以编程方式访问脸书社交图的任何节点或边成为可能。更简单的是,脸书为流行的语言和平台提供了 SDK,如 PHP(见清单 8-6 )、JavaScript(见清单 8-7 )、iOS(见清单 8-8 )和 Android(见清单 8-9 )。

Listing 8-6. Make an API Call from PHP

$request = new FacebookRequest(

$session,

’GET’,

’/me’

);

$response = $request->execute();

$graphObject = $response->getGraphObject();

/* result handler */

Listing 8-7. Make an API Call from JavaScript

FB.api(

"/me",

function (response) {

if (response && !response.error) {

/* result handler */

}

}

);

Listing 8-8. Make an API Call from iOS

[FBRequestConnection startWithGraphPath:@"/me"

completionHandler:^(

FBRequestConnection *connection,

id result,

NSError *error

) {

/* result handler */

}];

Listing 8-9. Make an API Call from Android

new Request(

session,

"/me",

null,

HttpMethod.GET,

new Request.Callback() {

public void onCompleted(Response response) {

/* result handler */

}

}

).executeAsync();

自 2011 年以来,脸书不仅以 JSON 格式,而且以语义丰富的 RDF 序列化格式提供从社交图检索的数据,以包括关联数据 URIs。实现应该是灵活和健壮的,所以选择了 Turtle 格式,尽管也考虑了 JSON-LD。Turtle 翻译的 JSON 输出可以通过 HTTP 内容协商访问。URI 或空白节点被分配给 JSON 对象或数组,作为 RDF 三元组的主题。RDF 三元组的谓词和对象源自 JSON 对象和数组的键值对。JSON 键被转换成 URI,而值被转换成 RDF 术语,比如有意义的文字、URI 或空白节点。

原始值对应于 RDF 文字,转换是通过应用试探法确定最适合文字的 RDF 数据类型 URI 来进行的。构成 URIs 的 JSON 字符串被翻译成 URIs。JSON-Turtle 转换中最常用的数据类型 URIs 是xsd:Booleanxsd:dateTimexsd:decimalxsd:doublexsd:integer。对象标识符仍然是字符串,即使它们看起来是整数。脸书为字符串实现了 RDF 1.1 约定,即常规字符串被保留为普通文字(隐式地处理为xsd:string),而不是显式地将其类型化为xsd:string。为了符合 httpRange-14(确保 HTTP GET请求不会导致未定义的域),片段标识符比斜线 URIs 更受欢迎。因为输出代表一个没有连接到外部资源的孤立图形,所以产生的链接数据只是四星链接数据(参见第三章)。尽管如此,RDF/Turtle 的输出在语义上比 JSON 的输出更丰富,因为显式的语义可以作为利用 RDFS 和 OWL 词汇表的本体来访问。

可以像直接执行 HTTP GET请求一样访问链接的数据,即使用 http://graph.facebook.comhttps://graph.facebook.com 基 URI,后跟一个斜杠和脸书用户名或脸书页面名。例如,关联数据 URIs 可以用来扩充一个人的 FOAF 档案,如清单 8-10 所示。

Listing 8-10. FOAF Profile Augmentation

@base <http://graph.facebook.com/

<http://www.lesliesikos.com/datasets/sikos.rdf#sikos

owl:sameAs </1105249544#> ;

rdfs:seeAlso </1105249544?metadata=1> ;

foaf:depiction </1105249544/picture> ;

foaf:account <http://www.facebook.com/sikos

Apache Marmotta 的 LDClient 库的脸书模块

Apache Marmotta 的 LDClient 库的脸书模块使用 Schema.org、都柏林核心、FOAF、SIOC 和 SKOS 术语将脸书图形 API 对象和连接表示为 RDF 三元组。只要可行,映射将使用 Schema.org 术语。Marmotta 的脸书模块(ldclient-provider-facebook)注册一个端点来处理从 http://graph.facebook.comhttp://www.facebook.com开始的所有 URIs。通过添加一个依赖项,可以在 Apache Maven 项目中使用脸书模块,如清单 8-11 所示。

Listing 8-11. Dependency for the Facebook Module in Maven

<dependency>

<groupId>org.apache.marmotta</groupId>

<artifactId>ldclient-provider-facebook</artifactId>

<version>3.3.0</version>

</dependency>

每个脸书对象至少有一个类别(尽可能使用rdf:type映射到 Schema.org 术语)、一个标识符(映射到dcterms:id)、一个名称(映射到schema:name)、一个描述(映射到schema:description)和一个脸书网页(映射到foaf:homepage)。这允许从 Maven 项目中以编程方式访问脸书对象。

脸书开放图协议

受微格式和 RDFa 的启发,Open Graph 协议使开发者能够将他们的页面集成到脸书社交图中。

开放图表词汇表可用于用与脸书属性相关联的元数据来注释您的网站标记。例如,一本书可以如清单 8-12 所示进行描述。打开图的命名空间是 http://opengraphprotocol.org/schema/

A978-1-4842-1049-9_8_Fig8a_HTML.jpg

Listing 8-12. Open Graph Annotation in the Markup

<meta property="og:title" content="Web Standards: Mastering HTML5, CSS3, and XML" />

<meta property="og:type" content="book" />

<meta property="og:url" content="http://www.masteringhtml5css3.com

<meta property="og:image" content="??http://www.masteringhtml5css3.com/img/

webstandardsbook.jpg " />

<meta property="og:site_name" content="Web Site of the Book Web Standards: A978-1-4842-1049-9_8_Fig8ae_HTML.jpg

Mastering HTML5, CSS3, and XML" />

<meta property="og:description" content="A book describing web standardization to create A978-1-4842-1049-9_8_Fig8af_HTML.jpg

optimized, device-independent web sites with cutting-edge technologies." />

推特卡片

类似于脸书的开放图形注释,Twitter 提供了所谓的 Twitter Cards 注释,将结构化数据添加到您关于 Twitter 对象的标记中。因为 Twitter 卡基于与 Open Graph 协议相同的约定,所以标签是相似的,并且您可以生成混合了 Open Graph 和 Twitter 卡注释的 Twitter 卡,而没有标签或数据重复。虽然建议用户在html元素(<html prefix="og: http://ogp.me/ns# ">)上为 Open Graph 指定og RDFa Core 1.1 CURIE 前缀映射,但是 Twitter 卡不需要类似的标记;但是,他们可以使用前缀twitter:作为meta元素的name属性值。另一个区别是,虽然开放图协议指定了标记的属性和内容属性的使用(例如<meta property="og:image" content="http://example.com/ogimg.jpg"/>),但是 Twitter 卡使用namecontent。Twitter 的解析器将理解现有开放图标记的propertycontent属性。要定义一个摘要卡(默认的 Twitter 卡类型),您可以在meta元素上混合使用 Twitter 卡和 Open Graph 注释,如清单 8-13 所示。

Listing 8-13. Twitter Card Annotation in the Markup

<meta name="twitter:card" content="summary" />

<meta name="twitter:site" content="@lesliesikos" />

<meta name="twitter:creator" content="@lesliesikos" />

<meta property="og:url" content="??http://www.lesliesikos.com/linked-data-platform-1-0

standardized/" />

<meta property="og:title" content="Linked Data Platform 1.0 Standardized" />

<meta property="og:description" content="The Linked Data Platform 1.0 is now a W3C A978-1-4842-1049-9_8_Fig8ah_HTML.jpg

Recommendation, covering a set of rules for HTTP operations on Web resources, including A978-1-4842-1049-9_8_Fig8ai_HTML.jpg

RDF-based Linked Data, to provide an architecture for read-write Linked Data on the A978-1-4842-1049-9_8_Fig8aj_HTML.jpg

Semantic Web." />

<meta property="og:image" content="http://www.lesliesikos.com/img/LOD.svg

沃森机器人

IBM Watson 的 DeepQA 系统是一个问答系统,最初是为了与 Jeopardy 的参赛者竞争而设计的!智力竞赛节目,三名参赛者在回答开放领域的问题时相互竞争。虽然该系统赢得了与人类大冠军的比赛,但它的应用远远超出了危险!,即一般情况下问题和知识源两方面的自然语言内容分析 [3 ]。沃森的认知计算算法用于医疗保健,以提供洞察力和决策支持,并对客户服务中的任何查询或服务问题做出个性化的即时响应。开发人员可以使用 IBM Watson 开发人员云,这是一个 REST APIs 和 SDK 的集合,用于认知计算任务,如自然语言分类、概念扩展、机器翻译、关系提取、语音到文本和视觉识别。

在其他技术中,Watson 使用了诸如 Sesame、本体和推理等三元组。DeepQA 的信息资源由非结构化、半结构化和结构化数据组成,其中结构化数据起着重要的作用,主要是通过在 IBM 的 DB2 数据库平台 [4 ]中实现 RDF。DeepQA 使用三种类型的结构化数据,包括在线结构化数据仓库,如 DBpedia、GeoNames、YAGO 和电影数据集;从非结构化数据中提取的结构化数据;以及提供要存储在 triplestore 中的附加信息(如问答类型)的管理数据。沃森使用语义网技术对数据进行推理 [5 ]。DeepQA 使用各种技术来产生每个问题的候选答案。随后的候选答案排名组件主要由语义网技术支持。特别地,链接的数据源被用来为潜在的答案提供分型证据 [6 ]。链接开放数据在 DeepQA 架构中起着至关重要的作用,不仅在生成候选答案方面,而且在考虑多个观点(如类型强制和地理邻近性)的同时对答案进行评分。从 DBpedia 提取的数据还支持实体消歧和关系检测。YAGO 用于实体类型识别,其中不连续属性被手动分配给 YAGO 分类法中的更高级别类型。为了能够回答来自各种领域的问题,Watson 在自然语言处理(NLP)算法的基础上实现了关系检测和实体识别,这些算法处理来自维基百科 [8 ]的事实数据。

BBC 的动态语义出版

英国广播公司(BBC)从 2010 年开始在 2010 年世界杯网站 [9 ]和 2012 年伦敦奥运会网站 [11 ]等网站实施 RDF。如今,BBC 新闻 [12 ]、BBC 体育 [13 ]以及 BBC 的许多其他网站都是使用语义网技术创作和发布的。BBC 新闻文章使用自动元数据标记和链接,不同的 BBC 领域(品牌、地点、人物和一般主题)通过对简单知识组织系统(SKOS) [14 ]中表达的术语进行分类的层次结构进行整合。BBC 节目网站 [15 ]的内容分类系统(CIS)的标识符被映射到 DBpedia 概念。BBC 音乐网站 [16 ]也是建立在链接数据上的,每个艺术家都用 RDF 表示。BBC 地球网站是由 RDF 和它自己的野生动物本体论支持的。

BBC 的发布平台基于嵌入式链接数据标识符、本体和推理来管理和发布 XHTML 和 RDF 聚合。BBC 的内部内容管理系统(称为内容管理/制作系统,简称 CPS)支持通过所见即所得(WYSIWYG)编辑器进行静态元数据输入。手动内容管理过程由动态语义注释完成,产生自动化的元数据、丰富的内容关系和语义导航。发布平台自动聚集和呈现到相关故事和资产的链接。

国会图书馆链接数据服务

美国国会图书馆是世界上最大的图书馆,拥有超过 1.6 亿项内容,它发布主题分类法作为编目的链接数据。它提供了 LC 链接数据服务,以 RDF [20 ]和 SKOS(在适当的情况下)表示数据,并使用自己的本体来准确描述分类资源和关系。国会图书馆的所有记录都可以通过内容协商单独获得,如 XHTML+RDFa、RDF/XML、N-Triples 和 JSON [21 ]。为了解决机器可读编目(MARC)这一由国会图书馆发起的标准的局限性,MARC 记录已经被映射到 BIBFRAME 词汇表术语 [22 ]以利用关联数据的优势。该库使用的其他受控词汇表是 Dublin Core 和 MARC Relator 术语(使用 marcrel 前缀)。例如,Dublin Core 词汇表的 contributor 术语已经使用 MARC Relator 术语词汇表的对应术语进行了改进,它允许编目员在 RDF [23 ]中指定个人在资源创建中扮演的角色,如插图画家、书法家或编辑。

高性能存储:万亿三倍大关

AllegroGraph ( http://franz.com/agraph/allegrograph/ ),在第六章中讨论的业界领先的图数据库,在加载和查询海量 RDF 三元组方面不断刷新记录。2004 年,AllegroGraph 的第一个版本是第一个使用标准 x86 64 位架构加载和索引 10 亿个三元组的图数据库。2008 年,亚马逊 EC2 服务上加载了 100 亿个 quads。2011 年 6 月,它使用基于八插槽英特尔至强 E7-8870 处理器的服务器系统,配置了 2TB 内存和 22TB 物理磁盘空间,在短短 78 小时内成功加载了 3100 亿个 RDF 三元组。两个月后,AllegroGraph 成为世界上第一个加载、推断和查询超过 1 万亿(!)三胞胎。这种令人惊叹的无与伦比的性能足以存储[25]

  • 世界上最大的图书馆——美国国会图书馆的 1.58 亿件藏品中的每一件都有 6350 个事实
  • 10 亿 Twitter 用户中的每一个都有 1000 条推文
  • 13 亿脸书用户的 770 个事实
  • 关于人类大脑中 860 亿个神经元的 12 个事实。
  • 人类平均一生中 25 亿次心跳中的每一次都有 400 次代谢读数
  • 银河系中 2000 亿颗恒星的五个事实

AllegroGraph 专为最大加载速度和查询速度而设计。通过其高度优化的 RDF/XML 和 N-Quads 解析器加载三元组和四元组是非常强大的,尤其是对于大文件。这 1,009,690,381,946 个三元组仅用了 338 个多小时就被加载,平均速率超过每秒 800,000 个三元组(见表 8-1 )。

表 8-1。

AllegroGraph’s Performance in Triple Loading and Indexing

| 配置 | 三重计数 | 时间 | 负载率(吨/秒) | | --- | --- | --- | --- | | 2 x4 Intel e 5520 @ 2.26 GHz、48GB RAM、CentOS 5.3 | 11.06 亿 | 48 米 30 秒 | Three hundred and seventy-nine thousand nine hundred and forty-seven | | 32 核英特尔 E5520@2.0 GHz,1TB 内存,Red Hat Enterprise Linux 6.1 | 11.06 亿 | 36 支 m 49 步枪 | Five hundred thousand six hundred and seventy-nine | | 32 核英特尔 E5520@2.0 GHz,1TB 内存,Red Hat Enterprise Linux 6.1 | 221.20 亿 | 12 小时 18 分 16 秒 | Four hundred and ninety-nine thousand one hundred and eighty-eight | | 64 核英特尔 x7560@2.27 GHz,2TB 内存,22TB 磁盘,Red Hat Enterprise Linux 6.1 | 3102.69 亿 | 78 小时 9 分 23 秒 | One million one hundred and two thousand seven hundred and thirty-seven | | 240 核英特尔 x5650,2.66GHz,1.28TB 内存,88TB 磁盘,Red Hat Enterprise Linux 6.1 | 1.009 万亿 | 338 小时 5 分钟 | Eight hundred and twenty-nine thousand five hundred and fifty-six |

采用 Oracle Database 12c 的 Oracle Spatial 和 Graph 在 2014 年 9 月在处理和索引 RDF 三元组方面达到了 1 万亿三元组。Oracle 的最大加载速率为每秒加载和索引 1420000 个四元组(参见表 8-2 )。

表 8-2。

Oracle Spatial and Graph’s Performance in Triple and Quad Loading and Indexing

| 配置 | 数数 | 时间 | 负载率* | | --- | --- | --- | --- | | 64 核 SPARC64 VII+@3GHz、512GB RAM、双 F5100 闪存阵列中的 160 个驱动器、Oracle 数据库 11.2.0.2.0 | 11 亿个三倍 | 28 米 11 秒 | 650,500 万亿次 | | 64 核 SPARC64 VII+@3GHz、512GB RAM、双 F5100 闪存阵列中的 160 个驱动器、Oracle 数据库 11.2.0.2.0 | 34 亿个三倍 | 105 米 | 539,700 万亿次 | | 40 核英特尔 E7-4870@ 2.4GHz,在一个 Sun 服务器 X2-4 节点上带有 1TB RAM,双节点 Sun ZFS 7420 存储 | 274 亿个四边形 | 13 小时 11 分 | 273,000 QLIPS | | 192 核 Oracle 数据库云服务器 X4-2 高容量全机架、2TB RAM、44.8TB 闪存、八托盘双控制器 ZS3-2 存储、Oracle 数据库 12.1.0.1 | 6054 亿个四边形 | 115.2 小时 | 1,420,QLIPS |

*TLIPS:每秒加载和索引三次;QLIPS:每秒加载和索引的四边形数

摘要

在本章中,您看到了在搜索引擎、社交媒体和高性能存储中使用语义网技术的大数据应用。您学习了如何将结构化数据添加到您的网站,Google 会考虑将其包含在知识图中,其数据将用于在知识面板和知识转盘上显示其他数据。到目前为止,您已经知道如何在标记中为脸书和 Twitter 对象编写语义注释。

最后一章将一步一步地展示各种真实情况下的用例。

参考

Google (2015) Introducing the Knowledge Graph. www.google.co.uk/insidesearch/features/search/knowledge.html . Accessed 9 March 2015.   Twitter (2015) Getting Started with Cards. https://dev.twitter.com/cards/ . Accessed 12 March 2015.   Gliozzo, A., Patwardhan, S., Biran, O., McKeown, K. (2013) Semantic Technologies in IBM Watson. www.cs.columbia.edu/nlp/papers/2013/watson_class_acl_tnlp_2013.pdf . Accessed 23 April 2015.   Gucer, V. (2013) IBM is embracing Semantic technologies in its products. In: 5 Things To Know About Semantic Technologies. www.ibm.com/developerworks/community/blogs/5things/entry/5_things_to_know_about_the_semantic_technologies?lang=en . Accessed 23 April 2015.   Le Hors, A. (2012) Interview: IBM on the Linked Data Platform. www.w3.org/blog/2012/05/interview-ibm-on-a-linked-data/ . Accessed 23 April 2015.   Welty, C. (2013) Semantic Web and Best Practice in Watson. In: Proceedings of the Workshop on Semantic Web Enterprise Adoption and Best Practice (WaSABi 2013), Sydney, Australia, 22 October, 2013. http://ceur-ws.org/Vol-1106/keynote2.pdf . Accessed 23 April 2015.   Unger, C., Freitas, A., Cimiano, P. (2014) An Introduction to Question Answering over Linked Data. In: Reasoning Web: Reasoning on the Web in the Big Data Era. Lecture Notes in Computer Science 2014, 8714:128–130, http://dx.doi.org/10.1007/978-3-319-10587-1. Accessed 23 April 2015.   Gliozzo, A. M., Kalyanpur, A., Welty, C. (2011) Semantic Web Technology in Watson. Tutorial at the 10th International Semantic Web Conference, Bonn, Germany, 23–27 October 2011. http://iswc2011.semanticweb.org/tutorials/semantic-web-technology-in-watson/ . Accessed 23 April 2015.   Shotton, D. (2012) A major user of RDF linked data—the BBC. http://jats.nlm.nih.gov/jats-con/2012/presentations/shotton_jatscon2012.pdf . Accessed 24 April 2015.   BBC (2010) World Cup 2010. http://news.bbc.co.uk/sport2/hi/football/world_cup_2010/ . Accessed 24 April 2015.   BBC (2012) London 2012 Olympics. www.bbc.com/sport/0/olympics/2012/ . Accessed 24 April 2015.   BBC (2015) BBC News. www.bbc.co.uk/news/ . Accessed 24 April 2015.   BBC (2015) BBC Sport. www.bbc.co.uk/sport . Accessed 24 April 2015.   Kobilarov, G., Scott, T., Raimond, Y., Oliver, S., Sizemore, C., Smethurst, M., Bizer, C., Lee, R. (2009) Media Meets Semantic Web—How the BBC Uses DBpedia and Linked Data to Make Connections. Lecture Notes in Computer Science 2009, 5554:723–737, http://dx.doi.org/10.1007/978-3-642-02121-3_53. Accessed 24 April 2015.   BBC (2015) BBC Programmes. www.bbc.co.uk/programmes . Accessed 24 April 2015.   BBC (2015) BBC Music. www.bbc.co.uk/music . Accessed 24 April 2015.   BBC (2015) BBC Earth. www.bbc.com/earth/uk . Accessed 24 April 2015.   BBC (2012) Sports Refresh: Dynamic Semantic Publishing. www.bbc.co.uk/blogs/legacy/bbcinternet/2012/04/sports_dynamic_semantic.html . Accessed 24 April 2015.   Library of Congress (2015) Fascinating Facts. www.loc.gov/about/fascinating-facts/ . Accessed 24 April 2015.   Library of Congress (2015) LC Linked Data Service. http://id.loc.gov/ . Accessed 24 April 2015.   Ford, K. (2010) ID.LOC.GOV, 1½ Years: Review, Changes, Future Plans, MADS/RDF. http://id.loc.gov/static/presentations/kefo_dlf_id.pdf . Accessed 24 April 2015.   Library of Congress (2015) Vocabulary (Bibliographic Framework Initiative Technical Site). http://bibframe.org/vocab/ . Accessed 24 April 2015.   Harper, C. A., Tillett, B. B. (2007) Library of Congress Controlled Vocabularies and Their Application to the Semantic Web. Cataloging & Classification Quarterly 2007, 43(3-4):47–68. http://dx.doi.org/10.1300/J104v43n03_03. Accessed 24 April 2015.   Franz Inc. (2011) Franz’s AllegroGraph Sets New Record on Intel Xeon E7 Platform. http://franz.com/about/press_room/Franz-Intel_6-7-11.lhtml . Accessed 12 March 2015.   Oracle (2014) Oracle Spatial and Graph: Benchmarking a Trillion Edges RDF Graph. http://download.oracle.com/otndocs/tech/semantic_web/pdf/OracleSpatialGraph_RDFgraph_1_trillion_Benchmark.pdf . Accessed 3 February 2015.

九、用例

通过阅读这本书,您学习了如何在标记中编写 HTML5 微数据和 JSON-LD 注释,开发语义 web 应用,用标准化语言描述 Web 服务,在链接开放数据(LOD)数据集上运行强大的查询,以及开发语义 Web 应用。现在您已经熟悉了语义 Web 技术,让我们分析四个复杂的例子,为现实生活中的实现做准备!

RDB 到 RDF 直接映射

使用 R2RML 语言来表达从关系数据库(RDB)到资源描述框架(RDF)数据集的定制映射,您可以引用逻辑表来从输入数据库中检索数据。逻辑表可以是基表、视图或 SQL 查询[1]。假设您有一个关于企业员工的关系数据库,并希望将其映射到 RDF。每个工作人员由一个唯一的标识符(ID)识别,该标识符用作主键(见表 9-1 )。

表 9-1。

The Employee Database Table

| ID `INTEGER` | 名字`VARCHAR(50)` | 姓氏`VARCHAR(50)` | | --- | --- | --- | | `10` | `John` | `Smith` | | `11` | `Sarah` | `Williams` | | `12` | `Peter` | `Jones` |

员工项目由员工标识符(ID_Employee)和项目标识符(ID_Project)描述,两者都是主外键(见表 9-2 )。

表 9-2。

The Employee_Project Database Table

| ID _ 员工`INTEGER` | ID _ 项目`INTEGER` | | --- | --- | | `10` | `110` | | `11` | `111` | | `11` | `112` | | `12` | `111` |

项目使用一个整数标识符(ID),这是一个主键,最多描述 50 个字符(表 9-3 )。

表 9-3。

The Project Database Table

| ID `INTEGER` | 描述`VARCHAR(50)` | | --- | --- | | `110` | `WebDesign` | | `111` | `CloudComputing` | | `112` | `DomainRegistration` |

直接映射定义了关系数据库中数据的 RDF 图表示[2]。直接映射将关系数据库(数据和模式)作为输入,并生成一个称为直接图的 RDF 图。在映射过程中,工作人员、项目以及它们之间的关系用 Turtle 语法用 RDF 表示(见清单 9-1 )。将逻辑表的每一行转换成零个或多个 RDF 三元组的规则被指定为三元组映射。从逻辑表中的一行生成的所有 RDF 三元组共享同一个主题。三元组映射由引用其他资源的资源表示。每个三元组映射只有一个rr:logicalTable属性,该属性的值代表指定要映射到 RDF 三元组的结构化查询语言(SQL)查询结果的逻辑表。三元组映射也正好有一个主题映射,它指定了为逻辑表的每一行生成主题所使用的技术,使用的是其值为主题映射的rr:subjectMap属性、 1 。三元组映射可能有可选的rr:predicateObjectMap属性,其值是为逻辑表的每个逻辑表行创建谓词-对象对的谓词-对象映射。谓词-对象映射指定的谓词映射-对象映射对可以与主题映射生成的主题一起使用,为每行创建 RDF 三元组。

Listing 9-1. Direct Mapping from RDB to RDF

@prefix foaf: < http://xmlns.com/foaf/0.1/ >。

@prefix ex: <``http://example.com

@prefix xsd: <``http://www.w3.org/2001/XMLSchema#

@base <``http://example.com/base/

<TriplesMap1>

a rr:TriplesMap;

rr:logicalTable [ rr:tableName "\"Employee\""; ] ;

rr:subjectMap [ rr:template "http://example.com/employee/{\"\ID\"}"; ];

rr:predicateObjectMap

[

rr:preficate        ex:firstName ;

rr:objectMap    [ rr:column "\"FirstName\"" ]

];

rr:predicateObjectMap

[

rr:predicate        ex:lastName ;

rr:objectMap    [  rr:column "\"LastName\"" ]

]

<TripleMap2>

a rr:TriplesMap;

rr:logicalTable [ rr:tableName "\"Project\""; ] ;

rr:subjectMap [ rr:template "http://example.com/project/{\"\ID\"}"; ];

rr:predicateObjectMap

[

rr:preficate        ex:id ;

rr:objectMap    [ rr:column "\"ID\"" ]

];

rr:predicateObjectMap

[

rr:predicate        ex:description ;

rr:objectMap    [  rr:column "\"Description\"" ]

]

<linkMap_1_2>

a rr:TriplesMap;

rr:logicalTable [ rr:tableName "\"Employee_Project\""; ] ;

rr:subjectMap [ rr:template "http://example.com/employee/{\"\ID_Employee\"}"; ];

rr:predicateObjectMap

[

rr:preficate        ex:involvedIn ;

rr:objectMap    [ rr:template "http://example.com/project/{\"ID_Project\"}" ];

] .

R2RML 映射受软件工具支持,如 db2triples 软件库[3]、OpenLink Virtuoso [4]、RDF-RDB2RDF [5]、morph [6]和 Ultrawrap [7]。在这个例子中,结果是一组 RDF 三元组,描述了员工和他们参与的项目(表 9-4 )。

表 9-4。

The RDF Triples of the Output

| 科目 | 述语 | 目标 | | --- | --- | --- | | `` | `` | `"Smith"` | | `` | `` | `"John"` | | `` | `` | `"Jones"` | | `` | `` | `"Peter"` | | `` | `` | `"Williams"` | | `` | `` | `"Sarah"` | | `` | `` | `"WebDesign"` | | `` | `` | `"110"^^` | | `` | `` | `"CloudComputing"` | | `` | `` | `"111"^^` | | `` | `` | `"DomainRegistration"` | | `` | `` | `"112"^^` | | `` | `` | `` | | `` | `` | `` | | `` | `` | `` | | `` | `` | `` |

默认情况下,所有 RDF 三元组都在输出数据集的默认图中。然而,三元组映射可以包含将部分或全部三元组放入命名图中的图映射。

OWL-S 中对信用卡收费的语义 Web 服务过程

假设一个 Web 服务向一个有效的信用卡收费。在 OWL-S 中,Web 服务可以被建模为指定客户端如何与服务交互的过程。可以有任意数量的前提条件,这些条件都必须满足,才能成功调用流程。一个流程有零个或多个输入,代表在某些情况下流程执行所需的信息。一个流程可能有任意数量的输出,这些输出表示流程向请求者提供的信息。效果描述了该过程所依赖的真实世界条件。为了在 OWL-S 中描述信用卡收费过程,我们必须检查卡是否透支,这可以定义为一个原子过程(对期望一个消息并返回一个消息作为响应的服务的描述)。如果卡透支,应该显示失败。否则,如果卡可以被收费,则必须执行该过程。因此,流程的描述包括两个result元素:一个用于对卡收费,另一个用于错误处理程序(参见清单 9-2 )。

Listing 9-2. OWL-S Description of Charging a Credit Card [8]

<process:AtomicProcess rdf:ID="Purchase">

<process:hasInput>

<process:Input rdf:ID="ObjectPurchased" />

</process:hasInput>

<process:hasInput>

<process:Input rdf:ID="PurchaseAmt" />

</process:hasInput>

<process:hasInput>

<process:Input rdf:ID="CreditCard" />

</process:hasInput>

<process:hasOutput>

<process:Output rdf:ID="ConfirmationNum" />

</process:hasOutput>

<process:hasResult>

<process:Result>

<process:hasResultVar>

<process:ResultVar rdf:ID="CreditLimH">

<process:parameterType rdf:resource="&ecom;#Dollars" />

</process:ResultVar>

</process:hasResultVar>

<process:inCondition>

<expr:KIF-Condition>

<expr:expressionBody>

(and (current-value (credit-limit ?CreditCard)

?CreditLimH)

(>= ?CreditLimH ?purchaseAmt))

</expr:expressionBody>

</expr:KIF-Condition>

</process:inCondition>

<process:withOutput>

<process:OutputBinding>

<process:toParam rdf:resource="#ConfirmationNum" />

<process:valueFunction rdf:parseType="Literal">

<cc:ConfirmationNum xsd:datatype="&xsd;#string" />

</process:valueFunction>

</process:OutputBinding>

</process:withOutput>

<process:hasEffect>

<expr:KIF-Condition>

<expr:expressionBody>

(and (confirmed (purchase ?purchaseAmt) ?ConfirmationNum)

(own ?objectPurchased)

(decrease (credit-limit ?CreditCard)

?purchaseAmt))

</expr:expressionBody>

</expr:KIF-Condition>

</process:hasEffect>

</process:Result>

<process:Result>

<process:hasResultVar>

<process:ResultVar rdf:ID="CreditLimL">

<process:parameterType rdf:resource="&ecom;#Dollars" />

</process:ResultVar>

</process:hasResultVar>

<process:inCondition>

<expr:KIF-Condition>

<expr:expressionBody>

(and (current-value (credit-limit ?CreditCard)

?CreditLimL)

(< ?CreditLimL ?purchaseAmt))

</expr:expressionBody>

</expr:KIF-Condition>

</process:inCondition>

<process:withOutput rdf:resource="&ecom;failureNotice" />

<process:OutputBinding>

<process:toParam rdf:resource="#ConfirmationNum" />

<process:valueData rdf:parseType="Literal">

<drs:Literal>

<drs:litdefn xsd:datatype="&xsd;#string">00000000</drs:litdefn>

</drs:Literal>

</process:valueData>

</process:OutputBinding>

</process:withOutput>

</process:Result>

</process:hasResult>

</process:AtomicProcess>

过程产生的数据转换由输入和输出指定(hasInputhasOutput)。原子流程总是从客户端接收指定流程执行所需信息的输入。流程执行的结果是信用卡被充值,钱从账户中取出。本例中的效果描述了客户现在拥有该对象(own ?objectPurchased),并且信用卡账户中的金额已经减少(decrease (credit-limit ?CreditCard) ?purchaseAmt)。在实际应用中,此类服务通常会发送一张发票,其中包含或不包含交易成功的通知。信用卡交易有两种结果:一种是余额足够支付账单的情况,另一种是余额不足的情况。每个结果都可以通过进一步的绑定来扩充。

用 WSMO 建模旅行社 Web 服务

假设以下场景。Leslie 想预订一个热带假期的机票和酒店。虚构的 Dream Holidays 旅行社提供基于语义 Web 服务技术的娱乐和商务旅行服务。旅行社根据与服务提供商的合同安排机票预订和酒店预订(图 9-1 )。

A978-1-4842-1049-9_9_Fig1_HTML.jpg

图 9-1。

Travel agency modeling

该服务的目标可以描述为“为 Leslie 预订一个热带假期的航班和酒店房间。”后置条件是通过提供当前位置、目的地、支付方式和酒店名称来获得旅行预订(参见清单 9-3 )。

Listing 9-3. Defining the Service Goal

goal _"??http://www.example.com/successfulBooking

capability

postcondition

definedBy

?tripReservation memberOf tr#reservation[

customer hasValue fof#Leslie,

origin hasValue loc#adelaide,

destination hasValue loc#bali,

travel hasValue ?flight,

accommodation hasValue ?Hotel

payment hasValue tr#creditcard

] and

?flight[airline hasValue tr#staralliance] memberOf tr#flight and

?hotel[name hasValue "Tropical Paradise Hotel"] memberOf tr#hotel .

服务描述应该包含门票、酒店、便利设施等等。预先状态能力描述包括预订请求和先决条件,比如有效的信用卡(参见清单 9-4 )。

Listing 9-4. Pre-State Capability Description

capability DREAMHOLIDAYScapability

sharedVariables {?creditCard, ?initialBalance, ?item, ?passenger}

precondition

definedBy

?reservationRequest[

reservationItem hasValue ?item,

passenger hasValue ?passenger,

payment hasValue ?creditcard,

] memberOf tr#reservationRequest and

((?item memberOf tr#trip) or (?item memberOf tr#ticket)) and

?creditCard[balance hasValue ?initialBalance] memberOf po#creditCard.

assumption

definedBy

po#validCreditCard(?creditCard) and

(?creditCard[type hasValue po#visa] or ?creditCard[type hasValue po#mastercard]).

后状态能力描述包括后条件、保留价格和信用卡的最终价值(参见清单 9-5 )。

Listing 9-5. Post-State Capability Description

postcondition

definedBy

?reservation[

reservationItem hasValue ?item,

customer hasValue ?passenger,

payment hasValue ?creditcard

] memberOf tr#reservation .

assumption

definedBy

reservationPrice(?reservation, "AUD", ?tripPrice) and

?finalBalance= (?initialBalance - ?ticketPrice) and

?creditCard[po#balance  hasValue  ?finalBalance] .

使用 Jena 的 RDF API 查询 DBpedia

如前所述,Apache Jena 使用 ARQ 引擎来处理 SPARQL 查询。ARQ API 类可以在com.hp.hpl.jena.query中找到。ARQ 的核心类是Query,它代表一个 SPARQL 查询;Dataset,在那里执行查询;QueryFactory,用于从 SPARQL 字符串生成Query对象;QueryExecution,提供查询执行的方法;ResultSet,包含从执行的查询中获得的结果;和QuerySolution,代表一行查询结果。如果该查询有多个答案,将返回一个包含QuerySolutionsResultSet

要从 Jena 查询 DBpedia,您可以使用QueryFactoryQueryExecutionFactory. QueryFactory has create()方法来读取文本查询并返回一个带有解析查询的Query对象。QueryExecutionFactory创建一个QueryExecution来以QueryExecutionFactory.sparqlService(String service,Query query)的形式通过 HTTP 访问 SPARQL 服务,其中service是一个表示 SPARQL 服务的字符串。您可以创建一个到 DBpedia 的 SPARQL 服务的测试连接,如清单 9-6 所示。

Listing 9-6. Test Connection to DBpedia’s SPARQL Endpoint

import com.hp.hpl.jena.query.QueryExecution;

import com.hp.hpl.jena.query.QueryExecutionFactory;

import com.hp.hpl.jena.sparql.engine.http.QueryExceptionHTTP;

public class QueryTest {

public static void main(String[] args) {

String service = "http://dbpedia.org/sparql";

String query = "ASK { }";

QueryExecution qe = QueryExecutionFactory.sparqlService(service, query);

try {

if (qe.execAsk()) {

System.out.println(service + " is UP");

}

} catch (QueryExceptionHTTP e) {

System.out.println(service + " is DOWN");

} finally {

qe.close();

}

}

}

如您所见,service字符串包含 DBpedia 的 SPARQL 端点。现在,运行一个查询来检索出生在艾森纳赫的人。为了实现这一点,您需要一个SELECT SPARQL 查询来搜索 person 对象中的dbo:birthPlace: Eisenach,如清单 9-7 所示。

Listing 9-7. A SPARQL Query to Run on DBpedia from Jena

String service="http://dbpedia.org/sparql";

String query="PREFIX dbo:<http://dbpedia.org/ontology/>"

+ "PREFIX : <http://dbpedia.org/resource/>"

+ "PREFIX foaf:<http://xmlns.com/foaf/0.1/>"

+ "select ?person ?name where {?person dbo:birthPlace : Eisenach."

+ "?person foaf:name ?name}";

QueryExecution qe=QueryExecutionFactory.sparqlService(service, query);

ResultSet rs=qe.execSelect();

while (rs.hasNext()){

QuerySolution s=rs.nextSolution();

Resource r=s.getResource("?person");

Literal name=s.getLiteral("?name");

System.out.println(s.getResource("?person").toString());

System.out.println(s.getLiteral("?name").getString());

}

结果应该包含出生在埃森纳赫的人,如约翰·塞巴斯蒂安·巴赫。

摘要

在这一章中,你分析了四个复杂的语义网例子。您了解了如何将关系数据库表映射到 RDF,如何用 OWL-S 描述流程,如何在 WSMO 建模语义 Web 服务,以及如何从 Apache Jena 以编程方式查询 LOD 数据集。

通过阅读这本书,你现在理解了基于图论和知识表示的核心语义网概念和数学背景。您了解了如何使用来自 Schema.org、DBpedia、GeoNames 和 Wikidata 的机器可读元数据来注释您的网站标记,以提高网站在搜索引擎结果页面上的性能。现在,你可以使用基于 vCard 的 hCard、Schema.org FOAF 和 DBpedia 编写高级的机器可读的个人描述。您已经了解了如何发布带有语义的组织数据,以覆盖更广泛的受众,包括针对您的公司、产品、服务和事件的 HTML5 微数据或 JSON-LD 注释,供 Google 考虑包含在知识图中。您知道如何将结构化数据序列化为 HTML5 微数据、RDF/XML、Turtle、Notation3 和 JSON-LD,以及如何用 RDFS 和 OWL 创建机器可读的词汇和本体。您已经学会了为开放数据和开放知识计划做出贡献,并且知道如何发布自己的 LOD 数据集。您知道如何为语义 Web 应用开发设置编程环境,并使用流行的 API 和软件库(如 Apache Jena 和 Sesame)用 Java、Ruby 和 JavaScript 编写程序。您还学习了如何在 triplestores 和 quadstores 中存储和操作数据,并熟悉了最流行的图数据库,如 AllegroGraph 和 Neo4j。你能够用 OWL-S、WSDL、WSML 和 WS-BPEL 来描述和建模语义 Web 服务。您可以在大型 LOD 数据集上运行复杂的 SPARQL 查询,如 DBpedia 和 Wikidata,甚至可以使用您自己的易于访问的 OpenLink Virtuoso、Fuseki 或 4store SPARQL 端点来鼓励数据重用。最后,您了解了利用语义网技术的大数据应用,如谷歌知识库、脸书社交图、IBM Watson 和世界上最大图书馆的链接数据服务。

参考

Das, S., Sundara, S., Cyganiak, R. (eds.) (2012) R2RML Processors and Mapping Documents. In: R2RML: RDB to RDF Mapping Language. www.w3.org/TR/r2rml/#dfn-r2rml-mapping. Accessed 1 May 2015.   Arenas, A., Bertails, A., Prud’hommeaux, E., Sequeda, J. (eds.) (2012) Direct Mapping of Relational Data to RDF. www.w3.org/TR/rdb-direct-mapping/ . Accessed 1 May 2015.   Antidot (2015) db2triples. https://github.com/antidot/db2triples . Accessed 1 May 2015.   OpenLink Software (2015) Virtuoso Universal Server. http://virtuoso.openlinksw.com . Accessed 1 May 2015.   Inkster, T. (2015) RDF-RDB2RDF—map relational database to RDF declaratively. https://metacpan.org/release/RDF-RDB2RDF . Accessed 1 May 2015.   Calbimonte, J.-P. (2015) morph. https://github.com/jpcik/morph . Accessed 1 May 2015.   Capsenta (2015) Ultrawrap. http://capsenta.com . Accessed 1 May 2015.   Martin, D. et al. (2004) Service Profiles. In: OWL-S: Semantic Markup for Web Services. www.w3.org/Submission/OWL-S/ . Accessed 1 May 2015.   Footnotes 1

或者,也可以使用rr:subject常量快捷方式属性。