7

I have this query SPARQL that I ran on it.dbpedia.org/sparql:

select ?resource where {
  ?resource rdfs:label "Piemonte"@it
}

I get this result:

http://it.dbpedia.org/resource/Categoria:Piemonte
http://it.dbpedia.org/resource/Piemonte

I would like to have only http://it.dbpedia.org/resource/Piemonte as a result. I am trying to write this query SPARQL to delete http://it.dbpedia.org/resource/Categoria:Piemonte from the results:

select ?resource where {
  ?resource rdfs:label "Piemonte"@it
  FILTER (rdf:type != skos:Concept)
}

because I noticed that http://it.dbpedia.org/resource/Categoria:Piemonte has the object skos:Concept whereas the http://it.dbpedia.org/resource/Piemonte doesn't, but I get the same result. Why? What am I doing wrong here?

I also tries adding LIMIT 1, but the result was http://it.dbpedia.org/resource/Categoria:Piemonte, since the results aren't guaranteed to be in the same order.

Joshua Taylor
  • 84,998
  • 9
  • 154
  • 353
Musich87
  • 562
  • 1
  • 12
  • 31

1 Answers1

10

With a filter like FILTER (rdf:type != skos:Concept) you're just asking whether two constants are unequal. The URIs rdf:type and skos:Concept are, of course, different.

What you want is a resource that doesn't have the value skos:Concept for the property rdf:type. You'd indicate that it does have that by ?resource rdf:type skos:Concept. So your query just needs a filter that ensures that that triple does not exist in the data. On the Italian DBpedia, you can ask the following and get just one result back.

select ?resource where {
  ?resource rdfs:label "Piemonte"@it
  filter not exists { ?resource rdf:type skos:Concept }
}

SPARQL results

Joshua Taylor
  • 84,998
  • 9
  • 154
  • 353
  • It works! I have another question. If I write this query: prefix rdfs: prefix skos: prefix rdf: select ?resource where { ?resource rdfs:label "Piemonte"@it filter not exists { ?resource rdf:type skos:Concept } } I get this SPARQL result: http://it.dbpedia.org/resource/Categoria:Piemonte http://it.dbpedia.org/resource/Piemonte Why? What is the difference between two queries? I have added only the prefixes! – Musich87 Jun 12 '14 at 07:09
  • I have resolved in this way: prefix rdfs: prefix skos: prefix rdf: select ?resource where { ?resource rdfs:label "Piemonte"@it filter not exists { ?resource rdf:type skos:Concept } } I had wrong the skos prefix. – Musich87 Jun 12 '14 at 07:20
  • 3
    @Musich87 Comments are for requesting clarification on a question/answer, if you have new questions ask them as new questions linking back to your original question as a reference where relevant – RobV Jun 12 '14 at 09:11