我有一个用于跟踪项目修订的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.