在Apache Jena中按插入时间插入和搜索记录

时间:2012-12-06 17:22:44

标签: jena

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

1 个答案:

答案 0 :(得分: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三元组表示更新资源的时间,而不是书的最后更新本身。如果资源类型更明显地表示事物的描述而不是事物本身,则此模式可能更好地工作 - 例如,如果主题资源是example: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的union default graph功能),但它确实允许您单独管理内容数据和元数据,并且如有必要,请将其隐藏在某些用户之外。