2015-11-23 4 views
2

Я новичок в Semantic Web и SPARQL. Я делаю RDFS концерта. Он имеет песню запись, как:Как использовать запрос SPARQL для получения поля и количества полей одновременно?

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) 
} 
+1

Это не ответ на ваш вопрос, но важно тем не менее: вы используете ресурс 'rdfs: Class' неправильно. Это имя класса, а не свойство. Тройка 'con: song04 rdfs: Class con: Repertoire' делает _not_ сказать, что песня 4 находится в классе« Репертуар ». Если это то, что вы хотите выразить, вместо этого вы должны использовать 'rdf: type' (это свойство, которое выражает отношения класса экземпляра). –

+1

@JeenBroekstra: Вы хотите сказать, я должен сказать «con: song04 ref: type con: Repertoire' вместо этого? Прошу пояснить, спасибо –

+1

Да, минус опечатка (это 'rdf', а не' ref'). –

ответ

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) 
} 

Если вставить этот запрос в validator at sparql.org, вы видите, что это ошибка, чтобы выбрать переменную, которую не сгруппированных BY, когда вы используете агрегатные функции, такие как COUNT. Ваш запрос почти правильный, хотя. Вы пытаетесь ГРУППАТЬ по песне, и 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) 
+0

Привет @Joshua, Спасибо, Ваше объяснение помогло мне лучше понять. Вы точно поняли, что я пытаюсь сделать, но я не получаю правильный ответ. :(Возможно, что-то мне не хватает, помощь будет оценена. –

+2

@ParashNathMishra. Не зная точно, чего вы ожидаете в качестве результатов, будет сложно помочь вам исправить запрос. –

+0

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

1

Согласно описанию, я полностью согласен с @Joshua Тейлор и верить, что вы пытаетесь сделать, может быть достигнутый по запросу. Проверьте, правильно ли работает 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) 
+1

Спасибо Суреш, это действительно была проблема с моей RDFS. –