对两个图运行sparql查询?

时间:2013-03-10 22:46:34

标签: graph union sparql

指定图形的典型SPARQL查询可能如下所示:

SELECT ?b ?c WHERE { GRAPH <http://AliceIRI> {
<http://local.virt/foo> ?b ?c}}

这将告诉我AliceIRI的所有三元组,其中“foo”是一个主题。如果我想查看两个不同的图表,我唯一可以选择UNION:

SELECT ?b ?c WHERE {{ GRAPH <http://AliceIRI> {
<http://local.virt/foo> ?b ?c}}
UNION
{ GRAPH <http://BobIRI> {
<http://local.virt/foo> ?b ?c}}}

或者是否有一些速记可以让我更方便地写这个:像这样:

SELECT ?b ?c WHERE { GRAPH <http://AliceIRI> + <http://BobIRI> {
<http://local.virt/foo> ?b ?c}

BTW我在Virtuoso 6.01.3127上。

更新1

为了澄清,我真的希望能够运行:

SELECT ?b ?c WHERE { GRAPH <http://AliceIRI> + <http://BobIRI> {
<http://local.virt/foo> ?b ?c .
<http://local.virt/bar> ?b ?c}}

并且匹配?b?c<http://local.virt/foo> ?b ?c位于<http://AliceIRI><http://local.virt/bar> ?b ?c位于<http://BobIRI>。简单地在<http://AliceIRI>(单独)和<http://BobIRI>(单独)中进行匹配联合将无法实现此目的。

并进一步澄清:我已经意识到,如果foos都属于Alice而且所有的酒吧都属于Bob,那么我就可以写了

SELECT ?b ?c WHERE { 
GRAPH <http://AliceIRI> {
<http://local.virt/foo> ?b ?c } .
GRAPH <http://BobIRI> {
<http://local.virt/bar> ?b ?c}}

(这实际上是我的应用程序所需要的) - 但至少对于“学术兴趣”的问题是,是否有一种语法上很好的方式来运行针对图形联合的查询(而不是针对多个图形)然后联合结果)仍然有效。

2 个答案:

答案 0 :(得分:7)

SELECT ?b ?c
FROM NAMED <http://AliceIRI>
FROM NAMED <http://BobIri>
WHERE
{
  GRAPH ?g { <http://local.virt/foo> ?b ?c }
}

FROM NAMED子句可用于设置在使用GRAPH ?var子句时查询的命名图。

重要的是要注意,语义上这个查询与你上面写的相同,所以GRAPH子句表示的模式分别与每个命名图匹配并联合在一起

修改

要回答评论中的额外问题,您可以,如果您使用FROM而不是FROM NAMED,则可以将查询的默认图表设置为{{1}中所有图表的合并}子句并且不要求您使用FROM例如

GRAPH

这包括您希望允许与三重模式的不同部分匹配的三元组来自您命名的任何图形的情况。

请注意,某些三重存储可能允许您设置它们,以便默认图形自动被视为所有命名图形的合并。

答案 1 :(得分:1)

如果您必须在正在使用的图形子集中运行查询,还可以在图形的iri上设置过滤器。

例如:

SELECT ?b ?c
FROM NAMED <http://AliceIRI>
FROM NAMED <http://BobIri>
FROM NAMED <http://CarlIri>
WHERE {
GRAPH ?g {
    <http://local.virt/foo> ?b ?c 
    FILTER( ?g=<http://AliceIRI> || ?g=<http://BobIri> )
}
}