通过在MarkLogic8中引入新的BiTemporal功能,您可以跟踪两个时间轴的变化:有效时间和系统时间。三元组也支持这些功能。所以你可以沿着这两个轴回到过去,并可能看到变化。但是,由于三元组存储在文档中,而双时态元数据存储在文档级别而不是三级,因此您无法删除或更新特定的三元组。此外,您不能将新的SPARQL Update功能与时间三元组一起使用。这是一个例子:
在第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")
))
)
)
基于这些,您无法正确回答以下问题:
以下是主要问题的摘要:
是否有任何解决方法可以删除/更新时间三元组,以便我们可以回答示例问题?
答案 0 :(得分:0)
我认为依靠系统轴而不是有效轴是有意义的。不同之处在于系统轴有助于识别数据何时进入系统以及何时到期(例如,删除的时间等效物)。有效轴告诉我们数据的语义有效性。它告诉它何时变得相关,何时失去/失去相关性。接下来,系统轴由MarkLogic管理,因此它确保时间版本没有重叠的结束时间,我认为这是导致上述示例中的主要问题。
我不确定所描述的案例是否真的需要BI-temporal。 MarkLogic 9提供了使用单时间的选项,例如仅使用系统轴。这样可以使维护变得更加容易,因为您可以省略有效的轴属性,并且更加可靠,因为您只需要关注(临时)插入时的系统启动时间。以前的版本会自动过期,因为MarkLogic会相应地更新以前版本的系统结束时间。
我也认为如果你按照主题iri对你的三元组进行分组是最容易的,并且每个主题创建一个文档iri,暂时管理。如果更新特定主题的三元组,则可以执行临时节点更新以进行适当的三重更改。如果你然后首先为住在丹佛的Luna插入一个三元组,然后(暂时)更新Luna三重文档以说Luna生活在SF中,旧版本在最新版本的系统开始时间之前获得新的系统结束时间。
然后,您可以运行约束为cts:collection-query('latest')
的SPARQL查询以获取最新的时间三元组,cts:lsqt-query(..)
从LSQT之前的特定时间获取三元组,或者在系统上使用日期范围查询手动执行某些操作开始和结束时间属性。
HTH!