简体   繁体   中英

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.

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM