Apache jena更新远程端点

时间:2018-08-09 06:56:52

标签: insert sparql rdf endpoint

我们现在经常执行的当前过程是从端点提取数据,执行计算分析,生成RDF文件并将其手动加载回端点。

现在我正在研究使用Apache Jena ARQ自动化此过程,因为这些依赖关系当前用于信息检索。

我设法使它部分使用INSERT语句工作,但对我来说成千上万个甚至不是数百万个的插入似乎有点效率低下。第二个问题是,我们有时在字符串中使用正则表达式或“,需要对此进行转义,但是有很多例外。

是否可以解析或迭代内部apache jena模型语句并将其直接注入端点?

我们目前使用graphdb,但是如果可以使用通用方法来应用,那就太好了。

更新

我已经更新了代码,可以立即处理10条语句,但不确定最终的限制是什么。

public class EndpointTests extends TestCase {

    // Only for local testing
    public void testEndpoint() throws Throwable {
        String endpoint = "http://10.117.11.77:7200/repositories/Test";
        Domain domain = new Domain("file:///Users/jasperkoehorst/diana_interproscan_head.nt");

        StmtIterator statements = domain.getRDFSimpleCon().getModel().listStatements();
        String strInsert = "INSERT DATA { ";
        int insertCounter = 0;
        while (statements.hasNext()) {
            insertCounter = insertCounter + 1;

            Statement statement = statements.nextStatement();

            String subject = statement.getSubject().getURI();
            String predicate = statement.getPredicate().getURI();
            String object = statement.getObject().toString();
            if (statement.getObject().isURIResource()) {
                object = "<" + statement.getObject().toString() + ">";
            }

            if (statement.getObject().isLiteral()) {
                object = statement.getObject().asLiteral().getString();
                object = object.replaceAll("\\\\", "\\\\\\\\");
                object = object.replaceAll("\"","\\\\\"");
            }

            if (object.startsWith("http")) {
                object = "<" + object + ">";
            } else {
                object = "\"" + object + "\"";
            }

            strInsert = strInsert + "<" + subject + "> <" + predicate + "> " + object + " . ";

            if (insertCounter % 10 == 0) {
                System.out.println(insertCounter);
                strInsert = strInsert + " } ";
                UpdateRequest updateRequest = UpdateFactory.create(strInsert);
                UpdateProcessor updateProcessor = UpdateExecutionFactory.createRemote(updateRequest, endpoint + "/statements");
                updateProcessor.execute();
                strInsert = "INSERT DATA { ";
            }
        }
    }
}

0 个答案:

没有答案