если в запросе SPARQL

моя проблема очень проста: у меня есть источник my:g1, который содержит:

my:a1 my:b "literal 1"

Затем у меня есть второй источник 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" |

т.е. как я могу сказать sparql использовать одну и ту же переменную для "literal 1" и "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}
}
}

будет работать, но это не мой "настоящий" случай. Есть ли другие решения?


person ffa    schedule 15.05.2015    source источник


Ответы (1)


Вы можете использовать путь свойства и фильтр. Хитрость здесь в том, что свойство path со знаком вопроса означает путь длины 0 или 1. Если путь имеет длину 0, то ?literal совпадает с ?c, что покрывает случай, когда ?a напрямую связан с буквально. Если путь имеет длину 1, то ?literal является значением rdfs:label для ?c.

Вот пример с реальными данными:

@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" |
-----------------------------

Возможно, вы не ожидали появления последней строки в результатах, но если ?a и ?b являются переменными, то это имеет смысл, потому что ничто не говорит о том, что переменная ?b должна быть связана с конкретное свойство :b.

person Joshua Taylor    schedule 15.05.2015
comment
Ваш ответ действительно полезен, но я не могу понять, как заставить его работать с двумя разными графиками. Любые идеи? - person ffa; 15.05.2015
comment
что вы подразумеваете под работой с двумя разными графиками? Вы имеете в виду, что на одном графике значения являются литералами, а на другом значениями являются ресурсы со свойством rdfs:label? Даже если это так, вы должны быть в состоянии просто обернуть все это. Например, select ... where { graph ?g { ?a ?b ?c . ... filter ... } }. - person Joshua Taylor; 15.05.2015
comment
Совершенно неясно, каков контекст вашего графика из вопроса. В первом примере вы используете graph ?g { ... } с переменной, но затем во втором вы используете объединение, но URI для графиков: { graph my:g1 { ... } } union { graph my:g2 { ... } }. - person Joshua Taylor; 15.05.2015