我正在尝试比较SPARQL中的RDF列表,我有以下的龟文件(下面只是其中的一部分):
dyldo_o:ob388bc6eb70fae0379746174f3092f22 a qb:Observation ; # One observation
per seed URI.
:hasSnapshot dyldo_s:s2012-05-13 ;
:hasSeedURI "http://whatev.er/3" ;
:hasRequestChain (
[ a http:Request ;
http:requestURI "http://whatev.er/3" ;
http:resp dyldo_r:rb388bc6eb70fae0379746174f3092f22
]) .
dyldo_r:rb388bc6eb70fae0379746174f3092f22 a http:Response ;
http:statusCodeValue 200 ;
http:body (
[ a rdf:Statement ;
rdf:subject <http://ex.org/s3> ;
rdf:predicate <http://ex.org/p2> ;
rdf:object <http://ex.org/o1>
# Context in the quads equals request URI
]
[ a rdf:Statement ;
rdf:subject <http://ex.org/s0> ;
rdf:predicate <http://ex.org/p9> ;
rdf:object <http://ex.org/o8>
# Context in the quads equals request URI
]
) .
整个文件包含许多快照,每个快照有许多不同的URI。 我的SPARQL查询必须能够比较的是http:body,与RDF语句的顺序无关。它应该找出在具有不同http响应主体的给定快照之后拍摄的快照(包含或不包含不在初始快照中的三元组)。
不幸的是,这个和其他变体不起作用:
PREFIX : <http://dyldo.info/vocab#>
PREFIX http: <http://www.w3.org/2011/http#>
PREFIX dyldo: <http://dyldo.info/#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
select distinct ?seedURI ?subject1
WHERE {
?observation1 :hasSnapshot ?snapshot1;
:hasSeedURI ?seedURI ;
:hasRequestChain/rdf:rest*/rdf:first ?item1 .
?snapshot1 <http://purl.org/dc/terms/created> ?date1 .
?item1 http:resp ?hash1 .
?hash1 http:body/rdf:rest*/rdf:first ?body1 .
?observation2 :hasSnapshot ?snapshot2;
:hasSeedURI ?seedURI2;
:hasRequestChain/rdf:rest*/rdf:first ?item2 .
?snapshot2 <http://purl.org/dc/terms/created> ?date2 .
?item2 http:resp ?hash2 .
?hash2 http:body/rdf:rest*/rdf:first ?body2 .
filter(?date1 = "2012-05-06"^^xsd:date && str(?seedURI) = str(?seedURI2) && ?date2 > ?date1)
filter (exists {
?body1 rdf:subject ?subject1;
rdf:predicate ?predicate1;
rdf:object ?object1 .
filter not exists {
?body2 rdf:subject ?subject1;
rdf:predicate ?predicate1;
rdf:object ?object1 .
}
})
}
修改 下面的查询似乎有效,至少在我的示例数据上,可能有更好的方法来实现相同的结果。仍然存在的问题是存在空白节点,如果它们只有空白节点,则2个相等的RDF内容将被标记为不相等
PREFIX : <http://dyldo.info/vocab#>
PREFIX http: <http://www.w3.org/2011/http#>
PREFIX dyldo: <http://dyldo.info/#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX list: <http://jena.hpl.hp.com/ARQ/list#>
select distinct ?seedURI1
WHERE {
?observation1 :hasSnapshot ?snapshot1;
:hasSeedURI ?seedURI1 ;
:hasRequestChain/rdf:rest* ?rest1 .
?snapshot1 <http://purl.org/dc/terms/created> ?date1 .
?rest1 rdf:first ?requestChain1; rdf:rest rdf:nil .
?requestChain http:resp/http:body ?body1 .
?observation2 :hasSnapshot ?snapshot2;
:hasSeedURI ?seedURI2;
:hasRequestChain/rdf:rest* ?rest2 .
?snapshot2 <http://purl.org/dc/terms/created> ?date2 .
?rest2 rdf:first ?requestChain2; rdf:rest rdf:nil .
?requestChain http:resp/http:body ?body2 .
filter(?date2 > ?date1 && str(?seedURI1) = str(?seedURI2))
filter (exists {
?body1 list:member ?member1 .
?member1 rdf:subject ?subject1 .
?member1 rdf:object ?object1
filter not exists {
?body2 list:member ?member1 .
?member2 rdf:subject ?subject1 .
?member2 rdf:object ?object1
}
}
|| exists {
?body2 list:member ?member1 .
?member2 rdf:subject ?subject2 .
?member2 rdf:object ?object2
filter not exists {
?body1 list:member ?member1 .
?member1 rdf:subject ?subject2 .
?member1 rdf:object ?object2
}
})
}