新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     >>W3CHINA.ORG讨论区<<     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论Semantic Web(语义Web,语义网或语义万维网, Web 3.0)及相关理论,如:Ontology(本体,本体论), OWL(Web Ontology Langauge,Web本体语言), Description Logic(DL, 描述逻辑),RDFa,Ontology Engineering等。
    [返回] W3CHINA.ORG讨论区 - 语义网·描述逻辑·本体·RDF·OWLW3CHINA.ORG讨论区 - Web新技术讨论『 Semantic Web(语义Web)/描述逻辑/本体 』 → 借助语义技术构建 Wikipedia 查询表单 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 11909 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: 借助语义技术构建 Wikipedia 查询表单 举报  打印  推荐  IE收藏夹 
       本主题类别: RDF/RDFS    
     admin 帅哥哟,离线,有人找我吗?
      
      
      
      威望:9
      头衔:W3China站长
      等级:计算机硕士学位(管理员)
      文章:5255
      积分:18406
      门派:W3CHINA.ORG
      注册:2003/10/5

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给admin发送一个短消息 把admin加入好友 查看admin的个人资料 搜索admin在『 Semantic Web(语义Web)/描述逻辑/本体 』的所有贴子 点击这里发送电邮给admin  访问admin的主页 引用回复这个贴子 回复这个贴子 查看admin的博客楼主
    发贴心情 借助语义技术构建 Wikipedia 查询表单

    借助语义技术构建 Wikipedia 查询表单

    创建简单的 Web 表单,促使语义 Web 标准查询利用让人兴奋的新数据库

    Bob DuCharme, 解决方案架构师, IBM  
    Bob DuCharme 是 TopQuadrant 的一位解决方案构架师,TopQuadrant 是一家语义 Web 应用程序建模、 开发和部署软件提供商。它撰写了 4 部关于信息及技术的图书,还在网上发表和印刷出版了近百篇相关文章,而在任何这些作品中从未使用过 “功能” 的概念。他的博客地址为:http://www.snee.com/bobdc.blog。

    简介: 通过提供对大量 Linked Data 的开放访问,公共的 SPARQL 端点为您的应用程序提供了很棒的数据,进而推动了语义 Web 的发展。正如很多其他受数据驱动的 Web 站点一样,可以通过向这些端点发送一个查询、然后再将结果包装在 HTML 标签内的方式创建一个 Web 页面;SPARQL 端点的一个与众不同之处在于这些新数据是公开可用的,可用在您的应用程序中。本文展示了如何通过简单的 CGI 脚本从两个不同的 SPARQL 端点获得数据并构建应用程序以解答用户的两个问题:在两个导演的电影中都出现过的演员有哪些以及哪些艺人发布过哪些专辑。


    常用缩写词
    CSS:级联样式表(Cascading stylesheet)
    CGI:通用网关接口(Common Gateway Interface)
    HTML:超文本标记语言(Hypertext Markup Language)
    HTTP:超文本转换协议(Hypertext Transfer Protocol)
    JSON:JavaScript Object Notation
    RDBMS:关系型数据库管理系统(Relational Database Management System)
    RDF:资源描述框架(Resource Description Framework)
    REST:具象状态转换(Representational State Transfer)
    SPARQL:SPARQL Protocol and RDF Query Language
    URI:统一资源标识符(Uniform Resource Identifier)
    URL:统一资源定位符(Uniform Resource Locator)
    XML:可扩展标记语言(Extensible Markup Language)
    SPARQL 端点通过查询提供了对数据库的访问,而这些查询使用的是 W3C 标准的 SPARQL 查询语言。越来越多的这类数据出现在公共 internet 上,应用程序可以检索和使用这类数据,方式与检索和使用关系型数据库数据一样。了解了 SPARQL 之后,您就可以将这种语言的查询融入到应用程序内,使其不再类似于您以前所编写的那些应用程序,您(以及在您编写了这些应用程序后获得的用户)将能够访问所有类型的新数据。

    本文将讨论两个应用程序的示例,它们可以显示用户友好的表单、查询数据库的 SPARQL 端点并给出结果,而这一切都不要求表单用户知道递送该数据所用的技术和标准。本文所附的 zip 文件包含了所有示例文件,请参见 [URL=http://www.ibm.com/developerworks/cn/xml/x-wikiquery/#download]下载[/URL]。第一个应用程序允许指定两个电影导演,然后检索出现在二者所执导电影中的所有演员的姓名;第二个应用程序检索有关艺人专辑的信息。

    对于诸多受数据驱动的 Web 站点,这两个应用程序的基本架构均遵循如下模式:

    用户在 Web 表单内输入一个或多个查询条件并单击 Submit
    表单将所输入的值传递给一个 CGI 脚本。
    这个 CGI 脚本将这些值插入查询并将此查询发送到数据库服务器。
    此服务器将查询结果返回给 CGI 脚本,该脚本围绕所返回的数据构建一个 HTML 页面并将页面发送至用户的浏览器。
    这一模式与 CGI 脚本一样古老。惟一让其出新意之处是这次使用的查询语言是 SPARQL,而非为人熟知的 SQL。更让人兴奋的是,虽然 Internet 上供应用程序自由查询的 SQL 数据库为数不多,但是通过 SPARQL 接口(又称 SPARQL 端点)可用的大型数据库越来越多。实际上,这些 SPARQL 端点通常都是一些添加到现有关系型数据库的额外接口。除了出现在公共 internet 上的 SPARQL 端点之外,其他的 SPARQL 端点均出现在企业防火墙背后以减轻对企业数据的跨部门查询。

    应用程序一:数据库和查询

    第一个应用程序自动化针对特定数据库的查询递送以及对所返回数据的格式化,我们不妨从其数据库和查询开始。Internet Movie Database (IMDb) 内包含大量有关已经制作完毕的所有英文影片的信息,它不接受您对信息的查询。比如,如果我想知道有无演员既出现在由 Sofia Coppola 执导的电影,又出现在由她的父亲 Francis Ford Coppola 导演的电影中时,我必须要访问六个 IMDb Web 页面来获得由 Sofia 执导的电影,访问 32 个页面来获得由她父亲执导的电影,然后手动整理演员列表,然后进行交叉比对。

    所幸的是,linkedmdb.org 的 Linked Movie Database 提供了一个包含电影信息的数据库,可接受 SPARQL 查询。比如,[URL=http://www.ibm.com/developerworks/cn/xml/x-wikiquery/#list1]清单 1[/URL] 中的查询就是要让它列出所有由 Sofia Coppola 执导的电影名:


    清单 1. 查询由 Sofia Coppola 执导的电影
        
    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 查询,这个查询的基本意思应该是 “为我显示在所有的三元组中可用的所有谓词,但不能重复”:
    SELECT DISTINCT ?p WHERE {?s ?p ?o}


    很多 SPARQL 端点,包括 linkedmdb.org 上的这个,都会提供基于表单的界面来尝试使用 SPARQL 查询。若访问它们的 SNORQL 表单,粘贴进上述两个查询中的任何一个,并单击 Go!,应该会看到由 Sofia Coppola 执导的电影的一个列表。(如果默认 Results: 设置无法工作,可以尝试其他的设置,特别是 JSON 格式的,这也是在我们的应用程序中将要使用的格式。)

    [URL=http://www.ibm.com/developerworks/cn/xml/x-wikiquery/#list2]清单 2[/URL] 所示的是另一个可在 linkedmdb.org 的 SNORQL 表单上尝试使用的查询。这个查询会列出在 Sofia Coppola 执导的电影中出现的所有演员:


    清单 2. 检索演员的查询
        
    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 所做的一样。


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


    构建应用程序

    第一个应用程序的目的是为了体现 linkedmdb.org 数据库和 SPARQL 查询语言的益处,而将实际的查询和 URI 对应用程序的用户隐藏起来。就上述系统的基础架构而言,

    应用程序用户利用 [URL=http://www.ibm.com/developerworks/cn/xml/x-wikiquery/#fig1]图 1[/URL] 所示的表单输入两个导演的名字。

    图 1. commonActors 应用程序的输入表单
    按此在新窗口浏览图片


    表单将这两个导演的名字传递给 commonActors.cgi CGI 脚本。
    CGI 脚本将这两个导演的名字插入 SPARQL 查询并将此查询发送至位于 http://data.linkedmdb.org/sparql 的 linkedmdb.org SPARQL 端点。
    SPARQL 端点返回 JSON 版本的结果,CGI 脚本围绕所返回的数据构建一个 HTML 页面并将页面发送至用户的浏览器。
    [URL=http://www.ibm.com/developerworks/cn/xml/x-wikiquery/#list3]清单 3[/URL] 所示的这个 SPARQL 查询将被发送并硬编码,以索询有关 Sofia 和 Francis Ford Coppola 的信息:


    清单 3. SPARQL 查询用来列出 Sofia 和 Francis Ford Coppola 电影中共用的演员
        
    PREFIX m: <http://data.linkedmdb.org/resource/movie/>
    SELECT DISTINCT ?actorName WHERE {

      ?dir1     m:director_name "Sofia Coppola".

      ?dir2     m:director_name "Francis Ford Coppola".

      ?dir1film m:director ?dir1;
                m:actor ?actor.

      ?dir2film m:director ?dir2;
                m:actor ?actor.

      ?actor    m:actor_name ?actorName.
    }


    如果将这个查询粘贴至 linkedmdb.org 的 SNORQL 接口,您将发现只有 Kathleen Turner 曾出现在由这两位导演各自执导的电影中。

    存储于 commonActors.html 文件内的 Web 输入表单(您可以在 http://www.snee.com/sparqlforms/commonActors.html 自己进行尝试)将所输入的导演姓名分别分配给变量 dir1 和 dir2,而这二者又被传递给 commonActors.cgi 脚本。


    清单 4. commonActors 应用程序的 Web 输入表单
        
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <title>Find common actors between two directors</title>
        <link href="simple.css" type="text/css" rel="stylesheet" />
      </head>
      <body>
        <h1>Find common actors between two directors</h1>
        <form action="commonActors.cgi" method="get">

          <p>Enter the "official" name of each director (check
          <a href="http://www.imdb.com">IMDB</a> if you're not sure)
          and click "Search" to list actors who have appeared in movies by
          both directors.</p>
          <p>
            <input type="text" name="dir1"/>
            <input type="text" name="dir2"/>
            <input type="submit" value="search"/>
          </p>

        </form>
      </body>
    </html>


    SPARQL 端点的一个妙处是:通过一个基于 REST 的 HTTP 接口,您可以与所有端点通信,但 Web 搜索应该提供一个针对您采用的编程语言的更为简单的接口。我用 Python 编写 commonActors.cgi CGI 脚本并使用 SPARQLWrapper 库来简化查询的发送和对结果的解包。


    清单 5. commonActors 应用程序的 Python 脚本
        
    #!/usr/local/bin/python

    import sys
    sys.path.append('/usr/home/bobd/lib/python/') # needed for hosted version
    from SPARQLWrapper import SPARQLWrapper, JSON
    import string
    import urllib
    import cgi

    def main():
      form = cgi.FieldStorage()
      dir1name = form.getvalue('dir1')
      dir2name = form.getvalue('dir2')

      sparql = SPARQLWrapper("http://data.linkedmdb.org/sparql")
      queryString = """

    PREFIX m: <http://data.linkedmdb.org/resource/movie/>
    SELECT DISTINCT ?actorName WHERE {

      ?dir1     m:director_name "DIR1-NAME".
      ?dir2     m:director_name "DIR2-NAME".
      ?dir1film m:director ?dir1;
                m:actor ?actor.

      ?dir2film m:director ?dir2;
                m:actor ?actor.

      ?actor    m:actor_name ?actorName.
    }
      """

      queryString = queryString.replace("DIR1-NAME",dir1name)
      queryString = queryString.replace("DIR2-NAME",dir2name)

      sparql.setQuery(queryString)
      sparql.setReturnFormat(JSON)

      try:
        ret = sparql.query()
        results = ret.convert()
        requestGood = True
      except Exception, e:
        results = str(e)
        requestGood = False

      print """Content-type: text/html

        <html>
          <head>
            <title>results</title>
              <link href="simple.css" type="text/css" rel="stylesheet" />
          </head>
          <body>
    """

      if requestGood == False:
        print "<h1>Problem communicating with the server</h1>"
        print "<p>" + results + "</p>"
      elif (len(results["results"]["bindings"]) == 0):
          print "<p>No results found.</p>"

      else:
        for result in results["results"]["bindings"]:
          print "<p>" + result["actorName"]["value"] + "</p>"

      print "</body></html>"

    main()


    其中的 sys.path.append 行是必需的,因为当我在一个托管服务上运行上述脚本时,我要用它来告诉托管 Python 编译器我将 SPARQLWrapper 与 JSON 库安装在了什么位置,因为标准的 Python 发行版并不包含 SPARQLWrapper 与 JSON 库。

    在导入了这些必需的库并保存了来自 HTML 表单并以 dir1name 与 dir2name 变量传递而来的导演名字值后,此脚本会设置 SPARQL 查询并将其发送给 SPARQL 端点。在创建 SPARQLWrapper 对象(存储于脚本的 sparql 对象中)时,此端点会被一个作为实参传递来的 URL 标识。

    保存在 queryString 变量中的查询类似于前面用来索询同时出现在两个导演执导影片中的演员的那个查询,只有一点除外,即在 queryString 变量创建后,DIR1-NAME 和 DIR2-NAME 字符串被 dir1name 和 dir2name 值替代。

    在设置了查询字符串和确定了将数据作为 JSON 返回的格式后,try/except 块就会将查询发送给服务器并设置一个 requestGood 变量以指示请求是否成功。在输出了 HTML 页面头后,此脚本的输出有如下三种情况:

    如果请求不成功,输出一个简单的错误消息。
    如果查询没有错误,但却未找到结果,就会输出一个 “No results found” 消息。
    每个演员的名字,作为单一一个 HTML 段落。
    脚本的末尾输出 HTML 页面的 body 和 html 元素。


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


    应用程序二:专辑、艺人及发行日期

    您的 HTML 和 CSS 技能可以帮助您构建一个比我的 commonActors 外观更光鲜的应用程序。当然所创建的应用程序不仅要外观漂亮,而且还要能做更多的事情,请注意上面 SPARQL 查询中的 SELECT 语句查找的只是所匹配模式的一条信息:演员的名字。典型的 SPARQL 查询,像典型的 SQL 查询一样,查找的信息要更多,并且当这个用您的托管语言(上个例子中用的是 Python)编写的程序遍历所检索到的查询结果时,它应该可以对这些检索到的信息做各种各样有趣的操作。

    真正的潜力在于越来越广泛的可用数据的选择。除了 linkedmdb.org 外,您还可以找到其他的公共 SPARQL 端点,为您提供对更广泛数据的访问。

    SPARQL 数据集中规模最大也最受欢迎的当属 DBpedia,它来源于社区,旨在从 Wikipedia “Infoboxes”(很多 Wikipedia 页面右侧的灰色框中的信息)提取结构化数据并将其存储起来以便您能够用 SPARQL 查询对之进行检索。

    在听音乐时,我经常会想要知道某个特定专辑发布的时间,因此我编写了这个 simpleAlbumQuery 应用程序来便于我查找这些信息。(事实上,我在编写本文的第一篇草稿时,就一直在听 Duke Ellington 的歌曲选集,当听到 Diana Krall 对 “I'm Just a Lucky So and So” 的翻唱版本时,我就可以在 http://www.snee.com/sparqlforms/simpleAlbumQuery.html 上查找关于她的信息,这里存有我的应用程序的一个副本。您也可以自己尝试一下!)在本文随附的 zip 文件以及 commonActors.html 文件、commonActors.cgi 文件和它们所使用的 simple.css 样式表内,都可以找到一个 simpleAlbumQuery.html Web 页面文件和 simpleAlbumQuery.cgi Python CGI 脚本(参见 [URL=http://www.ibm.com/developerworks/cn/xml/x-wikiquery/#download]下载[/URL]。)

    对于这个 simpleAlbumQuery 应用程序,[URL=http://www.ibm.com/developerworks/cn/xml/x-wikiquery/#fig2]图 2[/URL] 给出了相应的 HTML 表单,该表单具有两个字段,用来将 artist 和 album 参数传递给 Python CGI 脚本。(查看 放大图。)


    图 2. SimpleAlbumQuery 应用程序的输入表单
    按此在新窗口浏览图片

    该表单包含一些建议查询供用户参考。除了填写表单上的建议值之外,用户还可以单击其中的一个 try it 链接。比如,单击第二个 try it 链接会激活 URL http://www.snee.com/sparqlforms/simpleAlbumQuery.cgi?artist=&album=Fillmore,它具有与在第一个表单字段中不输入内容、在第二个字段内输入 Fillmore 然后单击 search 按钮同样的效果:调用 simpleAlbumQuery.cgi 脚本,传递一个空字符串作为艺人值、Fillmore 作为专辑值。

    [URL=http://www.ibm.com/developerworks/cn/xml/x-wikiquery/#fig3]图 3[/URL] 给出了示例 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 表单向其传递不同的值。
    详细查看 [URL=http://www.ibm.com/developerworks/cn/xml/x-wikiquery/#list6]清单 6[/URL] 中的这个查询。(DBpedia 具有其自己的 SNORQL 表单以便直接在 http://dbpedia.org/snorql/ 输入查询,此查询不会像所展示的这样工作,因为它具有 ARTIST-STRING 和 ALBUM-TITLE-STRING 两个占位符字符串,与 commonActors 应用程序中的 DIR1-NAME 和 DIR2-NAME 一样,在查询被发送至 SPARQL 端点服务器之前,二者将会被替代。)


    清单 6. 针对 albumQuery 应用程序的 SPARQL 查询
        
    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=http://www.ibm.com/developerworks/cn/xml/x-wikiquery/#fig3]图 3[/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 文件中相应的代码是对等的。


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


    结束语

    若您发现一个 SPARQL 端点具有对您或您的用户有用的数据,您就可以基于本文中介绍的这两个应用程序的结构来创建自己的 HTML 表单和 CGI 脚本,然后构建一个使用该数据的应用程序。每当看到 Wikipedia Infobox,想象一下您也能够创建一个像 commonActors 或 simpleAlbumQuery 这样的应用程序来使用该数据,这真是有趣。并且,除了不断扩大的 W3C 的 SPARQL 端点列表 包含的这几个与音乐信息相关的数据库之外,您还可以找到很多其他的数据库,尤其是在文学、生物和医药领域。更进一步而言,应用程序完全可以从多个端点检索数据并由这些数据构建新的东西,创建更复杂更有趣的应用程序。只要敢想,没有什么不可能。


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


    下载

    描述 名字 大小 下载方法
    本文的示例 Python、HTML 和 CSS WPQueryFormApps.zip 5KB [URL=http://www.ibm.com/developerworks/apps/download/index.jsp?contentid=427360&filename=WPQueryFormApps.zip&method=http&locale=zh_CN]HTTP[/URL]

    [URL=http://www.ibm.com/developerworks/cn/whichmethod.html]关于下载方法的信息[/URL]

    关于作者

    按此在新窗口浏览图片
    Bob DuCharme 是 TopQuadrant 的一位解决方案构架师,TopQuadrant 是一家语义 Web 应用程序建模、 开发和部署软件提供商。它撰写了 4 部关于信息及技术的图书,还在网上发表和印刷出版了近百篇相关文章,而在任何这些作品中从未使用过 “功能” 的概念。他的博客地址为:http://www.snee.com/bobdc.blog。


       收藏   分享  
    顶(0)
      




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

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

    第十二章第一节《用ROR创建面向资源的服务》
    第十二章第二节《用Restlet创建面向资源的服务》
    第三章《REST式服务有什么不同》
    InfoQ SOA首席编辑胡键评《RESTful Web Services中文版》
    [InfoQ文章]解答有关REST的十点疑惑

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2010/11/18 10:00:00
     
     zhoucqucs 帅哥哟,离线,有人找我吗?
      
      
      等级:大二(研究汇编)
      文章:35
      积分:202
      门派:XML.ORG.CN
      注册:2008/10/10

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给zhoucqucs发送一个短消息 把zhoucqucs加入好友 查看zhoucqucs的个人资料 搜索zhoucqucs在『 Semantic Web(语义Web)/描述逻辑/本体 』的所有贴子 引用回复这个贴子 回复这个贴子 查看zhoucqucs的博客2
    发贴心情 
    谢谢了!!!
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2010/11/18 10:48:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 Semantic Web(语义Web)/描述逻辑/本体 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/11/3 3:29:09

    本主题贴数2,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    125.000ms