SPARQL выбирает два столбца

#rdf #semantic-web #sparql

#rdf #семантический веб #sparql

Вопрос:

Я новичок в SPARQL и пытаюсь выбрать два или более свойства данных из entity. У меня есть объект Artist, который имеет два свойства данных (id и name). Я пытаюсь получить результат, подобный этому:

  id         Name
 0         Artist 1
 1         Artist 2
  

Но то, что я получаю, это:

  id         Name
 0         Artist 1
 0         Artist 2
 1         Artist 1
 1         Artist 2
  

Вот мой запрос SPARQL:

 PREFIX wits:   <http://wits.org/song/> 
SELECT ?name, ?id 
FROM <http://wits.org/song> 
WHERE
{ 
    <http://wits.org/song/Artist>  wits:Name ?name .
    <http://wits.org/song/Artist>  wits:ID ?id 
}
  

Вот RDF-реализация класса Artist:

 <!ENTITY www "http://www.wits.org/" >
<owl:Class rdf:about="amp;www;Artist">
        <rdfs:subClassOf rdf:resource="amp;owl;Thing"/>
        <rdfs:subClassOf>
            <owl:Restriction>
                <owl:onProperty rdf:resource="amp;www;song#ID"/>
                <owl:allValuesFrom rdf:resource="amp;xsd;unsignedInt"/>
            </owl:Restriction>
        </rdfs:subClassOf>
        <rdfs:subClassOf>
            <owl:Restriction>
                <owl:onProperty rdf:resource="amp;www;song#Name"/>
                <owl:qualifiedCardinality rdf:datatype="amp;xsd;nonNegativeInteger">1</owl:qualifiedCardinality>
                <owl:onDataRange rdf:resource="amp;xsd;string"/>
            </owl:Restriction>
        </rdfs:subClassOf>
    </owl:Class>
  

Это команда INSERT, которая была выполнена ранее:

 PREFIX wits: <http://wits.org/song/>
        INSERT DATA INTO <http://wits.org/song> {
        wits:Artist wits:Name "Artist 2"
        wits:ID 1 .
        }
  

Что я делаю не так?

Приветствуется любая помощь. 125125

Комментарии:

1. Дублируется в answers.semanticweb.com/questions/8757 /…

Ответ №1:

Я предполагаю, что вы вставляете следующие данные.

     INSERT DATA INTO <http://wits.org/song> {
        wits:Artist wits:Name "Artist 0"; wits:ID 0 .
        wits:Artist wits:Name "Artist 1"; wits:ID 1 .
    }
  

что неправильно, потому что wits:Artist будет иметь оба имени и оба идентификатора, вам нужно присвоить разные URI каждому исполнителю и предоставить класс как rdf:type .

Правильным способом в соответствии с вашей онтологией было бы …

     INSERT DATA INTO <http://wits.org/song> {
        wits:Artist0 a wits:Artist; wits:Name "Artist 0"; wits:ID 0 .
        wits:Artist1 a wits:Artist; wits:Name "Artist 1"; wits:ID 1 .
    }
  

a эквивалентно rdf:type . Здесь мы говорим, что это wits:Artist0 тип класса wits:Artist с именем Artist 0 и идентификатором 0 .