11

グラフを指定する典型的な SPARQL クエリは次のようになります。

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

これにより、「foo」が主語である AliceIRI のすべてのトリプルがわかります。2 つの異なるグラフを調べたい場合、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 に属し、バーがすべて 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 に答える