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

原文:Mastering Structured Data on the Semantic Web

协议:CC BY-NC-SA 4.0

四、语义化 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 )。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 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 会重新生成浏览器预览和图形。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 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 )。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 4-3。

RDFa to Turtle conversion in RDF Distiller

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

DBpedia 聚焦

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

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 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 )。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 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 程序中访问。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 4-6。

Protégé’s command line

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

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 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é会显示片段标识符,以及子类/超类(如果有)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 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 )。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 4-9。

Ontology editing with TopBraid Composer Maestro

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

阿帕哈奇·斯坦布尔

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

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

它包括一个内容管理系统,支持语义 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 对象的访问,比如本体和类表达式。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 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 ]编写的结构化数据的存储、检索和分析。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

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 ]。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

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).

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 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).

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 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).

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 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/ 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

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).

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 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).

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 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, 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

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 )。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 4-16。

Using Sesame to store and retrieve RDF triples

开发工具

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

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

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 )。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 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 )。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 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)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

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 )。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 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 输出中。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 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 数据浏览器(ODE)

OpenLink Data Explorer (ODE,最初是 OpenLink RDF Browser)是一个利用结构化数据的浏览器扩展。ODE 在标准视图菜单中增加了两个选项,都在主菜单和上下文菜单中(见图 4-21 )。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 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 )。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 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 图上,当大量“事物”通过相同的属性联系在一起时,您可以看到聚类。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 4-23。

An RDF graph in IsaViz

RelFinder

RelFinder (Relationship Finder)可以用来可视化、过滤和分析对象之间的大量关系。它适用于知识表示和知识发现。RelFinder 提供了对数据集的标准 SPARQL 访问。在 http://www.visualdataweb.org/relfinder/relfinder.php 有在线版本,可以根据选择的对象及其关系生成有向图(见图 4-24 )。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 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 )。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 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 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

xmlns="http://www.w3.org/ns/wsdl"

xmlns:tns="http://www.example.com/wsdl" 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

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 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

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" 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

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" 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

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" 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

address="http://www.example.com/rest/"/>

<endpoint name="SoapEndpoint" binding="tns:SoapBinding" 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

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" 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

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 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

targetNamespace="http://www.example.com/wsdl/order#" 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

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#" 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

elementFormDefault="qualified">

<xs:element name="OrderRequest" 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

sawsdl:modelReference="http://example.com/purchaseorder#OrderRequest" 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

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" 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

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 )。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 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 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

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 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

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 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

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 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

?d[amount hasValue ?a, units hasValue ?u] and ((?u="Kilometers" and ?y=?a) or 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(?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 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

?d[amount hasValue ?a, units hasValue ?u] and ((?u="Miles" and ?y=?a) or 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(?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 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(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 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 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 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

help you establish a baseline AllegroGraph configuration.

You will be prompted for a few settings.  In most cases, you can hit 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

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 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 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).

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 6-4。

Neo4j started

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 6-3。

Neo4j ready to be started

左侧 Neo4j web 界面的侧边栏提供了对有关当前 Neo4j 数据库(节点标签、关系类型以及数据库位置和大小)、保存的脚本(参见图 6-5 )的信息以及诸如文档、指南、示例图应用、参考以及 Neo4j 社区资源等信息的方便的可点击访问。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 6-5。

The web interface of Neo4j

Neo4j web 界面在顶层提供命令编辑和执行(从$ :开始),包括使用 Neo4j 的查询语言 Cypher 进行查询。如果您编写复杂的查询或命令,或者您希望经常使用的命令,您可以保存它们以供将来使用。默认情况下,命令编辑器是一个单行编辑器,仅适用于短查询或命令。如果需要更多的空间,可以用 Shift+Enter 切换到多行编辑,这样就可以编写跨越多行的命令,或者编写多个命令,而不用逐个执行(见图 6-6 )。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 6-6。

Writing Cypher commands

在多行编辑中,可以使用 Ctrl+Enter 运行查询。使用命令历史可以很容易地检索以前使用的命令。在命令行编辑器中,您也可以使用客户端命令,比如打开 Neo4j 帮助的:help。浏览器窗口的主要部分显示内容、查询答案等。,具体取决于您使用的命令。每个命令的执行都会产生一个结果框架(子窗口),它被添加到流的顶部,以创建一个按时间倒序排列的可滚动集合。每个子窗口都可以最大化为全屏,或者通过鼠标悬停在子窗口右上角的两个图标来关闭。类似的子窗口也用于数据可视化。可以使用:clear命令清除该流。

Neo4j 的 web 界面提供了高级可视化选项。节点和关系可以用您选择的颜色显示标识符或标签。通过 CSS 样式表可以任意改变图形可视化的颜色、线宽、字体大小和气泡大小,如图 6-7 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 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).

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 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).

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 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 => 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

’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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值