SPARQL 查询以从 RDF 数据中选择/构建最新版本

az_*_*az_ 5 rdf sparql

我有一个用于跟踪项目修订的 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 .
Run Code Online (Sandbox Code Playgroud)

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

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

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

Bil*_*ill 2

不确定您是否可以在一个查询中完成此操作。如果可以的话,我会更多地考虑它,但以下两个查询可能会让您朝着正确的方向开始:

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)) 
}
Run Code Online (Sandbox Code Playgroud)

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))
}
Run Code Online (Sandbox Code Playgroud)

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