Полагаю, вам нужно что-то вроде ...
SELECT ?article ?name WHERE {
?article rdf:type bench:Article .
?article dc:creator ?author .
?author foaf:name ?name .
FILTER ( ?article = <ARTICLE_URI_1> || ?article = <ARTICLE_URI_2> || ...
... || ?article = <ARTICLE_URI_5>)
}
Создание фильтра с соответствующими идентификаторами URI статьи вернет вам пять строк, а не одну строку с пятью именами, которые, как я думаю, будет возвращать ваш запрос. Также важно получить URI статьи, чтобы вы могли отслеживать статьи и имена.
Кроме того, ваш запрос не использует "соединения" SPARQL, как ожидалось, у вас есть три отдельных блока изолированных шаблонов, которые могут привести к комбинаторному взрыву в зависимости от структуры ваших данных.
Редактировать: объединить анализ запроса в вопросе
Объединение этого запроса приведет к наиболее вероятным противоречивым результатам. Но наиболее оптимизированный способ - начать с самых строгих шаблонов. Таким образом, возможный подход может быть:
Найдите ?article1
и ?article2
, применив ?article1 rdf:type bench:Article .
и ?article2 rdf:type bench:Article .
Удалите все значения из article1
и ?article2
, которые не совпадают ?journal
. Это связано с паттернами ?article1 swrc:journal ?journal .
и ?article2 swrc:journal ?journal .
Замените значения ?article1
и ?article2
на ?article1 dc:creator ?author1 .
и ?article2 dc:creator ?author2
соответственно, чтобы получить ?author1
и ?author2
.
Сделайте эквивалентный шаг, чтобы получить ?name1
?name2
.
Делать декартово произведение выбранных переменных ?name1
?name2
, потому что они не объединены.
Суть в том, что ответ на ваш вопрос таков: Да, результат создается на основе объединения переменных. Который в большинстве случаев также выполняется путем подстановки значений в последующих шаблонах. Оптимизация, как правило, производится на основе наиболее строгих шаблонов и заменяется как можно скорее.