SPARUL查询使用Jena API删除大多数图表

时间:2016-12-16 10:42:27

标签: sparql virtuoso apache-jena

我正在尝试使用Apache Jena清除本地Virtuoso三重商店中包含的大多数图表,作为我的单元测试之前和之后的清理过程的一部分。我认为应该这样做。首先,我检索要删除的图形URI;然后我执行SPARUL Drop操作。

String sparqlEndpointUsername = ...;
String sparqlEndpointPassword = ...;
String sparqlQueryString = ...; // Returns the URIs of the graphs to be deleted

HttpAuthenticator authenticator = new SimpleAuthenticator(sparqlEndpointUsername,
            sparqlEndpointPassword.toCharArray());
ResultSet resultSetToReturn = null;
try (QueryEngineHTTP queryEngine = new QueryEngineHTTP(sparqlEndpoint, sparqlQueryString, authenticator)) {
    resultSetToReturn = queryEngine.execSelect();
    resultSetToReturn = ResultSetFactory.copyResults(resultSetToReturn);

    while(resultSetToReturn.hasNext()){
        String graphURI = resultSetToReturn.next().getResource("?g").getURI();

        UpdateRequest request = UpdateFactory.create() ;
        request.add("DROP GRAPH <"+graphURI+">");

        Dataset dataset = ...; // how can I create a default dataset pointing to my local virtuoso installation?

        // And perform the operations.
        UpdateAction.execute(request, dataset) ;

    }
}
;

问题:

  1. this example所示,ARQ需要运行数据集。如何创建指向本地Virtuoso安装的数据集以进行更新操作?
  2. 我的方法可能有其他选择吗?使用另一种方法(除了jena)会更好吗?
  3. 请注意,我试图删除所有图表。我只删除名称通过开头(第3行)中定义的SPARQL查询返回的图表。

2 个答案:

答案 0 :(得分:1)

您的问题似乎是针对Virtuoso的,并且意味着删除所有 RDF数据,因此您可以使用Virtuoso's built-in RDF_GLOBAL_RESET() function

这不是SPARQL / SPARUL查询;它通常通过SQL连接发出 - 可以是JDBC,ODBC,ADO.NET,OLE DB,iSQL等。

也就是说,当您通过SPARUL特权连接进行连接时,您应该可以使用Virtuoso's (limited) SQL-in-SPARQL support,la -

SELECT
  ( bif:RDF_GLOBAL_RESET()  AS reset )
WHERE
  {  ?s  ?p  ?o  }
LIMIT 1

(通过非默认的SPARQL端点之类的非特权连接执行此操作将导致Virtuoso 37000 Error SP031: SPARQL compiler: Function bif:RDF_GLOBAL_RESET() can not be used in text of SPARQL query due to security restrictions之类的错误。)

(ObDisclaimer:OpenLink Software生成Virtuoso,雇用我。)

答案 1 :(得分:1)

您可以构建单个SPARQL更新请求:

DROP GRAPH <g1> ;
DROP GRAPH <g2> ;
DROP GRAPH <g3> ;
... ;

因为在SPARQL Update中,一个HTTP请求可以是多个更新操作,由;分隔。