I'm doing a SPARQL query on the DBpediaset, but I am having some issues (due to lack of detailed SPARQL knowledge) with a query limitation:
I first 'get' all music artists:
?person rdf:type <http://dbpedia.org/ontology/MusicalArtist> .
But I want to limit this to the broader category Category:American_musicians
(via traversing skos:broader
?): how?
*= while the question is specific, I've encountered this quest many times when wanting to running sparql queries.
This can be made easier with property paths in SPARQL 1.1
SELECT DISTINCT ( ?person )
WHERE
{
?person rdf:type dbpedia-owl:MusicalArtist .
?person skos:subject skos:broader* category:American_musicians .
}
Here it displays all the ancestors that could be reached via the skos:broader
property.
I'm amazed this simple question hasn't been answered correctly in 3 years, and how much uncertainty and doubt people spread.
SELECT * {
?person a dbo:MusicalArtist .
filter exists {?person dct:subject/skos:broader* dbc:American_musicians}
}
dbo
instead of the long dbpedia-owl
, dbc
instead of category
. These short prefixes are builtin to DBpediaskos:subject
(no such prop exists) to dct:subject
/
skos:broader
is not transitive, skos:broaderTransitive
is. However, DBpedia doesn't have the latter (no transitive reasoning)DISTINCT
which is expensive with FILTER EXISTS
which is much faster. The FILTER
can stop at the first relevant sub-category it finds, while the original query first finds all such sub-cats per artist, then discards them (DISTINCT
), sorts the artists in memory and removes duplicates.If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With