2013-03-13 63 views
2

我有两个SPARQL updates.First之一:UNION运营商更新

INSERT 
{ GRAPH <[http://example/bookStore2]> { ?book ?p ?v } } 
WHERE 
{ GRAPH <[http://example/bookStore]> 
    { ?book dc:date ?date . 
    FILTER (?date > "1970-01-01T00:00:00-02:00"^^xsd:dateTime) 
    ?book ?p ?v 
} } 

二:

INSERT 
{ GRAPH <[http://example/bookStore2]> { ?book ?p ?v } } 
WHERE 
{ GRAPH <[http://example/bookStore3]> 
    { ?book dc:date ?date . 
    FILTER (?date > "1980-01-01T00:00:00-02:00"^^xsd:dateTime) 
    ?book ?p ?v 
} } 

我可以与UNION运算符将它们结合起来?如果是的话,这是一个相同的结果?是否可以在SPARQL更新中使用UNION,例如在“选择”中?

回答

1

WHERE子句与SPARQL查询相同 - 您可以使用UNION。

+0

是的,但例如在SQL更新在SQL中也有相同的WHERE子句,但我们不能使用UNION运算符 – Cheryl 2013-03-13 17:11:16

+0

@Cheryl SPARQL与SQL有一些相似之处,它们都提供了查询某些数据的方法,但除此之外,它们是非常不同的。不管SQL是否允许你将WHERE和UNION结合起来,在SPARQL中,你可以将它们结合起来,例如,'select * where {{?animal a:Cat} UNION {?animal a:Dog}}'获得所有'?x那就是':猫'和所有'?x'都是':狗'。 – 2013-08-26 18:47:04

2

AndyS's answer是正确的;您可以将它们组合起来,UNION的说明可在SPARQL规范的7 Matching Alternatives部分找到。合并查询是:

INSERT { 
    GRAPH <[http://example/bookStore2]> { ?book ?p ?v } 
} 
WHERE{ 
    { 
    GRAPH <[http://example/bookStore]> { 
     ?book dc:date ?date . 
     FILTER (?date > "1970-01-01T00:00:00-02:00"^^xsd:dateTime) 
     ?book ?p ?v 
    } 
    } 
    UNION 
    { 
    GRAPH <[http://example/bookStore3]> { 
     ?book dc:date ?date . 
     FILTER (?date > "1980-01-01T00:00:00-02:00"^^xsd:dateTime) 
     ?book ?p ?v 
    } 
    } 
} 

在这种特殊情况下的图案是如此相似,你也可以只是抽象出来的不同部位与VALUES

INSERT { 
    GRAPH <[http://example/bookStore2]> { ?book ?p ?v } 
} 
WHERE{ 
    values (?graph ?startDate) { 
    (<[http://example/bookStore]> "1970-01-01T00:00:00-02:00"^^xsd:dateTime) 
    (<[http://example/bookStore3]> "1980-01-01T00:00:00-02:00"^^xsd:dateTime) 
    } 
    GRAPH ?graph { 
    ?book dc:date ?date . 
    FILTER (?date > ?startDate) 
    ?book ?p ?v 
    } 
}