构造成命名图

Yoa*_*man 15 rdf sparql 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
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我从CONSTRUCT块中删除图形语句,查询工作正常,但我想将三元组放入我指定的命名图形而不是默认图形.

据我所知,CONSTRUCT上的SPARQL 1.1部分没有说明构建命名图的任何内容.有没有办法做到这一点?

Jos*_*lor 19

就像当您有兴趣获取一组变量绑定一样使用SELECT查询时,使用CONSTRUCT查询您有兴趣获取模型.正如SELECT结果集中绑定的变量没有放入任何模型或持久的绑定集中一样,由CONSTRUCT构建的模型也不存储在任何地方.您想要使用SPARQL 1.1 INSERT.更新功能在3 SPARQL 1.1更新语言中描述.因此,您的更新请求可以写为:

INSERT {
  GRAPH <http://graph.com/new> {
    ?s ?p ?o
  }
}
WHERE {
  GRAPH <http://graph.com/old> {
    ?s ?p ?o
  }
}
Run Code Online (Sandbox Code Playgroud)

但是,对于这种特殊情况,您可以使用3.2.3 COPY中描述的COPY操作.COPY首先从目标图中删除所有数据,因此它可能不适用于您的实际情况(理解您提供的代码可能是一个最小的示例,而不一定是您尝试执行的实际更新).关于COPY标准说:

COPY操作是将输入图形中的所有数据插入目标图形的快捷方式.来自输入图的数据不受影响,但是在插入之前删除了目标图中的数据(如果有).

COPY ( SILENT )? ( ( GRAPH )? IRIref_from | DEFAULT) TO ( ( GRAPH )? IRIref_to | DEFAULT )
Run Code Online (Sandbox Code Playgroud)

在操作上类似于:

DROP SILENT (GRAPH IRIref_to | DEFAULT);
      INSERT { ( GRAPH IRIref_to )? { ?s ?p ?o } } WHERE { ( GRAPH IRIref_from )? { ?s ?p ?o } }
Run Code Online (Sandbox Code Playgroud)

COPY和DROP/INSERT组合之间的区别在于,如果使用COPY将图形复制到自身上,则不会执行任何操作,数据将保持原样.在这种情况下使用DROP/INSERT将导致空图.

如果目标图形不存在,则将创建它.默认情况下,如果输入图形不存在,服务可能会返回失败.如果存在SILENT,则操作结果将始终成功.

如果COPY不合适,那么ADD可能就是你想要的:

3.2.5 ADD

ADD操作是将输入图形中的所有数据插入目标图形的快捷方式.输入图表中的数据不受影响,目标图表中的初始数据(如果有)保持不变.

ADD ( SILENT )? ( ( GRAPH )? IRIref_from | DEFAULT) TO ( ( GRAPH )? IRIref_to | DEFAULT)
Run Code Online (Sandbox Code Playgroud)

相当于:

INSERT { ( GRAPH IRIref_to )? { ?s ?p ?o } } WHERE { ( GRAPH IRIref_from )? { ?s ?p ?o } }
Run Code Online (Sandbox Code Playgroud)

如果目标图形不存在,则将创建它.默认情况下,如果输入图形不存在,服务可能会返回失败.如果存在SILENT,则操作结果将始终成功.

  • "COPY"的替代方案当然是"ADD",它将数据从源复制到目标并保留目标图形现有数据 (2认同)