我们现在经常执行的当前过程是从端点提取数据,执行计算分析,生成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 { ";
}
}
}
}