У меня довольно сложный запрос SPARQL со структурой, описанной ниже, включающей несколько графовых шаблонов, UNION
и вложенный FILTER NOT EXISTS
.
Я хочу, чтобы запрос оставался общим, и я хочу иметь возможность вводить значения для определенных переменных во время выполнения, и моя идея состоит в том, чтобы добавить ключевое слово VALUES
в конце запроса, чтобы указать значение определенного переменные в запросе. В приведенной ниже структуре я установил значение ?x
и проиллюстрировал все места в запросе, где применяется ?x
.
Однако в Fuseki я вижу, что выполнение такого запроса занимает от 4 до 5 секунд, но ручная замена переменной ?x
в запросе на URI вместо указания предложения VALUES
делает его очень быстрым. быстро.
- Я всегда думал, что использование ключевого слова
VALUES
в конце предложения WHERE
похоже на установку значений для некоторых переменных, встроенных в строку, поэтому я ожидаю, что использование предложения VALUES
или замена переменных на соответствующие им URI будут то же самое с точки зрения выполнения запроса. Может ли кто-нибудь подтвердить ожидаемое поведение ключевого слова VALUES
? также объясните разницу между его использованием вне условия WHERE
или внутри предложения WHERE
?
- Изменяет ли то, что переменная, установленная с помощью
VALUES
в предложении FILTER NOT EXISTS
, что-то меняет?
- Можете ли вы подтвердить, что это правильный подход для требования выше (я хочу, чтобы запрос оставался универсальным, и я хочу иметь возможность вводить значения для определенных переменных во время выполнения)?
- Возможно ли, что это поведение зависит от того, как Fuseki обрабатывает
VALUES
?
Спасибо!
SELECT DISTINCT ...
WHERE {
# ?x ...
# ... basic graph pattern here
{
{
# ... basic graph pattern here
FILTER NOT EXISTS {
# ?x ...
# ... basic graph pattern here
}
FILTER NOT EXISTS {
# ... basic graph pattern here
FILTER NOT EXISTS {
# ?x ...
# ... basic graph pattern here
}
}
}
UNION
{
?x ...
# ... basic graph pattern here
}
UNION
{
# ... basic graph pattern here
FILTER NOT EXISTS {
?x ...
# ... basic graph pattern here
}
FILTER NOT EXISTS {
# ... basic graph pattern here
FILTER NOT EXISTS {
?x ...
# ... basic graph pattern here
}
}
}
UNION
{
?x ...
}
}
}
VALUES ?x { <http://example.com/Foo> }