Списки сущностей SPARQL внутри запросов select

В следующем запросе DBpedia есть ли способ объединить UNION в единый шаблон?

PREFIX prop: <http://resedia.org/ontology/>
PREFIX res: <http://resedia.org/resource/>
SELECT DISTINCT ?language ?label 
WHERE { 
  {res:Spain prop:language ?language} 
    UNION
  {res:France prop:language ?language}
    UNION
  {res:Italy prop:language ?language}
  ?language rdfs:label ?label .
  FILTER langMatches(lang(?label), "en") 
}

В спецификации SPARQL что-то упоминается о коллекциях RDF, но я не действительно понимаю, что он описывает. Казалось, что следующий синтаксис должен работать, но это не так.

PREFIX prop: <http://resedia.org/ontology/>
PREFIX res: <http://resedia.org/resource/>
SELECT DISTINCT ?language ?label 
WHERE { 
  (res:Spain res:France res:Italy) prop:language ?language
  ?language rdfs:label ?label .
  FILTER langMatches(lang(?label), "en") 
}

Есть ли способ определить список (или «множество», или «сумку») таких URI внутри запроса SELECT?


person wynz    schedule 01.06.2010    source источник


Ответы (2)


Простой ответ: нет.

(res:Spain res:France res:Italy) prop:language ?language

означает «сопоставить, где список, содержащий Испанию, Францию ​​и Италию, имеет язык», т. е. сам список имеет язык.

Вы можете сделать:

?country prop:language ?language . ?language rdfs:label ?label . 
FILTER ( ?country == res:Spain || ?country == res:France || ?country == res:Italy )

который короче, но может быть медленнее.

(У меня было ощущение, что в SPARQL 1.1 есть функция «IN», но я не вижу ее в черновиках)

person user205512    schedule 01.06.2010
comment
Жалко, может быть что-то подобное добавят в более поздних версиях. Спасибо за разъяснение и предложение. Кстати, есть ли способ назначить один URI переменной запроса и использовать эту переменную в другом месте запроса? - person wynz; 03.06.2010
comment
В стандартном SPARQL 1.0 нет, хотя в некоторых системах можно предварительно привязать переменные. В SPARQL 1.1 и некоторых системах да. См., например. semanticoverflow.com/questions/925/927#927. SELECT с подчиненным SELECT определенно будет работать в SPARQL 1.1. LET может войти. - person user205512; 04.06.2010
comment
О, и, конечно же, { ... FILTER ( ?var = ‹uri› ) } имеет тот же эффект. - person user205512; 04.06.2010

В SPARQL 1.1 вы можете сделать

SELECT DISTINCT ?language ?label 
WHERE {
  ?country prop:language ?language .
  ?language rdfs:label ?label .
  VALUES ?country { res:Spain res:France res:Italy }
  FILTER langMatches(lang(?label), "en") 
}
person Blake Regalia    schedule 14.03.2015