Board logo

标题: 用 SPARQL 搜索 RDF 数据(2) [打印本页]

作者: look_w    时间: 2018-7-15 14:03     标题: 用 SPARQL 搜索 RDF 数据(2)

编写更复杂的查询迄今为止,您已经看到了两种运行简单 SPARQL 查询的方法:用命令行 sparql 工具,用 Java 代码调用 Jena API。在这一节中,我将介绍更多 SPARQL 的特性,以及它们支持的更复杂的查询。
RDF 经常被用来表示半结构化的 数据。这意味着在一个模型中,两个相同类型的节点可能有两个不同的属性集。例如,在 FOAF 模型中,对人的描述可能只包含电子邮件地址;而作为另一个选择,它也可以包含真实名称、IRC 昵称、描绘个人照片的 URL,等等。
提炼查询结果为了进一步提炼查询的结果,SPARQL 拥有 DISTINCT、LIMIT、OFFSET 和 ORDER BY 关键字,它们操作或多或少与它们在 SQL 中的对应物有些类似。DISTINCT 可能只用在 SELECT 查询上,格式为 SELECT DISTINCT。它会从结果集中清除重复的查询结果,让留下的每个结果都是惟一的。其他关键字都放在查询的 WHERE 子句之后。LIMIT n 把查询返回的结果数量限制在 n 个, 而 OFFSET n 则忽略前面 n 个结果。ORDER BY ?var 会根据 ?var 的自然顺序对结果进行排序,例如,如果 var 是字符串值,则按字母顺序排序。可以用 ASC[?var] 和 DESC[?var] 指定排序的方向。
当然,可以把 DISTINCT、LIMIT、OFFSET 和 ORDER BY 组合在查询中。例如,可以用 ORDER BY DESC[?date] LIMIT 10 找到 RSS feed 中最新的十个条目。

清单 5 显示了一个非常小的 FOAF 图,用 Turtle 语法表示。它包含对 4 个虚构人物的描述,但是每个描述都有不同的属性集。
清单 5. 一个描述 4 个虚构人物的小 FOAF 图
1
2
3
4
5
6
7
8
9
10
11
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
_:a foaf:name         "Jon Foobar" ;
    foaf:mbox         <mailto:jon@foobar.xx> ;
    foaf:depiction    <http://foobar.xx/2005/04/jon.jpg> .
_:b foaf:name         "A. N. O'Ther" ;
    foaf:mbox         <mailto:a.n.other@example.net> ;
    foaf:depiction    <http://example.net/photos/an-2005.jpg> .
_:c foaf:name         "Liz Somebody" ;
    foaf:mbox_sha1sum "3f01fa9929df769aff173f57dec2fe0c2290aeea"
_:d foaf:name         "M Benn" ;
    foaf:depiction    <http://mbe.nn/pics/me.jpeg> .




可选匹配假设您想编写一个查询,返回清单 5 的图中所描述的每个人的名字,以及每个人的照片的链接(如果有照片的话)。在 foaf:depiction 中包含的图形模式的 SELECT 查询可能只会发现三个结果。Liz Somebody 不会形成结果,因为虽然它有 foaf:name 属性,但它没有 foaf:depiction 属性,而如果要与查询匹配的话,那么这两个属性都需要。
帮助就在眼前,就是 SPARQL 的 OPTIONAL 关键字。可选块 定义了附加图形模式,即使模式不匹配,不会造成结果被拒绝,但在匹配的时候,图形模式会被绑定到图形上。清单 6 演示了一个查询,在清单 5 的 FOAF 数据中查找每个人的 foaf:name,而且可以选择性地查找伴随的 foaf:depiction。
清单 6. 用可选块查询 FOAF 数据
1
2
3
4
5
6
7
8
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT ?name ?depiction
WHERE {
        ?person foaf:name ?name .
        OPTIONAL {
            ?person foaf:depiction ?depiction .
        } .
      }




清单 7 显示了运行清单 6 的查询的结果。所有查询结果都包含人名,可选的图形模式则只在 foaf:depiction 属性存在的时候才绑定;如果没有,就从结果中忽略。从这种意义上说,查询与 SQL 中的左外连接相似。
清单 7. 清单 6 的查询结果
1
2
3
4
5
6
7
8
------------------------------------------------------------
| name           | depiction                               |
============================================================
| "A. N. O'Ther" | <http://example.net/photos/an-2005.jpg> |
| "Jon Foobar"   | <http://foobar.xx/2005/04/jon.jpg>      |
| "Liz Somebody" |                                         |
| "M Benn"       | <http://mbe.nn/pics/me.jpeg>            |
------------------------------------------------------------




可选块可以包含任何图形模式,不仅仅是像清单 6 所示的那种单一的三元模式。可选块中的所有查询模式都匹配,才能让可选模式成为查询结果的一部分。如果查询有多个可选块,那么它们会分别发挥作用 —— 可能在结果中被忽略,也可能存在于结果中。可选块也可以嵌套,在这种情况下,只有外部可选块的模式与图形匹配时,才考虑内部可选块。
替换匹配FOAF 图形用人们的电子邮件地址来惟一地标识他们。出于隐私的考虑,有些人喜欢用电子邮件地址的哈希码。纯文本的电子邮件地址用 foaf:mbox 属性表示,而电子邮件地址的哈希码则用 foaf:mbox_sha1sum 属性表示;这两个属性在人们的 FOAF 描述中通常是互斥的。在这种情况下,可以用 SPARQL 的 替代匹配 特性来编写查询,该查询返回任何可用的属性。
替换匹配的定义方式是写出多个替换图形模式,中间用 UNION 关键字连接。清单 8 显示的查询在 清单 5 中的 FOAF 中查找每个人的名字,以及他们的 foaf:mbox 或 foaf:mbox_sha1sum。M Benn 不是查询结果,因为它既没有 foaf:mbox 属性也没有 foaf:mbox_sha1sum 属性。与 OPTIONAL 图形模式相比,至少 要有一个替换模式和某个查询结果匹配;如果UNION 匹配中的分支都匹配,那么会生成两个结果。
清单 8. 有替代匹配的查询和查询结果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
SELECT ?name ?mbox
WHERE {
  ?person foaf:name ?name .
  {
      { ?person foaf:mbox ?mbox } UNION { ?person foaf:mbox_sha1sum ?mbox }
  }
}
---------------------------------------------------------------------
| name                 | mbox                                       |
=====================================================================
| "Jon Foobar"         | <mailto:jon@foobar.xx>                     |
| "A. N. O'Ther"       | <mailto:a.n.other@example.net>             |
| "Liz Somebody"       | "3f01fa9929df769aff173f57dec2fe0c2290aeea" |
---------------------------------------------------------------------






欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0