11

指定图形的典型 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}

顺便说一句,我在 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,而 bar 都属于 Bob,那么我可以写

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

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

4

2 回答 2

10

是的

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这个,则将查询的默认图设置为FROM子句中所有图的合并,并且不需要您使用GRAPH例如

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

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

请注意,某些三元存储可能允许您对其进行设置,以便将默认图自动视为所有命名图的合并。

于 2013-03-11T16:10:00.060 回答
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> )
}
}
于 2015-04-28T13:21:47.380 回答