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

借助语义技术构建 Wikipedia 查询表单 -4 应用程序二:专辑、艺人及发行日期

借助语义技术构建 Wikipedia 查询表单 -4 应用程序二:专辑、艺人及发行日期

您的 HTML 和 CSS 技能可以帮助您构建一个比我的 commonActors 外观更光鲜的应用程序。当然所创建的应用程序不仅要外观漂亮,而且还要能做更多的事情,请注意上面 SPARQL 查询中的 SELECT 语句查找的只是所匹配模式的一条信息:演员的名字。典型的 SPARQL 查询,像典型的 SQL 查询一样,查找的信息要更多,并且当这个用您的托管语言(上个例子中用的是 Python)编写的程序遍历所检索到的查询结果时,它应该可以对这些检索到的信息做各种各样有趣的操作。
真正的潜力在于越来越广泛的可用数据的选择。除了 linkedmdb.org 外,您还可以找到其他的公共 SPARQL 端点,为您提供对更广泛数据的访问。
SPARQL 数据集中规模最大也最受欢迎的当属 ,它来源于社区,旨在从 Wikipedia “Infoboxes”(很多 Wikipedia 页面右侧的灰色框中的信息)提取结构化数据并将其存储起来以便您能够用 SPARQL 查询对之进行检索。
在听音乐时,我经常会想要知道某个特定专辑发布的时间,因此我编写了这个 simpleAlbumQuery 应用程序来便于我查找这些信息。(事实上,我在编写本文的第一篇草稿时,就一直在听 Duke Ellington 的歌曲选集,当听到 Diana Krall 对 “I'm Just a Lucky So and So” 的翻唱版本时,我就可以在  上查找关于她的信息,这里存有我的应用程序的一个副本。您也可以自己尝试一下!)在本文随附的 zip 文件以及 commonActors.html 文件、commonActors.cgi 文件和它们所使用的 simple.css 样式表内,都可以找到一个 simpleAlbumQuery.html    Web 页面文件和 simpleAlbumQuery.cgi Python CGI 脚本(参见 。)
对于这个 simpleAlbumQuery 应用程序, 给出了相应的 HTML 表单,该表单具有两个字段,用来将 artist 和 album 参数传递给 Python    CGI 脚本。(查看 。)
图 2. SimpleAlbumQuery 应用程序的输入表单该表单包含一些建议查询供用户参考。除了填写表单上的建议值之外,用户还可以单击其中的一个 try it 链接。比如,单击第二个 try it 链接会激活 URL http://www.snee.com/sparqlforms/ ... cgi?artist=&album=Fillmore,它具有与在第一个表单字段中不输入内容、在第二个字段内输入 Fillmore 然后单击 search 按钮同样的效果:调用 simpleAlbumQuery.cgi 脚本,传递一个空字符串作为艺人值、Fillmore 作为专辑值。
给出了示例    Fillmore 查询的前三项结果。做少许 CSS 处理使其看上去更好看一些,它包括了专辑的封面图以及指向这些专辑 Wikipedia 页面的专辑名称链接。(在返回的结果中向下滚动将会看到 Miles Davis 1970 年在 Fillmore 的两张专辑。如果这场演出与图 3 中第三行所列的 Neil Young 和 Crazy Horse 是同一场演出,那真是链接数据的一个意外惊喜 — 并且这场演出一定很棒。)
图 3. artist = "" and album = "Fillmore" 查询所返回的前三项结果除了进行一些字符串处理来格式化所返回的某些文本之外,simpleAlbumQuery.cgi 与 commonActors.cgi 只有两个显著不同:
  • 查询发送至不同的目标,所以将一个不同的 URL http://dbpedia.org/sparql(DBpedia 的 SPARQL 端点 URL)发送给 SPARQLWrapper 创建方法。
  • queryString 变量存储的是用来索求不同信息的不同查询,所以为了针对 simpleAlbumQuery 应用程序用户定制查询,需要从 HTML 表单向其传递不同的值。
详细查看  中的这个查询。(DBpedia 具有其自己的 SNORQL 表单以便直接在  输入查询,此查询不会像所展示的这样工作,因为它具有 ARTIST-STRING 和 ALBUM-TITLE-STRING 两个占位符字符串,与 commonActors 应用程序中的 DIR1-NAME 和 DIR2-NAME 一样,在查询被发送至 SPARQL 端点服务器之前,二者将会被替代。)
清单 6. 针对 albumQuery 应用程序的 SPARQL 查询
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
PREFIX dbpedia2: <http://dbpedia.org/property/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>

SELECT DISTINCT ?artistName ?album
    ?wpURL ?releaseDate ?coverURL
WHERE {
  ?s dbpedia2:artist   ?artist;
     dbpedia2:name     ?album;
     foaf:page         ?wpURL;
     dbpedia2:released ?releaseDate;
     dbpedia2:cover    ?coverURL.
  ?artist rdfs:label   ?artistName.

  FILTER (regex(?artistName, "ARTIST-STRING")).
  FILTER (regex(?album, "ALBUM-TITLE-STRING")).
  FILTER (lang(?artistName) = "en").
}
LIMIT 30




对应于 Wikipedia 页面的 DBpedia 项各自具有一个 URI 标识符,并具有与其相关的若干信息。其中包括针对专辑的信息项,所以此查询所查找的是一个专辑的艺人标识符、专辑名、Wikipedia URL,以构建  中的链接、发布日期以及封面 URL 以便在输出中显示图像。有了艺人标识符后,因为想要显示给用户的是易于用户读懂的人名,而非这个 URI 标识符,所以此查询还会请求获得与该艺人标识符相关的 rdfs:label。
那么查询又是如何指定所需的专辑呢?通过使用 SPARQL 的 FILTER 关键字来表明我们只想获得与所指定的模式相匹配的艺人名和专辑名。对于 commonActors 应用程序,查询所具有的 dummy 字符串在 CGI 脚本被发送至 SPARQL 端点之前就会被此 CGI 脚本替代。由于 DBpedia 可以存储艺人的多个名字(在不同语言中,艺人的名字不同),因此需要用第三个 FILTER 语句来表明只需要艺人的英文名字。
为了不加重 DBpedia 服务器的负担,此查询还包括了一个 LIMIT 30 语句以防止它检索太多数据。比如,如果 simpleAlbumQuery 应用程序的一个用户输入了字母 “a” 作为专辑的标题,而保留 artist 字段空白,那么此查询会向 DBpedia 查找其数据库中标题中含有字母 “a” 的来自任何艺人的所有专辑,这样就会搜索大量的数据。
如果查阅 simpleAlbumQuery.cgi 和 simpleAlbumQuery.html 中除 SPARQL 查询之外的其他部分,就不难发现其中的代码与 commonActors 文件中相应的代码是对等的。
返回列表