在 MarkLogic 中删除不同事务中的三元组

Deletion of triples in different transaction in MarkLogic

我正在使用 MarkLogic 8

我必须在第一个语句中使用 sem:sparql-update 删除三元组并且不想在下一个语句中使用 sem:sparql.

获得相同的删除三元组

我尝试在 xdmp:invoke-function 中传递 sem:sparql-update 但它不起作用。

sem:sparql-update 中据说默认隔离将是 'different-transaction',如果是这样的话我相信我不应该在 [=11= 的立即声明中得到删除的三元组].

请帮忙!

您需要 运行 sem:sparql-updatesem:sparql different-transactions。 sem:sparql 否则 运行 带有调用更新的请求的时间戳,它早于更新本身,因此它永远无法看到更新。

它是 MarkLogic 用于其事务处理的 MVCC 方法的一部分。

HTH!

我强烈建议阅读应用程序开发人员指南的 Understanding Transactions in MarkLogic Server 章节。

MarkLogic 中的语句是请求或更新。请求在特定时间戳发生并且是只读的,这意味着他们看到的是稳定的。正因为如此,请求不必担心写锁。更新对数据库进行更改。对于 XQuery,MarkLogic 通过静态分析知道您在做什么(对于 JavaScript,您必须调用 declareUpdate()). If you're not sure which you're running, you can call xdmp:request-timestamp;请求会给您一个值,但更新会给您空序列.

您想进行更新并使这些更改对以后的 SPARQL 查询可见。有两种可能的方式,具体取决于父请求是查询还是更新。

无论哪种情况,您都走在正确的轨道上,您的 sem:sparql-update 调用需要在不同的事务中进行。

父级是更新

如果父请求是更新,那么在 separate-transaction sparql-update 之后发出的请求将是可见的。除了确保在 sparql-update 之后读取数据外,您不需要做任何特别的事情。

父级是查询

如果父请求是查询,那么它会运行在设置的时间戳处运行,并且不会看到 sparql-update 的结果。在这种情况下,您还希望将 运行 和 sem:sparql 作为一个单独的事务,这将允许它看到已经完成的更新事务的结果。

请注意,如果父项是一个查询,从技术上讲,使其成为更新是可行的,但这不太可能是一个好的计划。在那种情况下,整个父请求需要担心更多的锁。