Совокупные свойства

Я разрабатываю свою собственную конечную точку Fuseki на основе некоторых данных DBpedia. Я сомневаюсь, как агрегировать свойства, связанные с одним ресурсом.

SELECT ?name ?website ?abstract ?genre ?image
WHERE{
VALUES ?s {<http://dbpedia.org/resource/Attack_Attack!>}
  ?s  foaf:name ?name ;
      dbo:abstract ?abstract .
  OPTIONAL { ?s dbo:genre ?genre } .
  OPTIONAL { ?s dbp:website ?website } .
  OPTIONAL { ?s dbo:image ?image } .
  FILTER LANGMATCHES(LANG(?abstract ), "en")
}

Конечная точка SPARQL: http://dbpedia.org/sparql/

Этот запрос возвращает 2 совпадающих результата. Они отличаются только значением dbo:genre. Есть способ запросить базу знаний и получить один результат со списком genres?


person alfredopacino    schedule 04.07.2017    source источник
comment
Первый шаблон тройки не нужен, так как он обозначает тройку свойств RDF без переменных. Кроме того, VALUES можно использовать, чтобы сделать запрос более компактным, см. мой отредактированный запрос.   -  person UninformedUser    schedule 04.07.2017


Ответы (2)


Запрос @chrisis хорошо работает с конечной точкой DBpedia SPARQL, основанной на Virtuoso.

Однако, если вы используете Jena Fuseki, вам следует использовать более подходящий синтаксис:

PREFIX dbo: <http://dbpedia.org/ontology/>
PREFIX dbp: <http://dbpedia.org/property/>

SELECT
?name
(SAMPLE(?website) AS ?sample_website)
(SAMPLE(?abstract) AS ?sample_abstract)
(SAMPLE(?image) AS ?sample_image)
(GROUP_CONCAT(?genre; separator=', ') AS ?genres)
WHERE {
  VALUES (?s) {(<http://dbpedia.org/resource/Attack_Attack!>)}
  ?s  foaf:name ?name ;
      dbo:abstract ?abstract .
  OPTIONAL { ?s dbo:genre ?genre } .
  OPTIONAL { ?s dbp:website ?website } .
  OPTIONAL { ?s dbo:image ?image} .
  FILTER LANGMATCHES(LANG(?abstract ), "en")
} GROUP BY ?name

Отличия от запроса @chrisis:

  • Поскольку GROUP_CONCAT является функцией агрегирования, ее можно использовать только с GROUP BY;
  • Поскольку используется GROUP BY, все негруппирующие переменные должны быть агрегированы (например, через SAMPLE);
  • Синтаксис GROUP_CONCAT немного отличается.

В Fuseki эти AS в проекции на самом деле лишние: см. этот вопрос и комментарии.

person Stanislav Kralin    schedule 04.07.2017
comment
АС не лишний. Это предписано спецификацией. если вы пытаетесь написать юридический запрос, его следует включить. Тот факт, что некоторые конечные точки могут обрабатывать недопустимый синтаксис, на самом деле не является веской причиной для его исключения. - person Joshua Taylor; 05.07.2017

Да, вам нужна функция GROUP_CONCAT().

SELECT ?name ?website ?abstract (GROUP_CONCAT(?genre,',') AS ?genres) ?image
WHERE{
  <http://dbpedia.org/resource/Attack_Attack!> a dbo:Band ;
       foaf:name ?name;
      dbo:abstract ?abstract .
  OPTIONAL{   <http://dbpedia.org/resource/Attack_Attack!> dbo:genre ?genre } .
  OPTIONAL{   <http://dbpedia.org/resource/Attack_Attack!> dbp:website ?website} .
  OPTIONAL{   <http://dbpedia.org/resource/Attack_Attack!> dbo:image ?image} .
FILTER LANGMATCHES(LANG(?abstract ), "en")

}
person chrisis    schedule 04.07.2017