如何同时加载和查询 RDF
How can I load and query RDF at the same time
你能想到同时加载和查询 RDF 三元组的方法吗?
我只知道在Sesame中你必须先初始化一个存储库(比如加载rdf文件)然后你才能通过SPARQL查询。
假设我们初始化一个RDF存储库(输入一个文件)并且不希望加载完成,但是在加载RDF数据的同时,想通过SPARQL查询数据以进行验证。
对于下面的初始化,应该等到存储库中的RDF文件加载完成(我的假设),然后才能查询存储库中的RDF数据:
File rdfFile; // parameter, RDF file.
repo = new SailRepository(new MemoryStore());
repo.initialize();
try {
RepositoryConnection con = repo.getConnection();
try {
con.add(rdfFile, null, rdfFormat);
} finally {
con.close();
}
}
在上面的代码中,RepositoryConnection.add
得到一个 File
作为参数。将 FileInputStream
作为参数可以解决问题吗? (repository 的初始化不等待加载文件,加载完成之前可以查询)。
使用 FileInputStream
而不是 File
不会对 Sesame 处理文件的方式产生影响:add
方法仍然不会 return 直到它已完全添加数据。
但是,您可以通过在加载文件的单独线程中执行查询,然后使用具有隔离级别 READ_UNCOMMITTED
的事务来实现您想要的效果。当然,在这种情况下,几乎无法保证查询结果的完整性或一致性,但在技术上是可行的。
像这样的东西(来自我的头顶,所以未经测试):
File rdfFile; // parameter, RDF file.
repo = new SailRepository(new MemoryStore());
repo.initialize();
Thead loader = new Thread() {
public void run() {
try (RepositoryConnection con = repo.getConnection()) {
con.add(rdfFile, null, rdfFormat);
}
}
};
Thead query = new Thread() {
public void run() {
try (RepositoryConnection con = repo.getConnection()) {
conn.begin(IsolationLevels.READ_UNCOMMITTED);
String query = "SELECT * WHERE ... ";
try(TupleQueryResult result = conn.prepareTupleQuery(query).evaluate()) {
while (result.hasNext()) {
...
}
}
conn.commit();
}
};
loader.start();
query.start();
你能想到同时加载和查询 RDF 三元组的方法吗?
我只知道在Sesame中你必须先初始化一个存储库(比如加载rdf文件)然后你才能通过SPARQL查询。
假设我们初始化一个RDF存储库(输入一个文件)并且不希望加载完成,但是在加载RDF数据的同时,想通过SPARQL查询数据以进行验证。
对于下面的初始化,应该等到存储库中的RDF文件加载完成(我的假设),然后才能查询存储库中的RDF数据:
File rdfFile; // parameter, RDF file.
repo = new SailRepository(new MemoryStore());
repo.initialize();
try {
RepositoryConnection con = repo.getConnection();
try {
con.add(rdfFile, null, rdfFormat);
} finally {
con.close();
}
}
在上面的代码中,RepositoryConnection.add
得到一个 File
作为参数。将 FileInputStream
作为参数可以解决问题吗? (repository 的初始化不等待加载文件,加载完成之前可以查询)。
使用 FileInputStream
而不是 File
不会对 Sesame 处理文件的方式产生影响:add
方法仍然不会 return 直到它已完全添加数据。
但是,您可以通过在加载文件的单独线程中执行查询,然后使用具有隔离级别 READ_UNCOMMITTED
的事务来实现您想要的效果。当然,在这种情况下,几乎无法保证查询结果的完整性或一致性,但在技术上是可行的。
像这样的东西(来自我的头顶,所以未经测试):
File rdfFile; // parameter, RDF file.
repo = new SailRepository(new MemoryStore());
repo.initialize();
Thead loader = new Thread() {
public void run() {
try (RepositoryConnection con = repo.getConnection()) {
con.add(rdfFile, null, rdfFormat);
}
}
};
Thead query = new Thread() {
public void run() {
try (RepositoryConnection con = repo.getConnection()) {
conn.begin(IsolationLevels.READ_UNCOMMITTED);
String query = "SELECT * WHERE ... ";
try(TupleQueryResult result = conn.prepareTupleQuery(query).evaluate()) {
while (result.hasNext()) {
...
}
}
conn.commit();
}
};
loader.start();
query.start();