我想将多个对象插入到像 Jena fuseki 或 virtuoso 这样的三元组中。
就我而言,主题等于主键。它类似于关系数据库。如何确保该主题仅出现一次或已在使用中?ASK 可以与 Sparql 中的插入相结合吗?或者可以生成密钥吗?
只要您使用后端的实例,您就可以确保主题只存在一次,但是对于更多实例,查询和插入必须同时发生以保存事务。
我想将多个对象插入到像 Jena fuseki 或 virtuoso 这样的三元组中。
就我而言,主题等于主键。它类似于关系数据库。如何确保该主题仅出现一次或已在使用中?ASK 可以与 Sparql 中的插入相结合吗?或者可以生成密钥吗?
只要您使用后端的实例,您就可以确保主题只存在一次,但是对于更多实例,查询和插入必须同时发生以保存事务。
更新可以是形式INSERT .. WHERE
,并且该WHERE
部分可以包括是否更新的测试。
用于更新的 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 一起工作的更多信息,请参阅文档。
如果您不使用 Java,您还可以通过RDF4J REST API处理事务,这是 SPARQL 协议的扩展。
顺便说一句:以上只是回答您问题的“我如何进行交易”部分。对于您正在寻找的约束验证类型,可能存在比 ASK 查询更好的机制。SHACL,形状约束语言,可能是您需要的。各种工具和平台(部分或全部)支持 SHACL 验证。您可以在此处阅读有关RDF4J SHACL 支持的更多信息。