Списки объектов SPARQL внутри запросов выбора - PullRequest
2 голосов
/ 01 июня 2010

В следующем запросе 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?

Ответы [ 2 ]

7 голосов
/ 14 марта 2015

В 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") 
}
2 голосов
/ 01 июня 2010

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

(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', но я не вижу ее в черновиках)

...