Musich87
Musich87

Reputation: 572

How to exclude resources with a specific rdf:type from SPARQL results?

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.

Upvotes: 7

Views: 4244

Answers (1)

Joshua Taylor
Joshua Taylor

Reputation: 85813

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

Upvotes: 10

Related Questions