SPARQL更新中的UNION运算符

时间:2013-03-13 10:14:05

标签: sparql

我有两个SPARQL更新。第一个:

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,例如“选择”?

2 个答案:

答案 0 :(得分: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
  }
}

答案 1 :(得分:1)

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