2

我需要定期处理持续存储在 Jena 数据存储中的数据。插入数据时,有什么方法可以存储 RDF 记录的插入时间?

4

1 回答 1

0

RDF 的一个有趣且有用的特性是数据和元数据都存储在同一级别 - 本质上是在一个图中(尽管请参阅下面的警告)。因此,与其有一个单独的地方(例如附加到数据库表的元数据)来记录更新时间等内容,不如在 RDF 中将该信息作为三元组放在数据本身旁边。

所以假设我正在向example:Book我的三重商店添加资源。我可以简单地dcTerms:modified向资源本身添加一个属性,以对更改日期进行编码:

example:eloquent_ruby
    a example:Book ;
    dcTerms:title "Eloquent Ruby"@en ;
    dcTerms:modified "2012-12-07T08:00:00"^^xsd:dateTime.

一个潜在的问题是,这样做时,我必须确信所有使用该存储的应用程序都明白modified三元组表示资源更新的时间,而不是书籍本身的最后一次更新。如果资源类型更明显地表示事物的描述而不是事物本身,则此模式可能会更好地工作 - 例如,如果主题资源是 aexample:PatientRecord而不是example:Book.

我可以通过显式记录更新主题资源的事件来降低更新时间不明确的风险:

example:eloquent_ruby
    a example:Book ;
    dcTerms:title "Eloquent Ruby"@en ;
    dcTerms:identifier "0-321-58410-4".

<urn:uuid:6ba3f8ea-4048-11e2-82bc-ab86fea9a379> 
    a example:UpdateEvent ;
    example:about example:eloquent_ruby ;
    dcTerms:modified "2012-12-07T08:00:00"^^xsd:dateTime ;
    example:changed dcTerms:identifier , dcTerms:title.

注意:您不必使用 UUID 作为更改记录的主题 - 任何其他合成 ID 甚至 bNode 都可以。这些天我个人较少使用 bNode,只是因为在 UI 中使用命名资源更容易。

如果在您的应用程序中,您不想将内容数据和出处元数据放在同一个 RDF 图中,您可以将更新记录放在不同的命名图中。这意味着您必须记住在您使用的任何 SPARQL 查询中使用图形名称(除非您依赖 Jena TDB 的联合默认图形功能),但它确实允许您单独管理内容数据和元数据,并将其隐藏如有必要,来自某些用户。

于 2012-12-07T08:41:31.577 回答