Как использовать запрос SPARQL для одновременного получения поля и количества полей?

Я новичок в Semantic Web и SPARQL. Я делаю RDFS концерта. В нем есть такие записи песен, как:

con:song04
    rdfs:Class con:Repertoire;
    rdfs:label "Deewani Mastani";
    con:performedBy con:artist02.
    con:performedBy con:artist05.

Я пытаюсь получить список песен и их количество, если они исполняются одним и тем же исполнителем. Я пробовал некоторые учебники из stackoverflow, но не выполняю свою задачу.

Запрос, который я использую, может быть совершенно неправильным, он был бы очень полезен в обучении, если бы кто-нибудь мог помочь мне в этом аспекте. Я использую Apache Jena Fuseki для запроса.

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX co: <http://rhizomik.net/ontologies/copyrightonto.owl#>
PREFIX dc: <http://purl.org/dc/elements/1.1/>
prefix con: <http://www.example.com/paras/concert#>

#Use SPARQL to count and list the songs that two artists share.
SELECT ?songs (COUNT(?artist) AS ?count)  
WHERE
{ 
  ?s rdfs:label ?songs .
  ?s rdf:type con:Repertoire.
  ?s con:performedBy ?artist.
  ?artist rdf:type con:Artist .
  filter( ?count > 1 )
}

person Parash Nath Mishra    schedule 23.11.2015    source источник
comment
Это не ответ на ваш вопрос, но тем не менее важный: вы используете ресурс rdfs:Class неправильно. Это имя класса, а не свойство. Тройка con:song04 rdfs:Class con:Repertoire не говорит о том, что песня 4 относится к классу Repertoire. Если это то, что вы хотите выразить, вы должны вместо этого использовать rdf:type (это свойство, которое выражает отношения экземпляр-класс).   -  person Jeen Broekstra    schedule 23.11.2015
comment
@JeenBroekstra: Вы хотите сказать, что вместо этого я должен говорить con:song04 ref:type con:Repertoire? Пожалуйста, уточните, спасибо   -  person Parash Nath Mishra    schedule 24.11.2015
comment
Да, за исключением опечатки (это rdf, а не ref).   -  person Jeen Broekstra    schedule 24.11.2015
comment
Спасибо @JeenBroekstra   -  person Parash Nath Mishra    schedule 24.11.2015


Ответы (2)


SELECT ?songs (COUNT(?artist) AS ?count)  
WHERE
{ 
  ?s rdfs:label ?songs .
  ?s rdfs:Class con:Repertoire.
  ?s con:performedBy ?artist.
  ?artist rdfs:Class con:Artist .
  filter( ?count > 1 )
}

Если вы вставите этот запрос в валидатор на sparql.org, вы увидите, что выбор переменной является ошибкой. которые вы не сгруппировали по, когда используете агрегатные функции, такие как COUNT. Ваш запрос почти правильный. Вы пытаетесь СГРУППИРОВАТЬ ПО песне и ПОСЧИТАТЬ, сколько исполнителей написали эту песню. Затем вы хотите взять только результаты, ИМЕЮЩИЕ количество больше 1. Вы делаете это следующим образом:

SELECT ?songs (COUNT(?artist) AS ?count)  
WHERE
{ 
  ?s rdfs:label ?songs .
  ?s rdfs:Class con:Repertoire.
  ?s con:performedBy ?artist.
  ?artist rdfs:Class con:Artist .
}
GROUP BY ?songs
HAVING (?count > 1 )
person Joshua Taylor    schedule 23.11.2015
comment
Привет @Joshua, спасибо, твое объяснение помогло мне лучше понять. Вы точно поняли, что я пытался сделать, но я не получаю правильного ответа. :( Возможно, я что-то упускаю, помощь будет оценена по достоинству. - person Parash Nath Mishra; 24.11.2015
comment
@ParashNathMishra Не зная точно, чего вы ожидаете в качестве результатов, вам будет трудно помочь вам исправить запрос. - person Joshua Taylor; 24.11.2015
comment
Я пытаюсь перечислить песни, которые исполняют более 2 исполнителей. Как упоминалось в вопросе, я бы хотел, чтобы песня04 была указана в качестве результата, поскольку она также ароматизирована двумя исполнителями, отображать количество песен, удовлетворяющих условию. - person Parash Nath Mishra; 24.11.2015
comment
@parash У меня нет твоих данных. Я не знаю, что мой запрос возвращает ваши данные. Без доступа к вашим данным я не могу отладить запрос к вашим данным. - person Joshua Taylor; 24.11.2015

Согласно данному описанию, я полностью согласен с @Joshua Taylor и считаю, что то, что вы пытаетесь сделать, может быть достигнуто с помощью запроса. Пожалуйста, проверьте, в порядке ли ваша RDFS.

SELECT ?songs (COUNT(?artist) AS ?count)  
WHERE
{ 
  ?s rdfs:label ?songs .
  ?s rdfs:Class con:Repertoire.
  ?s con:performedBy ?artist.
  ?artist rdfs:Class con:Artist .
}
GROUP BY ?songs
HAVING (?count > 1 )
person Suresh KUMAR Mukhiya    schedule 26.11.2015
comment
Спасибо, Суреш, это действительно была проблема с моей RDFS. - person Parash Nath Mishra; 26.11.2015