Joe*_*eli 9 union graph sparql
指定图形的典型SPARQL查询可能如下所示:
SELECT ?b ?c WHERE { GRAPH <http://AliceIRI> {
<http://local.virt/foo> ?b ?c}}
Run Code Online (Sandbox Code Playgroud)
这将告诉我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}}}
Run Code Online (Sandbox Code Playgroud)
或者是否有一些速记可以让我更方便地写这个,如下所示:
SELECT ?b ?c WHERE { GRAPH <http://AliceIRI> + <http://BobIRI> {
<http://local.virt/foo> ?b ?c}
Run Code Online (Sandbox Code Playgroud)
顺便说一下,我在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}}
Run Code Online (Sandbox Code Playgroud)
并有这场比赛?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}}
Run Code Online (Sandbox Code Playgroud)
(这实际上是我的应用程序所需要的) - 但至少对于"学术兴趣"的问题是,是否存在一种语法上很好的方式来运行针对图形联合的查询(而不是针对多个图形然后结合结果)仍然有效.
是
SELECT ?b ?c
FROM NAMED <http://AliceIRI>
FROM NAMED <http://BobIri>
WHERE
{
GRAPH ?g { <http://local.virt/foo> ?b ?c }
}
Run Code Online (Sandbox Code Playgroud)
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
}
Run Code Online (Sandbox Code Playgroud)
这包括您希望允许三重模式的不同部分匹配的三元组来自您命名的任何图形的情况.
请注意,某些三重存储可能允许您进行设置,以便将默认图形自动视为所有命名图形的合并.