随着 MarkLogic8 中新的 BiTemporal 功能的引入,您可以跟踪两个时间轴的变化:有效时间和系统时间。三元组也支持这些功能。所以你可以沿着这两个轴回到过去,并可能看到变化。但是,由于三元组存储在文档中,并且双时态元数据存储在文档级别而不是三元组,因此您无法删除或更新特定的三元组。此外,您不能将新的 SPARQL 更新功能与时间三元组一起使用。这是一个例子:
在第 1 天,我们添加了以下三元组,我们假设它们总是正确的:
<temporalTriples>
<systemStart />
<systemEnd />
<validStart>2001-01-01T00:00:00Z</validStart>
<validEnd>2999-01-01T00:00:00Z</validEnd>
<sem:triples>
<sem:triple>
<sem:subject>Denver</sem:subject>
<sem:predicate>state</sem:predicate>
<sem:object>CO</sem:object>
</sem:triple>
<sem:triple>
<sem:subject>San Francisco</sem:subject>
<sem:predicate>state</sem:predicate>
<sem:object>CA</sem:object>
</sem:triple>
</sem:triples>
</temporalTriples>
在第 2 天,我们添加以下三元组,因为我们认为 Luna 住在丹佛:
<temporalTriples>
<systemStart />
<systemEnd />
<validStart>{current-dateTime()}</validStart>
<validEnd>2999-01-01T00:00:00Z</validEnd>
<sem:triples xmlns:sem="http://marklogic.com/semantics">
<sem:triple>
<sem:subject>Luna</sem:subject>
<sem:predicate>city</sem:predicate>
<sem:object>Denver</sem:object>
</sem:triple>
</sem:triples>
</temporalTriples>
现在在第 3 天,我们想将 Luna 市更改为旧金山,所以我们别无选择,只能添加另一个三元组:
<temporalTriples>
<systemStart />
<systemEnd />
<validStart>{current-dateTime()}</validStart>
<validEnd>2999-01-01T00:00:00Z</validEnd>
<sem:triples xmlns:sem="http://marklogic.com/semantics">
<sem:triple>
<sem:subject>Luna</sem:subject>
<sem:predicate>city</sem:predicate>
<sem:object>San Francisco</sem:object>
</sem:triple>
</sem:triples>
</temporalTriples>
如果没有三重更新/删除的概念,有几个问题使 MarkLogic 无法正确回答某些问题:
- 如果您要求所有有效三元组(沿有效时间轴),您将获得所有三元组,包括
<Luna> <city> <Denver>
. - 如果您要求所有当前三元组(沿系统时间轴),您将再次获得所有三元组。
- 如果您要求最新的三元组(沿两个轴),您只会得到
<Luna> <city> <San Francisco>
.
这是一个提供所有有效三元组的示例查询:
sem:sparql('SELECT *
WHERE {
?s ?p ?o .
}',
(),
(),
sem:store(
(),
cts:and-query((
cts:period-range-query(
"valid",
"ALN_CONTAINS",
cts:period( xs:dateTime("2998-12-31T23:59:59Z") )
),
cts:collection-query("temporalCollection"),
cts:collection-query("temp/triples.xml")
))
)
)
基于这些,您无法正确回答以下问题:
- 如果您要求 Luna 现在居住的有效城市和州,您将得到丹佛和旧金山及其州。
- 如果您询问 Luna 居住的最新城市和州,您将一无所获,因为定义城市和州之间联系的三元组不在最新集合中。
以下是主要问题的摘要:
- 将新的三元组添加到数据库中:ML8 双时间特性完全支持它。您可以及时返回并查看添加之前的数据库。
- 删除三元组:不支持。您只能使用 temporal:document-delete 从“最新”集合中删除最新插入的三元组。数据在那里,您可以查询。您也可能最终删除要保留的三元组,因为一组三元组存储在单个文档中。
- 更新三元组(例如 Luna 从丹佛搬到旧金山)。理想情况下,您应该能够删除旧的三元组并插入新的三元组(类似于 ML8 SPARQL 更新功能),但由于不支持删除,您最终会将新的和旧的三元组都存储在数据库中/从数据库中返回.
是否有任何解决方法可以删除/更新时间三元组,以便我们可以回答示例问题?