我正在尝试使用SPARQL Construct查询从现有查询创建新的命名图。我查询的数据库包含http://graph.com/old
作为现有的命名图。我使用 Jena TDB 作为数据库,通过 Jena Fuseki 端点访问。以下查询给出了一个错误:
CONSTRUCT
{
GRAPH <http://graph.com/new> {
?s ?p ?o
}
}
WHERE
{
GRAPH <http://graph.com/old> {
?s ?p ?o
}
}
如果我从CONSTRUCT块中删除图形语句,则查询工作正常,但我想将三元组放入我指定的命名图形而不是默认图形。
据我所知,SPARQL 1.1 section on CONSTRUCT没有说明构建命名图的任何内容。有没有办法做到这一点?
答案 0 :(得分:18)
正如您对获取一组变量绑定感兴趣时使用SELECT查询一样,使用CONSTRUCT查询您有兴趣获取模型。正如SELECT结果集中绑定的变量没有放入任何模型或持久的绑定集中一样,由CONSTRUCT构建的模型也不存储在任何地方。您想要使用SPARQL 1.1 INSERT。 3 SPARQL 1.1 Update Language中介绍了更新功能。因此,您的更新请求可以写为:
INSERT {
GRAPH <http://graph.com/new> {
?s ?p ?o
}
}
WHERE {
GRAPH <http://graph.com/old> {
?s ?p ?o
}
}
但是,对于这种特殊情况,您可以使用3.2.3 COPY中描述的COPY操作。 COPY首先从目标图中删除所有数据,因此它可能不适用于您的实际情况(理解您提供的代码可能是一个最小的示例,而不一定是您尝试执行的实际更新)。关于COPY标准说:
COPY操作是从输入插入所有数据的快捷方式 图表到目标图表。来自输入图的数据不是 受影响,但目标图表中的数据(如果有)将被删除 在插入之前。
COPY ( SILENT )? ( ( GRAPH )? IRIref_from | DEFAULT) TO ( ( GRAPH )? IRIref_to | DEFAULT )
在操作上类似于:
DROP SILENT (GRAPH IRIref_to | DEFAULT); INSERT { ( GRAPH IRIref_to )? { ?s ?p ?o } } WHERE { ( GRAPH IRIref_from )? { ?s ?p ?o } }
COPY和DROP / INSERT组合之间的区别在于if COPY用于将图形复制到自身,然后不会进行任何操作 执行后,数据将保持不变。使用DROP / INSERT 这种情况会导致空图。
如果目标图形不存在,则会创建它。通过 默认情况下,如果输入图形没有,则服务可能会返回失败 存在。如果存在SILENT,则操作结果将始终为 成功。
如果COPY不合适,那么ADD可能就是你要找的东西:
3.2.5 ADD
ADD操作是从输入插入所有数据的快捷方式 图表到目标图表。来自输入图的数据不是 受影响的,并保留目标图表中的初始数据(如果有) 完好。
ADD ( SILENT )? ( ( GRAPH )? IRIref_from | DEFAULT) TO ( ( GRAPH )? IRIref_to | DEFAULT)
相当于:
INSERT { ( GRAPH IRIref_to )? { ?s ?p ?o } } WHERE { ( GRAPH IRIref_from )? { ?s ?p ?o } }
如果目标图形不存在, 它将被创建。默认情况下,如果服务可能会返回失败 输入图不存在。如果存在SILENT,则结果为 操作永远是成功的。