0

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

就我而言,主题等于主键。它类似于关系数据库。如何确保该主题仅出现一次或已在使用中?ASK 可以与 Sparql 中的插入相结合吗?或者可以生成密钥吗?

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

4

2 回答 2

0

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

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

于 2019-02-08T15:34:21.770 回答
0

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 一起工作的更多信息,请参阅文档

如果您不使用 Java,您还可以通过RDF4J REST API处理事务,这是 SPARQL 协议的扩展。

顺便说一句:以上只是回答您问题的“我如何进行交易”部分。对于您正在寻找的约束验证类型,可能存在比 ASK 查询更好的机制。SHACL,形状约束语言,可能是您需要的。各种工具和平台(部分或全部)支持 SHACL 验证。您可以在此处阅读有关RDF4J SHACL 支持的更多信息。

于 2019-02-07T21:15:31.070 回答