首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

借助语义技术构建 Wikipedia 查询表单 -2 应用程序一:数据库和查询

借助语义技术构建 Wikipedia 查询表单 -2 应用程序一:数据库和查询

第一个应用程序自动化针对特定数据库的查询递送以及对所返回数据的格式化,我们不妨从其数据库和查询开始。 (IMDb) 内包含大量有关已经制作完毕的所有英文影片的信息,它不接受您对信息的查询。比如,如果我想知道有无演员既出现在由 Sofia Coppola 执导的电影,又出现在由她的父亲 Francis Ford Coppola 导演的电影中时,我必须要访问六个 IMDb Web 页面来获得由 Sofia 执导的电影,访问 32 个页面来获得由她父亲执导的电影,然后手动整理演员列表,然后进行交叉比对。
所幸的是,linkedmdb.org 的  提供了一个包含电影信息的数据库,可接受 SPARQL  查询。比如, 中的查询就是要让它列出所有由 Sofia Coppola 执导的电影名:
清单 1. 查询由 Sofia Coppola 执导的电影
1
2
3
4
5
6
7
8
PREFIX m: <http://data.linkedmdb.org/resource/movie/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>

SELECT ?filmTitle WHERE {
  ?film rdfs:label ?filmTitle.
  ?film m:director ?dir.
  ?dir  m:director_name "Sofia Coppola".
}




SPARQL 被设计用来查询以 RDF 数据模型表示的数据,这种数据模型用一个三元组来表示数据,每个三元组都具有一个主语、一个谓语和一个宾语。有时,为了方便,不妨将其看成是条目、属性名、属性和值。例如,比方说有这样的三元组,其描述可以是:“ID 为 http://data.linkedmdb.org/resource/director/7764 的条目的 director_name 值为 ‘Sofia Coppola’。”
在 SPARQL 内,变量以问号开头。上述查询使用的是三元组,并且变量插在特定位置来描述想要返回的电影标题需要满足的三个条件:
  • RDF 使用 URI 作为标识符,但我们希望此数据库检索可读懂的电影标题。在此查询内,?film 变量代表的是电影的 URI 标识符。电影的 ?filmTitle 是一个 rdfs:label,而这正是查询在 SELECT 语句所要寻找的。rdfs:label 谓语以 RDF Schema 标准定义,而查询第二行中的名称空间声明所描述的恰好就是 rdfs 前缀所指代的内容。
  • 电影导演的标识符是 ?dir。
  • 由于 ?dir 代表的是导演的 URI 标识符,而我们想要的是导演的实际姓名,因此查询要求获得 m:director_name 值为 Sofia Coppola 的 ?dir。此查询开始处的另一个名称空间声明表明 m 前缀所指代的是什么。我之所以知道 director_name 是可以使用的正确的谓词名称,是因为在编写这个查询之前,我已经查找过 linkedmdb.org 数据使用过的名称了,正如我在创建 XQuery 或 SQL 查询之前,先查证 XML 或 RDBMS 模式使用的名称一样。若想对此进行深入了解,可以从任何一个 SPARQL 端点借助一个简单的 SPARQL 查询,这个查询的基本意思应该是 “为我显示在所有的三元组中可用的所有谓词,但不能重复”:
1
SELECT DISTINCT ?p WHERE {?s ?p ?o}




很多 SPARQL 端点,包括 linkedmdb.org 上的这个,都会提供基于表单的界面来尝试使用 SPARQL 查询。若访问它们的 ,粘贴进上述两个查询中的任何一个,并单击 Go!,应该会看到由 Sofia Coppola 执导的电影的一个列表。(如果默认 Results: 设置无法工作,可以尝试其他的设置,特别是 JSON 格式的,这也是在我们的应用程序中将要使用的格式。)
所示的是另一个可在 linkedmdb.org 的 SNORQL 表单上尝试使用的查询。这个查询会列出在 Sofia Coppola 执导的电影中出现的所有演员:
清单 2. 检索演员的查询
1
2
3
4
5
6
7
8
9
10
PREFIX m: <http://data.linkedmdb.org/resource/movie/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>

SELECT ?actorName ?filmTitle WHERE {
  ?film rdfs:label ?filmTitle;
        m:director ?dir;
        m:actor ?actor.
  ?dir  m:director_name "Sofia Coppola".
  ?actor m:actor_name ?actorName.
}




除了查询她执导的电影的标题之外,此查询还会查询每部电影中的演员 — 或更甚者,查询符合每部电影演员标识符的演员的姓名。在您的第一个查询(以及大多数的    SPARQL 查询)中,使用的是 URI 来标识您想要查找的数据,但是在输出时列出的却是与这些 URI 相关的可被人读懂的标签。这非常类似于 SQL 查询使用产品 ID 值来交叉比对产品,而实际输出时却使用的是产品名称。
此查询还引入了一些 SPARQL 的简略表述方式。它没有拼写出三个完整的三元组来表达希望得到与每部电影相关的标题、导演和演员数据,相反,它使用分号来表示谓语/宾语对 m:director ?dir 和 m:actor ?actor 与主语 ?film 的关系,正如谓语/宾语对 rdfs:label ?filmTitle 所做的一样。
返回列表