SPARQL查询从RDF数据中选择/构造最新修订

我有一个用于跟踪项目修订的RDF文件.使用此数据,我可以追溯项目生命周期内所做的更改.一旦特定的更改,相应的数据将被放置为新的修订版.看一看..

@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix mymeta: <http://www.mymeta.com/meta/> .
@prefix dc: <http://purl.org/dc/elements/1.1/> .

<urn:ITEMID:12345> rdf:type mymeta:item .
<urn:ITEMID:12345> mymeta:itemchange <urn:ITEMID:12345:REV-1> .
<urn:ITEMID:12345:REV-1> dc:title "Product original name"@en .
<urn:ITEMID:12345:REV-1> dc:issued "2006-12-01"@en .
<urn:ITEMID:12345:REV-1> dc:format "4 x 6 x 1 in"@en .
<urn:ITEMID:12345:REV-1> dc:extent "200"@en .

<urn:ITEMID:12345> rdf:type mymeta:item .
<urn:ITEMID:12345> mymeta:itemchange <urn:ITEMID:12345:REV-2> .
<urn:ITEMID:12345:REV-2> dc:title "Improved Product Name"@en .
<urn:ITEMID:12345:REV-2> dc:issued "2007-06-01"@en .

根据这些数据,在“2007-06-01”上有一个项目修订版,其中只有项目名称被更改为“改进的产品名称”.如您所见,最新数据修订版中缺少“dc:format”和“dc:extent”.这是为了避免数百万的重复记录!

我可以编写一个SPARQL查询,向我显示最新的产品修订信息(REV-2:dc:title和dc:已发布),但它缺少“dc:format”和“dc:extent”,我想从最后一个继承修订版(REV-1).

如何编写SPARQL查询来执行此操作?任何帮助非常感谢!

最佳答案 不确定您是否可以在一个查询中执行此操作.如果可以的话,我会更多地考虑它,但是以下两个查询可能会让你开始朝着正确的方向前进:

1)找到没有格式的更改

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX mymeta: <http://www.mymeta.com/meta/>
PREFIX dc: <http://purl.org/dc/elements/1.1/>

DESCRIBE ?change
WHERE 
{
    ?item a mymeta:item;
             mymeta:itemchange ?change.
    ?change ?p ?o.
    OPTIONAL 
    {
        ?change dc:format ?format .
    }
    FILTER (!bound(?format)) 
}

2)我认为这将找到具有格式的最古老的变化

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX mymeta: <http://www.mymeta.com/meta/>
PREFIX dc: <http://purl.org/dc/elements/1.1/>

SELECT DISTINCT ?format
WHERE {
    ?item a mymeta:item;
             mymeta:itemchange ?change.
    ?change  dc:format ?format;
                  dc:issued ?issued.
    OPTIONAL {
        ?moreRecentItem a mymeta:item;
                ?moreRecentItem dc:issued ?moreRecentIssued.
        FILTER (?moreRecentIssued > ?issued)}
    FILTER (?bound (?moreRecentIssued))
}

通过更多的工作,应该可以将(2)的?格式限制为来自(1)的结果的发布数据之前的发布日期的那些变化.因此,对于(1)中的每一行,您执行(2)以查找要使用的格式值.如果使用基于规则的推理引擎而不是SPARQL,则可能会有更好的结果.我推荐EulerSharp或Pellet.

点赞