我需要定期处理持续存储在Jena数据存储中的数据。在插入数据时,有没有办法存储RDF记录的插入时间?
答案 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功能),但它确实允许您单独管理内容数据和元数据,并且如有必要,请将其隐藏在某些用户之外。