粗糙翻译,供自己学习记录用,有时间再精细化。不明朗之处请对照英文原文理解
简化版:https://blog.csdn.net/minosisterry/article/details/102963985
官网教程链接:http://jena.apache.org/tutorials/sparql_data.html
先给个定义:
SPARQL是W3C RDF数据访问工作组设计的用于访问RDF的查询语言和协议。
作为查询语言,SPARQL是“面向数据的”,因为它仅查询模型中保存的信息; 查询语言本身没有推断。 当然,Jena模型可能是“智能的”,因为它通过按需创建某些三元组来提供印象,包括OWL推理。 SPARQL除了以查询的形式描述应用程序的需求并以绑定集或RDF图的形式返回该信息外,不做任何其他事情。
首先,我们需要清楚要查询什么数据。 SPARQL查询RDF图。 RDF图是一组三元组(Jena将RDF图称为“模型”,将三元组称为“语句”,因为这是在最初设计Jena API时所称的)。
重要的是要意识到,重要的是三元组,而不是序列化。序列化只是写下三元组的一种方法。 RDF / XML是W3C的建议,但是由于有多种编码同一张图的方法,因此很难看到序列化形式的三元组。在本教程中,我们使用一种更类似于“三重”的序列化方法,称为Turtle(另请参见W3C语义Web入门中描述的N3语言)。
我们将从vc-db-1.rdf中的简单数据开始:此文件包含RDF,用于描述许多人的vCard。 vCard在RFC2426中进行了描述,而RDF转换在W3C注释“在RDF / XML中表示vCard对象”中进行了描述。我们的示例数据库仅包含一些名称信息。
以图形方式,数据看起来像:
三元组形式可能看起来像:
@prefix vCard: .
@prefix rdf: .
@prefix : <#> .
vCard:FN "Matt Jones" ;
vCard:N [ vCard:Family
"Jones" ;
vCard:Given
"Matthew"
] .
vCard:FN "Becky Smith" ;
vCard:N [ vCard:Family
"Smith" ;
vCard:Given
"Rebecca"
] .
vCard:FN "John Smith" ;
vCard:N [ vCard:Family
"Smith" ;
vCard:Given
"John"
] .
vCard:FN "Sarah Jones" ;
vCard:N [ vCard:Family
"Jones" ;
vCard:Given
"Sarah"
] .
甚至更明确地表示为三元组:
@prefix vCard: .
@prefix rdf: .
vCard:FN "Matt Jones" .
vCard:N _:b0 .
_:b0 vCard:Family "Jones" .
_:b0 vCard:Given "Matthew" .
vCard:FN "Becky Smith" .
vCard:N _:b1 .
_:b1 vCard:Family "Smith" .
_:b1 vCard:Given "Rebecca" .
vCard:FN "John Smith" .
vCard:N _:b2 .
_:b2 vCard:Family "Smith" .
_:b2 vCard:Given "John" .
vCard:FN "Sarah Jones" .
vCard:N _:b3 .
_:b3 vCard:Family "Jones" .
_:b3 vCard:Given "Sarah" .
重要的是要意识到这些是相同的RDF图,并且图中的三元组没有特定的顺序。 它们只是按上面相关的类别写给人类的读者使用-机器不在乎。
在本节中,我们看一个简单的第一个查询,并展示如何使用Jena执行该查询。
文件“ q1.rq”包含以下查询:
SELECT ?x
WHERE { ?x "John Smith" }
使用命令行查询应用程序执行该查询;
---------------------------------
| x |
=================================
| |
---------------------------------
这是通过将WHERE子句中的三元组模式与RDF图中的三元组进行匹配来实现的。三元组的谓词和对象是固定值,因此模式将仅将三元组与那些值匹配。主题是变量,并且对该变量没有其他限制。模式与这些谓词和对象值匹配任何三元组,并且与x的解匹配。
<>内的项目是URI(实际上是IRI),而“”内的项目是纯文本。就像Turtle,N3或N-triples一样,键入的文字用\ ^ \ ^编写,语言标签可以用@添加。
?x是一个叫做x的变量。 ?不构成名称的一部分,这就是为什么它不出现在表输出中的原因。
有一个匹配。该查询在x查询变量中返回匹配项。显示的输出是通过使用ARQ的命令行应用程序之一获得的。
执行查询
Jena发行版bat /和bin /目录中有帮助程序脚本。您应在使用前检查这些脚本。可以将它们放在shell命令路径上。
Windows设置
执行:
bat\sparql.bat --data=doc\Tutorial\vc-db-1.rdf --query=doc\Tutorial\q1.rq
您可以将bat /目录放在您的类路径中,或者从中复制程序。
Linux / Cygwin / Unix的bash脚本
执行:
bin/sparql --data=doc/Tutorial/vc-db-1.rdf --query=doc/Tutorial/q1.rq
直接使用Java命令行应用程序
(这不是必需的。)
您将需要设置类路径以将所有jar文件包含在Jena发行版lib /目录中。
java -cp 'DIST/lib/*' arq.sparql ...
其中DIST是apache-jena-VERSION目录。
本节涵盖基本模式和解决方案,这是SPARQL查询的主要构建块。
解决方案
查询解决方案是一组变量名称和值的对。 SELECT查询直接将解决方案(应用顺序/限制/偏移后)作为结果集公开-其他查询形式使用解决方案制作图形。 解决方案是模式匹配的方式-变量必须具有值才能使模式匹配。
第一个查询示例只有一个解决方案。 将模式更改为第二个查询:(q-bp1.rq):
SELECT ?x ?fname
WHERE {?x ?fname}
它有4个解决方案,每个VCARD名称属性一个,数据源中的三倍
----------------------------------------------------
| x | name |
====================================================
| | "Becky Smith" |
| | "Sarah Jones" |
| | "John Smith" |
| | "Matt Jones" |
----------------------------------------------------
到目前为止,使用三重模式和基本模式,将在每个解决方案中定义每个变量。 可以将查询的解决方案视为一个表,但是在一般情况下,它是一个表,其中并非每一行的每一列都有一个值。 给定SPARQL查询的所有解决方案不必在每个解决方案中都具有所有变量的值,我们将在后面看到。
基本模式
基本模式是一组三重模式。 当三元组模式都匹配且每次使用具有相同名称的变量时都使用相同的值时,它将匹配。
SELECT ?givenName
WHERE
{ ?y "Smith" .
?y ?givenName .
}
此查询(q-bp2.rq)涉及两个三重模式,每个三重模式以“.”结尾。 (但可以像在一个三重图案示例中那样省略最后一个点之后的点)。 对于每个三重模式匹配,变量y都必须相同。 解决方案是:
-------------
| givenName |
=============
| "John" |
| "Rebecca" |
-------------
QNames¶
存在使用前缀编写长URI的速记机制。 上面的查询更清楚地写为查询(q-bp3.rq):
PREFIX vcard:
SELECT ?givenName
WHERE
{ ?y vcard:Family "Smith" .
?y vcard:Given ?givenName .
}
这是一种前缀机制-URI的两个部分(来自前缀声明和qname中“:”之后的部分)被串联在一起。 严格来说,这不是XML qname的意思,而是使用RDF规则通过串联各个部分将qname转换为URI。
空白节点
稍微更改查询以也返回y(q-bp4.rq):
PREFIX vcard:
SELECT ?y ?givenName
WHERE
{ ?y vcard:Family "Smith" .
?y vcard:Given ?givenName .
}
并且出现空白节点
--------------------
| y | givenName |
====================
| _:b0 | "John" |
| _:b1 | "Rebecca" |
--------------------
作为以_:开头的奇特qname。 这不是空白节点的内部标签-它是ARQ打印出来的,它们分配了_:b0,_:b1来显示两个空白节点何时相同。 在这里他们是不同的。 尽管使用Java API时可用,但它不会显示用于空白节点的内部标签。
图形匹配允许在图形中找到模式。 本节介绍如何限制解决方案中的值。 有许多比较可用-我们在这里仅介绍两种情况。
字符串匹配
SPARQL提供基于正则表达式测试字符串的操作。 尽管正则表达式的语法与SQL不同,但这包括询问SQL“ LIKE”样式测试的能力。
语法为:
FILTER regex(?x, "pattern" [, "flags"])
flags参数是可选的。 标志“ i”表示不区分大小写的模式匹配。
示例查询(q-f1.rq)查找名称中带有“ r”或“ R”的名称。
PREFIX vcard:
SELECT ?g
WHERE
{ ?y vcard:Given ?g .
FILTER regex(?g, "r", "i") }
结果:
-------------
| g |
=============
| "Rebecca" |
| "Sarah" |
-------------
正则表达式语言与XQuery正则表达式语言相同,后者是Perl中发现的语言的编码版本。
测试值
有时,应用程序希望根据变量的值进行过滤。 在数据文件vc-db-2.rdf中,我们添加了一个age字段。 vCard架构未定义年龄,因此出于本教程的目的,我们创建了一个新属性。 由于URI是唯一的,因此RDF允许对信息的不同定义进行这种混合。 另请注意,键入了info:age属性值。
在此数据提取中,我们显示了键入的值。 它也可以写成普通的23。
info:age "23"^^xsd:integer ;
vCard:FN "Becky Smith" ;
vCard:N [ vCard:Family "Smith" ;
vCard:Given "Rebecca" ] .
因此,查询(q-f2.rq)以查找24岁以上的人的名字是:
PREFIX info:
SELECT ?resource
WHERE
{
?resource info:age ?age .
FILTER (?age >= 24)
}
算术表达式必须在括号中(圆括号)。 唯一的解决方案是:
---------------------------------
| resource |
=================================
| |
---------------------------------
仅一个匹配,从而为John Smith获得了资源URI。 轮到这轮,要求少于24岁的匹配也为丽贝卡·史密斯(Rebecca Smith)带来了一场匹配。 没有关于琼斯的。
该数据库不包含有关Jones的年龄信息:这些vCard上没有info:age属性,因此可变年龄未获得值,因此未通过过滤器进行测试。
RDF是半结构化数据,因此SPARQL具有查询数据的能力,但是当该数据不存在时不会失败。 该查询使用可选部分来扩展在查询解决方案中找到的信息,但无论如何都将返回非可选信息。
该查询(q-opt1.rq)获取一个人的名字以及他们的年龄(如果有该信息的话)。
PREFIX info:
PREFIX vcard:
SELECT ?name ?age
WHERE
{
?person vcard:FN ?name .
OPTIONAL { ?person info:age ?age }
}
数据(vc-db-2.rdf)中的四个人中有两个具有年龄属性,因此其中两个查询解决方案都具有该信息。 但是,由于年龄的三重模式是可选的,因此对于没有年龄信息的人有一种模式解决方案。
------------------------
| name | age |
=======================
| "Becky Smith" | 23 |
| "Sarah Jones" | |
| "John Smith" | 25 |
| "Matt Jones" | |
-----------------------
如果可选子句不存在,则不会检索任何年龄信息。 如果三元模式已经包括但不是可选的,那么我们将获得查询(q-opt2.rq):
PREFIX info:
PREFIX vcard:
SELECT ?name ?age
WHERE
{
?person vcard:FN ?name .
?person info:age ?age .
}
只有两个解决方案:
-----------------------
| name | age |
=======================
| "Becky Smith" | 23 |
| "John Smith" | 25 |
-----------------------
因为info:age属性现在必须存在于解决方案中。
带过滤器的选装件
OPTIONAL是组合两个图形模式的二进制运算符。 可选模式是任何组模式,并且可以包含任何SPARQL模式类型。 如果组匹配,则扩展解决方案;如果不匹配,则给出原始解决方案(q-opt3.rq)。
PREFIX info:
PREFIX vcard:
SELECT ?name ?age
WHERE
{
?person vcard:FN ?name .
OPTIONAL { ?person info:age ?age . FILTER ( ?age > 24 ) }
}
因此,如果在可选部分中过滤年龄大于24的年龄,我们仍将获得4个解决方案(来自vcard:FN模式),但只有通过测试的年龄才能获得。
-----------------------
| name | age |
=======================
| "Becky Smith" | |
| "Sarah Jones" | |
| "John Smith" | 25 |
| "Matt Jones" | |
-----------------------
“贝基·史密斯”的年龄未满24岁。
如果将过滤器条件移出可选部分,则可能会影响解决方案的数量,但可能有必要使过滤器更加复杂,以允许可变年龄不受约束(q-opt4.rq)。
PREFIX info:
PREFIX vcard:
SELECT ?name ?age
WHERE
{
?person vcard:FN ?name .
OPTIONAL { ?person info:age ?age . }
FILTER ( !bound(?age) || ?age > 24 )
}
如果解决方案具有年龄变量,则它必须大于24。它也可以不受限制。 现在有三种解决方案:
-----------------------
| name | age |
=======================
| "Sarah Jones" | |
| "John Smith" | 25 |
| "Matt Jones" | |
-----------------------
评估具有未绑定变量的表达式(如果期望绑定值),则将导致评估异常,整个表达式将失败。
可选和顺序相关查询
要注意的一件事是在两个或多个可选子句中使用相同的变量(也没有在某些基本模式中使用):
PREFIX foaf:
PREFIX vCard:
SELECT ?name
WHERE
{
?x a foaf:Person .
OPTIONAL { ?x foaf:name ?name }
OPTIONAL { ?x vCard:FN ?name }
}
如果第一个可选选项将?name和?x绑定到某些值,则第二个OPTIONAL是尝试匹配地面三元组(?x和?name kbd>具有值)。 如果第一个可选部分与可选部分不匹配,则第二个可选部分将其三元组与两个变量进行匹配。
处理半结构化数据的另一种方法是查询多种可能性之一。本节介绍UNION模式,其中尝试了多种可能性之一。
UNION-相同数据的两种方式
vCard词汇表和FOAF词汇表都具有人们姓名的属性。在vCard中,它是vCard:FN,即“格式化名称”,在FOAF中,它是foaf:name。在本节中,我们将查看一小组数据,其中可以通过FOAF或vCard词汇表来提供人名。
假设我们有一个RDF图,其中包含使用vCard和FOAF词汇表的名称信息。
@prefix foaf: .
@prefix vcard: .
_:a foaf:name "Matt Jones" .
_:b foaf:name "Sarah Jones" .
_:c vcard:FN "Becky Smith" .
_:d vcard:FN "John Smith" .
以任何一种形式访问名称信息的查询都可以是(q-union1.rq):
PREFIX foaf:
PREFIX vCard:
SELECT ?name
WHERE
{
{ [] foaf:name ?name } UNION { [] vCard:FN ?name }
}
这将返回结果:
-----------------
| name |
=================
| "Matt Jones" |
| "Sarah Jones" |
| "Becky Smith" |
| "John Smith" |
-----------------
名称使用哪种形式的表达式都没有关系,已设置?name变量。这可以使用FILTER来实现,因为此查询(q-union-1alt.rq)显示:
PREFIX foaf:
PREFIX vCard:
SELECT ?name
WHERE
{
[] ?p ?name
FILTER ( ?p = foaf:name || ?p = vCard:FN )
}
测试属性是一个URI还是另一个。解决方案可能不会以相同的顺序出现。第一种形式可能会更快,具体取决于所使用的数据和存储,因为第二种形式可能必须从图中获取所有三元组,以将三元组模式与每个插槽中的未绑定变量(或空白节点)相匹配,然后测试每个?p,看是否与其中一个值匹配。这取决于查询优化器的复杂程度,即它是否发现它可以更有效地执行查询并能够将约束向下传递到存储层。
上面的示例在每个分支中使用了相同的变量。如果使用了不同的变量,则应用程序可以发现哪个子模式导致了匹配(q-union2.rq):
PREFIX foaf:
PREFIX vCard:
SELECT ?name1 ?name2
WHERE
{
{ [] foaf:name ?name1 } UNION { [] vCard:FN ?name2 }
}
---------------------------------
| name1 | name2 |
=================================
| "Matt Jones" | |
| "Sarah Jones" | |
| | "Becky Smith" |
| | "John Smith" |
---------------------------------
通过将姓名分配给不同的变量,第二个查询保留了该姓名的名称信息。
在实践中,OPTIONAL比UNION更常见,但它们都有其用途。 OPTIONAL对增加找到的解决方案很有用,UNION对从两种可能性中连接解决方案很有用。他们不必以相同的方式返回信息:
查询(q-union3.rq):
PREFIX foaf:
PREFIX vCard:
SELECT ?name1 ?name2
WHERE
{
?x a foaf:Person
OPTIONAL { ?x foaf:name ?name1 }
OPTIONAL { ?x vCard:FN ?name2 }
}
---------------------------------
| name1 | name2 |
=================================
| "Matt Jones" | |
| "Sarah Jones" | |
| | "Becky Smith" |
| | "John Smith" |
---------------------------------
但请注意在每个OPTIONAL中都使用?name,因为这是一个与顺序相关的查询。
本节介绍RDF数据集-RDF数据集是SPARQL查询所查询的单位。它由一个默认图和许多命名图组成。
图匹配操作(基本模式,OPTIONAL和UNION)在一个RDF图上运行。它最初是数据集的默认图形,但可以通过GRAPH关键字进行更改。
GRAPH uri { ... pattern ... }
GRAPH var { ... pattern ... }
如果提供了URI,则该模式将与该名称的数据集中的图形进行匹配-如果不存在,则GRAPH子句完全不匹配。
如果给出了变量,则尝试所有命名的图(不是默认图)。该变量可以在其他地方使用,这样,如果在执行过程中解决方案已知其值,则仅尝试使用特定的命名图。
RDF数据集可以采用多种形式。两种常见设置是使默认图成为所有已命名图的并集(RDF合并),或者使默认图成为已命名图的清单(它们来自何处,何时被读取等)。没有限制-一个图可以用不同的名称包含两次,或者某些图可能与其他图共享三元组。
在下面的示例中,我们将使用以下数据集,这可能是书籍详细信息的RDF聚合器:
默认图形(ds-dft.ttl):
@prefix dc: .
@prefix xsd: .
dc:date "2005-07-14T03:18:56+0100"^^xsd:dateTime .
dc:date "2005-09-22T05:53:05+0100"^^xsd:dateTime .
命名图(ds-ng-2.ttl):
@prefix dc: .
[] dc:title "Harry Potter and the Philospher's Stone" .
[] dc:title "Harry Potter and the Chamber of Secrets" .
也就是说,我们有两个描述某些书的小图,并且我们有一个默认图,它记录了上一次阅读这些图的时间。
可以使用命令行应用程序运行查询(这将是全部一行):
java -cp ... arq.sparql
--graph ds-dft.ttl --namedgraph ds-ng-1.ttl --namedgraph ds-ng-2.ttl
--query query file
不必仅在查询生命周期内创建数据集。可以创建它们并将其存储在数据库中,这对于聚合器应用程序来说更常见。
第一个示例仅访问默认图形(q-ds-1.rq):
PREFIX xsd:
PREFIX dc:
PREFIX : <.>
SELECT *
{ ?s ?p ?o }
(“ PREFIX:<。>”仅有助于格式化输出)
----------------------------------------------------------------------
| s | p | o |
======================================================================
| :ds-ng-2.ttl | dc:date | "2005-09-22T05:53:05+01:00"^^xsd:dateTime |
| :ds-ng-1.ttl | dc:date | "2005-07-14T03:18:56+01:00"^^xsd:dateTime |
----------------------------------------------------------------------
这仅是默认图-命名图中没有任何内容,因为除非通过GRAPH明确指出,否则不会查询它们。
我们可以通过查询默认图和命名图(q-ds-2.rq)来查询所有三元组:
PREFIX xsd:
PREFIX dc:
PREFIX : <.>
SELECT *
{
{ ?s ?p ?o } UNION { GRAPH ?g { ?s ?p ?o } }
}
给予:
---------------------------------------------------------------------------------------
| s | p | o | g |
=======================================================================================
| :ds-ng-2.ttl | dc:date | "2005-09-22T05:53:05+01:00"^^xsd:dateTime | |
| :ds-ng-1.ttl | dc:date | "2005-07-14T03:18:56+01:00"^^xsd:dateTime | |
| _:b0 | dc:title | "Harry Potter and the Sorcerer's Stone" | :ds-ng-2.ttl |
| _:b1 | dc:title | "Harry Potter and the Chamber of Secrets" | :ds-ng-2.ttl |
| _:b2 | dc:title | "Harry Potter and the Chamber of Secrets" | :ds-ng-1.ttl |
| _:b3 | dc:title | "Harry Potter and the Philospher's Stone" | :ds-ng-1.ttl |
---------------------------------------------------------------------------------------
如果应用程序知道名称图,它可以直接询问诸如在给定图中(q-ds-3.rq)找到所有标题的查询:
PREFIX dc:
前缀:<。>
PREFIX dc:
PREFIX : <.>
SELECT ?title
{
GRAPH :ds-ng-2.ttl
{ ?b dc:title ?title }
}
结果:
---------------------------------------------
| title |
=============================================
| "Harry Potter and the Sorcerer's Stone" |
| "Harry Potter and the Chamber of Secrets" |
---------------------------------------------
可以通过查询本身确定要查询的图的名称。 无论变量是图形模式还是GRAPH表单的一部分,都适用相同的变量处理过程。 下面的查询(q-ds-4.rq)基于默认图形中的信息,在用于选择命名图形的变量上设置条件。
PREFIX xsd:
PREFIX dc:
PREFIX : <.>
SELECT ?date ?title
{
?g dc:date ?date . FILTER (?date > "2005-08-01T00:00:00Z"^^xsd:dateTime )
GRAPH ?g
{ ?b dc:title ?title }
}
在示例数据集上执行此查询的结果是其中一个图的标题,一个图的日期晚于2005年8月1日。
-----------------------------------------------------------------------------------------
| date | title |
=========================================================================================
| "2005-09-22T05:53:05+01:00"^^xsd:dateTime | "Harry Potter and the Sorcerer's Stone" |
| "2005-09-22T05:53:05+01:00"^^xsd:dateTime | "Harry Potter and the Chamber of Secrets" |
-----------------------------------------------------------------------------------------
可以在构建执行对象时为查询执行提供数据集,也可以在查询本身中对其进行描述。当详细信息位于命令行上时,将创建一个临时数据集,但是应用程序可以创建数据集,然后在许多查询中使用它们。
在查询中描述时,FROM
不要为默认图由FROM子句中的一个或多个URL描述而感到困惑。这是从中读取数据的位置,而不是图的名称。由于可以提供几个FROM子句,因此可以从多个位置读取数据,但是它们都不成为图形名称。
FROM NAMED
请注意,图形随Jena FileManager一起加载,其中包括提供文件替代位置的功能。例如,查询可能具有FROM NAMED
例如,可以在默认图形和命名图形中查找所有三元组的查询可以写为(q-ds-5.rq):
PREFIX xsd:
PREFIX dc:
PREFIX : <.>
SELECT *
FROM
FROM NAMED
FROM NAMED
{
{ ?s ?p ?o } UNION { GRAPH ?g { ?s ?p ?o } }
}
SPARQL具有四种结果形式:
SELECT –返回结果表。
CONSTRUCT –根据查询中的模板返回RDF图。
DESCRIBE –根据配置的查询处理器返回的结果返回RDF图。
询问–询问布尔查询。
SELECT表单直接将解决方案表作为结果集返回,而DESCRIBE和CONSTRUCT使用匹配结果来构建RDF图。
模式匹配产生了一套解决方案。可以用多种方式修改此集合:
投影-仅保留选定的变量
偏移/限制-切开数字解决方案(最适合与ORDER BY配合使用)
ORDER BY-排序结果
DISTINCT-对于变量和值的一种组合仅产生一行。
解决方案修饰符OFFSET / LIMIT和ORDER BY始终应用于所有结果表单。
可以通过指定要返回的偏移量(起始索引)和限制(解决方案数量)来简化一组解决方案。单独使用LIMIT可以确保不返回太多解决方案,以限制某些意外情况的影响。 LIMIT和OFFSET可以与排序结合使用,以通过找到的解决方案获取定义的切片。
SPARQL解决方案按表达式排序,包括自定义函数。
ORDER BY ?x ?y
ORDER BY DESC(?x)
ORDER BY x:func(?x) # Custom sorting condition
SELECT结果表单可以使用DISTINCT修饰符,该修饰符可确保返回的两个解都不相同-这是在投影到所请求的变量之后进行的。
SELECT结果表单是解决方案集的投影,应用了DISTINCT。 SELECT标识结果集中包含哪些命名变量。这可能是“ *”,意思是“所有命名变量”(查询中的空白节点的作用类似于要匹配的变量,但从不返回)。
CONSTRUCT基于图形模板构建RDF。图形模板可以具有由WHERE子句绑定的变量。效果是在考虑任何解决方案修饰符之后,为WHERE子句中的每个解决方案计算了给定模板的图形片段。图片段(每个解决方案一个)被合并为一个RDF图,这就是结果。
每次将模板用于解决方案时,都会重新创建图形模板中明确提及的所有空白节点。
CONSTRUCT表单采用图形结果的应用程序模板。 DESCRIBE表单还创建了一个图,但是该图的形式由查询处理器(而不是应用程序)提供。对于在DESCRIBE子句中找到或明确提到的每个URI,查询处理器应提供有用的RDF片段,例如书中所有已知的细节。 ARQ允许编写特定于域的描述处理程序。
ASK结果表单返回一个布尔值,匹配的模式为true,否则为false。