首页 文章

构造成命名图

提问于
浏览
14

我试图使用SPARQL Construct查询从现有的查询创建一个新的命名图 . 我查询的数据库包含 http://graph.com/old 作为现有的命名图 . 我使用 Jena TDB 作为数据库,通过 Jena Fuseki endpoints 访问 . 以下查询给出了一个错误:

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 回答

  • 16

    就像当您有兴趣获取一组变量绑定一样使用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操作是将输入图形中的所有数据插入目标图形的快捷方式 . 来自输入图的数据不受影响,但是在插入之前删除了目标图中的数据(如果有) . 复制(沉默)? ((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组合之间的区别在于,如果使用COPY将图形复制到自身上,则不会执行任何操作,数据将保持原样 . 在这种情况下使用DROP / INSERT将导致空图 . 如果目标图形不存在,则将创建它 . 默认情况下,如果输入图形不存在,服务可能会返回失败 . 如果存在SILENT,则操作结果将始终成功 .

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

    3.2.5 ADD ADD操作是将输入图形中的所有数据插入目标图形的快捷方式 . 输入图表中的数据不受影响,目标图表中的初始数据(如果有)保持不变 . 加(沉默)? ((GRAPH)?IRIref_from | DEFAULT)TO((GRAPH)?IRIref_to | DEFAULT)
    相当于:INSERT {(GRAPH IRIref_to)? {?s?p?o}} WHERE {(GRAPH IRIref_from)? {?s?p?o}}
    如果目标图形不存在,则将创建它 . 默认情况下,如果输入图形不存在,服务可能会返回失败 . 如果存在SILENT,则操作结果将始终成功 .

相关问题