加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

在MarkLogic 8中删除/更新BiTemporal三元组

发布时间:2020-12-14 05:12:32 所属栏目:大数据 来源:网络整理
导读:通过在MarkLogic8中引入新的BiTemporal功能,您可以跟踪两个时间轴的变化:有效时间和系统时间.三元组也支持这些功能.所以你可以沿着这两个轴回到过去,并可能看到变化.但是,由于三元组存储在文档中,而双时态元数据存储在文档级别而不是三级,因此您无法删除或
通过在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> <城市> <丹佛取代.
>如果您要求所有当前三元组(沿系统时间轴),您将再次获得所有三元组.
>如果您要求最新的三元组(沿两个轴),您将只获得< Luna> <城市> <旧金山>.

以下是一个示例查询,它提供了所有有效的三元组:

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双时态功能完美支持它.您可以及时返回并查看添加前的DB.
>删除三元组:不支持.您只能使用temporal:document-delete从“最新”集合中删除最新插入的三元组.数据在那里你可以查询.您也可能最终删除要保留的三元组,因为一组三元组存储在单个文档中.
>更新三人组(例如Luna从丹佛搬到旧金山).理想情况下,您应该能够删除旧的三元组并插入新的三元组(类似于ML8 SPARQL更新功能),但由于不支持删除,您最终会将新旧三元组存储在数据库中/从数据库中恢复.

是否有任何解决方法可以删除/更新时间三元组,以便我们可以回答示例问题?

解决方法

我认为依靠系统轴而不是有效轴是有意义的.不同之处在于系统轴有助于识别数据何时进入系统以及何时到期(例如,删除的时间等效物).有效轴告诉我们数据的语义有效性.它告诉它何时变得相关,何时失去/失去相关性.接下来,系统轴由MarkLogic管理,因此它确保时间版本没有重叠的结束时间,我认为这是导致上述示例中的主要问题.

我不确定所描述的案例是否真的需要BI-temporal. MarkLogic 9提供了使用单时间的选项,例如仅使用系统轴.这样可以使维护变得更加容易,因为您可以省略有效的轴属性,并且更加可靠,因为您只需要关注(临时)插入时的系统启动时间.之前的版本将自动过期,因为MarkLogic将相应地更新先前版本的系统结束时间.

我也认为如果你按照主题iri对你的三元组进行分组是最简单的,并且每个主题创建一个文档iri,暂时管理.如果更新特定主题的三元组,则可以执行临时节点更新以进行适当的三重更改.如果你然后首先为住在丹佛的Luna插入一个三元组,然后(暂时)更新Luna三重文档以说Luna生活在SF中,旧版本在最新版本的系统开始时间之前获得新的系统结束时间.

然后,您可以运行受限于cts的SPARQL查询:collection-query(‘latest’)仅获取最新的时间三元组,cts:lsqt-query(..)从LSQT之前的特定时间获取三元组,或者使用系统开始和结束时间属性的日期范围查询.

HTH!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读