Sparql 交易

Sparql Transaction

我想将多个对象插入到像 Jena fuseki 或 virtuoso 这样的三元组中。

在我的例子中,主题等于主键。它类似于关系数据库。我怎样才能确保该主题只出现一次或已经在使用中? ASK 可以与 Sparql 中的插入结合使用吗?还是可以生成密钥?

只要使用后端的实例就可以确保主题只存在一次,但对于更多的实例,查询和插入必须同时发生才能保存事务。

SPARQL 标准本身不提供任何事务支持。然而,Virtuoso 和许多其他 RDF 数据库支持 Eclipse RDF4J API,它们具有完整的事务支持(披露:我在 RDF4J 开发团队)。在 Java 中使用 RDF4J 事务的示例如下所示:

 Repository rep = ... ; // the Repository object is your database

 // open a connection to the database
 try(RepositoryConnection conn = rep.getConnection) {
     conn.begin(); // start a new transaction
     ... 
     // do a query
     boolean success = conn.prepareBooleanQuery("ASK ...").evaluate(); 
     if (!success) { 
        conn.rollback();
     }
     else {
        // add some data
        conn.add(...);
        conn.commit();
     }
 }

有关事务如何与 RDF4J 一起工作的更多信息,请参阅 documentation

如果您不在 Java 中工作,您还可以通过 RDF4J REST API 处理事务,它是 SPARQL 协议的扩展。

顺便说一句:以上内容只是为了真正回答您问题的 "how do I do transactions" 部分。对于您正在寻找的约束验证类型,可能还有其他比 ASK 查询更好的可用机制。 SHACL,形状约束语言,可能是您所需要的。各种工具和平台都(部分或全部)支持 SHACL 验证。您可以在此处阅读有关 RDF4J SHACL support 的更多信息。

更新可以是 INSERT .. WHERE 的形式,WHERE 部分可以包括是否更新的测试。

用于更新的 SPARQL 协议要求操作是原子的。