构造成命名图

时间:2013-08-20 22:21:27

标签: sparql rdf jena fuseki named-graphs

我正在尝试使用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没有说明构建命名图的任何内容。有没有办法做到这一点?

1 个答案:

答案 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,则结果为   操作永远是成功的。