3

私の問題は非常に単純です。次を含むソースmy:g1があります。

my:a1 my:b "literal 1"

次に、次を含む 2 番目のソースmy:g2があります。

my:a2 my:b my:c.
my:c rdfs:label "literal 2"

次のようなものを生成する SPARQL クエリを設定するにはどうすればよいですか。

| ?a    | ?b    | ?literal    |
|-------|-------|-------------|
| my:a1 | my:b  | "literal 1" |
| my:a2 | my:b  | "literal 2" |

すなわち。"literal 1"と の両方に同じ変数を使用するように sparql に指示するにはどうすればよい"literal 2"ですか : 次のようなものを探しています

Select ?a ?b ?literal 
where {
 if (?g = my:g1) then
  GRAPH ?g { ?a ?b ?literal}
 else if (?g = my:g2) then
  GRAPH ?g { ?a ?b ?c. ?c rdfs:label ?literal}
}

注:このクエリがひどく間違っていることは知っていますが、私の意図を明確にするためだけです

編集:

この特定のケースでは、次のような「ユニオン」ステートメント

select ?a ?b ?literal 
where {
{
 GRAPH my:g1 { ?a ?b ?literal}
}
union
{
  GRAPH my:g2 { ?a ?b ?c. ?c rdfs:label ?literal}
}
}

動作しますが、私の「実際の」ケースではありません。他の解決策はありますか?

4

1 に答える 1

2

プロパティ パスとフィルターを使用できます。ここでの秘訣は、疑問符の付いたプロパティ パスが長さ 0 または 1 のパスを意味することです。パスの長さが 0 の場合、?literal は ?c と同じであり、?a がリテラル。パスの長さが 1 の場合、?literal は ?c の rdfs:label の値です。

実際のデータを使用した例を次に示します。

@prefix : <urn:ex:>

:a :b "literal 1" .
:a :b :c .
:c :label "literal 2" .prefix : <urn:ex:>
select distinct ?a ?b ?literal where {
  ?a ?b ?c .
  ?c :label? ?literal
  filter isLiteral(?literal)
}
-----------------------------
| a  | b      | literal     |
=============================
| :a | :b     | "literal 1" |
| :a | :b     | "literal 2" |
| :c | :label | "literal 2" |
-----------------------------

結果の最後の行を期待していなかったかもしれませんが、変数?bを特定のプロパティ:bにバインドする必要があるとは何も言っていないため、 ?a と ?b が変数である場合は意味があります。

于 2015-05-15T13:57:17.873 に答える