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

原文:Mastering Structured Data on the Semantic Web

协议:CC BY-NC-SA 4.0

七、查询

虽然机器可读数据集主要是为软件代理发布的,但自动数据提取并不总是一个选项。语义信息检索通常涉及用户基于数据集或数据库中正式表示的知识来搜索复杂问题的答案。虽然结构化查询语言(SQL)用于查询关系数据库,但查询图数据库和平面资源描述框架(RDF)文件可以使用 SPARQL 协议和 RDF 查询语言(SPARQL)来完成,SPARQL 是 RDF 的主要查询语言,比 SQL 强大得多。SPARQL 是一种标准化语言,能够查询本地和在线 RDF 文件、链接开放数据(LOD)数据集和图数据库;基于查询的图中的信息构建新的 RDF 图;向图中添加新的 RDF 语句或从图中删除三元组;推断逻辑结果;和跨不同储存库的联合查询。SPARQL 可以一次查询多个数据源,将较小的图动态合并成一个大的超级图。虽然图数据库通常有专有的查询语言(通常基于或扩展 SPARQL),但大多数公开可用的数据集都有一个 SPARQL 端点,您可以从该端点运行 SPARQL 查询。对于开发人员来说,许多语义 Web 软件工具都提供了 SPARQL 应用编程接口(API)用于编程访问。

SPARQL:RDF 的查询语言

如前所述,RDF 的主要查询语言是 SPARQL(读作“sparkle”,SPARQL 协议和 RDF 查询语言的递归首字母缩写),它可用于检索和操作存储在 RDF 中的信息,或以 RDF [1 ]格式检索的信息。输出可以是结果集或 RDF 图。

结构和语法

SPARQL 使用类似 Notation3 的语法。URIs 可以完整地写在小于(<)和大于(>)字符之间(参见清单 7-1 ),或者使用带有PREFIX关键字的名称空间机制进行缩写(参见清单 7-2 )。

Listing 7-1. Full URI Syntax in SPARQL

<http://example.com>

Listing 7-2. Using the Namespace Mechanism in SPARQL

PREFIX schema: <http://schema.org/

在声明了 Schema.org 命名空间( http://schema.org/ )后,例如 http://schema.org/Person 可以缩写为schema:Person。SPARQL 查询的默认名称空间可以通过使用不带前缀的PREFIX指令来设置(例如PREFIX : < http://yourdefaultnamespace.com/ >),这样就可以在查询中使用空前缀,比如as ?a :knows ?b。与 N3 类似,URI http://www.w3.org/1999/02/22-rdf-syntax-ns#typerdf:type可缩写为a。文字可以用或不用语言标记和类型来编写。普通字符串由引号分隔,如"a plain literal",而包括语言标签的普通字符串以@符号和标准语言代码结尾,如"Wagen"@de(德语中的单词 car)。类型化文字的编写类似于 RDF 中的类型化文字,例如,"55"^^xsd:integer (55 是一个整数,而不是字符串中两个无意义的字符)。常用的类型文字可以缩写成"true"^^xsd:boolean对应于true,而整数和小数分别被自动假定为xsd:integerxsd:decimal类型。因此,"5"^^xsd:integer可以缩写为5,而"13.1"^^xsd:decimal可以写成13.1

每个 SPARQL 查询都有一个头和一个体。SPARQL 查询的头是一个表达式,用于构造查询的答案。针对 RDF 图的查询评估是通过检查主体是否与图匹配来执行的,这导致主体中变量的一组绑定。使用关系操作符(如 projection 和 distinction)处理这些绑定,以生成查询的输出。主体可以是简单的三元模式表达式,也可以是包含三元模式的复杂 RDF 图模式表达式,比如主谓宾 RDF 三元组,其中每个主、谓或宾都可以是一个变量。主体还可以包含合取、析取、可选部分和变量值约束(见图 7-1 )。

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

图 7-1。

The structure of SPARQL queries

BASE指令、名称空间声明(PREFIX)、数据集声明(FROMFROM NAMED)和查询修饰符(GROUP BYHAVINGORDER BYLIMITOFFSETBINDINGS)是可选的。指令和前缀列表用于缩写 URIs。BASE关键字定义了基本 URI,查询中的所有相对 URIs 都是根据它进行解析的。前缀列表可以包含任意数量的PREFIX语句。分号前面的前缀缩写pref代表前缀 URI,可以在整个 SPARQL 查询中使用,这样就不必重复长 URIs(标准名称空间机制)。FROM子句指定要搜索的默认图形。FROM NAMED子句可用于指定要查询的命名图。在某些情况下,例如,当用于查询的 SPARQL 端点专用于要从中检索数据的 LOD 数据集时,FROM子句是可选的,可以安全地省略。WHERE子句指定了用于提取期望结果的模式。查询修饰符,如ORDER BYLIMIT,如果存在,位于查询的最后部分。

SPARQL 1.0 和 SPARQL 1.1

SPARQL 的第一个版本 SPARQL 1.0 发布于 2008 年 [2 ]。SPARQL 1.0 引入了 SPARQL 语法、SPARQL 查询语法、RDF 术语约束、图模式、解决方案序列和解决方案修饰符,以及四种核心查询类型(SELECTCONSTRUCTASKDESCRIBE)。SPARQL 1.0 已经通过 SPARQL 1.1 [3 ]中的新特性进行了显著扩展。

例如,SPARQL 1.1 支持聚合。要执行聚合,首先必须根据GROUP BY子句中的表达式将结果分成不同的组。然后,评估SELECT子句中的投影和聚合函数,以获得每组一个结果。最后,必须在一个HAVING子句中过滤汇总的结果。

SPARQL 1.1 更新语言支持图形更新操作(INSERT DATADELETE DATADELETE/INSERTLOADCLEAR)和图形管理操作(CREATEDROPCOPYMOVEADD ) [4 )。INSERT DATA操作将请求中内联写入的一些三元组添加到 graphstore 中。如果 graphstore 中的各个图包含 RDF 三元组,则使用DELETE DATA操作来移除 RDF 三元组。根据在WHERE子句中指定的查询模式的绑定,DELETE/INSERT操作可用于从 graphstore 中删除三元组或向其添加三元组。LOAD操作从国际化资源标识符(IRI)中读取一个 RDF 文档,并将其三元组插入 graphstore 中的指定图中。CLEAR操作删除 graphstore 中指定图形中的所有三元组。CREATE操作在 graphstore 中创建新图。DROP操作删除图形及其所有内容。COPY操作修改一个图形以包含另一个图形的副本。换句话说,它将输入图中的所有数据插入到目标图中。MOVE操作将所有数据从一个图形移动到另一个图形。ADD操作将一个图形的所有数据复制到另一个图形中。还可以通过一种称为 SPARQL 1.1 统一 HTTP 协议 [5 ]的协议来更新 RDF 图。

SPARQL 1.1 服务描述规范 [6 ]提供了一种发现 SPARQL 服务信息的方法,比如支持的扩展功能和默认数据集的细节。它还有一个描述 SPARQL 服务的词汇表,这个词汇表有名称空间 IRI http://www.w3.org/ns/sparql-service-description#和前缀sd。在语义 Web 应用中,并不总是能够显式地编写用于图模式匹配的图结构,这就是为什么 SPARQL 1.1 定义了语义蕴涵关系,称为蕴涵机制 [7 ]。这些标准的语义蕴涵关系可以用在依赖于从显式给出的断言中推断出的 RDF 语句的应用中,以便使用语义蕴涵关系而不是显式给出的图结构来执行图模式匹配。SPARQL 1.1 支持查询输出的其他序列化格式,包括 JSON [8 ]、CSV 和 TSV [9 ],超出了 SPARQL 1.0 支持的格式,如 XML [10 。除了 SPARQL 1.0 中引入的四种核心 SPARQL 查询类型之外,SPARQL 1.1 还支持推理查询和联邦查询,您将在下一节中看到。

查询类型

可选的名称空间声明后跟查询。SPARQL 中的四种核心查询类型是SELECTASKCONSTRUCTDESCRIBE查询。SELECT查询为匹配查询模式的变量提供了一个值选择。是/否查询(ASK查询)提供一个布尔值。查询从上述值以及资源描述中创建新的 RDF 数据。DESCRIBE查询返回包含匹配资源的新 RDF 图。最常用的 SPARQL 查询是SELECT查询。

除了基本的查询类型,SPARQL 1.1 还支持通过REASON查询进行推理,并使用SERVICE关键字 [11 ]执行分布在不同 SPARQL 端点上的查询(联邦查询)。

模式匹配

查询输出结果子句后面是模式匹配。SPARQL 查询中可以使用两种不同的模式类型:三元模式和图形模式。SPARQL 三元组模式类似于 RDF 的主谓宾三元组,但是它们也可以包含变量。这使得从 RDF 图中选择符合模式中描述的标准的 RDF 三元组成为可能。任何或所有的主语、谓语或宾语值都可以是变量,它们都由字符串前面的问号 1 标识,如?name。为了精确匹配 RDF 三元组,您必须编写主谓宾名称,后跟一个.,如清单 7-3 所示。

Listing 7-3. Exact RDF Triple Matching in SPARQL

ex:Person schema:familyName "Sikos" .

为了匹配一个变量,你必须用一个变量替换适当的三元组(主语、谓语或宾语)(见清单 7-4 )。

Listing 7-4. Matching One Variable in SPARQL

?person schema:familyName "Sikos" .

变量不限于三元组模式的任何部分。您可以用变量替换任何三元组(主语、谓语或宾语)(参见清单 7-5 )。

Listing 7-5. Matching Multiple Variables in SPARQL

?person schema:familyName ?name .

甚至所有组件都可以是变量。例如,三元组模式?subject ?object ?name将匹配 RDF 图中的所有三元组。有时候,需要的选择规则比你用一个三元组模式所能表达的要复杂得多。三重模式的集合被称为图形模式,由花括号界定(参见清单 7-6 )。

Listing 7-6. A Graph Pattern in SPARQL

{

?who schema:name ?name.

?who iswc:research_topic ?research_topic.

?who foaf:knows ?others.

}

图形模式可用于匹配可选部分、创建模式的联合、嵌套、过滤可能匹配的值,以及选择模式匹配的数据源。因此,一个图形模式将会找到所有的资源,所有的期望属性都写在模式中。图形模式使得编写复杂的查询成为可能,因为在多个三元模式中使用同一个变量的情况下,每个返回的资源都可以替换到变量的所有出现处。这导致了传统 Web 所不知道的真正复杂的选择,因此除了一些基本的操作符,如 AND、OR 或 XOR,您不能在搜索中使用多重过滤。但是 SPARQL 也支持过滤函数,包括逻辑运算(!&&||=!=<<=>>=)和数学运算(+-*/,以及比较运算(=!=><)。SPARQL 具有用于检查 web 地址、空白图节点、文字和边界(isURIisBlankisLiteralbound)、诸如strdatatypelang之类的访问器(参见清单 7-7 )以及诸如sameTermlangMatchesregex之类的其他函数的内置测试,用于检查相同的术语、语言匹配和编写正则表达式。

Listing 7-7. Language Checking in SPARQL

lang(?title)="en"

除了 SPARQL 1.0 的操作符和函数之外,SPARQL 1.1 还支持存在检查函数(EXISTSNOT EXISTS),这两个函数都可以用作图形模式的一部分(比如在清单 7-8 中,查找没有电子邮件地址的人)以及用于FILTER表达式中。

Listing 7-8. Existence Checking in a Graph Pattern

SELECT ?person

WHERE

{

?person rdf:type foaf:Person .

NOT EXISTS { ?person foaf:mbox ?email }

}

SPARQL 1.1 还具有额外的功能,如COUNTSUMAVGMINMAXSAMPLEGROUP_CONCAT。此外,SPARQL 1.1 支持属性路径,允许三元模式匹配图中任意长度的路径。谓词与类似于正则表达式的操作符组合在一起(见表 7-1 )。

表 7-1。

Property Path Constructs in SPARQL 1.1

| 建造 | 意义 | | --- | --- | | `path1/path2` | 正向路径(`path1`后跟`path2`) | | `^path1` | 反向路径(对象到主题) | | `path1|path2` | `path1`或`path2` | | `path1*` | `path1`,重复零次或多次 | | `path1+` | `path1`,重复一次或多次 | | `path1?` | `path1`,可选 | | `path1{m,n}` | 至少`m`次,不超过`n`次`path1` | | `path1{n}` | `path1`的确切发生次数`n` | | `path1{m,}` | 至少出现`path1`次`m` | | `path1{,n}` | 最多出现`path1`次`n` |

溶液改性剂

SPARQL 查询的最后一个可选部分是解决方案修饰符。一旦计算出模式的输出(以变量值表的形式),解决方案修饰符允许您修改这些值,应用标准的经典操作符,如 projection、【2】DISTINCT(删除重复项)、ORDER(排序机制)和LIMIT(设置返回结果的最大数量)。

选择查询

最常见的 SPARQL 查询是SELECT查询。SELECT子句指定 SPARQL 查询返回的数据项(变量绑定)。即使 LOD 数据集可能包含数千甚至数百万个 RDF 三元组,您也可以选择那些符合您的标准的项目。例如,从一个作家的数据集中,你可以列出那些生活在 20 世纪的作家或者是美国人。SPARQL 支持小丑字符,因此您可以使用SELECT *选择查询中提到的所有变量。如果你想消除潜在的重复,在SELECT后面使用DISTINCT关键字,比如SELECT DISTINCT ?var. SELECT查询经常被用来通过特定的变量和表达式提取三元组。例如,假设我们需要一个查询来提取使用foaf:name声明的某人的 FOAF 文件中提到的所有名字。名称空间的缩写需要一个PREFIX声明。该查询是一个SELECT查询,它使用一个变量作为名称(?name),并使用一个具有三元模式的WHERE子句来查找与foaf:name谓词链接的所有主语(?person)和宾语(?name)(参见清单 7-9 )。

Listing 7-9. A SELECT Query to Find Subjects and Objects Linked with a Declared Predicate

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

SELECT ?name

WHERE {

?person foaf:name ?name .

}

如果我们需要 FOAF 文件中指定了电子邮件地址的所有人,我们必须声明两个谓词,一个用于名称(foaf:name),另一个用于电子邮件地址(foaf:mbox),而所有的主语(?person)和宾语(?name?email)都是变量(参见清单 7-10 )。

Listing 7-10. A SELECT Query to Find Subjects and Objects Linked with Two Different Predicates

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

SELECT ?name ?email

WHERE {

?person foaf:name ?name .

?person foaf:mbox ?email .

}

输出将包含所有的姓名和电子邮件地址。

Note

如果用Schema.org/Person描述人物,可以用givenNamefamilyName属性表示姓名,用email属性表示电子邮件地址,而名称空间必须修改为 http://schema.org/

SELECT查询的结果通常显示为一个值表(HTML、XML 或 JSON 格式)。

过滤

如果我们必须从 DBpedia 中提取所有人口超过 500 万的内陆国家,我们需要在WHERE子句中使用FILTER关键字(参见清单 7-11 )。

Listing 7-11. A SELECT Query with a Filter to Extract All Landlocked Countries from DBpedia with More Than 5 Million Inhabitants

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

PREFIX type: <http://dbpedia.org/class/yago/

PREFIX prop: <http://dbpedia.org/property/

SELECT ?country_name ?population

WHERE {

?country a type:LandlockedCountries ;

rdfs:label ?country_name ;

prop:populationEstimate ?population .

FILTER (?population > 5000000) .

}

所提供的布尔条件将过滤掉不需要的查询结果,在本例中,过滤掉所有人口少于 500 万的内陆国家。

Note

前面的例子使用了快捷方式;来分隔共享相同主题?country的三元组模式。

询问问题

如果您需要一个是/否问题的答案,可以使用 SPARQL 中的 ASK 查询。例如,您可以查询 DBpedia 来找出亚马逊河是否比尼罗河长(参见清单 7-12 )。

Listing 7-12. An ASK Query in SPARQL

PREFIX prop: <http://dbpedia.org/property/

ASK

{

<http://dbpedia.org/resource/Amazon_River

<http://dbpedia.org/resource/Nile

FILTER(?amazon > ?nile) .

}

ASK查询的结果不是true就是false。在我们的例子中,输出是true

构造查询

SPARQL 不仅可以用于从数据集中检索信息,还可以创建新的图,或者通过添加新的三元组来重塑现有的 RDF 图。这种查询称为CONSTRUCT查询。假设您想通过添加祖母来扩展您的家谱描述。为此,你必须确定其他家庭成员的性别和亲子关系(见清单 7-13 )。

Listing 7-13. Preparing a CONSTRUCT Query

:Ben   :hasParent  :Christina ;

:gender     :male .

:Luke  :hasParent  :Linda ;

:gender     :male .

:Christina :hasParent :Anna ;

:gender    :female .

:Linda :hasParent :Anna ;

:gender    :female .

:Anna  :gender    :female .

下一步是运行一个CONSTRUCT查询来基于前面的创建新的三元组,以指定谁是谁的祖母(参见清单 7-14 )。

Listing 7-14. A CONSTRUCT Query

PREFIX : <http://samplefamilytreeonto.com/

CONSTRUCT { ?p :hasGrandmother ?g . }

WHERE {?p      :hasParent ?parent .

?parent :hasParent ?g .

?g      :gender    :female .}

新构造的三元组描述了两个孙子和他们的祖母之间的关系(参见清单 7-15 )。

Listing 7-15. A CONSTRUCT Query Generates New Triples

:Ben

:hasGrandmother  :Anna .

:Luke

:hasGrandmother  :Anna .

描述查询

DESCRIBE查询描述了给定变量匹配的资源。例如,如果您在国家数据集上运行一个DESCRIBE查询(参见清单 7-16 ,输出将是与被查询国家相关的所有三元组(参见清单 7-17 )。

Listing 7-16. A DESCRIBE Query

DESCRIBE ?country

Listing 7-17. The Output of a DESCRIBE Query

ex:Hungary a geo:Country;

ex:continent geo:Europe;

ex:flag <http://yourwebsite.com/img/flag-hun.png

联邦查询

在 SPARQL 1.1 中,查询可以在查询执行期间在另一个 SPARQL 端点上发出查询。这些查询称为联邦查询,其中远程 SPARQL 端点由关键字SERVICE声明,该关键字将查询的相应部分发送到远程 SPARQL 端点。例如,如果远程 SPARQL 端点是 DBpedia 的端点,那么可以编写一个联邦查询,如清单 7-18 所示。

Listing 7-18. A Federated Query in SPARQL 1.1

SELECT DISTINCT ?person

WHERE {

SERVICE <http://dbpedia.org/sparql> { ?person a <http://schema.org/Person

} LIMIT 10

清单 7-19 显示了该查询的一个示例输出,从 DBpedia 中识别了十个人。

Listing 7-19. Federated Query Result Example

---------------------------------------------------------

| person                                                |

=========================================================

| <http://dbpedia.org/resource/%C3%81ngel_Gim%C3%A9nez

| <http://dbpedia.org/resource/Aaron_Lines

| <http://dbpedia.org/resource/Abel_Lafleur

| <http://dbpedia.org/resource/Ada_Maimon

| <http://dbpedia.org/resource/Adam_Krikorian

| <http://dbpedia.org/resource/Albert_Constable

| <[http://dbpedia.org/resource/Alex_Reid_(actress](http://dbpedia.org/resource/Alex_Reid_(actress)

| <[http://dbpedia.org/resource/Alex_Reid_(art_dealer](http://dbpedia.org/resource/Alex_Reid_(art_dealer)

| <[http://dbpedia.org/resource/Alex_Reid_(fighter](http://dbpedia.org/resource/Alex_Reid_(fighter)

| <[http://dbpedia.org/resource/Alex_Reid_(footballer](http://dbpedia.org/resource/Alex_Reid_(footballer)

---------------------------------------------------------

原因查询

在 SPARQL 1.1 中,推理可以通过执行一个带有REASON关键字的 SPARQL 查询来执行,后面是一个本体或声明性语言中的规则集(声明为一个 URL,指向一个由<>或花括号之间的内联 N3 规则限定的规则),以及一个OVER和一个WHERE子句的组合来定义用于推理的三元组。

例如,要列出来自两个不同数据集的 Leslie Sikos 的所有熟人,您可以编写一个带推理的联邦查询,如清单 7-20 所示,而不管 Leslie Sikos 是否将他们列为熟人,或者其他人是否声明他们认识他。

Listing 7-20. Find Acquaintances Regardless of the Relationship Direction

REASON {

{ ?x foaf:knows ?y } => { ?y foaf:knows ?x }

}

OVER {

:LeslieSikos foaf:knows ?person .

}

WHERE {

{

SERVICE <http://examplegraph1.com/sparql

} UNION {

SERVICE <http://examplegraph2.com/sparql

}

}

SPARQL 查询的 URL 编码

为了给自动化流程提供进行 SPARQL 查询的选项,SPARQL 可以通过 HTTP 使用,使用 SPARQL 协议(在 SPARQL 中缩写为 P)。SPARQL 端点可以处理带有 HTTP GETPOST请求参数的 SPARQL 查询。该查询是 URL 编码的,以转义特殊字符并创建查询字符串作为query变量的值。这些参数在标准化的 SPARQL 协议 [12 中定义。例如,看一下清单 7-21 中所示的默认 DBpedia SPARQL 端点( http://dbpedia.org/sparql/ )查询。

Listing 7-21. A URL-Encoded SPARQL Query

http://dbpedia.org/sparql?default-graph-uri=http%3A%2F%2Fdbpedia.org&query=select+distinct+%3FConcept+where+{[]+a+%3FConcept}+LIMIT+100&format=text%2Fhtml&timeout=30000&debug=on

Note

第二个参数(default-graph-uri)是 DBpedia 的专有实现,它扩展了标准的 URL 编码的 SPARQL 查询。

图表更新操作

在 SPARQL 1.1 中,可以使用INSERT DATA操作将新的 RDF 三元组添加到图中。如果目标图不存在,则创建目标图。举个例子,假设有两个关于一本书的 RDF 陈述,分别是图表、标题和格式(参见清单 7-22 )。

Listing 7-22. Data Before the INSERT DATA Operation

@prefix dc: <http://purl.org/dc/elements/1.1/

@prefix schema: <http://schema.org/

<http://www.lesliesikos.com/mastering-structured-data-on-the-semantic-web/> dc:title

"Mastering Structured Data on the Semantic Web" .

<http://www.lesliesikos.com/mastering-structured-data-on-the-semantic-web/>

schema:bookFormat schema:Paperback .

要向这个关于作者和书写该书的语言的图中添加两个新的三元组,可以使用INSERT DATA操作,如清单 7-23 所示。因为两个三元组的主题是相同的,所以在分号分隔的列表中只需声明一次。

Listing 7-23. Adding New Triples to a Graph, Using the INSERT DATA Operation

PREFIX dc: <http://purl.org/dc/elements/1.1/

PREFIX schema: <http://schema.org/

INSERT DATA

{

<http://www.lesliesikos.com/mastering-structured-data-on-the-semantic-web/> dc:creator

"Leslie Sikos" ;

schema:inLanguage "English" .

}

结果,这个图将包含关于这本书的四个三元组,如清单 7-24 所示。

Listing 7-24. Data After the INSERT DATA Operation

@prefix dc: <http://purl.org/dc/elements/1.1/

@prefix schema: <http://schema.org/

<http://www.lesliesikos.com/mastering-structured-data-on-the-semantic-web/> dc:title

"Mastering Structured Data on the Semantic Web" .

<http://www.lesliesikos.com/mastering-structured-data-on-the-semantic-web/>

schema:bookFormat schema:Paperback .

<http://www.lesliesikos.com/mastering-structured-data-on-the-semantic-web/> dc:creator

"Leslie Sikos" .

<http://www.lesliesikos.com/mastering-structured-data-on-the-semantic-web/> dc:inLanguage

"English" .

SPARQL 1.1 还支持使用DELETE DATA操作移除 RDF 三元组。例如,要从清单 7-24 中删除书籍的格式和语言,您声明前缀,使用DELETE DATA操作,并列出要删除的语句(参见清单 7-25 )。

Listing 7-25. Removing Triples from a Graph, Using the DELETE DATA Operation

PREFIX schema: <http://schema.org/

PREFIX dc: <http://purl.org/dc/elements/1.1/

DELETE DATA

{

<http://www.lesliesikos.com/mastering-structured-data-on-the-semantic-web/>

schema:bookFormat schema:Paperback ; dc:inLanguage "English" .

}

图表管理操作

在 SPARQL 1.1 中,可以使用COPY操作将 RDF 语句从默认图复制到命名图。例如,假设我们有清单 7-26 中所示的三元组。

Listing 7-26. Data Before Copying

# Default Graph

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

<http://examplegraph.com/Leslie> a foaf:Person .

<http://examplegraph.com/Leslie> foaf:givenName "Leslie" .

<http://examplegraph.com/Leslie> foaf:mbox  <mailto:leslie@examplegraph.com> .

# Graph http://examplenamedgraph.com

<http://examplenamedgraph.com/Christina> a foaf:Person .

<http://examplenamedgraph.com/Christina> foaf:givenName "Christina" .

默认图的所有三元组都可以通过COPY操作复制到命名图,如清单 7-27 所示。

Listing 7-27. A COPY DEFAULT TO Operation SPARQL 1.1

COPY DEFAULT TO <http:/examplenamedgraph.com>

COPY DEFAULT TO操作的结果如清单 7-28 所示。

Listing 7-28. Data After the COPY DEFAULT TO Operation

# Default Graph

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

<http://examplegraph.com/Leslie> a foaf:Person .

<http://examplegraph.com/Leslie> foaf:givenName "Leslie" .

<http://examplegraph.com/Leslie> foaf:mbox  <mailto:leslie@examplegraph.com> .

# Graph http://examplenamedgraph.com

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

<http://examplegraph.com/Leslie> a foaf:Person .

<http://examplegraph.com/Leslie> foaf:givenName "Leslie" .

<http://examplegraph.com/Leslie

Note

命名图的原始内容因COPY操作而丢失。

类似地,可以使用MOVE操作将 RDF 语句从默认图移动到命名图。例如,假设您有清单 7-29 中所示的数据。

Listing 7-29. Data Before the MOVE DEFAULT TO Operation

# Default Graph

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

<http://examplegraph.com/Nathan> a foaf:Person .

<http://examplegraph.com/Nathan> foaf:givenName "Nathan" .

<http://examplegraph.com/Nathan> foaf:mbox  <mailto:nathan@examplegraph.com> .

# Graph http://examplenamedgraph.com

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

<http://examplenamedgraph.com/Peter> a foaf:Person .

<http://examplenamedgraph.com/Peter> foaf:givenName "Peter" .

要将所有 RDF 语句从默认图移动到命名图中,可以使用MOVE操作,如清单 7-30 所示。

Listing 7-30. A MOVE DEFAULT TO Operation

MOVE DEFAULT TO http://examplenamedgraph.com

Note

命名图的原始内容因MOVE操作而丢失(见清单 7-31 )。

Listing 7-31. Data After the MOVE DEFAULT TO Operation

# Default Graph

# Graphhttp://examplenamedgraph.com

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

<http://examplegraph.com/Nathan> a foaf:Person .

<http://examplegraph.com/Nathan> foaf:givenName "Nathan" .

<http://examplegraph.com/Nathan> foaf:mbox  <mailto:nathan@examplegraph.com> .

使用ADD操作,RDF 语句可以从输入图插入到目标图。清单 7-32 显示了从默认图添加到命名图的 RDF 三元组示例。

Listing 7-32. Data Before the ADD Operation

# Default graph

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

<http://examplegraph.com/Michael> a foaf:Person .

<http://examplegraph.com/Michael> foaf:givenName "Michael" .

<http://examplegraph.com/Michael> foaf:mbox  <mailto:mike@examplegraph.com> .

# Graph http://examplenamedgraph.com

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

<http://examplenamedgraph.com/Jemma> a foaf:Person .

清单 7-33 中的ADD操作执行该任务。

Listing 7-33. An ADD Operation in SPARQL 1.1

ADD DEFAULT TO <http://examplenamedgraph.com>

结果,默认图形被合并到命名图形中(参见清单 7-34 )。

Listing 7-34. The Result of an ADD Operation

# Default graph

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

<http://examplegraph.com/Michael> a foaf:Person .

<http://examplegraph.com/Michael> foaf:givenName "Michael" .

<http://examplegraph.com/Michael> foaf:mbox  <mailto:mike@examplegraph.com> .

# Graph http://examplenamedgraph.com

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

<http://examplenamedgraph.com/Jemma

<http://examplegraph.com/Michael> a foaf:Person .

<http://examplegraph.com/Michael> foaf:givenName "Michael" .

<http://examplegraph.com/Michael> foaf:mbox <mailto:mike@example> .

专有查询引擎和查询语言

虽然大多数语义 Web 平台和图数据库通过 SPARQL 查询引擎(如 Apache Jena 的 ARQ 或 AllegroGraph 的 sparql-1.1)支持 SPARQL,但一些供应商提供了自己的查询语言。这些查询语言中有许多与 SPARQL 部分兼容或相似,但是除了与它们一起发布的产品之外,它们通常与其他语义 Web 软件产品不兼容。

SeRQL:Sesame RDF 查询语言

Sesame 不仅支持 SPARQL,还支持 SeRQL(读作“circle”),即 Sesame RDF 查询语言 [13 ]。不管您是连接到本地还是远程的 Sesame 存储库,您都可以对一个SesameRepository对象执行 SeRQL 查询,以表格的形式检索结果,并显示值(参见清单 7-35 )。

Listing 7-35. A SeRQL Query, Using the Sesame Repository API

String query = "SELECT * FROM {x} p {y}";

QueryResultsTable resultsTable = myRepository.performTableQuery(QueryLanguage.SERQL, query);

int rowCount = resultsTable.getRowCount();

int columnCount = resultsTable.getColumnCount();

for (int row = 0; row < rowCount; row++) {

for (int column = 0; column < columnCount; column++) {

Value value = resultsTable.getValue(row, column);

if (value != null) {

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

}

else {

System.out.print("null");

}

System.out.print("\t");

}

System.out.println();

}

Note

一些存储库操作需要提升权限,因此您可能需要在获取存储库对象之前登录到SesameService。例如,如果您没有对存储库的读取权限,您将获得一个AccessDeniedException

如果您必须更改存储库中的大量 RDF 三元组,您可以将 Sesame Graph API 与 SeRQL CONSTRUCT查询结合使用。例如,如果我们有一个存储库,它用许多三元组描述了一本书的手稿,并且这本书在存储库的最后一次更新之后已经出版了,那么对于来自出版状态本体(PSO)的PublicationStatus属性,有许多过时的属性值(draft)应该被更改为published。我们不是为每个受影响的三元组手动更改属性值,而是从现有的PublicationStatus语句中派生出新的三元组,将这些语句的对象从draft更改为published(参见清单 7-36 )。

Listing 7-36. Changing Multiple Property Values, Using the Sesame Graph API

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

"CONSTRUCT {X} <http://purl.org/spar/pso/PublicationStatus> {\"published\"} " +

"FROM {X} <http://purl.org/spar/pso/PublicationStatus

现在所有的三元组都用新的属性值更新了;然而,这些三元组是重复的。具有过时属性值的原始三元组必须从图中移除。为此,我们选择所有带有对象draft(旧值)的PublicationStatus三元组,并从存储库中移除这些三元组(参见清单 7-37 )。

Listing 7-37. Removing All Triples with the Obsolete Property Value

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

"CONSTRUCT * " + "FROM {X} <http://purl.org/spar/pso/PublicationStatus

Note

只有当 SeRQL 不支持更新操作时,才需要这种变通方法。更新 Sesame 存储库的另一个选择是使用 SAIL API。

CQL: Neo4j 的查询语言

Neo4j 有一种专有的查询语言,称为 Cypher Query Language (CQL),这是一种声明式模式匹配语言,具有类似 SQL 的、非常简单的、人类可读的语法 [14 ]。最常用的 Neo4j CQL 命令和子句是CREATE(创建节点、关系和属性)MATCH(检索关于节点、关系和属性的数据)RETURN(返回查询结果)WHERE(提供过滤检索数据的条件)DELETE(删除节点和关系)REMOVE(删除节点和关系的属性)ORDER BY(对检索数据进行排序)SET(添加或更新标签)。最常用的 Neo4j CQL 函数是String(处理字符串文字)、Aggregation(对 CQL 查询结果执行一些聚合操作)和Relationship(获取startnodeendnode等关系的细节)。Neo4j CQL 的数据类型类似于 Java 编程语言。数据类型用于定义节点和关系的属性,如booleanbyteshortintlongfloatdoublecharstring

MATCH命令通过节点名和节点标签识别节点。MATCH命令期望节点名和标签名作为用冒号分隔的花括号中的参数(参见清单 7-38 )。

Listing 7-38. MATCH Command Syntax

MATCH

(

node-name:label-name

)

在 CQL 中,RETURN子句与MATCH命令一起使用,从 Neo4j 图数据库中检索关于节点、关系和属性的数据。RETURN子句可以检索节点的部分或全部属性,并检索节点的部分或全部属性以及关联关系。RETURN子句的参数是节点名和属性名(参见清单 7-39 )。

Listing 7-39. RETURN Clause Syntax

RETURN

node-name.property1-name, … node-name. propertyn-name

例如,要检索代表大学院系的Fac节点的所有属性数据,可以将MATCH命令与RETURN子句结合起来,如清单 7-40 所示。

Listing 7-40. Retrieving All Faculty Data

MATCH (fac: Fac)

RETURN fac.facno,fac.fname,fac.location

该命令返回的行数将与数据库中存储的大学院系数相同。

与 SPARQL 类似,Neo4j 的 CQL 使用WHERE子句来获取想要的数据(参见清单 7-41 )。然而,在 CQL,不是在SELECT命令中使用WHERE子句,而是在SELECT的 CQL 对等词MATCH中使用它。

Listing 7-41. The Syntax of the WHERE Clause in CQL

WHERE condition boolean_operator additional_condition

第一个参数提供条件,由属性名、比较运算符和值组成。属性名是图形节点的名称或关系的名称。比较运算符为=(等于)、<>(不等于)、<(小于)、>(大于)、<=(小于等于)或>=(大于等于)中的一种。该值是文字值,如数字、字符串文字等。第二个和第三个参数(布尔运算符和多个条件)是可选的。布尔运算符可以是ANDORNOTXOR

要按升序或降序对行进行排序,请使用带有MATCH命令的ORDER BY子句(类似于 SPARQL 在SELECT查询上的ORDER BY)。ORDER BY子句包含用于排序的属性列表,可选地后跟DESC关键字(当以降序排序时)。

识别要查询的数据集

要从 LOD 数据集中访问数据,您可以执行语义搜索、浏览数据集目录或直接从专用查询界面运行查询。对于搜索机器可读数据,可以使用 Sindice ( http://sindice.com )或 FactForge ( http://factforge.net )等语义搜索引擎。第三方数据市场如 http://datamarket.com 可以从二级数据源中发现开放数据,为数据寻找者消费或获取数据。

为了从数据集中检索信息,可以在称为 SPARQL 端点(如前所述)的专门构建的访问点上运行 SPARQL 查询,这些访问点通常提供一个 web 接口和一个可选的 API。给定资源的 SPARQL 端点的自动发现并不简单;但是,对于给定 URI 的 SPARQL 端点,可以查询数据集目录,如 http://datahub.iohttp://dataportals.org 。因为将所有 LOD 数据集添加到 LOD 云图的先决条件是提供一个专用的 SPARQL 端点,所以 Datahub 注册中心通常包含一个 SPARQL 端点 URL。

另一种识别 SPARQL 端点的方法是使用 VoID 标准化词汇表,这是专门为描述数据集而设计的。在 VoID 文件中,描述是以 URL 的形式提供的,它可以从 URI 中规范化地派生出来。

公共 SPARQL 端点

许多 SPARQL 端点是公开可用的,通常有一个默认的 LOD 数据集集用于查询。您的 SPARQL 查询将在端点的默认图上运行,除非您在查询中引用了命名图。比如 DBpedia 的 SPARQL 端点是 http://dbpedia.org/sparql/ ,默认在 DBpedia 上运行查询。

Note

DBpedia 为其 SPARQL 端点提供了另外两个接口。第一个叫做 SPARQL Explorer,可以在 http://dbpedia.org/snorql/ 获得。第二个是在 http://querybuilder.dbpedia.org 可用的 DBpedia 查询构建器,可以用来构建自己的查询。因为数据集在每种情况下都是相同的,所以 SPARQL 查询结果在所有三个接口上都是相同的。

专用于特定数据集的 SPARQL 端点可以是特定于域的。由于数据网是高度分布式的,所以没有 SPARQL 端点来查询整个语义网(就像传统 Web 上的 Google 搜索一样)。然而,最常用的公共 SPARQL 端点可以查询包含数百万甚至数十亿个三元组的极大数据集,适合回答复杂问题(见表 7-2 )。

表 7-2。

Popular Public SPARQL Endpoints

| 服务/数据集 | SPARQL 端点 | | --- | --- | | Datahub/CKAN | [`http://semantic.ckan.net/sparql`](http://semantic.ckan.net/sparql) | | DBpedia(数据库管理员) | [`http://dbpedia.org/sparql/`](http://dbpedia.org/sparql/) | | 地名 | [`http://geosparql.org/`](http://geosparql.org/) | | 链接开放商业 | [`http://linkedopencommerce.com/sparql/`](http://linkedopencommerce.com/sparql/) | | 链接开放数据云 | [`http://lod.openlinksw.com/sparql`](http://lod.openlinksw.com/sparql) | | LinkedGeoData | [`http://linkedgeodata.org/sparql`](http://linkedgeodata.org/sparql) | | 辛迪克 | [`http://sparql.sindice.com/`](http://sparql.sindice.com/) | | 尿酸燃烧器 | [`http://uriburner.com/sparql`](http://uriburner.com/sparql) |

设置您自己的 SPARQL 端点

如果在服务器上发布 LOD 数据集,您可能希望设置一个专用的 SPARQL 端点来提供对它的轻松访问。有一些免费的、开源的和商业的产品,并不是所有的都完全支持 SPARQL 1.1,但是大多数都完全支持 SPARQL 1.0。有些产品是可以安装在 web 服务器上的独立 SPARQL 端点,而其他产品则是提供 SPARQL 端点功能的更全面的产品。部署最广泛的 SPARQL 端点是 OpenLink Virtuoso、Fuseki、D2R、4store SPARQL Server 和 PublishMyData。

OpenLink 大师

OpenLink Virtuoso 是目前部署最广泛的 SPARQL 端点。其中,Virtuoso 被实现为 DBpedia 和 DBpedia Live、LinkedGeoData、Sindice、BBC、BioGateway、data.gov、CKAN 和 LOD 云缓存的 SPARQL 端点。

Virtuoso SPARQL 查询编辑器提供了与特定安装相关联的默认 LOD 数据集,在查询命名图形时可以覆盖该数据集。例如,DBpedia SPARQL 端点的默认数据集是 http://dbpedia.org ,如图 7-2 所示。这在 Virtuoso 的每次安装中明显不同,但界面通常非常相似,如果不是完全相同的话。

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

图 7-2。

A Virtuoso SPARQL endpoint

Query Text是一个多行文本区域,您可以在其中编写 SPARQL 查询。这个 textarea 通常包含一个框架查询,您可以通过覆盖、删除或添加 SPARQL 代码来轻松修改它。在 textarea 下,您可以选择输出格式,也可以选择查询执行停止之前的最长时间,以及查询的严格检查。一些安装提供了一组样本查询作为下拉列表。您通常也有两个按钮:一个运行您编写的查询(Run Query),另一个清除文本区域(Reset)。

输出格式下拉列表可能会因安装的不同而有所不同,但一般来说,您可以选择 HTML、电子表格、XML、JSON、JavaScript、Turtle、RDF/XML、N-Triples、CSV、TSV 和 CXML。由于配置或缺少组件,某些输出格式可能不可用。比如适合刻面视图的 CXML 数据交换格式,可以用 Microsoft Pivot 等程序显示,需要 Virtuoso Universal Server(Virtuoso 开源不包含一些需要的功能),ImageMagick 插件,二维码插件(0.6 版本之前;在 0.6 版之后,它是可选的),并且要安装 sparql_cxml VAD 包,以便获得该选项。

要安装 OpenLink Virtuoso SPARQL 端点,请按照下列步骤操作:

Download Virtuoso Open Source from http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/VOSDownload or the commercial edition of Virtuoso from http://virtuoso.openlinksw.com/download/ .   For the commercial Windows Open Source Edition, run the installer; otherwise, create a build.   Verify the installation and the configuration of the environmental variables by running the virtuoso -? Command.   Start the Virtuoso server with virtuoso-start.sh.   Verify the connection to the Virtuoso Server, using isql localhost (if using the default DB settings), isql localhost:1112 (assuming demo database), or visit http://<virtuoso-server-host-name>:[port]/conductor in your browser   Open the SPARQL endpoint at http://<virtuoso-server-host-name>:[port]/sparql.   Run a test query such as SELECT DISTINCT * WHERE {?s ?p ?o} LIMIT 50.

富士见

Fuseki 是 Apache Jena 的 SPARQL 服务器,使用 HTTP 上的 SPARQL 协议提供 REST 风格的 SPARQL HTTP 更新、SPARQL 查询和 SPARQL 更新。

Download the binary distribution from https://jena.apache.org/download/ .   Unzip the file.   Set file permission using the chmod +x fuseki-server s-* command.   Run the server by executing the command fuseki-server --update --mem /ds, which creates an in-memory, non-persistent dataset. If you want to create an empty, in-memory (non-persistent) dataset and load a file into it, use --file=FILE instead of --mem.

Fuseki 的默认端口号是 3030,可以用形式为--port=number的 port 参数覆盖。Fuseki 不仅支持 SPARQL 1.1 查询、SPARQL 1.1 更新操作和将文件上传到选定的数据集,还为 SPARQL 查询和 SPARQL 更新以及 RDF 序列化提供了验证器。要打开 Fuseki 的控制面板,在浏览器中访问http://localhost:3030,点击Control Panel,并选择数据集。

Fuseki 服务器的 URI 模式由主机、随后的数据集和端点组成,所有这些都用斜杠分隔。

  • http://host/dataset/query (SPARQL 查询端点)
  • http://host/dataset/update (SPARQL 更新端点)
  • http://host/dataset/data (SPARQL 图存储协议端点)
  • http://host/dataset/upload(文件上传端点)

要将一些 RDF 数据加载到服务器的默认图中,使用s-put命令,如清单 7-42 所示。

Listing 7-42. Load RDF Data into the Default Graph of Fuseki

s-put http://localhost:3030/ds/datadefault books.ttl

要从服务器的默认图中检索数据,使用s-get命令(参见清单 7-43 )。

Listing 7-43. Retrieving Data, Using s-get

s-get http://localhost:3030/ds/datadefault

可以使用 SPARQL 查询服务器的默认图,使用s-query命令使用…/query端点,如清单 7-44 所示。

Listing 7-44. SPARQL Querying with Fuseki

s-query --service http://localhost:3030/ds/query ’SELECT * {?s ?p ?o}’

可以使用带有s-update…/update端点来执行 SPARQL UPDATE查询。作为一个例子,让我们清除默认图形,如清单 7-45 所示。

Listing 7-45. A SPARQL UPDATE Query with Fuseki

s-update --service http://localhost:3030/ds/update ’CLEAR DEFAULT’

要在 Java 应用中使用 SPARQL 1.1 查询,可以使用 Apache Jena 的 SPARQL 查询引擎 ARQ 的QueryExecutionFactory.sparqlService。对于 SPARQL 更新的编程访问,使用UpdateExecutionFactory.createRemote。SPARQL HTTP 可以通过DatasetAccessor使用。

D2R

D2R 服务器是一个工具,用于将关系数据库发布为链接数据,通过浏览器界面提供对数据库内容的访问,并使用 SPARQL 查询数据库。D2R 通过映射执行 SPARQL 查询到 SQL 查询的动态转换。其中,D2R 被用作 Dailymed 的 SPARQL 终点,daily med 是一个全面的、最新的美国上市药物数据集。D2R 服务器可以按如下方式安装:。

Download the server from http://d2rq.org .   Run the server in one of the following ways:

  • 从命令行(用于开发或测试),语法如清单 7-46 所示

.Listing 7-46. Running D2R From the Command Line

d2r-server [--port port] [-b serverBaseURI][--fast] [--verbose] [--debug] mapping-file.ttl

因为默认端口号是2020,所以默认服务器 URI 是http://localhost:2020。可以选择将fast参数用于性能优化,将verbose参数用于详细日志记录,将debug参数用于完整日志记录。或者,您可以声明要使用的 D2RQ 映射文件的名称。如果没有提供映射文件,则必须在命令行上指定数据库连接,以便使用默认映射。

Ensure that the mapping file includes a configuration block, setting the base URI in the form http://servername/webappname/. The d2r:Server instance in this file configures the D2R server (see Listing 7-47).

  • 将 D2R 服务器 web 应用部署到一个 servlet 容器中,比如 Apache Tomcat 或 Jetty(用于生产)。

Listing 7-47. D2R Configuration File Example

@prefix d2r: <http://example.com/d2r-server/config.rdf#> .

@prefix meta: <http://exampe.com/d2r-server/metadata#> .

<> a d2r:Server;

rdfs:label "My D2R Server";

d2r:baseURI <http://localhost:2020/>;

d2r:port 2020;

d2r:vocabularyIncludeInstances true;

d2r:sparqlTimeout 300;

d2r:pageTimeout 5;

meta:datasetTitle "My Dataset" ;

meta:datasetDescription "This dataset contains Semantic Web 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

publication resources." ;

meta:datasetSource "The dataset covers publications from all related 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

datasets such as XY." ;

meta:operatorName "John Smith" ;

d2r:Server实例支持多种配置属性。可以使用rdfs:label提供人类可读的服务器名称。可以使用d2r:baseURI(相当于–b命令行参数)来声明服务器的基本 URI。服务器的端口号可以添加为d2r:port(与命令行中的--port相同)。默认情况下,词汇表类的 RDF 和 HTML 表示也是列表实例,属性表示也是使用属性的列表三元组。d2r:vocabularyIncludeInstances配置属性接受false布尔值来覆盖这种行为。要指定映射文件更改的自动检测,可以使用d2r:autoReloadMapping属性。默认值为true。可以使用d2r:limitPerClassMap设置每个类别映射的最大实体数量。默认值为50,可以通过将属性值设置为false来禁用该限制。可以使用d2r:limitPerPropertyBridge配置每个属性桥的最大值数量。默认值为50,可以通过将属性值设置为false来禁用该限制。D2R 服务器的 SPARQL 端点的超时可以以秒为单位设置为d2r:sparqlTimeout属性的属性值。如果想要禁用 SPARQL 端点的超时,请将值设置为0。生成资源描述页面的超时可以使用d2r:pageTimeout以秒为单位进行类似的设置,也可以通过将该值设置为0来禁用。可以使用d2r:metadataTemplate覆盖默认的资源元数据模板,它为路径名指定一个文字值,可以是绝对的,也可以是相对于服务器配置文件的位置。默认的数据集元数据模板可以被d2r:datasetMetadataTemplate的值覆盖。属性允许自动创建和发布所有数据集和资源元数据,它接受一个布尔值。如果省略了d2r:disableMetadata属性,则采用true值。

The name of the configuration file declared as the configFile param in /webapp/WEB-INF/web.xml has to be changed to the name of your configuration file. The recommended location of the mapping file is the /webapp/WEB-INF/ directory.   In the main directory of the D2R server, run ant war, which creates the d2rq.war file (requires Apache Ant).   The name of your web application can optionally be changed by renaming the file to webappname.war.   Deploy the .war file into your servlet container, such as by copying it into the webapps directory of Tomcat.

4store SPARQL 服务器

4store 提供了一个 SPARQL HTTP 协议服务器,它可以使用 SPARQL HTTP 查询协议来回答 SPARQL 查询。要运行 4store 的 SPARQL 服务器,请使用清单 7-48 中所示的带有端口号和 KB 名称的4s-httpd命令。

Listing 7-48. Running 4store’s HTTP Server

4s-httpd -p port_number 4store_KB_name

Note

多个 4store KBs 必须在不同的端口上运行。

一旦服务器开始运行,就可以在 web 浏览器的http://localhost:port_number/status/访问概览页面,在http://localhost:port_number/sparql/访问 SPARQL 端点,在http://localhost:port_number/test/访问 HTML 界面。从命令行,您可以使用位于 https://github.com/tialaramex/sparql-query 的 sparql-query 工具查询 SPARQL 服务器。

发布我的数据

PublishMyData 是一个商业链接数据发布平台。因为它是云中的软件即服务(SaaS),你不必安装任何东西来使用它。除了 SPARQL 端点,PublishMyData 还提供 RDF 数据托管、链接的数据 API 和可定制的可视化。它支持 SPARQL 1.1。要从代码中提交 SPARQL 查询,向 SPARQL 端点发出 HTTP GET 请求,如清单 7-49 所示。

Listing 7-49. SPARQL Query on PublishMyData

http://example.com/sparql?query=URL-encoded_query

例如,要运行查询SELECT * WHERE {?s ?p ?o} LIMIT 10并在 JSON 中获得结果,要使用的 URL 将具有清单 7-50 中所示的结构。

Listing 7-50. URL-Encoded SPARQL Query with PublishMyData

http://example.com/sparql.json?query=SELECT+%2A+WHERE+%7B%3Fs+%3Fp+%3Fo%7D+LIMIT+10

为了演示编程访问,让我们使用 JavaScript 从 SPARQL 端点请求数据(参见清单 7-51 )。

Listing 7-51. Using jQuery to Request Data Through the SPARQL Endpoint

<!DOCTYPE html>

<html>

<head>

<script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>

</head>

<body>

<script type="text/javascript">

var siteDomain = "example.com";

var query = "SELECT * WHERE {?s ?p ?o} LIMIT 10";

var url = "http://" + siteDomain + "/sparql.json?query=";

url += encodeURIComponent(query);

$.ajax({

dataType: ’json’,

url: url,

success: function(data) {

alert(’success: ’ + data.results.bindings.length + ’ results’);

console.log(data);

}

});

</script>

</body>

</html>

当请求作为 JSON 的 SPARQL 输出时,可以传递一个回调参数,这样结果将被包装在函数中,这可以防止在旧浏览器下运行 JavaScript 时出现跨域问题(参见清单 7-52 )。

Listing 7-52. Using a Callback Function

http://example.com/sparql.json?callback=myCallbackFunction&query=SELECT+%2A+WHERE+%7B%3Fs 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

+%3Fp+%3Fo%7D+LIMIT+10

或者,您可以使用 jQuery 发出 JSON-P 请求,并通过将dataType设置为jsonp来省略 URL 中的回调参数,如清单 7-53 所示。

Listing 7-53. Using JSON-P for SPARQL Querying

queryUrl = ’example.com/sparql.json?query=SELECT+%2A+WHERE+%7B%3Fs+%3Fp+%3Fo%7D+LIMIT+10’

$.ajax({

dataType: ’jsonp’,

url: queryUrl,

success: function(data) {

// callback code

alert(’success!’);

}

});

还可以使用 Ruby 从 PublishMyData SPARQL 端点请求数据,如清单 7-54 所示。

Listing 7-54. Make a Request to the PublishMyData SPARQL Endpoint in Ruby

require ’rest-client’

require ’json’

query = ’SELECT * WHERE {?s ?p ?o} LIMIT 10’

site_domain = "example.com"

url = "http://\#example.com/sparql.json"

results_str = RestClient.get url, {:params => {:query => query}}

results_hash = JSON.parse results_str

results_array = results_hash["results"]["bindings"]

puts "Total number of results: \#{results_array.length}"

本例中的请求被写成 JSON,结果将被放入一个哈希表中。

摘要

在本章中,您学习了 SPARQL 的基础,SPARQL 是 RDF 的标准化查询语言。现在,您已经熟悉了查询类型,并且知道如何编写 SPARQL 查询来回答复杂的问题、显示具有特定特性的 RDF 图的所有节点、过滤结果或者向数据集添加新的三元组。到目前为止,您已经认识了最流行的 SPARQL 端点接口,并且知道如何设置自己的端点。

下一章将向您展示如何处理大容量、高速度的数据集,如何在大数据应用中利用语义网技术,以及如何向您的网站添加结构化数据,以便考虑将其纳入 Google 知识图。

参考

The W3C SPARQL Working Group (2013) SPARQL 1.1 Overview. W3C Recommendation. World Wide Web Consortium. www.w3.org/TR/sparql11-overview/. Accessed 6 March 2015.   Prud’hommeaux, E., Seaborne, A. (2008) SPARQL Query Language for RDF. www.w3.org/TR/rdf-sparql-query/ . Accessed 18 April 2015.   Harris, S., Seaborne, A. (2013) www.w3.org/TR/sparql11-query/ . Accessed 18 April 2015.   Gearon, P., Passant, A., Polleres, A. (eds.) (2013) SPARQL 1.1 Update. www.w3.org/TR/sparql11-update/ . Accessed 18 April 2015.   Ogbuji, C. (ed.) (2013) SPARQL 1.1 Graph Store HTTP Protocol. W3C Recommendation. World Wide Web Consortium. www.w3.org/TR/sparql11-http-rdf-update/ . Accessed 6 March 2015.   Williams, G. T. (ed.) SPARQL 1.1 Service Description. www.w3.org/TR/sparql11-service-description/ . Accessed 18 April 2015.   Glimm, B., Ogbuji, C. (eds.) (2013) SPARQL 1.1 Entailment Regimes. www.w3.org/TR/sparql11-entailment/ . Accessed 18 April 2015.   Seaborne, A. (ed.) (2013) SPARQL 1.1 Query Results JSON Format. www.w3.org/TR/sparql11-results-json/ . Accessed 18 April 2015.   Seaborne, A. (ed.) (2013) SPARQL 1.1 Query Results CSV and TSV Formats. www.w3.org/TR/sparql11-results-csv-tsv/ . Accessed 18 April 2015.   Hawke, S. (ed.) (2013) SPARQL Query Results XML Format (Second Edition). www.w3.org/TR/rdf-sparql-XMLres/ . Accessed 18 April 2015.   Prud’hommeaux, E., Buil-Aranda, C. (eds.) (2013) SPARQL 1.1 Federated Query. www.w3.org/TR/sparql11-federated-query/ . Accessed 18 April 2015.   Feigenbaum, L., Williams, G. T., Clark, K. G., Torres, E. (eds.) (2013) SPARQL 1.1 Protocol. W3C Recommendation. World Wide Web Consortium. www.w3.org/TR/sparql11-protocol/ . Accessed 9 March 2015.   Broekstra, J., Ansell, P., Visser, D., Leigh, J., Kampman, A., Schwarte, A. et al. (2015) The SeRQL query language. http://rdf4j.org/sesame/2.7/docs/users.docbook?view#chapter-serql . Accessed 22 April 2015.   Neo Technology, Inc. (2015) Intro to Cypher. http://neo4j.com/developer/cypher-query-language/ . Accessed 22 April 2015.   Footnotes 1

或者,可以使用美元符号($)。

2

只有那些由聚合和常量组成的表达式才能使用聚合在 SPARQL 查询级别中进行投影。唯一的例外是将GROUP BY与一个或多个仅包含一个变量的简单表达式一起使用,该变量可以从该级别进行投影。

八、大数据应用

使用传统软件工具无法处理的不同格式的巨大且不断增长的数据池的可持续性是网页设计师、互联网营销人员和软件工程师的下一个重大挑战,需要新的技术和实践。处理大数据的方法之一是使用语义网技术,特别是机器可解释的元数据和链接数据。实现资源描述框架(RDF)和基于 RDF 的标准可以确保数据及其含义被封装,并且在连接来自不同数据源的不同数据时可以管理概念和关系。图形表示,如脸书的开放图,为数据分析添加了上下文并可视化了大数据。基于大数据的面向服务架构(SOA)基础设施使得实时更新大数据成为可能。可以自动对数据进行分类、关联关系和发现新的关系,这样就可以收集和集成数据,而不必担心模式和数据描述,还可以提供数据描述。语义网上的大数据应用包括但不限于下一代搜索引擎结果页面、社交媒体图表、自然语言内容分析、发布关于大规模世界事件的事实数据、链接 BBC 的在线内容以及高性能数据存储和处理。

大语义数据:语义网上的大数据

大数据是指任何大容量、高速度的数据集,这些数据集太大太复杂,无法使用传统的数据处理工具、应用和数据库系统进行处理。这种数据集代表数十亿字节的数据,存储了数十亿个隐藏值,无法进行高效的自动机器处理。大数据有四个特征:

  • 卷:海量数据集中存储和检索的大量数据。挑战在于实现合理的处理速度,尤其是在实时应用中。
  • 速度:高速数据流。挑战在于流数据处理。
  • 多样性:不同形式的数据。挑战在于处理不同的数据结构、数据格式和序列化。
  • 准确性:数据的不确定性。面临的挑战是处理信任问题、确定准确性和应对糟糕的数据质量。

解决大数据相关问题的一个有希望的方法是实施语义网技术,以构建能够高效处理大数据并随着不断增长的数据处理需求而发展的系统。

谷歌知识图和知识库

语义网上最著名的大数据应用之一是 2012 年推出的谷歌知识图。Google Knowledge Graph 是一个语义知识库,它使用从各种来源收集的语义搜索信息来增强传统的搜索引擎结果页面(SERPs)。知识图使用的数据源包括 Google 索引的页面、GoogleMaps 上的对象、公共数据源(如 Wikipedia)、LOD 数据集(如 DBpedia)、CIA World Factbook 和 FDA 数据集,以及特定主题的资源(如 Weather Underground 和 World Bank ),分别用于气象信息和经济统计。知识图搜索的结果不仅是比传统搜索更准确的相关信息,还有相关信息,例如人们搜索最多的类似资源。例如,如果你搜索达芬奇,你不仅会得到关于他和他的著名作品如《蒙娜丽莎》和《最后的晚餐》的事实,谷歌还会提示同一时代的其他著名画家,如扬·范·艾克、丢勒、拉斐尔和米开朗基罗(见图 8-1 )。

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

图 8-1。

The Google Knowledge Graph finds data resources related to your search phrase [1]

同样,如果搜索动作电影的标题,结果将包括类似的电影,而搜索特定的发明者将显示其他发明者,具有类似的研究领域和奖项。知识图包含超过 5 亿个对象和超过 180 亿个关于不同对象之间关系的事实,帮助软件代理“理解”搜索关键字的含义,并且这些数字还在不断增长。

根据使用的搜索短语,从 Google Knowledge Graph 检索到的搜索结果以两种方式表示。第一个称为谷歌知识面板,显示在搜索引擎结果页面的右侧,靠近有机搜索结果。搜索人员或品牌名称通常会出现一个知识面板,如图 8-2 所示。

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

图 8-2。

Facts about Tim Berners-Lee shown by the Google Knowledge Panel

如果对象在脸书、YouTube、Twitter、Instagram、Google+等社交媒体上存在。,还将显示指向这些页面的链接。最相关的链接显示在“人们也搜索”下面,可以通过单击“查看更多”链接来扩展。如果你搜索一个活着的音乐家,你可能还会在知识面板上看到“即将到来的事件”,包括即将到来的音乐会的地点和日期。

从 Google Knowledge Graph 检索的数据的第二种数据表示是 Google Knowledge Carousel,它显示与搜索短语相关的实体。例如,如果你搜索克林特·伊斯特伍德的电影记录,谷歌会提供有机结果,一个关于克林特·伊斯特伍德的知识面板,以及一个关于他最著名电影的知识转盘,如《好、坏、丑》、《不可饶恕》、《亡命之徒乔西·威尔士》、《老爷车》、《一把美元》、《肮脏的哈利》等(见图 8-3 )。当您单击“知识面板”上的某些链接类型时,也可以使用转盘。例如,如果您单击知识面板上显示的音乐家的即将举行的音乐会,该音乐家的所有即将举行的音乐会将显示在顶部的转盘上。

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

图 8-3。

Searching for an actor’s filmography gives both a Knowledge Carosel and a Knowledge Panel

Google 知识库结合了来自传统网站的数据,包括非结构化文本、DOM 树和表格,以及来自 Freebase 的结构化数据。这是一个自动提取结构化数据的大型数据库。用户可以检索的信息量取决于查询的结构和正确性。

知识库从知识图及其来源中获取大量数据,并收集自己的数据,对其可靠性进行排名,并将所有结果汇编到由机器学习算法收集的超过 16 亿个事实的数据库中。不再有关于美洲虎(汽车品牌或动物)或泰姬陵(纪念碑、音乐家或赌场)的模糊自然语言查询,因为谷歌完全知道这些“东西”之间的区别

将您的公司、产品和事件纳入知识图表

如果你在你的网站上使用受控词汇术语描述你的公司、产品、服务或事件,无论是 HTML5 微数据还是 JSON-LD,它们都将被视为包含在谷歌知识图中。Schema.org 术语可以用来定义特征和关系,例如一个人的姓氏( http://schema.org/familyName )、音乐专辑的流派( http://schema.org/music/artist/album )、或者商店的营业时间( http://schema.org/openingHours )。你使用的类别越精确越好。例如,如果你有一场音乐会,用 http://schema.org/MusicEvent 而不是 http://schema.org/Event ,或者如果你有一场足球比赛,用 http://schema.org/SportsEvent 而不是 http://schema.org/Event 。例如,活动组织者可以通过在 JSON-LD 中将结构化数据作为单独的代码块添加到标记中来描述即将到来的活动,这样 Google 就可以将它们包含在知识图上(参见清单 8-1 )。如前所述,在第三章的中,使用@context@type定义词汇表。

Listing 8-1. JSON-LD Annotation of a Band in the Markup

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

{

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

"@type"     : "MusicEvent",

"name"      : "Nice Band Live",

"startDate" : "2015-09-18T20:00",

"url"       : "http://www.nicebandexample.com/tour/150918

"location"  : {

"@type"   : "Place",

"name"    : "The Oval",

"address" : "1234 Blackwood Plaza",

"sameAs"  : "http://www.xyzoval.com

},

"performer" : {

"@type"   : "MusicGroup",

"name"    : "Nice Band",

"sameAs"  : "http://www.nicebandexample.com

},

"offers"   : {

"@type" : "Offer",

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

}

}

</script>

同样,在线零售商和商店可以使用 Schema.org 术语描述产品。要确定您可以使用哪些属性,请转到 http://schema.org/Book 并查看属性列表。这里,我们添加了带有url的书的网站,通过引用相应的 DBpedia 页面定义了作者,使用 Schema.org 术语声明了可用的格式(平装本和电子书),以及其他属性(见清单 8-2 )。

Listing 8-2. JSON-LD Annotation of a Product Description

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

{

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

"@type": "Book",

"url": "http://www.lesliesikos.com/web-standards-mastering-html5-css3-and-xml-second-

edition/",

"author": "http://dbpedia.org/resource/Leslie_Sikos

"bookFormat": "http://schema.org/Paperback

"bookFormat": "http://schema.org/EBook

"datePublished": "2014-12-24",

"image": "http://www.lesliesikos.com/img/web-design-book.jpg

"inLanguage": "English",

"isbn": "1484208846",

"name": "Web Standards: Mastering HTML5, CSS3, and XML",

"numberOfPages": "524",

"offers": {

"@type": "Offer",

"availability": "http://schema.org/InStock

"price": "39.89",

"priceCurrency": "USD"

},

"publisher": "http://dbpedia.org/resource/Apress

"about": "http://dbpedia.org/resource/Web_design

}

</script>

可以使用 GoodRelations 对产品进行注释,包括易贝或 Gumtree 上的广告网页、接受的支付方式、商品价格和货币、产品类别、描述产品的官方供应商网页以及产品描述等属性(参见清单 8-3 )。

Listing 8-3. JSON-LD Annotation of a Product Offering in the Markup

{

"@context": {

"gr": "``http://purl.org/goodrelations/v1#

"pto": "http://www.productontology.org/id/

"schema": "http://schema.org/

"xsd": "``http://www.w3.org/2001/XMLSchema#

"schema:url": {

"@type": "@id"

},

"gr:acceptedPaymentMethods": {

"@type": "@id"

},

"gr:hasBusinessFunction": {

"@type": "@id"

},

"gr:hasCurrencyValue": {

"@type": "xsd:float"

}

},

"@id": "http://www.ebay.com/itm/ExampleAd-Giant-TCR-Advanced-1-Road-Bike-/21621444051

"@type": "gr:Offering",

"gr:acceptedPaymentMethods": "gr:Cash",

"gr:description": "Want to sell my Giant TCR Advanced 1 Road Bike as I’m moving 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

interstate",

"gr:hasBusinessFunction": "gr:Sell",

"gr:hasPriceSpecification": {

"gr:hasCurrency": "USD",

"gr:hasCurrencyValue": "1350"

},

"gr:includes": {

"@type": [

"gr:Individual",

"pto:Racing_bicycle"

],

"gr:name": "Giant TCR Advanced 1",

"schema:url":https://www.giant-bicycles.com/enus/bikes/model/tcr.advanced.1.force/外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

14797/66271/"

},

"gr:name": "Used Giant Road Bike"

}

要向有关本地企业的 HTML5 标记中添加结构化数据,可以使用 Schema.org 的 local business 词汇表。确保您使用最适合您业务的类型( http://schema.org/Library 用于图书馆, http://schema.org/ShoppingCenter 用于购物中心, http://schema.org/AutomotiveBusiness 用于车库, http://schema.org/FinancialService 用于财务规划师和银行等)。).学校或者体育俱乐部应该用 http://schema.org/Organization代替,而 http://schema.org/Corporation 更适合企业。最常用的 LocalBusiness 属性是名称、描述、地址和电话(参见清单 8-4 )。物理地址细节可以嵌入到 PostalAddress 中。

Listing 8-4. LocalBusiness Annotated with Microdata

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

<h1><span itemprop="name">The Blue Cafe</span></h1>

<span itemprop="description">A nice cafe on the beach with a friendly atmosphere.</span>

<div itemprop="address" itemscope="itemscope" itemtype="http://schema.org/PostalAddress

<span itemprop="streetAddress">123 Esplanade</span>

<span itemprop="addressLocality">Nice Beach</span>,

<span itemprop="addressRegion">CA</span>

</div>

<p>

Phone: <span itemprop="telephone">123-456-7890</span>

</p>

</div>

根据您希望在站点上显示为人类可读数据的内容和希望添加为机器可读数据的内容,您可以使用不同的标记元素和样式表。对于那些仅为软件代理添加的数据,使用meta元素上的属性值。

社交媒体应用

语义网上大数据实施的优秀例子是社交媒体图,如脸书社交图、Twitter 兴趣图、Twitter 关注图、LinkedIn 专业图或 LinkedIn 经济图。

脸书社交图

脸书社交图是世界上最大的社交图,包含大约 10 亿用户的数十 Pb 的结构化数据。因为每个对象都是一个图节点,每个关系都是脸书社交图上的一个图边(见图 8-4 ),任何对象都可以作为用户在浏览器中直接访问,也可以通过脸书应用以编程方式访问。

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

图 8-4。

On the Facebook Social Graph, every object is a node and every connection is an edge

事实上,这种大量用户数据的轻松访问远远超出了脸书,因为脸书社交图的社交关系和链接也被其他社交网络门户网站使用,如 Pinterest 和 Last.fm(社交自举)。

你有没有想过脸书是如何推荐朋友的?利用脸书社交图的边缘,可以很容易地识别出那些至少有一个共同朋友的人(见图 8-5 )。

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

图 8-5。

The edges of the Facebook Social Graph make it possible to suggest people you may know

脸书图形 API

脸书图形应用编程接口是 Facebook 平台的核心,使开发者能够从脸书用户档案中读取数据和向其中写入数据。Graph API 通过人物、照片、事件、页面等图形对象,以及它们之间的联系,如朋友关系、共享内容、照片标签等,来表示脸书社交图的当前状态。换句话说,Graph API 使得从脸书社交图中以编程方式访问用户对象和连接成为可能,这可用于脸书应用。

Graph API 不仅可以查询数据,还可以发布新的故事,发布开放的 Graph 故事,阅读脸书用户的信息,上传照片,更新社交图中的信息,以及执行脸书应用使用的类似任务。脸书社交图的所有对象(用户、相册、照片、状态信息、页面等。)具有唯一的标识符,该标识符是正整数,并且使得引用任何节点或边成为可能。

最初,Graph API 专门在 JSON 中向应用提供数据。JSON 的两个不同的键/值对集是对象(其中键是字符串)和数组(将键集表示为非负整数的有限计数序列)。这些值可以是 JSON 对象、数组或原语(字符串、数字、布尔值和 null)。

因为 Graph API 是 RESTful JSON API,所以可以在浏览器中访问它。Graph API 的 web 接口称为 Graph API Explorer,可在 https://developers.facebook.com/tools/explorer/ 获得。有了这个工具,你可以使用和遍历脸书社交图。您必须拥有脸书帐户并登录才能使用图形 API 浏览器。一旦您登录并访问 Graph API Explorer,您可以在右侧看到一个 JSON 对象,它有两个属性,即当前用户的标识符和名称,因为这是默认选择的两个字段(显示在左侧的me节点下)。如果您取消选中这两个复选框,并点击提交,图形 API 浏览器将显示更多关于用户的信息(参见图 8-6 )。提供多少细节取决于您的隐私设置。当查询中没有指定字段时,这些字段值是要返回的默认数据。

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

图 8-6。

With the Graph API Explorer, you can access fields of a node in the Facebook Social Graph

如果您需要关于节点的更多数据,您可能需要生成一个访问令牌(Get Access Token),选择您选择的附加字段,并授予 Graph API 访问这些数据的权限。Graph API Explorer 在后台执行简单的 HTTP GET请求,如清单 8-5 所示,并在左侧提供一个下拉菜单,包含GETPOSTDELETE选项。默认值为GET。要启动新的请求,您必须单击右侧的提交。

Listing 8-5. HTTP GET Request Through the Graph API Explorer

GET /v2.2/me HTTP/1.1

Host: graph.facebook.com

虽然脸书社交图中的每个节点都有一个标识符,但是您可以通过数字 ID 或用户名(如果对象有用户名的话)来引用任何节点。例如,如果您在GET之后将请求从默认的me值更改为您的用户 ID 或用户名,并点击 Submit,您的查询会得到相同的结果。这甚至适用于脸书页面。

由于在幕后使用了 HTTP GET请求,每个查询也可以直接执行。例如,要获取这本书的脸书页面的信息( http://facebook.com/SemanticWebBook ),可以直接在浏览器中打开 http://graph.facebook.com/SemanticWebBook 来检索 JSON 输出。这使得通过处理 HTTP 请求和 JSON 格式的软件库,以编程方式访问脸书社交图的任何节点或边成为可能。更简单的是,脸书为流行的语言和平台提供了 SDK,如 PHP(见清单 8-6 )、JavaScript(见清单 8-7 )、iOS(见清单 8-8 )和 Android(见清单 8-9 )。

Listing 8-6. Make an API Call from PHP

$request = new FacebookRequest(

$session,

’GET’,

’/me’

);

$response = $request->execute();

$graphObject = $response->getGraphObject();

/* result handler */

Listing 8-7. Make an API Call from JavaScript

FB.api(

"/me",

function (response) {

if (response && !response.error) {

/* result handler */

}

}

);

Listing 8-8. Make an API Call from iOS

[FBRequestConnection startWithGraphPath:@"/me"

completionHandler:^(

FBRequestConnection *connection,

id result,

NSError *error

) {

/* result handler */

}];

Listing 8-9. Make an API Call from Android

new Request(

session,

"/me",

null,

HttpMethod.GET,

new Request.Callback() {

public void onCompleted(Response response) {

/* result handler */

}

}

).executeAsync();

自 2011 年以来,脸书不仅以 JSON 格式,而且以语义丰富的 RDF 序列化格式提供从社交图检索的数据,以包括关联数据 URIs。实现应该是灵活和健壮的,所以选择了 Turtle 格式,尽管也考虑了 JSON-LD。Turtle 翻译的 JSON 输出可以通过 HTTP 内容协商访问。URI 或空白节点被分配给 JSON 对象或数组,作为 RDF 三元组的主题。RDF 三元组的谓词和对象源自 JSON 对象和数组的键值对。JSON 键被转换成 URI,而值被转换成 RDF 术语,比如有意义的文字、URI 或空白节点。

原始值对应于 RDF 文字,转换是通过应用试探法确定最适合文字的 RDF 数据类型 URI 来进行的。构成 URIs 的 JSON 字符串被翻译成 URIs。JSON-Turtle 转换中最常用的数据类型 URIs 是xsd:Booleanxsd:dateTimexsd:decimalxsd:doublexsd:integer。对象标识符仍然是字符串,即使它们看起来是整数。脸书为字符串实现了 RDF 1.1 约定,即常规字符串被保留为普通文字(隐式地处理为xsd:string),而不是显式地将其类型化为xsd:string。为了符合 httpRange-14(确保 HTTP GET请求不会导致未定义的域),片段标识符比斜线 URIs 更受欢迎。因为输出代表一个没有连接到外部资源的孤立图形,所以产生的链接数据只是四星链接数据(参见第三章)。尽管如此,RDF/Turtle 的输出在语义上比 JSON 的输出更丰富,因为显式的语义可以作为利用 RDFS 和 OWL 词汇表的本体来访问。

可以像直接执行 HTTP GET请求一样访问链接的数据,即使用 http://graph.facebook.comhttps://graph.facebook.com 基 URI,后跟一个斜杠和脸书用户名或脸书页面名。例如,关联数据 URIs 可以用来扩充一个人的 FOAF 档案,如清单 8-10 所示。

Listing 8-10. FOAF Profile Augmentation

@base <http://graph.facebook.com/

<http://www.lesliesikos.com/datasets/sikos.rdf#sikos

owl:sameAs </1105249544#> ;

rdfs:seeAlso </1105249544?metadata=1> ;

foaf:depiction </1105249544/picture> ;

foaf:account <http://www.facebook.com/sikos

Apache Marmotta 的 LDClient 库的脸书模块

Apache Marmotta 的 LDClient 库的脸书模块使用 Schema.org、都柏林核心、FOAF、SIOC 和 SKOS 术语将脸书图形 API 对象和连接表示为 RDF 三元组。只要可行,映射将使用 Schema.org 术语。Marmotta 的脸书模块(ldclient-provider-facebook)注册一个端点来处理从 http://graph.facebook.comhttp://www.facebook.com开始的所有 URIs。通过添加一个依赖项,可以在 Apache Maven 项目中使用脸书模块,如清单 8-11 所示。

Listing 8-11. Dependency for the Facebook Module in Maven

<dependency>

<groupId>org.apache.marmotta</groupId>

<artifactId>ldclient-provider-facebook</artifactId>

<version>3.3.0</version>

</dependency>

每个脸书对象至少有一个类别(尽可能使用rdf:type映射到 Schema.org 术语)、一个标识符(映射到dcterms:id)、一个名称(映射到schema:name)、一个描述(映射到schema:description)和一个脸书网页(映射到foaf:homepage)。这允许从 Maven 项目中以编程方式访问脸书对象。

脸书开放图协议

受微格式和 RDFa 的启发,Open Graph 协议使开发者能够将他们的页面集成到脸书社交图中。

开放图表词汇表可用于用与脸书属性相关联的元数据来注释您的网站标记。例如,一本书可以如清单 8-12 所示进行描述。打开图的命名空间是 http://opengraphprotocol.org/schema/

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

Listing 8-12. Open Graph Annotation in the Markup

<meta property="og:title" content="Web Standards: Mastering HTML5, CSS3, and XML" />

<meta property="og:type" content="book" />

<meta property="og:url" content="http://www.masteringhtml5css3.com

<meta property="og:image" content="??http://www.masteringhtml5css3.com/img/

webstandardsbook.jpg " />

<meta property="og:site_name" content="Web Site of the Book Web Standards: 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Mastering HTML5, CSS3, and XML" />

<meta property="og:description" content="A book describing web standardization to create 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

optimized, device-independent web sites with cutting-edge technologies." />

推特卡片

类似于脸书的开放图形注释,Twitter 提供了所谓的 Twitter Cards 注释,将结构化数据添加到您关于 Twitter 对象的标记中。因为 Twitter 卡基于与 Open Graph 协议相同的约定,所以标签是相似的,并且您可以生成混合了 Open Graph 和 Twitter 卡注释的 Twitter 卡,而没有标签或数据重复。虽然建议用户在html元素(<html prefix="og: http://ogp.me/ns# ">)上为 Open Graph 指定og RDFa Core 1.1 CURIE 前缀映射,但是 Twitter 卡不需要类似的标记;但是,他们可以使用前缀twitter:作为meta元素的name属性值。另一个区别是,虽然开放图协议指定了标记的属性和内容属性的使用(例如<meta property="og:image" content="http://example.com/ogimg.jpg"/>),但是 Twitter 卡使用namecontent。Twitter 的解析器将理解现有开放图标记的propertycontent属性。要定义一个摘要卡(默认的 Twitter 卡类型),您可以在meta元素上混合使用 Twitter 卡和 Open Graph 注释,如清单 8-13 所示。

Listing 8-13. Twitter Card Annotation in the Markup

<meta name="twitter:card" content="summary" />

<meta name="twitter:site" content="@lesliesikos" />

<meta name="twitter:creator" content="@lesliesikos" />

<meta property="og:url" content="??http://www.lesliesikos.com/linked-data-platform-1-0

standardized/" />

<meta property="og:title" content="Linked Data Platform 1.0 Standardized" />

<meta property="og:description" content="The Linked Data Platform 1.0 is now a W3C 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Recommendation, covering a set of rules for HTTP operations on Web resources, including 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

RDF-based Linked Data, to provide an architecture for read-write Linked Data on the 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Semantic Web." />

<meta property="og:image" content="http://www.lesliesikos.com/img/LOD.svg

沃森机器人

IBM Watson 的 DeepQA 系统是一个问答系统,最初是为了与 Jeopardy 的参赛者竞争而设计的!智力竞赛节目,三名参赛者在回答开放领域的问题时相互竞争。虽然该系统赢得了与人类大冠军的比赛,但它的应用远远超出了危险!,即一般情况下问题和知识源两方面的自然语言内容分析 [3 ]。沃森的认知计算算法用于医疗保健,以提供洞察力和决策支持,并对客户服务中的任何查询或服务问题做出个性化的即时响应。开发人员可以使用 IBM Watson 开发人员云,这是一个 REST APIs 和 SDK 的集合,用于认知计算任务,如自然语言分类、概念扩展、机器翻译、关系提取、语音到文本和视觉识别。

在其他技术中,Watson 使用了诸如 Sesame、本体和推理等三元组。DeepQA 的信息资源由非结构化、半结构化和结构化数据组成,其中结构化数据起着重要的作用,主要是通过在 IBM 的 DB2 数据库平台 [4 ]中实现 RDF。DeepQA 使用三种类型的结构化数据,包括在线结构化数据仓库,如 DBpedia、GeoNames、YAGO 和电影数据集;从非结构化数据中提取的结构化数据;以及提供要存储在 triplestore 中的附加信息(如问答类型)的管理数据。沃森使用语义网技术对数据进行推理 [5 ]。DeepQA 使用各种技术来产生每个问题的候选答案。随后的候选答案排名组件主要由语义网技术支持。特别地,链接的数据源被用来为潜在的答案提供分型证据 [6 ]。链接开放数据在 DeepQA 架构中起着至关重要的作用,不仅在生成候选答案方面,而且在考虑多个观点(如类型强制和地理邻近性)的同时对答案进行评分。从 DBpedia 提取的数据还支持实体消歧和关系检测。YAGO 用于实体类型识别,其中不连续属性被手动分配给 YAGO 分类法中的更高级别类型。为了能够回答来自各种领域的问题,Watson 在自然语言处理(NLP)算法的基础上实现了关系检测和实体识别,这些算法处理来自维基百科 [8 ]的事实数据。

BBC 的动态语义出版

英国广播公司(BBC)从 2010 年开始在 2010 年世界杯网站 [9 ]和 2012 年伦敦奥运会网站 [11 ]等网站实施 RDF。如今,BBC 新闻 [12 ]、BBC 体育 [13 ]以及 BBC 的许多其他网站都是使用语义网技术创作和发布的。BBC 新闻文章使用自动元数据标记和链接,不同的 BBC 领域(品牌、地点、人物和一般主题)通过对简单知识组织系统(SKOS) [14 ]中表达的术语进行分类的层次结构进行整合。BBC 节目网站 [15 ]的内容分类系统(CIS)的标识符被映射到 DBpedia 概念。BBC 音乐网站 [16 ]也是建立在链接数据上的,每个艺术家都用 RDF 表示。BBC 地球网站是由 RDF 和它自己的野生动物本体论支持的。

BBC 的发布平台基于嵌入式链接数据标识符、本体和推理来管理和发布 XHTML 和 RDF 聚合。BBC 的内部内容管理系统(称为内容管理/制作系统,简称 CPS)支持通过所见即所得(WYSIWYG)编辑器进行静态元数据输入。手动内容管理过程由动态语义注释完成,产生自动化的元数据、丰富的内容关系和语义导航。发布平台自动聚集和呈现到相关故事和资产的链接。

国会图书馆链接数据服务

美国国会图书馆是世界上最大的图书馆,拥有超过 1.6 亿项内容,它发布主题分类法作为编目的链接数据。它提供了 LC 链接数据服务,以 RDF [20 ]和 SKOS(在适当的情况下)表示数据,并使用自己的本体来准确描述分类资源和关系。国会图书馆的所有记录都可以通过内容协商单独获得,如 XHTML+RDFa、RDF/XML、N-Triples 和 JSON [21 ]。为了解决机器可读编目(MARC)这一由国会图书馆发起的标准的局限性,MARC 记录已经被映射到 BIBFRAME 词汇表术语 [22 ]以利用关联数据的优势。该库使用的其他受控词汇表是 Dublin Core 和 MARC Relator 术语(使用 marcrel 前缀)。例如,Dublin Core 词汇表的 contributor 术语已经使用 MARC Relator 术语词汇表的对应术语进行了改进,它允许编目员在 RDF [23 ]中指定个人在资源创建中扮演的角色,如插图画家、书法家或编辑。

高性能存储:万亿三倍大关

AllegroGraph ( http://franz.com/agraph/allegrograph/ ),在第六章中讨论的业界领先的图数据库,在加载和查询海量 RDF 三元组方面不断刷新记录。2004 年,AllegroGraph 的第一个版本是第一个使用标准 x86 64 位架构加载和索引 10 亿个三元组的图数据库。2008 年,亚马逊 EC2 服务上加载了 100 亿个 quads。2011 年 6 月,它使用基于八插槽英特尔至强 E7-8870 处理器的服务器系统,配置了 2TB 内存和 22TB 物理磁盘空间,在短短 78 小时内成功加载了 3100 亿个 RDF 三元组。两个月后,AllegroGraph 成为世界上第一个加载、推断和查询超过 1 万亿(!)三胞胎。这种令人惊叹的无与伦比的性能足以存储[25]

  • 世界上最大的图书馆——美国国会图书馆的 1.58 亿件藏品中的每一件都有 6350 个事实
  • 10 亿 Twitter 用户中的每一个都有 1000 条推文
  • 13 亿脸书用户的 770 个事实
  • 关于人类大脑中 860 亿个神经元的 12 个事实。
  • 人类平均一生中 25 亿次心跳中的每一次都有 400 次代谢读数
  • 银河系中 2000 亿颗恒星的五个事实

AllegroGraph 专为最大加载速度和查询速度而设计。通过其高度优化的 RDF/XML 和 N-Quads 解析器加载三元组和四元组是非常强大的,尤其是对于大文件。这 1,009,690,381,946 个三元组仅用了 338 个多小时就被加载,平均速率超过每秒 800,000 个三元组(见表 8-1 )。

表 8-1。

AllegroGraph’s Performance in Triple Loading and Indexing

| 配置 | 三重计数 | 时间 | 负载率(吨/秒) | | --- | --- | --- | --- | | 2 x4 Intel e 5520 @ 2.26 GHz、48GB RAM、CentOS 5.3 | 11.06 亿 | 48 米 30 秒 | Three hundred and seventy-nine thousand nine hundred and forty-seven | | 32 核英特尔 E5520@2.0 GHz,1TB 内存,Red Hat Enterprise Linux 6.1 | 11.06 亿 | 36 支 m 49 步枪 | Five hundred thousand six hundred and seventy-nine | | 32 核英特尔 E5520@2.0 GHz,1TB 内存,Red Hat Enterprise Linux 6.1 | 221.20 亿 | 12 小时 18 分 16 秒 | Four hundred and ninety-nine thousand one hundred and eighty-eight | | 64 核英特尔 x7560@2.27 GHz,2TB 内存,22TB 磁盘,Red Hat Enterprise Linux 6.1 | 3102.69 亿 | 78 小时 9 分 23 秒 | One million one hundred and two thousand seven hundred and thirty-seven | | 240 核英特尔 x5650,2.66GHz,1.28TB 内存,88TB 磁盘,Red Hat Enterprise Linux 6.1 | 1.009 万亿 | 338 小时 5 分钟 | Eight hundred and twenty-nine thousand five hundred and fifty-six |

采用 Oracle Database 12c 的 Oracle Spatial 和 Graph 在 2014 年 9 月在处理和索引 RDF 三元组方面达到了 1 万亿三元组。Oracle 的最大加载速率为每秒加载和索引 1420000 个四元组(参见表 8-2 )。

表 8-2。

Oracle Spatial and Graph’s Performance in Triple and Quad Loading and Indexing

| 配置 | 数数 | 时间 | 负载率* | | --- | --- | --- | --- | | 64 核 SPARC64 VII+@3GHz、512GB RAM、双 F5100 闪存阵列中的 160 个驱动器、Oracle 数据库 11.2.0.2.0 | 11 亿个三倍 | 28 米 11 秒 | 650,500 万亿次 | | 64 核 SPARC64 VII+@3GHz、512GB RAM、双 F5100 闪存阵列中的 160 个驱动器、Oracle 数据库 11.2.0.2.0 | 34 亿个三倍 | 105 米 | 539,700 万亿次 | | 40 核英特尔 E7-4870@ 2.4GHz,在一个 Sun 服务器 X2-4 节点上带有 1TB RAM,双节点 Sun ZFS 7420 存储 | 274 亿个四边形 | 13 小时 11 分 | 273,000 QLIPS | | 192 核 Oracle 数据库云服务器 X4-2 高容量全机架、2TB RAM、44.8TB 闪存、八托盘双控制器 ZS3-2 存储、Oracle 数据库 12.1.0.1 | 6054 亿个四边形 | 115.2 小时 | 1,420,QLIPS |

*TLIPS:每秒加载和索引三次;QLIPS:每秒加载和索引的四边形数

摘要

在本章中,您看到了在搜索引擎、社交媒体和高性能存储中使用语义网技术的大数据应用。您学习了如何将结构化数据添加到您的网站,Google 会考虑将其包含在知识图中,其数据将用于在知识面板和知识转盘上显示其他数据。到目前为止,您已经知道如何在标记中为脸书和 Twitter 对象编写语义注释。

最后一章将一步一步地展示各种真实情况下的用例。

参考

Google (2015) Introducing the Knowledge Graph. www.google.co.uk/insidesearch/features/search/knowledge.html . Accessed 9 March 2015.   Twitter (2015) Getting Started with Cards. https://dev.twitter.com/cards/ . Accessed 12 March 2015.   Gliozzo, A., Patwardhan, S., Biran, O., McKeown, K. (2013) Semantic Technologies in IBM Watson. www.cs.columbia.edu/nlp/papers/2013/watson_class_acl_tnlp_2013.pdf . Accessed 23 April 2015.   Gucer, V. (2013) IBM is embracing Semantic technologies in its products. In: 5 Things To Know About Semantic Technologies. www.ibm.com/developerworks/community/blogs/5things/entry/5_things_to_know_about_the_semantic_technologies?lang=en . Accessed 23 April 2015.   Le Hors, A. (2012) Interview: IBM on the Linked Data Platform. www.w3.org/blog/2012/05/interview-ibm-on-a-linked-data/ . Accessed 23 April 2015.   Welty, C. (2013) Semantic Web and Best Practice in Watson. In: Proceedings of the Workshop on Semantic Web Enterprise Adoption and Best Practice (WaSABi 2013), Sydney, Australia, 22 October, 2013. http://ceur-ws.org/Vol-1106/keynote2.pdf . Accessed 23 April 2015.   Unger, C., Freitas, A., Cimiano, P. (2014) An Introduction to Question Answering over Linked Data. In: Reasoning Web: Reasoning on the Web in the Big Data Era. Lecture Notes in Computer Science 2014, 8714:128–130, http://dx.doi.org/10.1007/978-3-319-10587-1. Accessed 23 April 2015.   Gliozzo, A. M., Kalyanpur, A., Welty, C. (2011) Semantic Web Technology in Watson. Tutorial at the 10th International Semantic Web Conference, Bonn, Germany, 23–27 October 2011. http://iswc2011.semanticweb.org/tutorials/semantic-web-technology-in-watson/ . Accessed 23 April 2015.   Shotton, D. (2012) A major user of RDF linked data—the BBC. http://jats.nlm.nih.gov/jats-con/2012/presentations/shotton_jatscon2012.pdf . Accessed 24 April 2015.   BBC (2010) World Cup 2010. http://news.bbc.co.uk/sport2/hi/football/world_cup_2010/ . Accessed 24 April 2015.   BBC (2012) London 2012 Olympics. www.bbc.com/sport/0/olympics/2012/ . Accessed 24 April 2015.   BBC (2015) BBC News. www.bbc.co.uk/news/ . Accessed 24 April 2015.   BBC (2015) BBC Sport. www.bbc.co.uk/sport . Accessed 24 April 2015.   Kobilarov, G., Scott, T., Raimond, Y., Oliver, S., Sizemore, C., Smethurst, M., Bizer, C., Lee, R. (2009) Media Meets Semantic Web—How the BBC Uses DBpedia and Linked Data to Make Connections. Lecture Notes in Computer Science 2009, 5554:723–737, http://dx.doi.org/10.1007/978-3-642-02121-3_53. Accessed 24 April 2015.   BBC (2015) BBC Programmes. www.bbc.co.uk/programmes . Accessed 24 April 2015.   BBC (2015) BBC Music. www.bbc.co.uk/music . Accessed 24 April 2015.   BBC (2015) BBC Earth. www.bbc.com/earth/uk . Accessed 24 April 2015.   BBC (2012) Sports Refresh: Dynamic Semantic Publishing. www.bbc.co.uk/blogs/legacy/bbcinternet/2012/04/sports_dynamic_semantic.html . Accessed 24 April 2015.   Library of Congress (2015) Fascinating Facts. www.loc.gov/about/fascinating-facts/ . Accessed 24 April 2015.   Library of Congress (2015) LC Linked Data Service. http://id.loc.gov/ . Accessed 24 April 2015.   Ford, K. (2010) ID.LOC.GOV, 1½ Years: Review, Changes, Future Plans, MADS/RDF. http://id.loc.gov/static/presentations/kefo_dlf_id.pdf . Accessed 24 April 2015.   Library of Congress (2015) Vocabulary (Bibliographic Framework Initiative Technical Site). http://bibframe.org/vocab/ . Accessed 24 April 2015.   Harper, C. A., Tillett, B. B. (2007) Library of Congress Controlled Vocabularies and Their Application to the Semantic Web. Cataloging & Classification Quarterly 2007, 43(3-4):47–68. http://dx.doi.org/10.1300/J104v43n03_03. Accessed 24 April 2015.   Franz Inc. (2011) Franz’s AllegroGraph Sets New Record on Intel Xeon E7 Platform. http://franz.com/about/press_room/Franz-Intel_6-7-11.lhtml . Accessed 12 March 2015.   Oracle (2014) Oracle Spatial and Graph: Benchmarking a Trillion Edges RDF Graph. http://download.oracle.com/otndocs/tech/semantic_web/pdf/OracleSpatialGraph_RDFgraph_1_trillion_Benchmark.pdf . Accessed 3 February 2015.

九、用例

通过阅读这本书,您学习了如何在标记中编写 HTML5 微数据和 JSON-LD 注释,开发语义 web 应用,用标准化语言描述 Web 服务,在链接开放数据(LOD)数据集上运行强大的查询,以及开发语义 Web 应用。现在您已经熟悉了语义 Web 技术,让我们分析四个复杂的例子,为现实生活中的实现做准备!

RDB 到 RDF 直接映射

使用 R2RML 语言来表达从关系数据库(RDB)到资源描述框架(RDF)数据集的定制映射,您可以引用逻辑表来从输入数据库中检索数据。逻辑表可以是基表、视图或 SQL 查询[1]。假设您有一个关于企业员工的关系数据库,并希望将其映射到 RDF。每个工作人员由一个唯一的标识符(ID)识别,该标识符用作主键(见表 9-1 )。

表 9-1。

The Employee Database Table

| ID `INTEGER` | 名字`VARCHAR(50)` | 姓氏`VARCHAR(50)` | | --- | --- | --- | | `10` | `John` | `Smith` | | `11` | `Sarah` | `Williams` | | `12` | `Peter` | `Jones` |

员工项目由员工标识符(ID_Employee)和项目标识符(ID_Project)描述,两者都是主外键(见表 9-2 )。

表 9-2。

The Employee_Project Database Table

| ID _ 员工`INTEGER` | ID _ 项目`INTEGER` | | --- | --- | | `10` | `110` | | `11` | `111` | | `11` | `112` | | `12` | `111` |

项目使用一个整数标识符(ID),这是一个主键,最多描述 50 个字符(表 9-3 )。

表 9-3。

The Project Database Table

| ID `INTEGER` | 描述`VARCHAR(50)` | | --- | --- | | `110` | `WebDesign` | | `111` | `CloudComputing` | | `112` | `DomainRegistration` |

直接映射定义了关系数据库中数据的 RDF 图表示[2]。直接映射将关系数据库(数据和模式)作为输入,并生成一个称为直接图的 RDF 图。在映射过程中,工作人员、项目以及它们之间的关系用 Turtle 语法用 RDF 表示(见清单 9-1 )。将逻辑表的每一行转换成零个或多个 RDF 三元组的规则被指定为三元组映射。从逻辑表中的一行生成的所有 RDF 三元组共享同一个主题。三元组映射由引用其他资源的资源表示。每个三元组映射只有一个rr:logicalTable属性,该属性的值代表指定要映射到 RDF 三元组的结构化查询语言(SQL)查询结果的逻辑表。三元组映射也正好有一个主题映射,它指定了为逻辑表的每一行生成主题所使用的技术,使用的是其值为主题映射的rr:subjectMap属性、 1 。三元组映射可能有可选的rr:predicateObjectMap属性,其值是为逻辑表的每个逻辑表行创建谓词-对象对的谓词-对象映射。谓词-对象映射指定的谓词映射-对象映射对可以与主题映射生成的主题一起使用,为每行创建 RDF 三元组。

Listing 9-1. Direct Mapping from RDB to RDF

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

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

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

@base <``http://example.com/base/

<TriplesMap1>

a rr:TriplesMap;

rr:logicalTable [ rr:tableName "\"Employee\""; ] ;

rr:subjectMap [ rr:template "http://example.com/employee/{\"\ID\"}"; ];

rr:predicateObjectMap

[

rr:preficate        ex:firstName ;

rr:objectMap    [ rr:column "\"FirstName\"" ]

];

rr:predicateObjectMap

[

rr:predicate        ex:lastName ;

rr:objectMap    [  rr:column "\"LastName\"" ]

]

<TripleMap2>

a rr:TriplesMap;

rr:logicalTable [ rr:tableName "\"Project\""; ] ;

rr:subjectMap [ rr:template "http://example.com/project/{\"\ID\"}"; ];

rr:predicateObjectMap

[

rr:preficate        ex:id ;

rr:objectMap    [ rr:column "\"ID\"" ]

];

rr:predicateObjectMap

[

rr:predicate        ex:description ;

rr:objectMap    [  rr:column "\"Description\"" ]

]

<linkMap_1_2>

a rr:TriplesMap;

rr:logicalTable [ rr:tableName "\"Employee_Project\""; ] ;

rr:subjectMap [ rr:template "http://example.com/employee/{\"\ID_Employee\"}"; ];

rr:predicateObjectMap

[

rr:preficate        ex:involvedIn ;

rr:objectMap    [ rr:template "http://example.com/project/{\"ID_Project\"}" ];

] .

R2RML 映射受软件工具支持,如 db2triples 软件库[3]、OpenLink Virtuoso [4]、RDF-RDB2RDF [5]、morph [6]和 Ultrawrap [7]。在这个例子中,结果是一组 RDF 三元组,描述了员工和他们参与的项目(表 9-4 )。

表 9-4。

The RDF Triples of the Output

| 科目 | 述语 | 目标 | | --- | --- | --- | | `

默认情况下,所有 RDF 三元组都在输出数据集的默认图中。然而,三元组映射可以包含将部分或全部三元组放入命名图中的图映射。

OWL-S 中对信用卡收费的语义 Web 服务过程

假设一个 Web 服务向一个有效的信用卡收费。在 OWL-S 中,Web 服务可以被建模为指定客户端如何与服务交互的过程。可以有任意数量的前提条件,这些条件都必须满足,才能成功调用流程。一个流程有零个或多个输入,代表在某些情况下流程执行所需的信息。一个流程可能有任意数量的输出,这些输出表示流程向请求者提供的信息。效果描述了该过程所依赖的真实世界条件。为了在 OWL-S 中描述信用卡收费过程,我们必须检查卡是否透支,这可以定义为一个原子过程(对期望一个消息并返回一个消息作为响应的服务的描述)。如果卡透支,应该显示失败。否则,如果卡可以被收费,则必须执行该过程。因此,流程的描述包括两个result元素:一个用于对卡收费,另一个用于错误处理程序(参见清单 9-2 )。

Listing 9-2. OWL-S Description of Charging a Credit Card [8]

<process:AtomicProcess rdf:ID="Purchase">

<process:hasInput>

<process:Input rdf:ID="ObjectPurchased" />

</process:hasInput>

<process:hasInput>

<process:Input rdf:ID="PurchaseAmt" />

</process:hasInput>

<process:hasInput>

<process:Input rdf:ID="CreditCard" />

</process:hasInput>

<process:hasOutput>

<process:Output rdf:ID="ConfirmationNum" />

</process:hasOutput>

<process:hasResult>

<process:Result>

<process:hasResultVar>

<process:ResultVar rdf:ID="CreditLimH">

<process:parameterType rdf:resource="&ecom;#Dollars" />

</process:ResultVar>

</process:hasResultVar>

<process:inCondition>

<expr:KIF-Condition>

<expr:expressionBody>

(and (current-value (credit-limit ?CreditCard)

?CreditLimH)

(>= ?CreditLimH ?purchaseAmt))

</expr:expressionBody>

</expr:KIF-Condition>

</process:inCondition>

<process:withOutput>

<process:OutputBinding>

<process:toParam rdf:resource="#ConfirmationNum" />

<process:valueFunction rdf:parseType="Literal">

<cc:ConfirmationNum xsd:datatype="&xsd;#string" />

</process:valueFunction>

</process:OutputBinding>

</process:withOutput>

<process:hasEffect>

<expr:KIF-Condition>

<expr:expressionBody>

(and (confirmed (purchase ?purchaseAmt) ?ConfirmationNum)

(own ?objectPurchased)

(decrease (credit-limit ?CreditCard)

?purchaseAmt))

</expr:expressionBody>

</expr:KIF-Condition>

</process:hasEffect>

</process:Result>

<process:Result>

<process:hasResultVar>

<process:ResultVar rdf:ID="CreditLimL">

<process:parameterType rdf:resource="&ecom;#Dollars" />

</process:ResultVar>

</process:hasResultVar>

<process:inCondition>

<expr:KIF-Condition>

<expr:expressionBody>

(and (current-value (credit-limit ?CreditCard)

?CreditLimL)

(< ?CreditLimL ?purchaseAmt))

</expr:expressionBody>

</expr:KIF-Condition>

</process:inCondition>

<process:withOutput rdf:resource="&ecom;failureNotice" />

<process:OutputBinding>

<process:toParam rdf:resource="#ConfirmationNum" />

<process:valueData rdf:parseType="Literal">

<drs:Literal>

<drs:litdefn xsd:datatype="&xsd;#string">00000000</drs:litdefn>

</drs:Literal>

</process:valueData>

</process:OutputBinding>

</process:withOutput>

</process:Result>

</process:hasResult>

</process:AtomicProcess>

过程产生的数据转换由输入和输出指定(hasInputhasOutput)。原子流程总是从客户端接收指定流程执行所需信息的输入。流程执行的结果是信用卡被充值,钱从账户中取出。本例中的效果描述了客户现在拥有该对象(own ?objectPurchased),并且信用卡账户中的金额已经减少(decrease (credit-limit ?CreditCard) ?purchaseAmt)。在实际应用中,此类服务通常会发送一张发票,其中包含或不包含交易成功的通知。信用卡交易有两种结果:一种是余额足够支付账单的情况,另一种是余额不足的情况。每个结果都可以通过进一步的绑定来扩充。

用 WSMO 建模旅行社 Web 服务

假设以下场景。Leslie 想预订一个热带假期的机票和酒店。虚构的 Dream Holidays 旅行社提供基于语义 Web 服务技术的娱乐和商务旅行服务。旅行社根据与服务提供商的合同安排机票预订和酒店预订(图 9-1 )。

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

图 9-1。

Travel agency modeling

该服务的目标可以描述为“为 Leslie 预订一个热带假期的航班和酒店房间。”后置条件是通过提供当前位置、目的地、支付方式和酒店名称来获得旅行预订(参见清单 9-3 )。

Listing 9-3. Defining the Service Goal

goal _"??http://www.example.com/successfulBooking

capability

postcondition

definedBy

?tripReservation memberOf tr#reservation[

customer hasValue fof#Leslie,

origin hasValue loc#adelaide,

destination hasValue loc#bali,

travel hasValue ?flight,

accommodation hasValue ?Hotel

payment hasValue tr#creditcard

] and

?flight[airline hasValue tr#staralliance] memberOf tr#flight and

?hotel[name hasValue "Tropical Paradise Hotel"] memberOf tr#hotel .

服务描述应该包含门票、酒店、便利设施等等。预先状态能力描述包括预订请求和先决条件,比如有效的信用卡(参见清单 9-4 )。

Listing 9-4. Pre-State Capability Description

capability DREAMHOLIDAYScapability

sharedVariables {?creditCard, ?initialBalance, ?item, ?passenger}

precondition

definedBy

?reservationRequest[

reservationItem hasValue ?item,

passenger hasValue ?passenger,

payment hasValue ?creditcard,

] memberOf tr#reservationRequest and

((?item memberOf tr#trip) or (?item memberOf tr#ticket)) and

?creditCard[balance hasValue ?initialBalance] memberOf po#creditCard.

assumption

definedBy

po#validCreditCard(?creditCard) and

(?creditCard[type hasValue po#visa] or ?creditCard[type hasValue po#mastercard]).

后状态能力描述包括后条件、保留价格和信用卡的最终价值(参见清单 9-5 )。

Listing 9-5. Post-State Capability Description

postcondition

definedBy

?reservation[

reservationItem hasValue ?item,

customer hasValue ?passenger,

payment hasValue ?creditcard

] memberOf tr#reservation .

assumption

definedBy

reservationPrice(?reservation, "AUD", ?tripPrice) and

?finalBalance= (?initialBalance - ?ticketPrice) and

?creditCard[po#balance  hasValue  ?finalBalance] .

使用 Jena 的 RDF API 查询 DBpedia

如前所述,Apache Jena 使用 ARQ 引擎来处理 SPARQL 查询。ARQ API 类可以在com.hp.hpl.jena.query中找到。ARQ 的核心类是Query,它代表一个 SPARQL 查询;Dataset,在那里执行查询;QueryFactory,用于从 SPARQL 字符串生成Query对象;QueryExecution,提供查询执行的方法;ResultSet,包含从执行的查询中获得的结果;和QuerySolution,代表一行查询结果。如果该查询有多个答案,将返回一个包含QuerySolutionsResultSet

要从 Jena 查询 DBpedia,您可以使用QueryFactoryQueryExecutionFactory. QueryFactory has create()方法来读取文本查询并返回一个带有解析查询的Query对象。QueryExecutionFactory创建一个QueryExecution来以QueryExecutionFactory.sparqlService(String service,Query query)的形式通过 HTTP 访问 SPARQL 服务,其中service是一个表示 SPARQL 服务的字符串。您可以创建一个到 DBpedia 的 SPARQL 服务的测试连接,如清单 9-6 所示。

Listing 9-6. Test Connection to DBpedia’s SPARQL Endpoint

import com.hp.hpl.jena.query.QueryExecution;

import com.hp.hpl.jena.query.QueryExecutionFactory;

import com.hp.hpl.jena.sparql.engine.http.QueryExceptionHTTP;

public class QueryTest {

public static void main(String[] args) {

String service = "http://dbpedia.org/sparql";

String query = "ASK { }";

QueryExecution qe = QueryExecutionFactory.sparqlService(service, query);

try {

if (qe.execAsk()) {

System.out.println(service + " is UP");

}

} catch (QueryExceptionHTTP e) {

System.out.println(service + " is DOWN");

} finally {

qe.close();

}

}

}

如您所见,service字符串包含 DBpedia 的 SPARQL 端点。现在,运行一个查询来检索出生在艾森纳赫的人。为了实现这一点,您需要一个SELECT SPARQL 查询来搜索 person 对象中的dbo:birthPlace: Eisenach,如清单 9-7 所示。

Listing 9-7. A SPARQL Query to Run on DBpedia from Jena

String service="http://dbpedia.org/sparql";

String query="PREFIX dbo:<http://dbpedia.org/ontology/>"

+ "PREFIX : <http://dbpedia.org/resource/>"

+ "PREFIX foaf:<http://xmlns.com/foaf/0.1/>"

+ "select ?person ?name where {?person dbo:birthPlace : Eisenach."

+ "?person foaf:name ?name}";

QueryExecution qe=QueryExecutionFactory.sparqlService(service, query);

ResultSet rs=qe.execSelect();

while (rs.hasNext()){

QuerySolution s=rs.nextSolution();

Resource r=s.getResource("?person");

Literal name=s.getLiteral("?name");

System.out.println(s.getResource("?person").toString());

System.out.println(s.getLiteral("?name").getString());

}

结果应该包含出生在埃森纳赫的人,如约翰·塞巴斯蒂安·巴赫。

摘要

在这一章中,你分析了四个复杂的语义网例子。您了解了如何将关系数据库表映射到 RDF,如何用 OWL-S 描述流程,如何在 WSMO 建模语义 Web 服务,以及如何从 Apache Jena 以编程方式查询 LOD 数据集。

通过阅读这本书,你现在理解了基于图论和知识表示的核心语义网概念和数学背景。您了解了如何使用来自 Schema.org、DBpedia、GeoNames 和 Wikidata 的机器可读元数据来注释您的网站标记,以提高网站在搜索引擎结果页面上的性能。现在,你可以使用基于 vCard 的 hCard、Schema.org FOAF 和 DBpedia 编写高级的机器可读的个人描述。您已经了解了如何发布带有语义的组织数据,以覆盖更广泛的受众,包括针对您的公司、产品、服务和事件的 HTML5 微数据或 JSON-LD 注释,供 Google 考虑包含在知识图中。您知道如何将结构化数据序列化为 HTML5 微数据、RDF/XML、Turtle、Notation3 和 JSON-LD,以及如何用 RDFS 和 OWL 创建机器可读的词汇和本体。您已经学会了为开放数据和开放知识计划做出贡献,并且知道如何发布自己的 LOD 数据集。您知道如何为语义 Web 应用开发设置编程环境,并使用流行的 API 和软件库(如 Apache Jena 和 Sesame)用 Java、Ruby 和 JavaScript 编写程序。您还学习了如何在 triplestores 和 quadstores 中存储和操作数据,并熟悉了最流行的图数据库,如 AllegroGraph 和 Neo4j。你能够用 OWL-S、WSDL、WSML 和 WS-BPEL 来描述和建模语义 Web 服务。您可以在大型 LOD 数据集上运行复杂的 SPARQL 查询,如 DBpedia 和 Wikidata,甚至可以使用您自己的易于访问的 OpenLink Virtuoso、Fuseki 或 4store SPARQL 端点来鼓励数据重用。最后,您了解了利用语义网技术的大数据应用,如谷歌知识库、脸书社交图、IBM Watson 和世界上最大图书馆的链接数据服务。

参考

Das, S., Sundara, S., Cyganiak, R. (eds.) (2012) R2RML Processors and Mapping Documents. In: R2RML: RDB to RDF Mapping Language. www.w3.org/TR/r2rml/#dfn-r2rml-mapping. Accessed 1 May 2015.   Arenas, A., Bertails, A., Prud’hommeaux, E., Sequeda, J. (eds.) (2012) Direct Mapping of Relational Data to RDF. www.w3.org/TR/rdb-direct-mapping/ . Accessed 1 May 2015.   Antidot (2015) db2triples. https://github.com/antidot/db2triples . Accessed 1 May 2015.   OpenLink Software (2015) Virtuoso Universal Server. http://virtuoso.openlinksw.com . Accessed 1 May 2015.   Inkster, T. (2015) RDF-RDB2RDF—map relational database to RDF declaratively. https://metacpan.org/release/RDF-RDB2RDF . Accessed 1 May 2015.   Calbimonte, J.-P. (2015) morph. https://github.com/jpcik/morph . Accessed 1 May 2015.   Capsenta (2015) Ultrawrap. http://capsenta.com . Accessed 1 May 2015.   Martin, D. et al. (2004) Service Profiles. In: OWL-S: Semantic Markup for Web Services. www.w3.org/Submission/OWL-S/ . Accessed 1 May 2015.   Footnotes 1

或者,也可以使用rr:subject常量快捷方式属性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值