SPARQL для получения списка фильмов с правильным упорядочением атрибутов

Я пытаюсь получить список фильмов определенного года (скажем, 1990) с каждым фильмом и его атрибутами. Я пробовал разные способы получить SPARQL, но не смог. Как сгруппировать жанры в один столбец?

Мне бы хотелось, чтобы некоторые свойства были взяты отсюда http://schema.org/Movie.

PREFIX wd: <http://www.wikidata.org/entity/>
PREFIX wdt: <http://www.wikidata.org/prop/direct/>
PREFIX wikibase: <http://wikiba.se/ontology#>
PREFIX p: <http://www.wikidata.org/prop/>
PREFIX v: <http://www.wikidata.org/prop/statement/>
PREFIX q: <http://www.wikidata.org/prop/qualifier/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>

SELECT ?q ?film_title (GROUP_CONCAT(DISTINCT(?genreID); separator=", ") as ?genre) WHERE {
  ?q wdt:P31 wd:Q11424.
  ?q rdfs:label ?film_title filter (lang(?film_title) = "en").
  ?q wdt:P136 ?genreID.
  ?genreID rdfs:label ?genre.
  ?q wdt:P161 ?actorID.
  ?actorID rdfs:label ?actor filter (lang(?actor) = "en").
} LIMIT 100

person Venkat Reddy    schedule 03.05.2017    source источник


Ответы (1)


Использование агрегатных функций обычно требует создания группы вещей/строк, к которым вы хотите применить функцию, т. е. GROUP_BY для переменных проекции, которые не обозначают результат агрегатной функции:

SELECT ?q ?film_title (GROUP_CONCAT(DISTINCT(?genreID); separator=", ") as ?genres) WHERE {
  ?q wdt:P31 wd:Q11424 .
  ?q rdfs:label ?film_title . 
  FILTER (lang(?film_title) = "en")
  ?q wdt:P136 ?genreID .
  ?genreID rdfs:label ?genre .
  ?q wdt:P161 ?actorID .
  ?actorID rdfs:label ?actor 
  FILTER (lang(?actor) = "en")
} 
GROUP BY ?q ?film_title
LIMIT 100

Некоторые комментарии:

  • неясно, хотите ли вы получить идентификатор жанра или метку жанра, для последнего действительно вам нужно использовать переменную ?genre в функции GROUP_CONCAT: GROUP_CONCAT(DISTINCT(?genre); separator=", ")
  • нельзя переназначать имя переменной, которое уже использовалось в запросе, поэтому я изменил имя на ?genres
  • не ставь запятую после ФИЛЬТРА, не знаю зачем ты это сделал
  • вы не выбираете актера, поэтому остается неясным, почему вы используете последний тройной шаблон + ФИЛЬТР в своем запросе
  • ваш запрос довольно дорогой, поэтому его выполнение может истечь
person UninformedUser    schedule 03.05.2017